XRootD
XrdFfsFsinfo.cc File Reference
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <pthread.h>
#include <sys/statvfs.h>
#include "XrdOuc/XrdOucHash.hh"
+ Include dependency graph for XrdFfsFsinfo.cc:

Go to the source code of this file.

Classes

struct  XrdFfsFsInfo
 

Macros

#define _GNU_SOURCE
 

Functions

int XrdFfsFsinfo_cache_search (int(*func)(const char *, const char *, struct statvfs *, uid_t), const char *rdrurl, const char *path, struct statvfs *stbuf, uid_t user_uid)
 

Variables

pthread_mutex_t XrdFfsFsinfo_cache_mutex_rd = PTHREAD_MUTEX_INITIALIZER
 
pthread_mutex_t XrdFfsFsinfo_cache_mutex_wr = PTHREAD_MUTEX_INITIALIZER
 
XrdOucHash< struct XrdFfsFsInfoXrdFfsFsinfoHtab
 

Class Documentation

◆ XrdFfsFsInfo

struct XrdFfsFsInfo

Definition at line 46 of file XrdFfsFsinfo.cc.

+ Collaboration diagram for XrdFfsFsInfo:
Class Members
fsblkcnt_t f_bavail
fsblkcnt_t f_bfree
fsblkcnt_t f_blocks
time_t t

Macro Definition Documentation

◆ _GNU_SOURCE

#define _GNU_SOURCE

Definition at line 37 of file XrdFfsFsinfo.cc.

Function Documentation

◆ XrdFfsFsinfo_cache_search()

int XrdFfsFsinfo_cache_search ( int(*)(const char *, const char *, struct statvfs *, uid_t)  func,
const char *  rdrurl,
const char *  path,
struct statvfs stbuf,
uid_t  user_uid 
)

Definition at line 57 of file XrdFfsFsinfo.cc.

58 {
59  struct XrdFfsFsInfo *s;
60  int wlock, rc = 0, dofree = 0;
61  const char *p;
62  char* sname;
63 
64  wlock = pthread_mutex_trylock(&XrdFfsFsinfo_cache_mutex_wr);
65  pthread_mutex_lock(&XrdFfsFsinfo_cache_mutex_rd);
66 
67  p=strstr(path, "oss.cgroup=");
68  if (p != NULL && p[11] != '\0')
69  sname = strdup(p+11);
70  else
71  sname = strdup(" ");
72  s = XrdFfsFsinfoHtab.Find(sname);
73  if (s != NULL)
74  {
75  stbuf->f_blocks = s->f_blocks;
76  stbuf->f_bavail = s->f_bavail;
77  stbuf->f_bfree = s->f_bfree;
78  }
79  else
80  {
81  rc = (*func)(rdrurl, path, stbuf, user_uid);
82  s = (struct XrdFfsFsInfo*) malloc(sizeof(struct XrdFfsFsInfo));
83  s->t = 0;
84  dofree = 1;
85  }
86 
87  pthread_mutex_unlock(&XrdFfsFsinfo_cache_mutex_rd);
88  if (wlock == 0) // did get a lock for update
89  {
90  time_t curr_time = time(NULL);
91  if (curr_time - s->t > 120)
92  {
93  if (s->t != 0)
94  rc = (*func)(rdrurl, path, stbuf, user_uid);
95 
96  pthread_mutex_lock(&XrdFfsFsinfo_cache_mutex_rd);
97  s->t = curr_time;
98  s->f_blocks = stbuf->f_blocks;
99  s->f_bavail = stbuf->f_bavail;
100  s->f_bfree = stbuf->f_bfree;
101 
102  if (s->f_blocks != 0) // if s->f_blocks is zero, then this space token probably does not exist
104  else if (dofree) free(s);
105  pthread_mutex_unlock(&XrdFfsFsinfo_cache_mutex_rd);
106  }
107  pthread_mutex_unlock(&XrdFfsFsinfo_cache_mutex_wr);
108  }
109  free(sname);
110  return rc;
111 }
fsblkcnt_t f_bavail
Definition: XrdFfsFsinfo.cc:49
pthread_mutex_t XrdFfsFsinfo_cache_mutex_rd
Definition: XrdFfsFsinfo.cc:53
XrdOucHash< struct XrdFfsFsInfo > XrdFfsFsinfoHtab
Definition: XrdFfsFsinfo.cc:55
fsblkcnt_t f_bfree
Definition: XrdFfsFsinfo.cc:49
fsblkcnt_t f_blocks
Definition: XrdFfsFsinfo.cc:49
pthread_mutex_t XrdFfsFsinfo_cache_mutex_wr
Definition: XrdFfsFsinfo.cc:52
XrdOucHash_Options
Definition: XrdOucHash.hh:51
@ Hash_keepdata
Definition: XrdOucHash.hh:57
@ Hash_default
Definition: XrdOucHash.hh:51

References XrdFfsFsInfo::f_bavail, XrdFfsFsInfo::f_bfree, XrdFfsFsInfo::f_blocks, Hash_default, Hash_keepdata, XrdFfsFsInfo::t, XrdFfsFsinfo_cache_mutex_rd, XrdFfsFsinfo_cache_mutex_wr, and XrdFfsFsinfoHtab.

Variable Documentation

◆ XrdFfsFsinfo_cache_mutex_rd

pthread_mutex_t XrdFfsFsinfo_cache_mutex_rd = PTHREAD_MUTEX_INITIALIZER

Definition at line 53 of file XrdFfsFsinfo.cc.

Referenced by XrdFfsFsinfo_cache_search().

◆ XrdFfsFsinfo_cache_mutex_wr

pthread_mutex_t XrdFfsFsinfo_cache_mutex_wr = PTHREAD_MUTEX_INITIALIZER

Definition at line 52 of file XrdFfsFsinfo.cc.

Referenced by XrdFfsFsinfo_cache_search().

◆ XrdFfsFsinfoHtab

XrdOucHash<struct XrdFfsFsInfo> XrdFfsFsinfoHtab

Definition at line 55 of file XrdFfsFsinfo.cc.

Referenced by XrdFfsFsinfo_cache_search().