Mike Kolupaev 74b01ac2ea Fix use-after-free and double-deleting files in BackgroundCallPurge() (#6193)
Summary:
The bad code was:

```
mutex.Lock(); // `mutex` protects `container`
for (auto& x : container) {
  mutex.Unlock();
  // do stuff to x
  mutex.Lock();
}
```

It's incorrect because both `x` and the iterator may become invalid if another thread modifies the container while this thread is not holding the mutex.

Broken by https://github.com/facebook/rocksdb/pull/5796 - it replaced a `while (!container.empty())` loop with a `for (auto x : container)`.

(RocksDB code does a lot of such unlocking+re-locking of mutexes, and this type of bugs comes up a lot :/ )
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6193

Test Plan: Ran some logdevice integration tests that were crashing without this fix.

Differential Revision: D19116874

Pulled By: al13n321

fbshipit-source-id: 9672bc4227c1b68f46f7436db2b96811adb8c703
2020-01-02 12:21:53 -08:00
..
2019-09-18 20:26:04 -07:00
2017-07-15 16:11:23 -07:00
2019-05-31 15:24:43 -07:00
2018-10-04 20:46:50 -07:00
2017-07-15 16:11:23 -07:00
2018-08-24 18:13:20 -07:00
2017-07-15 16:11:23 -07:00
2019-12-17 17:09:46 -08:00
2017-07-15 16:11:23 -07:00
2019-05-31 15:24:43 -07:00
2019-05-31 11:57:01 -07:00
2019-05-31 11:57:01 -07:00
2017-07-15 16:11:23 -07:00
2017-07-15 16:11:23 -07:00
2017-07-15 16:11:23 -07:00
2017-07-15 16:11:23 -07:00
2017-07-15 16:11:23 -07:00