lei-xia commented on a change in pull request #1002:
URL: https://github.com/apache/helix/pull/1002#discussion_r426793803



##########
File path: 
helix-core/src/main/java/org/apache/helix/messaging/handling/HelixTaskExecutor.java
##########
@@ -524,12 +527,27 @@ public void finishTask(MessageTask task) {
   private void updateMessageState(List<Message> readMsgs, HelixDataAccessor 
accessor,
       String instanceName) {
     Builder keyBuilder = accessor.keyBuilder();
-    List<PropertyKey> readMsgKeys = new ArrayList<>();
+    List<String> readMsgPaths = new ArrayList<>();
+    List<DataUpdater<ZNRecord>> updaters = new ArrayList<>();
     for (Message msg : readMsgs) {
-      readMsgKeys.add(msg.getKey(keyBuilder, instanceName));
+      readMsgPaths.add(msg.getKey(keyBuilder, instanceName).getPath());
       _knownMessageIds.add(msg.getId());
+      /**
+       * We use the updater to avoid race condition between writing message to 
zk as READ state and removing message after ST is done
+       * If there is no message at this path, meaning the message is removed 
so we do not write the message
+       */
+      updaters.add(new DataUpdater<ZNRecord>() {

Review comment:
       One optimization here maybe to create just one updater instead of one 
per each message. You can define the update logic in the updater, i.e, read the 
message and mark the read field as "read".  




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to