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 <[email protected]>
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 <[email protected]>
Reviewers: Enrico Olivelli <[email protected]>, Mate Szalay-Beko
<[email protected]>
Closes #1877 from jithin23/ZOOKEEPER-4537
(cherry picked from commit f770467d3b1a3b088208601b14dfc3f375a4dcc0)
Signed-off-by: Mate Szalay-Beko <[email protected]>
---
.../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();