XRootD
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 {}

◆ ~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 
59  m_rel_dir_level = 0;
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
virtual XrdOssDF * newDir(const char *tident)=0
std::vector< XrdOssDF * > m_dir_handle_stack

References Macaroons::Error, m_current_path, m_dir_handle_stack, m_env, m_oss, m_rel_dir_level, XrdOss::newDir(), 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 {
45  m_maintain_dirstate = true;
47 
48  bool ret = begin_traversal(root_path);
49 
50  return ret;
51 }
bool begin_traversal(DirState *root, const char *root_path)

References m_dir_state, m_maintain_dirstate, and m_root_dir_state.

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

+ 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 
108  ++m_rel_dir_level;
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 }
int Opendir(XrdOssDF &atDir, const char *path, XrdOucEnv &env, XrdOssDF *&ossDF)
Definition: XrdOssAt.cc:96
DirState * find_dir(const std::string &dir, bool create_subdirs)

References Macaroons::Error, XrdPfc::DirState::find_dir(), m_current_path, m_dir_handle_stack, m_dir_state, m_env, m_maintain_dirstate, m_oss_at, m_rel_dir_level, XrdOssAt::Opendir(), 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 
130 
131  m_current_path.erase(m_current_path.find_last_of('/', m_current_path.size() - 2) + 1);
132  --m_rel_dir_level;
133 }
std::vector< std::string > m_current_dirs
std::map< std::string, FilePairStat > m_current_files
DirState * get_parent()

References XrdPfc::DirState::get_parent(), 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 call graph for this function:
+ 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  }
int OpenRO(XrdOssDF &atDir, const char *path, XrdOucEnv &env, XrdOssDF *&ossDF)
Definition: XrdOssAt.cc:127

References m_dir_handle_stack, m_env, m_oss_at, and XrdOssAt::OpenRO().

+ Here is the call graph for this function:

◆ 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 }
int stat(const char *path, struct stat *buf)
int fstat(int fildes, struct stat *buf)
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
Definition: XrdPfcInfo.hh:309
static const size_t s_infoExtensionLen
Definition: XrdPfcInfo.hh:310

References Macaroons::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  }
int Unlink(XrdOssDF &atDir, const char *path)
Definition: XrdOssAt.cc:199

References m_dir_handle_stack, m_oss_at, and XrdOssAt::Unlink().

+ Here is the call graph for this function:

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 begin_traversal().

◆ m_oss_at

XrdOssAt XrdPfc::FsTraversal::m_oss_at
protected

Definition at line 35 of file XrdPfcFsTraversal.hh.

Referenced by 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: