XRootD
Loading...
Searching...
No Matches
XrdPfc::FsTraversal Class Reference

#include <XrdPfcFsTraversal.hh>

Collaboration diagram for XrdPfc::FsTraversal:

Classes

struct  FilePairStat

Public Member Functions

 FsTraversal (XrdOss &oss)
 ~FsTraversal ()
bool begin_traversal (const char *root_path)
bool begin_traversal (DirState *root, const char *root_path)
bool cd_down (const std::string &dir_name)
void cd_up ()
int close_delete (XrdOssDF *&ossDF)
XrdOucEnvdefault_env ()
void end_traversal ()
int open_at_ro (const char *fname, XrdOssDF *&ossDF)
void slurp_current_dir ()
void slurp_dir_ll (XrdOssDF &dh, int dir_level, const char *path, const char *trc_pfx)
int unlink_at (const char *fname)

Public Attributes

std::vector< std::string > m_current_dirs
std::map< std::string, FilePairStatm_current_files
std::string m_current_path
std::vector< XrdOssDF * > m_dir_handle_stack
DirStatem_dir_state = nullptr
std::set< std::string > m_protected_top_dirs
int m_rel_dir_level = -1
DirStatem_root_dir_state = nullptr

Static Public Attributes

static const char * m_traceID = "FsTraversal"

Protected Attributes

XrdOucEnv m_env
bool m_maintain_dirstate = false
XrdOssm_oss
XrdOssAt m_oss_at

Detailed Description

Definition at line 20 of file XrdPfcFsTraversal.hh.

Constructor & Destructor Documentation

◆ FsTraversal()

FsTraversal::FsTraversal ( XrdOss & oss)

Definition at line 23 of file XrdPfcFsTraversal.cc.

23 :
24 m_oss(oss), m_oss_at(oss)
25{}

References m_oss, and m_oss_at.

◆ ~FsTraversal()

FsTraversal::~FsTraversal ( )

Definition at line 27 of file XrdPfcFsTraversal.cc.

28{}

Member Function Documentation

◆ begin_traversal() [1/2]

bool FsTraversal::begin_traversal ( const char * root_path)

Definition at line 53 of file XrdPfcFsTraversal.cc.

54{
55 static const char *trc_pfx = "FsTraversal::begin_traversal ";
56
57 assert(root_path && strlen(root_path) > 0 && root_path[0] == '/');
58
60 m_current_path = root_path;
61
62 XrdOssDF* dhp = m_oss.newDir("PfcFsTraversal");
63 if (dhp->Opendir(root_path, m_env) != XrdOssOK) {
64 delete dhp;
65 TRACE(Error, trc_pfx << "could not opendir [" << root_path << "], " << XrdSysE2T(errno));
66 return false;
67 }
68 m_dir_handle_stack.push_back(dhp);
69
70 TRACE_PURGE("FPurgeState::begin_traversal cur_path '" << m_current_path << "', rel_level=" << m_rel_dir_level);
71
73 return true;
74}
#define XrdOssOK
Definition XrdOss.hh:50
#define TRACE_PURGE(x)
const char * XrdSysE2T(int errcode)
Definition XrdSysE2T.cc:104
#define TRACE(act, x)
Definition XrdTrace.hh:63
virtual int Opendir(const char *path, XrdOucEnv &env)
Definition XrdOss.hh:79
std::vector< XrdOssDF * > m_dir_handle_stack

References Error, m_current_path, m_dir_handle_stack, m_env, m_oss, m_rel_dir_level, XrdOssDF::Opendir(), slurp_current_dir(), TRACE, TRACE_PURGE, XrdOssOK, and XrdSysE2T().

Here is the call graph for this function:

◆ begin_traversal() [2/2]

bool FsTraversal::begin_traversal ( DirState * root,
const char * root_path )

Definition at line 43 of file XrdPfcFsTraversal.cc.

44{
47
48 bool ret = begin_traversal(root_path);
49
50 return ret;
51}
bool begin_traversal(DirState *root, const char *root_path)

References begin_traversal(), m_dir_state, m_maintain_dirstate, and m_root_dir_state.

Referenced by begin_traversal(), XrdPfc::ResourceMonitor::perform_initial_scan(), and XrdPfc::FPurgeState::TraverseNamespace().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cd_down()

bool FsTraversal::cd_down ( const std::string & dir_name)

Definition at line 96 of file XrdPfcFsTraversal.cc.

97{
98 static const char *trc_pfx = "FsTraversal::cd_down ";
99
100 XrdOssDF *dhp = 0;
101 if (m_oss_at.Opendir(*m_dir_handle_stack.back(), dir_name.c_str(), m_env, dhp) != XrdOssOK) {
102 delete dhp;
103 TRACE(Error, trc_pfx << "could not opendir [" << m_current_path << dir_name << "], " << XrdSysE2T(errno));
104 return false;
105 }
106 m_dir_handle_stack.push_back(dhp);
107
109 m_current_path.append(dir_name);
110 m_current_path.append("/");
111
113 m_dir_state = m_dir_state->find_dir(dir_name, true);
114
116 return true;
117}

