Skip to content

Commit 6ae49be

Browse files
committed
Implement ReadV for S3File
The ReadV implementation is necessary as the PFC will emit vector reads when it is under load.
1 parent f6bb5ca commit 6ae49be

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

src/S3File.cc

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,30 @@ int S3File::Open(const char *path, int Oflag, mode_t Mode, XrdOucEnv &env) {
147147
return 0;
148148
}
149149

150+
ssize_t S3File::ReadV(XrdOucIOVec *readV, int rdvcnt) {
151+
if (rdvcnt <= 0 || !readV) {
152+
return -EINVAL;
153+
}
154+
155+
size_t totalRead = 0;
156+
for (int i = 0; i < rdvcnt; ++i) {
157+
auto &iov = readV[i];
158+
if (iov.size == 0) {
159+
continue;
160+
}
161+
auto bytesRead =
162+
Read(static_cast<void *>(iov.data), iov.offset, iov.size);
163+
if (bytesRead < 0) {
164+
return bytesRead;
165+
} else if (bytesRead != iov.size) {
166+
// Error number copied from implementation in XrdOss/XrdOssApi.cc
167+
return -ESPIPE;
168+
}
169+
totalRead += bytesRead;
170+
}
171+
return totalRead;
172+
}
173+
150174
ssize_t S3File::Read(void *buffer, off_t offset, size_t size) {
151175
return m_cache.Read(static_cast<char *>(buffer), offset, size);
152176
}

src/S3File.hh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class S3File : public XrdOssDF {
8989
return -ENOSYS;
9090
}
9191

92-
ssize_t ReadV(XrdOucIOVec *readV, int rdvcnt) override { return -ENOSYS; }
92+
ssize_t ReadV(XrdOucIOVec *readV, int rdvcnt) override;
9393

9494
ssize_t Write(const void *buffer, off_t offset, size_t size) override;
9595

0 commit comments

Comments
 (0)