@@ -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