References Error, m_current_path, m_dir_handle_stack, m_dir_state, m_env, m_maintain_dirstate, m_oss_at, m_rel_dir_level, slurp_current_dir(), TRACE, XrdOssOK, and XrdSysE2T().

Referenced by XrdPfc::FPurgeState::ProcessDirAndRecurse(), and XrdPfc::ResourceMonitor::scan_dir_and_recurse().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cd_up()

void FsTraversal::cd_up ( )

Definition at line 119 of file XrdPfcFsTraversal.cc.

120{
121 m_current_dirs.clear();
122 m_current_files.clear();
123
124 m_dir_handle_stack.back()->Close();
125 delete m_dir_handle_stack.back();
126 m_dir_handle_stack.pop_back();
127
129 m_dir_state = m_dir_state->get_parent();
130
131 m_current_path.erase(m_current_path.find_last_of('/', m_current_path.size() - 2) + 1);
133}
std::vector< std::string > m_current_dirs
std::map< std::string, FilePairStat > m_current_files

References m_current_dirs, m_current_files, m_current_path, m_dir_handle_stack, m_dir_state, m_maintain_dirstate, and m_rel_dir_level.

Referenced by XrdPfc::FPurgeState::ProcessDirAndRecurse(), and XrdPfc::ResourceMonitor::scan_dir_and_recurse().

Here is the caller graph for this function:

◆ close_delete()

int FsTraversal::close_delete ( XrdOssDF *& ossDF)

Definition at line 30 of file XrdPfcFsTraversal.cc.

31{
32 int ret = 0;
33 if (ossDF) {
34 ret = ossDF->Close();
35 delete ossDF;
36 }
37 ossDF = nullptr;
38 return ret;
39}
virtual int Close(long long *retsz=0)=0

References XrdOssDF::Close().

Here is the call graph for this function:

◆ default_env()

XrdOucEnv & XrdPfc::FsTraversal::default_env ( )
inline

Definition at line 80 of file XrdPfcFsTraversal.hh.

80{ return m_env; }

References m_env.

◆ end_traversal()

void FsTraversal::end_traversal ( )

Definition at line 76 of file XrdPfcFsTraversal.cc.

77{
78 TRACE_PURGE("FPurgeState::end_traversal reporting for '" << m_current_path << "', re_level=" << m_rel_dir_level);
79
80 for (auto &dhp : m_dir_handle_stack) {
81 dhp->Close();
82 delete dhp;
83 }
84 m_dir_handle_stack.clear();
85 m_current_path.clear();
86 m_current_dirs.clear();
87 m_current_files.clear();
88
89 m_rel_dir_level = -1;
90 m_root_dir_state = m_dir_state = nullptr;
91 m_maintain_dirstate = false;
92}

References m_current_dirs, m_current_files, m_current_path, m_dir_handle_stack, m_dir_state, m_maintain_dirstate, m_rel_dir_level, m_root_dir_state, and TRACE_PURGE.

Referenced by XrdPfc::ResourceMonitor::perform_initial_scan(), and XrdPfc::FPurgeState::TraverseNamespace().

Here is the caller graph for this function:

◆ open_at_ro()

int XrdPfc::FsTraversal::open_at_ro ( const char * fname,
XrdOssDF *& ossDF )
inline

Definition at line 72 of file XrdPfcFsTraversal.hh.

72 {
73 return m_oss_at.OpenRO(*m_dir_handle_stack.back(), fname, m_env, ossDF);
74 }

References m_dir_handle_stack, m_env, and m_oss_at.

◆ slurp_current_dir()

void FsTraversal::slurp_current_dir ( )

Definition at line 137 of file XrdPfcFsTraversal.cc.

138{
139 static const char *trc_pfx = "FsTraversal::slurp_current_dir ";
140
141 XrdOssDF &dh = *m_dir_handle_stack.back();
142 slurp_dir_ll(dh, m_rel_dir_level, m_current_path.c_str(), trc_pfx);
143}
void slurp_dir_ll(XrdOssDF &dh, int dir_level, const char *path, const char *trc_pfx)

References m_current_path, m_dir_handle_stack, m_rel_dir_level, and slurp_dir_ll().

Referenced by begin_traversal(), and cd_down().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ slurp_dir_ll()

void FsTraversal::slurp_dir_ll ( XrdOssDF & dh,
int dir_level,
const char * path,
const char * trc_pfx )

Definition at line 147 of file XrdPfcFsTraversal.cc.

