Skip to content

Commit 597a871

Browse files
Updating the prevFile pointer of upstream file(s)
With the current code it is possible that we can miss updating the pointer of an upstream file if an intermediate file is being removed. This change corrects that logic. Change-Id: Ic554dca3bb005bf12c31d83ec3f7f405d91866fb
1 parent eb56d00 commit 597a871

File tree

1 file changed

+32
-7
lines changed

1 file changed

+32
-7
lines changed

src/filemgr.cc

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1522,9 +1522,31 @@ uint64_t FileMgr::fetchPrevHeader(uint64_t bid, void *buf, size_t *len,
15221522
}
15231523

15241524
void FileMgr::updateFilePointers() {
1525+
/**
1526+
* Example:
1527+
*
1528+
* null <-- | A.0 | <-- | A.1 | <-- | A.2 | <-- | A.3 | --> null
1529+
* \ \ \----------->
1530+
* \ \---------------------->
1531+
* \--------------------------------->
1532+
*
1533+
* Scenarios to be considered:
1534+
* (1) If A.3 were being removed (as the latest file is being removed):
1535+
* - A.2 should point to NULL
1536+
* - A.1 can point to NULL
1537+
* - A.0 can point to NULL
1538+
* (2) If A.2 were being removed:
1539+
* - A.3 would need to point to A.1
1540+
* (3) If A.1 were being removed:
1541+
* - A.2 would need to point to A.0
1542+
* (4) If A.0 were being removed:
1543+
* - A.1 would need to point to NULL
1544+
*
1545+
*/
1546+
15251547
// Update new_file pointers of all previously redirected downstream files
15261548
FileMgr *temp = getPrevFile();
1527-
while (temp != NULL) {
1549+
while (temp != nullptr) {
15281550
temp->acquireSpinLock();
15291551
if (temp->getNewFile() == this) {
15301552
temp->setNewFile(getNewFile());
@@ -1533,13 +1555,16 @@ void FileMgr::updateFilePointers() {
15331555
temp = temp->getPrevFile();
15341556
}
15351557
// Update prev_file pointer of the upstream file if any
1536-
FileMgr *new_file = getNewFile();
1537-
if (new_file != NULL) {
1538-
new_file->acquireSpinLock();
1539-
if (new_file->getPrevFile() == this) {
1540-
new_file->setPrevFile(getPrevFile());
1558+
temp = getNewFile();
1559+
while (temp != nullptr && temp != this) {
1560+
temp->acquireSpinLock();
1561+
if (temp->getPrevFile() == this) {
1562+
temp->setPrevFile(getPrevFile());
1563+
temp->releaseSpinLock();
1564+
break;
15411565
}
1542-
new_file->releaseSpinLock();
1566+
temp->releaseSpinLock();
1567+
temp = temp->getPrevFile();
15431568
}
15441569
}
15451570

0 commit comments

Comments
 (0)