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();