148{
149 // Low-level implementation of slurp dir.
150
151 char fname[256];
152 struct stat fstat;
153
154 dh.StatRet(&fstat);
155
156 const char *info_ext = Info::s_infoExtension;
157 const size_t info_ext_len = Info::s_infoExtensionLen;
158
159 m_current_dirs.clear();
160 m_current_files.clear();
161
162 while (true)
163 {
164 int rc = dh.Readdir(fname, 256);
165
166 if (rc == -ENOENT)
167 {
168 TRACE_PURGE(" Skipping ENOENT dir entry [" << fname << "].");
169 continue;
170 }
171 if (rc != XrdOssOK)
172 {
173 TRACE(Error, trc_pfx << "Readdir error at " << path << ", err " << XrdSysE2T(-rc) << ".");
174 break;
175 }
176
177 TRACE_PURGE(" Readdir [" << fname << "]");
178
179 if (fname[0] == 0)
180 {
181 TRACE_PURGE(" Finished reading dir [" << path << "]. Break loop.");
182 break;
183 }
184 if (fname[0] == '.' && (fname[1] == 0 || (fname[1] == '.' && fname[2] == 0)))
185 {
186 TRACE_PURGE(" Skipping here or parent dir [" << fname << "]. Continue loop.");
187 continue;
188 }
189
190 if (S_ISDIR(fstat.st_mode))
191 {
192 if (dir_level == 0 && m_protected_top_dirs.find(fname) != m_protected_top_dirs.end())
193 {
194 // Skip protected top-directories.
195 continue;
196 }
197 m_current_dirs.push_back(fname);
198 }
199 else
200 {
201 size_t fname_len = strlen(fname);
202
203 if (fname_len > info_ext_len && strncmp(&fname[fname_len - info_ext_len], info_ext, info_ext_len) == 0)
204 {
205 // truncate ".cinfo" away
206 fname[fname_len - info_ext_len] = 0;
207 m_current_files[fname].set_cinfo(fstat);
208 }
209 else
210 {
211 m_current_files[fname].set_data(fstat);
212 }
213 }
214 }
215}
#define fstat(a, b)
Definition XrdPosix.hh:62
#define stat(a, b)
Definition XrdPosix.hh:101
virtual int StatRet(struct stat *buff)
Definition XrdOss.hh:107
virtual int Readdir(char *buff, int blen)
Definition XrdOss.hh:92
std::set< std::string > m_protected_top_dirs
static const char * s_infoExtension
static const size_t s_infoExtensionLen

References Error, fstat, m_current_dirs, m_current_files, m_protected_top_dirs, XrdOssDF::Readdir(), XrdPfc::Info::s_infoExtension, XrdPfc::Info::s_infoExtensionLen, stat, XrdOssDF::StatRet(), TRACE, TRACE_PURGE, XrdOssOK, and XrdSysE2T().

Referenced by slurp_current_dir().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ unlink_at()

int XrdPfc::FsTraversal::unlink_at ( const char * fname)
inline

Definition at line 75 of file XrdPfcFsTraversal.hh.

75 {
76 return m_oss_at.Unlink(*m_dir_handle_stack.back(), fname);
77 }

References m_dir_handle_stack, and m_oss_at.

Member Data Documentation

◆ m_current_dirs

std::vector<std::string> XrdPfc::FsTraversal::m_current_dirs

◆ m_current_files

std::map<std::string, FilePairStat> XrdPfc::FsTraversal::m_current_files

◆ m_current_path

◆ m_dir_handle_stack

std::vector<XrdOssDF*> XrdPfc::FsTraversal::m_dir_handle_stack

◆ m_dir_state

DirState* XrdPfc::FsTraversal::m_dir_state = nullptr

◆ m_env

XrdOucEnv XrdPfc::FsTraversal::m_env
protected

Definition at line 36 of file XrdPfcFsTraversal.hh.

Referenced by begin_traversal(), cd_down(), default_env(), and open_at_ro().

◆ m_maintain_dirstate

bool XrdPfc::FsTraversal::m_maintain_dirstate = false
protected

Definition at line 38 of file XrdPfcFsTraversal.hh.

Referenced by begin_traversal(), cd_down(), cd_up(), and end_traversal().

◆ m_oss

XrdOss& XrdPfc::FsTraversal::m_oss
protected

Definition at line 34 of file XrdPfcFsTraversal.hh.

Referenced by FsTraversal(), and begin_traversal().

◆ m_oss_at

XrdOssAt XrdPfc::FsTraversal::m_oss_at
protected

Definition at line 35 of file XrdPfcFsTraversal.hh.

Referenced by FsTraversal(), cd_down(), open_at_ro(), and unlink_at().

◆ m_protected_top_dirs

std::set<std::string> XrdPfc::FsTraversal::m_protected_top_dirs

◆ m_rel_dir_level

int XrdPfc::FsTraversal::m_rel_dir_level = -1

◆ m_root_dir_state

DirState* XrdPfc::FsTraversal::m_root_dir_state = nullptr

Definition at line 41 of file XrdPfcFsTraversal.hh.

Referenced by begin_traversal(), and end_traversal().

◆ m_traceID

const char * FsTraversal::m_traceID = "FsTraversal"
static

Definition at line 56 of file XrdPfcFsTraversal.hh.


The documentation for this class was generated from the following files: