XRootD
Loading...
Searching...
No Matches
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(* func )(const char *, const char *, struct statvfs *, uid_t),
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
pthread_mutex_t XrdFfsFsinfo_cache_mutex_rd
XrdOucHash< struct XrdFfsFsInfo > XrdFfsFsinfoHtab
fsblkcnt_t f_bfree
fsblkcnt_t f_blocks
pthread_mutex_t XrdFfsFsinfo_cache_mutex_wr
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, statvfs, 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().