Skip to content

Commit 721bd0b

Browse files
committed
[io] always recreate free list in TFile::Recover()
This avoids tainting the recovered free list by stale entries that were read before. It also allows for stronger assertions in TFree::AddFree().
1 parent fd8b95b commit 721bd0b

2 files changed

Lines changed: 10 additions & 7 deletions

File tree

io/io/src/TFile.cxx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2149,7 +2149,11 @@ Int_t TFile::Recover()
21492149

21502150
fEND = Long64_t(size);
21512151

2152-
if (fWritable && !fFree) fFree = new TList;
2152+
if (fWritable) {
2153+
if (!fFree)
2154+
fFree = new TList();
2155+
fFree->Delete();
2156+
}
21532157

21542158
Int_t nrecov = 0;
21552159
nwheader = 1024;
@@ -2222,12 +2226,7 @@ Int_t TFile::Recover()
22222226
if (fWritable) {
22232227
Long64_t max_file_size = Long64_t(kStartBigFile);
22242228
if (max_file_size < fEND) max_file_size = fEND+1000000000;
2225-
TFree *last = (TFree*)fFree->Last();
2226-
if (last) {
2227-
last->AddFree(fFree,fEND,max_file_size);
2228-
} else {
2229-
new TFree(fFree,fEND,max_file_size);
2230-
}
2229+
new TFree(fFree, fEND, max_file_size);
22312230
if (nrecov) Write();
22322231
}
22332232
return nrecov;

io/io/src/TFree.cxx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ TFree *TFree::AddFree(TList *lfree, Long64_t first, Long64_t last)
7373
do {
7474
Long64_t curfirst = idcur->GetFirst();
7575
Long64_t curlast = idcur->GetLast();
76+
// We can't have overlapping free segments
77+
assert((first < curfirst && last < curfirst) || first > curlast);
7678

7779
if ((curlast == first - 1) && (last - curfirst < kMaxGapSize)) {
7880
idcur->SetLast(last);
@@ -104,6 +106,8 @@ TFree *TFree::AddFree(TList *lfree, Long64_t first, Long64_t last)
104106
idcur = (TFree*)lfree->After(idcur);
105107
} while (idcur);
106108

109+
// never here
110+
assert(false);
107111
return nullptr;
108112
}
109113

0 commit comments

Comments
 (0)