Revision 74b01ac2eaf7b42cce38ebcbd837ba6177f074bb authored by Mike Kolupaev on 18 December 2019, 04:07:21 UTC, committed by Yanqin Jin on 02 January 2020, 20:21:53 UTC
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
1 parent 924bc5f
Raw File
Vagrantfile
# Vagrant file
Vagrant.configure("2") do |config|

  config.vm.provider "virtualbox" do |v|
    v.memory = 4096
    v.cpus = 2
  end

  config.vm.define "ubuntu14" do |box|
    box.vm.box = "ubuntu/trusty64"
  end

  config.vm.define "centos65" do |box|
    box.vm.box = "chef/centos-6.5"
  end

  config.vm.define "centos7" do |box|
    box.vm.box = "centos/7"
    box.vm.provision "shell", path: "build_tools/setup_centos7.sh"
  end

  config.vm.define "FreeBSD10" do |box|
    box.vm.guest = :freebsd
    box.vm.box = "robin/freebsd-10"
    # FreeBSD does not support 'mount_virtualbox_shared_folder', use NFS
    box.vm.synced_folder ".", "/vagrant", :nfs => true, id: "vagrant-root"
    box.vm.network "private_network", ip: "10.0.1.10"

    # build everything after creating VM, skip using --no-provision
    box.vm.provision "shell", inline: <<-SCRIPT
      pkg install -y gmake clang35
      export CXX=/usr/local/bin/clang++35
      cd /vagrant
      gmake clean
      gmake all OPT=-g
    SCRIPT
  end

end
back to top