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{
46 entry->size = flen;
47 return XrdOssOK;
48}
49
50int 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
77ssize_t XrdOssMirageFile::pgRead (void* buffer, off_t offset, size_t rdlen, uint32_t* csvec, uint64_t opts)
78{
79 return -ENOTSUP;
80}
81
82int XrdOssMirageFile::pgRead (XrdSfsAio* aioparm, uint64_t opts)
83{
84 return -ENOTSUP;
85}
86
87ssize_t XrdOssMirageFile::pgWrite(void* buffer, off_t offset, size_t wrlen, uint32_t* csvec, uint64_t opts)
88{
89 return -ENOTSUP;
90}
91
93{
94 return -ENOTSUP;
95}
96
97ssize_t XrdOssMirageFile::Read(off_t offset, size_t size)
98{
99 return XrdOssOK;
100}
101
102ssize_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
127ssize_t XrdOssMirageFile::ReadRaw(void *buffer, off_t offset, size_t size)
128{
129 return Read(buffer, offset, size);
130}
131
132ssize_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
148int 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}
#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