Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[dlog] Issue 1544: ConcurrentModificationException with nonblocking logReader.readNext(true) #1558

Closed
wants to merge 1 commit into from

Conversation

sijie
Copy link
Member

@sijie sijie commented Jul 18, 2018

Descriptions of the changes in this PR:

Motivation

Fixes #1544. ConcurrentModificationException is thrown when trying to access a non-thread-safe hashmap from different threads.

Changes

Make sure accessing to this non-thread-safe hashmap is under synchronized block.

Tests

It is a bit tricky to reproduce this race condition in a unit test or an integration test. so not going to attempt adding any tests.

Master Issue: #1544


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.

…r.readNext(true)

*Motivation*

Fixes apache#1544. ConcurrentModificationException is thrown when trying to access a non-thread-safe hashmap from different threads.

*Changes*

Make sure accessing to this non-thread-safe hashmap is under synchronized block.

*Tests*

It is a bit tricky to reproduce this race condition in a unit test or an integration test. so not going to attempt adding any tests.
@sijie
Copy link
Member Author

sijie commented Jul 18, 2018

@infodog this should fix the issue you reported in #1544

Copy link
Contributor

@eolivelli eolivelli left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder why spotbugs is okay with this change. We are not always accessing listeners using a synchronized block.

By the way, I don't this is it good to synchronize over a ConcurrentMap, maybe an alternative solution is to clone the keySet and iterate over the clone.

Maybe I am missing something

Copy link
Contributor

@eolivelli eolivelli left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry now I see, listeners is not the main listeners field.

+1

@eolivelli
Copy link
Contributor

retest this please

@sijie
Copy link
Member Author

sijie commented Jul 23, 2018

rebuild java8
rebuild java9
rerun integration tests
rerun pr validation

@eolivelli
Copy link
Contributor

rebuild java9

@sijie sijie closed this in ec7fb62 Jul 23, 2018
sijie added a commit that referenced this pull request Jul 23, 2018
…logReader.readNext(true)

Descriptions of the changes in this PR:

*Motivation*

Fixes #1544. ConcurrentModificationException is thrown when trying to access a non-thread-safe hashmap from different threads.

*Changes*

Make sure accessing to this non-thread-safe hashmap is under synchronized block.

*Tests*

It is a bit tricky to reproduce this race condition in a unit test or an integration test. so not going to attempt adding any tests.

Master Issue: #1544

Author: Sijie Guo <sijie@apache.org>

Reviewers: Enrico Olivelli <eolivelli@gmail.com>, Jia Zhai <None>

This closes #1558 from sijie/issue_1544, closes #1544

(cherry picked from commit ec7fb62)
Signed-off-by: Sijie Guo <sijie@apache.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants