Descriptions of the changes in this PR: (cherry-pick #1569)
For a long time PerChannelBookieClient has used guava LinkedListMultiMap to store conflicting V2 completion keys and values. This is problematic though. Completion keys are pooled objects. When a key-value pair is stored in a LinkedListMultiMap, if it is the first value for that key, a collection is created for the values, and added to a top-level map using the key, and then the key and the value are added to the collection. When a second value is added for the same key, the key and value are simply added to the collection. The problem occurs when the first key is removed. PBCB will recycle the key object, but this object is still being used in the multimap in the top-level map. This causes all sorts of fun like NullPointerException and IllegalStateException. Because of this, this patch introduces a very simple multimap implementation that only stores the key one time (in the collection) and uses the hashCode of the key to separate the collections into buckets. It's pretty inefficient, but this code it only hit in the rare case where a client is trying to read or write the same entry from the same ledger more than once at the same time. Author: Ivan Kelly <[email protected]> Reviewers: Enrico Olivelli <[email protected]> This closes #1569 from ivankelly/conc-test-flake Master Issue: #1569 > --- > In order to uphold a high standard for quality for code contributions, Apache > BookKeeper runs various precommit > checks for pull requests. A pull request can only be merged when it passes > precommit checks. However running all > the precommit checks can take a long time, some trivial changes don't need to > run all the precommit checks. You > can check following list to skip the tests that don't need to run for your > pull request. Leave them unchecked if > you are not sure, committers will help you: > > - [ ] [skip bookkeeper-server bookie tests]: skip testing > `org.apache.bookkeeper.bookie` in bookkeeper-server module. > - [ ] [skip bookkeeper-server client tests]: skip testing > `org.apache.bookkeeper.client` in bookkeeper-server module. > - [ ] [skip bookkeeper-server replication tests]: skip testing > `org.apache.bookkeeper.replication` in bookkeeper-server module. > - [ ] [skip bookkeeper-server tls tests]: skip testing > `org.apache.bookkeeper.tls` in bookkeeper-server module. > - [ ] [skip bookkeeper-server remaining tests]: skip testing all other tests > in bookkeeper-server module. > - [ ] [skip integration tests]: skip docker based integration tests. if you > make java code changes, you shouldn't skip integration tests. > - [ ] [skip build java8]: skip build on java8. *ONLY* skip this when *ONLY* > changing files under documentation under `site`. > - [ ] [skip build java9]: skip build on java9. *ONLY* skip this when *ONLY* > changing files under documentation under `site`. > --- > --- > Be sure to do all of the following to help us incorporate your contribution > quickly and easily: > > If this PR is a BookKeeper Proposal (BP): > > - [ ] Make sure the PR title is formatted like: > `<BP-#>: Description of bookkeeper proposal` > `e.g. BP-1: 64 bits ledger is support` > - [ ] Attach the master issue link in the description of this PR. > - [ ] Attach the google doc link if the BP is written in Google Doc. > > Otherwise: > > - [ ] Make sure the PR title is formatted like: > `<Issue #>: Description of pull request` > `e.g. Issue 123: Description ...` > - [ ] Make sure tests pass via `mvn clean apache-rat:check install > spotbugs:check`. > - [ ] Replace `<Issue #>` in the title with the actual Issue number. > > --- [ Full content available at: https://github.com/apache/bookkeeper/pull/1618 ] This message was relayed via gitbox.apache.org for [email protected]
