You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zookeeper.apache.org by sy...@apache.org on 2022/05/17 11:45:56 UTC

[zookeeper] branch branch-3.6 updated: ZOOKEEPER-4537: Race between SyncThread and CommitProcessor thread

This is an automated email from the ASF dual-hosted git repository.

symat pushed a commit to branch branch-3.6
in repository https://gitbox.apache.org/repos/asf/zookeeper.git


The following commit(s) were added to refs/heads/branch-3.6 by this push:
     new ba2b64a6f ZOOKEEPER-4537: Race between SyncThread and CommitProcessor thread
ba2b64a6f is described below

commit ba2b64a6fdf82a38a272d307a92b53e00a1bbd62
Author: jithin23 <ji...@gmail.com>
AuthorDate: Tue May 17 13:44:12 2022 +0200

    ZOOKEEPER-4537: Race between SyncThread and CommitProcessor thread
    
    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 <ji...@gmail.com>
    
    Reviewers: Enrico Olivelli <eo...@apache.org>, Mate Szalay-Beko <sy...@apache.org>
    
    Closes #1877 from jithin23/ZOOKEEPER-4537
    
    (cherry picked from commit f770467d3b1a3b088208601b14dfc3f375a4dcc0)
    Signed-off-by: Mate Szalay-Beko <ms...@cloudera.com>
---
 .../org/apache/zookeeper/server/quorum/CommitProcessor.java   | 11 +++++------
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/CommitProcessor.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/CommitProcessor.java
index 01f9f0d27..2f4b95836 100644
--- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/CommitProcessor.java
+++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/CommitProcessor.java
@@ -208,12 +208,11 @@ public class CommitProcessor extends ZooKeeperCriticalThread implements RequestP
                  * 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();