XRootD
Loading...
Searching...
No Matches
XrdOssMirageFile.cc
Go to the documentation of this file.
1#include "XrdOssMirageFile.hh"
2#include "XrdSfs/XrdSfsAio.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
23{
24 return -ENOTSUP;
25}
26
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
44int XrdOssMirageFile::Ftruncate(unsigned long long flen)
45{
47 return -EFBIG;
48
49 entry->size = flen;
50 return XrdOssOK;
51}
52
53int XrdOssMirageFile::Open(const char *path, int Oflag, mode_t Mode, XrdOucEnv &env)
54{
55 if ((Oflag & O_ACCMODE) == O_RDONLY)
56 {
57 const auto opt = oss.get_entry_read(path);
58 if (!opt.has_value())
59 return -ENOENT;
60
61 entry_storage = opt.value();
62 entry = &std::get<XrdOssMirageEntry>(entry_storage);
63 }
64 else
65 {
66 const auto opt = oss.get_entry_write(path);
67 if (!opt.has_value())
68 return -ENOENT;
69
70 entry_storage = opt.value();
71 entry = &*std::get<XrdOssMirageEntryPtr>(entry_storage);
72 }
73
74 if (entry->open.return_code != XrdOssOK)
75 return -entry->open.return_code;
76
77 return XrdOssOK;
78}
79
80ssize_t XrdOssMirageFile::pgRead (void* buffer, off_t offset, size_t rdlen, uint32_t* csvec, uint64_t opts)
81{
82 return -ENOTSUP;
83}
84
85int XrdOssMirageFile::pgRead (XrdSfsAio* aioparm, uint64_t opts)
86{
87 return -ENOTSUP;
88}
89
90ssize_t XrdOssMirageFile::pgWrite(void* buffer, off_t offset, size_t wrlen, uint32_t* csvec, uint64_t opts)
91{
92 return -ENOTSUP;
93}
94
96{
97 return -ENOTSUP;
98}
99
100ssize_t XrdOssMirageFile::Read(off_t offset, size_t size)
101{
102 return XrdOssOK;
103}
104
105ssize_t XrdOssMirageFile::Read(void *buffer, off_t offset, size_t size)
106{
107 if (offset < 0 || static_cast<uint64_t>(offset) > entry->size)
108 return -EINVAL;
109
110 if (entry->read.return_code != XrdOssOK &&
111 entry->read.return_position >= static_cast<std::uint64_t>(offset) &&
112 entry->read.return_position - static_cast<std::uint64_t>(offset) <= size)
113 return -entry->read.return_code;
114
115 const std::size_t num_bytes = static_cast<std::size_t>(std::min<std::uint64_t>(size, entry->size - offset));
116
117 if (entry->pattern.size() == 1)
118 std::fill_n(static_cast<char *>(buffer), num_bytes, entry->pattern.front());
119
120 if (entry->pattern.size() > 1)
121 {
122 std::call_once(pattern_buffer_once, [this, size] () {
123 while (pattern_buffer.size() < size)
124 pattern_buffer.insert(pattern_buffer.end(), entry->pattern.begin(), entry->pattern.end());
125 });
126
127 const std::size_t start = offset % entry->pattern.size();
128 const std::size_t first_chunk = std::min(num_bytes, pattern_buffer.size() - start);
129
130 char *out = static_cast<char *>(buffer);
131 std::copy(pattern_buffer.begin() + start, pattern_buffer.begin() + start + first_chunk, out);
132 if (first_chunk < num_bytes)
133 std::copy(pattern_buffer.begin(), pattern_buffer.begin() + (num_bytes - first_chunk), out + first_chunk);
134 }
135
136 return num_bytes;
137}
138
140{
141 return -ENOTSUP;
142}
143
144ssize_t XrdOssMirageFile::ReadRaw(void *buffer, off_t offset, size_t size)
145{
146 return Read(buffer, offset, size);
147}
148
149ssize_t XrdOssMirageFile::Write(const void *buffer, off_t offset, size_t size)
150{
151 if (offset < 0)
152 return -EINVAL;
153
154 if (entry->write.return_code != XrdOssOK &&
155 entry->write.return_position >= static_cast<std::uint64_t>(offset) &&
156 entry->write.return_position - static_cast<std::uint64_t>(offset) <= size)
157 return -entry->write.return_code;
158
159 if (size > XrdOssMirageEntry::max_file_size - entry->size)
160 return -EFBIG;
161
162 entry->size += size;
163 return size;
164}
165
167{
168 return -ENOTSUP;
169}
170
171int XrdOssMirageFile::Close(long long *retsz)
172{
173 const int return_code = entry->close.return_code;
174
175 if (std::holds_alternative<XrdOssMirageEntryPtr>(entry_storage))
176 std::get<XrdOssMirageEntryPtr>(entry_storage).reset();
177
178 if (return_code != XrdOssOK)
179 return -return_code;
180
181 return XrdOssOK;
182}
#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
static constexpr std::uint64_t max_file_size