XRootD
XrdOssMirageFile.cc
Go to the documentation of this file.
1 #include "XrdOssMirageFile.hh"
2 #include "XrdSfs/XrdSfsAio.hh"
3 #include "XrdSys/XrdSysXAttr.hh"
4 #include "XrdSys/XrdSysFAttr.hh"
5 
6 #include <fcntl.h>
7 
8 #include <algorithm>
9 #include <mutex>
10 
12  oss(oss),
13  entry(&std::get<XrdOssMirageEntry>(entry_storage))
14 {
15 }
16 
18 {
19  return -ENOTDIR;
20 }
21 
22 int XrdOssMirageFile::Fchmod(mode_t mode)
23 {
24  return -ENOTSUP;
25 }
26 
27 int XrdOssMirageFile::Fstat(struct stat *buf)
28 {
29  *buf = {};
30  buf->st_size = entry->size;
31  return XrdOssOK;
32 }
33 
35 {
36  return XrdOssOK;
37 }
38 
40 {
41  return -ENOTSUP;
42 }
43 
44 int XrdOssMirageFile::Ftruncate(unsigned long long flen)
45 {
46  entry->size = flen;
47  return XrdOssOK;
48 }
49 
50 int XrdOssMirageFile::Open(const char *path, int Oflag, mode_t Mode, XrdOucEnv &env)
51 {
52  if ((Oflag & O_ACCMODE) == O_RDONLY)
53  {
54  const auto opt = oss.get_entry_read(path);
55  if (!opt.has_value())
56  return -ENOENT;
57 
58  entry_storage = opt.value();
59  entry = &std::get<XrdOssMirageEntry>(entry_storage);
60  }
61  else
62  {
63  const auto opt = oss.get_entry_write(path);
64  if (!opt.has_value())
65  return -ENOENT;
66 
67  entry_storage = opt.value();
68  entry = &*std::get<XrdOssMirageEntryPtr>(entry_storage);
69  }
70 
71  if (entry->open.return_code != XrdOssOK)
72  return -entry->open.return_code;
73 
74  return XrdOssOK;
75 }
76 
77 ssize_t XrdOssMirageFile::pgRead (void* buffer, off_t offset, size_t rdlen, uint32_t* csvec, uint64_t opts)
78 {
79  return -ENOTSUP;
80 }
81 
82 int XrdOssMirageFile::pgRead (XrdSfsAio* aioparm, uint64_t opts)
83 {
84  return -ENOTSUP;
85 }
86 
87 ssize_t XrdOssMirageFile::pgWrite(void* buffer, off_t offset, size_t wrlen, uint32_t* csvec, uint64_t opts)
88 {
89  return -ENOTSUP;
90 }
91 
92 int XrdOssMirageFile::pgWrite(XrdSfsAio* aioparm, uint64_t opts)
93 {
94  return -ENOTSUP;
95 }
96 
97 ssize_t XrdOssMirageFile::Read(off_t offset, size_t size)
98 {
99  return XrdOssOK;
100 }
101 
102 ssize_t XrdOssMirageFile::Read(void *buffer, off_t offset, size_t size)
103 {
104  if (entry->read.return_code != XrdOssOK &&
105  entry->read.return_position >= static_cast<std::size_t>(offset) &&
106  entry->read.return_position <= static_cast<std::size_t>(offset + size))
107  return -entry->read.return_code;
108 
109  const std::size_t num_bytes = std::min(size, static_cast<std::size_t>(entry->size - offset));
110 
111  if (entry->pattern.size() == 1)
112  std::fill_n(static_cast<char *>(buffer), num_bytes, entry->pattern.front());
113 
114  if (entry->pattern.size() > 1)
115  std::generate_n(static_cast<char *>(buffer), num_bytes, [i = offset % entry->pattern.size(), this] () mutable {
116  return entry->pattern[i++ % entry->pattern.size()];
117  });
118 
119  return num_bytes;
120 }
121 
123 {
124  return -ENOTSUP;
125 }
126 
127 ssize_t XrdOssMirageFile::ReadRaw(void *buffer, off_t offset, size_t size)
128 {
129  return Read(buffer, offset, size);
130 }
131 
132 ssize_t XrdOssMirageFile::Write(const void *buffer, off_t offset, size_t size)
133 {
134  if (entry->write.return_code != XrdOssOK &&
135  entry->write.return_position >= static_cast<std::size_t>(offset) &&
136  entry->write.return_position <= static_cast<std::size_t>(offset + size))
137  return -entry->write.return_code;
138 
139  entry->size += size;
140  return size;
141 }
142 
144 {
145  return -ENOTSUP;
146 }
147 
148 int XrdOssMirageFile::Close(long long *retsz)
149 {
150  if (std::holds_alternative<XrdOssMirageEntryPtr>(entry_storage))
151  std::get<XrdOssMirageEntryPtr>(entry_storage).reset();
152  return XrdOssOK;
153 }
struct XrdOssMirageEntry::@117 read
struct XrdOssMirageEntry::@116 open
struct XrdOssMirageEntry::@118 write
#define XrdOssOK
Definition: XrdOss.hh:54
#define stat(a, b)
Definition: XrdPosix.hh:105
int Mode
struct myOpts opts
virtual int Fchmod(mode_t mode) override
virtual int Close(long long *retsz=0) override
virtual int Open(const char *path, int Oflag, mode_t Mode, XrdOucEnv &env) override
virtual ssize_t pgWrite(void *buffer, off_t offset, size_t wrlen, uint32_t *csvec, uint64_t opts) override
virtual int StatRet(struct stat *buff) override
virtual ssize_t Write(const void *buffer, off_t offset, size_t size) override
virtual ssize_t pgRead(void *buffer, off_t offset, size_t rdlen, uint32_t *csvec, uint64_t opts) override
virtual int Fstat(struct stat *buf) override
XrdOssMirageFile(XrdOssMirage &oss)
virtual int Fsync() override
virtual ssize_t Read(off_t offset, size_t size) override
virtual ssize_t ReadRaw(void *buffer, off_t offset, size_t size) override
virtual int Ftruncate(unsigned long long flen) override
std::optional< XrdOssMirageEntry > get_entry_read(const char *path)
std::optional< XrdOssMirageEntryPtr > get_entry_write(const char *path)