Skip to content

Commit

Permalink
ZOOKEEPER-4537: Race between SyncThread and CommitProcessor thread
Browse files Browse the repository at this point in the history
Zookeeper server can get stuck when it has just one client and the only way it recovers is due to a socket timeout or another client commit request.
Sync thread reads commitIsWaiting outside of a sync block and acts on this information in a sync block later. The actual status of commitIsWaiting can change between the time where commitIsWaiting is read and acted upon because commit thread updates it outside a sync block.
Fix here is to ensure that we read and process commitIsWaiting inside a sync block.

https://issues.apache.org/jira/browse/ZOOKEEPER-4537

Author: jithin23 <jithin.girish@gmail.com>

Reviewers: Enrico Olivelli <eolivelli@apache.org>, Mate Szalay-Beko <symat@apache.org>

Closes apache#1877 from jithin23/ZOOKEEPER-4537

(cherry picked from commit f770467)
Signed-off-by: Mate Szalay-Beko <mszalay@cloudera.com>
  • Loading branch information
jithin23 authored and Mate Szalay-Beko committed May 17, 2022
1 parent 3985d51 commit fa105c7
Showing 1 changed file with 5 additions and 6 deletions.
Expand Up @@ -213,12 +213,11 @@ public void run() {
* request from a client on another server (i.e., the order of
* the following two lines is important!).
*/
commitIsWaiting = !committedRequests.isEmpty();
requestsToProcess = queuedRequests.size();
// Avoid sync if we have something to do
if (requestsToProcess == 0 && !commitIsWaiting) {
// Waiting for requests to process
synchronized (this) {
synchronized (this) {
commitIsWaiting = !committedRequests.isEmpty();
requestsToProcess = queuedRequests.size();
if (requestsToProcess == 0 && !commitIsWaiting) {
// Waiting for requests to process
while (!stopped && requestsToProcess == 0 && !commitIsWaiting) {
wait();
commitIsWaiting = !committedRequests.isEmpty();
Expand Down

0 comments on commit fa105c7

Please sign in to comment.