XRootD
XrdPfcFsTraversal.hh
Go to the documentation of this file.
1 #ifndef __XRDPFC_FSTRAVERSAL_HH__
2 #define __XRDPFC_FSTRAVERSAL_HH__
3 
4 #include "XrdOss/XrdOssAt.hh"
5 #include "XrdOuc/XrdOucEnv.hh"
6 
7 #include <string>
8 #include <vector>
9 #include <map>
10 #include <set>
11 #include <sys/stat.h>
12 
13 class XrdOss;
14 class XrdOssDF;
15 
16 namespace XrdPfc {
17 
18 struct DirState;
19 
21 {
22 public:
23  struct FilePairStat {
24  struct stat stat_data, stat_cinfo;
25  bool has_data = false;
26  bool has_cinfo = false;
27 
28  void set_data (const struct stat &s) { stat_data = s; has_data = true; }
29  void set_cinfo(const struct stat &s) { stat_cinfo = s; has_cinfo = true; }
30  bool has_both() const { return has_data && has_cinfo; }
31  };
32 
33 protected:
37 
38  bool m_maintain_dirstate = false;
39  bool m_statret_warned = false; // StatRet() failure reported once per traversal
40 
41 public:
43  DirState *m_dir_state = nullptr; // current DirState
44 
45  int m_rel_dir_level = -1; // dir level relative to root, 0 ~ at root
46  std::string m_current_path; // Includes trailing '/' -- needed for printouts and PurgeCandidate creation.
47 
48  // Hmmh ... need a stack of those ... or not, if doing tail recursion.
49  // Can not, OpenDirAt descend can not be like that, ie, i will need the old handle.
50  std::vector<XrdOssDF*> m_dir_handle_stack;
51 
52  std::vector<std::string> m_current_dirs; // swap out into local scope before recursion
53  std::map<std::string, FilePairStat> m_current_files; // clear when done
54 
55  std::set<std::string> m_protected_top_dirs; // directories that will NOT be traversed at relative level 0.
56 
57  static const char *m_traceID;
58 
59  void slurp_current_dir();
60  void slurp_dir_ll(XrdOssDF &dh, int dir_level, const char *path, const char *trc_pfx);
61 
62 public:
63  FsTraversal(XrdOss &oss);
64  ~FsTraversal();
65 
66  bool begin_traversal(DirState *root, const char *root_path);
67  bool begin_traversal(const char *root_path);
68  void end_traversal();
69 
70  bool cd_down(const std::string &dir_name);
71  void cd_up();
72 
73  int open_at_ro(const char* fname, XrdOssDF *&ossDF) {
74  return m_oss_at.OpenRO(*m_dir_handle_stack.back(), fname, m_env, ossDF);
75  }
76  int unlink_at(const char* fname) {
77  return m_oss_at.Unlink(*m_dir_handle_stack.back(), fname);
78  }
79  int close_delete(XrdOssDF *&ossDF);
80 
81  XrdOucEnv& default_env() { return m_env; }
82 };
83 
84 }
85 
86 #endif
#define stat(a, b)
Definition: XrdPosix.hh:101
int OpenRO(XrdOssDF &atDir, const char *path, XrdOucEnv &env, XrdOssDF *&ossDF)
Definition: XrdOssAt.cc:127
int Unlink(XrdOssDF &atDir, const char *path)
Definition: XrdOssAt.cc:199
std::vector< std::string > m_current_dirs
int open_at_ro(const char *fname, XrdOssDF *&ossDF)
std::vector< XrdOssDF * > m_dir_handle_stack
int close_delete(XrdOssDF *&ossDF)
XrdOucEnv & default_env()
void slurp_dir_ll(XrdOssDF &dh, int dir_level, const char *path, const char *trc_pfx)
bool begin_traversal(DirState *root, const char *root_path)
int unlink_at(const char *fname)
std::set< std::string > m_protected_top_dirs
bool cd_down(const std::string &dir_name)
std::map< std::string, FilePairStat > m_current_files
static const char * m_traceID
Definition: XrdPfc.hh:41
void set_data(const struct stat &s)
void set_cinfo(const struct stat &s)