Commit e126508
committed
Fix a race condition in FIFO size-based compaction where concurrent threads could select the same non-L0 file (facebook#13946)
Summary:
**Context/Summary:**
Fix a race condition (illustrated below) in FIFO size-based compaction where concurrent threads could select the same non-L0 file, causing assertion failures in debug builds or "Cannot delete table file from LSM tree" errors in release builds.
```
Thread 1 Thread 2
-------- --------
FIFO size-based compaction
↓
Pick L2 file
↓
Mark: file.being_compacted = true (file.being_compacted was false)
↓
WriteManifestStart (unlock mutex) ─→ FIFO size-based compaction starts
↓ ↓
Continue manifest write... Pick SAME L2 file
↓ Mark: file.being_compacted = true (file.being_compacted was true) ❌
↓ ↓
↓ Unlock mutex, wait for manifest
↓ ↓
Lock mutex ←─────────────────────────────────┘
↓
Delete L2 file ✅
↓
Complete ─────────────────────────────→ Try delete same file ❌
↓
ERROR: "file not in LSM tree"
🐛 BUG: Both threads pick the same file!
Thread 2 doesn't properly check file.being_compacted flag
```
**Test**
New test that fails before the fix and passes after
Pull Request resolved: facebook#13946
Reviewed By: xingbowang
Differential Revision: D82279731
Pulled By: hx235
fbshipit-source-id: b426517f2d1b23dd7d4951157822a2d322fe14351 parent 46c255c commit e126508
3 files changed
Lines changed: 68 additions & 0 deletions
File tree
- db
- compaction
- unreleased_history/bug_fixes
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
258 | 258 | | |
259 | 259 | | |
260 | 260 | | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
261 | 264 | | |
262 | 265 | | |
263 | 266 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7128 | 7128 | | |
7129 | 7129 | | |
7130 | 7130 | | |
| 7131 | + | |
| 7132 | + | |
| 7133 | + | |
| 7134 | + | |
| 7135 | + | |
| 7136 | + | |
| 7137 | + | |
| 7138 | + | |
| 7139 | + | |
| 7140 | + | |
| 7141 | + | |
| 7142 | + | |
| 7143 | + | |
| 7144 | + | |
| 7145 | + | |
| 7146 | + | |
| 7147 | + | |
| 7148 | + | |
| 7149 | + | |
| 7150 | + | |
| 7151 | + | |
| 7152 | + | |
| 7153 | + | |
| 7154 | + | |
| 7155 | + | |
| 7156 | + | |
| 7157 | + | |
| 7158 | + | |
| 7159 | + | |
| 7160 | + | |
| 7161 | + | |
| 7162 | + | |
| 7163 | + | |
| 7164 | + | |
| 7165 | + | |
| 7166 | + | |
| 7167 | + | |
| 7168 | + | |
| 7169 | + | |
| 7170 | + | |
| 7171 | + | |
| 7172 | + | |
| 7173 | + | |
| 7174 | + | |
| 7175 | + | |
| 7176 | + | |
| 7177 | + | |
| 7178 | + | |
| 7179 | + | |
| 7180 | + | |
| 7181 | + | |
| 7182 | + | |
| 7183 | + | |
| 7184 | + | |
| 7185 | + | |
| 7186 | + | |
| 7187 | + | |
| 7188 | + | |
| 7189 | + | |
| 7190 | + | |
| 7191 | + | |
| 7192 | + | |
| 7193 | + | |
| 7194 | + | |
7131 | 7195 | | |
7132 | 7196 | | |
7133 | 7197 | | |
| |||
Lines changed: 1 addition & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
0 commit comments