Skip to content

Commit 1d32c96

Browse files
committed
FST: Avoid double stat when stripe checksum should be computed
1 parent c528f5e commit 1d32c96

File tree

1 file changed

+31
-37
lines changed

1 file changed

+31
-37
lines changed

fst/layout/RainMetaLayout.cc

Lines changed: 31 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,16 @@ RainMetaLayout::Open(XrdSfsFileOpenMode flags, mode_t mode, const char* opaque)
275275
}
276276
}
277277

278+
// Initialize stripe checksum only if it's enabled by the config
279+
if (mComputeStripeChecksum) {
280+
mStripeChecksum = std::make_unique<eos::fst::Adler>();
281+
eos_debug("msg=\"stripe checksum enabled\" fxid=%08llx",
282+
mOfsFile->GetFileId());
283+
} else {
284+
eos_debug("msg=\"stripe checksum disabled\" fxid=%08llx",
285+
mOfsFile->GetFileId());
286+
}
287+
278288
unsigned int num_failures = 0u;
279289
std::vector<std::future<XrdCl::XRootDStatus>> open_futures;
280290

@@ -296,12 +306,27 @@ RainMetaLayout::Open(XrdSfsFileOpenMode flags, mode_t mode, const char* opaque)
296306
{FileIoPlugin::GetIoObject(stripe_url, mOfsFile, mSecEntity)};
297307

298308
if (file) {
299-
// The local stripe is expected to be reconstructed during recovery
300-
// and since it might not exist, it gets created
301-
struct stat info;
309+
if ((i == 0) && mIsRw) {
310+
struct stat info;
311+
312+
if (file->fileStat(&info)) {
313+
// The local stripe is expected to be reconstructed during
314+
// recovery and since it might not exist, it gets created
315+
flags |= SFS_O_CREAT;
316+
} else {
317+
// If local stripe exists then we load the stripe checksum
318+
mStripeSize = info.st_size;
302319

303-
if (mIsRw && (i == 0) && (file->fileStat(&info))) {
304-
flags |= SFS_O_CREAT;
320+
if (mStripeChecksum && mStripeSize) {
321+
auto xs = GetStripeChecksum();
322+
323+
if (xs.has_value()) {
324+
mStripeChecksum->ResetInit(0, mStripeSize, xs.value().c_str());
325+
} else {
326+
mStripeChecksum->SetDirty();
327+
}
328+
}
329+
}
305330
}
306331

307332
open_futures.push_back(file->fileOpenAsync(flags, mode, stripe_opaque,
@@ -391,37 +416,6 @@ RainMetaLayout::Open(XrdSfsFileOpenMode flags, mode_t mode, const char* opaque)
391416
}
392417
}
393418

394-
// Initialize stripe checksum only if it's enabled by the config
395-
if (mComputeStripeChecksum) {
396-
mStripeChecksum = std::make_unique<eos::fst::Adler>();
397-
eos_debug("msg=\"stripe checksum enabled\" fxid=%08llx",
398-
mOfsFile->GetFileId());
399-
} else {
400-
eos_debug("msg=\"stripe checksum disabled\" fxid=%08llx",
401-
mOfsFile->GetFileId());
402-
}
403-
404-
if (mIsRw && mStripeChecksum) {
405-
struct stat info;
406-
size_t blockSize = 0;
407-
408-
if (!mStripe[0]->fileStat(&info)) {
409-
blockSize = info.st_size;
410-
}
411-
412-
if (blockSize != 0) {
413-
auto xs = GetStripeChecksum();
414-
415-
if (xs.has_value()) {
416-
mStripeChecksum->ResetInit(0, blockSize, xs.value().c_str());
417-
} else {
418-
mStripeChecksum->SetDirty();
419-
}
420-
421-
mStripeSize = blockSize;
422-
}
423-
}
424-
425419
eos_debug("msg=\"open successful\" file_size=%llu", mFileSize);
426420
mIsOpen = true;
427421
return SFS_OK;
@@ -1682,7 +1676,7 @@ RainMetaLayout::Truncate(XrdSfsFileOffset offset)
16821676
eos::common::Timing tm("truncate");
16831677
COMMONTIMING("begin", &tm);
16841678

1685-
if (mStripeChecksum && truncate_offset < mStripeSize) {
1679+
if (mStripeChecksum && (truncate_offset < mStripeSize)) {
16861680
mStripeChecksum->Reset();
16871681
mStripeChecksum->SetDirty();
16881682
}

0 commit comments

Comments
 (0)