28 #include "XrdVersion.hh"
37 :
XrdOssWrapDF(*wrapDF), m_log(lP), m_throttle(throttle), m_trace(tP), m_wrapped(std::move(wrapDF)) {}
41 virtual int Open(
const char *path,
int Oflag, mode_t
Mode,
44 std::tie(m_user, m_uid) = m_throttle.GetUserInfo(env.
secEnv());
46 std::string open_error_message;
47 if (!m_throttle.OpenFile(m_user, open_error_message)) {
52 auto rval = wrapDF.Open(path, Oflag,
Mode, env);
55 m_throttle.CloseFile(m_user);
61 virtual int Close(
long long *retsz)
override {
62 m_throttle.CloseFile(m_user);
63 return wrapDF.Close(retsz);
66 virtual int getFD()
override {
return -1;}
68 virtual off_t
getMmap(
void **addr)
override {*addr = 0;
return 0;}
70 virtual ssize_t
pgRead (
void* buffer, off_t offset,
size_t rdlen,
71 uint32_t* csvec, uint64_t
opts)
override {
73 return DoThrottle(rdlen, 1,
75 buffer, offset, rdlen, csvec,
opts);
88 virtual ssize_t
pgWrite(
void* buffer, off_t offset,
size_t wrlen,
89 uint32_t* csvec, uint64_t
opts)
override {
91 return DoThrottle(wrlen, 1,
93 buffer, offset, wrlen, csvec,
opts);
106 virtual ssize_t
Read(off_t offset,
size_t size)
override {
107 return DoThrottle(size, 1,
111 virtual ssize_t
Read(
void* buffer, off_t offset,
size_t size)
override {
112 return DoThrottle(size, 1,
114 buffer, offset, size);
127 for (
int i = 0; i < rdvcnt; ++i) {
128 sum += readV[i].
size;
134 virtual ssize_t
Write(
const void* buffer, off_t offset,
size_t size)
override {
135 return DoThrottle(size, 1,
137 buffer, offset, size);
150 template <
class Fn,
class... Args>
151 int DoThrottle(
size_t rdlen,
size_t ops, Fn &&fn, Args &&... args) {
152 m_throttle.Apply(rdlen, ops, m_uid);
159 return std::invoke(fn, wrapDF, std::forward<Args>(args)...);
165 std::unique_ptr<XrdOssDF> m_wrapped;
169 static constexpr
char TraceID[] =
"XrdThrottleFile";
180 m_throttle(m_log.get(), m_trace.get())
187 m_log->Say(
"Config",
"Throttle g-stream has", gstream ?
"" :
" NOT",
" been configured via xrootd.mongstream directive");
188 m_throttle.SetMonitor(gstream);
192 int Configure(
const std::string &config_filename) {
194 if (config.Configure(config_filename)) {
195 m_log->Emsg(
"Config",
"Unable to load configuration file", config_filename.c_str());
198 m_throttle.FromConfig(config);
202 virtual ~FileSystem() {}
205 std::unique_ptr<XrdOssDF> wrapped(wrapPI.newFile(user));
206 return new File(std::move(wrapped), m_throttle, m_log.get(), m_trace.get());
211 std::unique_ptr<XrdOss> m_oss;
212 std::unique_ptr<XrdSysError> m_log{
nullptr};
213 std::unique_ptr<XrdOucTrace> m_trace{
nullptr};
222 const char *config_fn,
const char *parms,
224 std::unique_ptr<FileSystem> fs(
new FileSystem(curr_oss, logger,
envP));
225 if (fs->Configure(config_fn)) {
226 XrdSysError(logger,
"XrdThrottle").
Say(
"Config",
"Unable to load configuration file", config_fn);
XrdOss * XrdOssAddStorageSystem2(XrdOss *curr_oss, XrdSysLogger *logger, const char *config_fn, const char *parms, XrdOucEnv *envP)
XrdVERSIONINFO(XrdOssAddStorageSystem2, throttle)
virtual ssize_t Read(off_t offset, size_t size)
virtual ssize_t pgWrite(void *buffer, off_t offset, size_t wrlen, uint32_t *csvec, uint64_t opts)
virtual ssize_t pgRead(void *buffer, off_t offset, size_t rdlen, uint32_t *csvec, uint64_t opts)
virtual ssize_t ReadV(XrdOucIOVec *readV, int rdvcnt)
virtual ssize_t Write(const void *buffer, off_t offset, size_t size)
virtual ssize_t Read(off_t offset, size_t size)
virtual ssize_t Write(const void *buffer, off_t offset, size_t size)
virtual int Open(const char *path, int Oflag, mode_t Mode, XrdOucEnv &env)
virtual int Close(long long *retsz=0)
virtual ssize_t pgRead(void *buffer, off_t offset, size_t rdlen, uint32_t *csvec, uint64_t opts)
virtual ssize_t pgWrite(void *buffer, off_t offset, size_t wrlen, uint32_t *csvec, uint64_t opts)
virtual ssize_t ReadV(XrdOucIOVec *readV, int rdvcnt)
virtual off_t getMmap(void **addr)
virtual int Init(XrdSysLogger *lp, const char *cfn)
virtual XrdOssDF * newFile(const char *tident)
void PutInt(const char *varname, long value)
void * GetPtr(const char *varname)
const XrdSecEntity * secEnv() const
virtual void doneRead()=0
virtual void doneWrite()=0
void Say(const char *text1, const char *text2=0, const char *txt3=0, const char *text4=0, const char *text5=0, const char *txt6=0)