You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@helix.apache.org by hz...@apache.org on 2020/09/28 19:55:15 UTC

[helix] branch master updated: Remove resource from customized state if all partitions are gone (#1411)

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

hzlu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/helix.git


The following commit(s) were added to refs/heads/master by this push:
     new dbd88a5   Remove resource from customized state if all partitions are gone (#1411)
dbd88a5 is described below

commit dbd88a50b69f0db92597f6428b346dd6d98a2763
Author: Meng Zhang <mn...@linkedin.com>
AuthorDate: Mon Sep 28 12:55:01 2020 -0700

     Remove resource from customized state if all partitions are gone (#1411)
    
    Remove resource from customized state if all partitions are gone
---
 .../customizedstate/CustomizedStateProvider.java   | 18 +++++++++--------
 .../helix/manager/zk/ZKHelixDataAccessor.java      | 23 +++++++++++-----------
 .../paticipant/TestCustomizedStateUpdate.java      |  5 +++++
 3 files changed, 27 insertions(+), 19 deletions(-)

diff --git a/helix-core/src/main/java/org/apache/helix/customizedstate/CustomizedStateProvider.java b/helix-core/src/main/java/org/apache/helix/customizedstate/CustomizedStateProvider.java
index 0abf4a1..8b25fbc 100644
--- a/helix-core/src/main/java/org/apache/helix/customizedstate/CustomizedStateProvider.java
+++ b/helix-core/src/main/java/org/apache/helix/customizedstate/CustomizedStateProvider.java
@@ -19,7 +19,9 @@ package org.apache.helix.customizedstate;
  * under the License.
  */
 
+import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import org.apache.helix.HelixDataAccessor;
@@ -28,7 +30,7 @@ import org.apache.helix.HelixManager;
 import org.apache.helix.PropertyKey;
 import org.apache.helix.model.CustomizedState;
 import org.apache.helix.zookeeper.datamodel.ZNRecord;
-import org.apache.helix.zookeeper.zkclient.DataUpdater;
+import org.apache.helix.zookeeper.datamodel.ZNRecordDelta;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -110,12 +112,12 @@ public class CustomizedStateProvider {
     PropertyKey propertyKey =
         keyBuilder.customizedState(_instanceName, customizedStateName, resourceName);
     CustomizedState existingState = getCustomizedState(customizedStateName, resourceName);
-    _helixDataAccessor.updateProperty(propertyKey, new DataUpdater<ZNRecord>() {
-      @Override
-      public ZNRecord update(ZNRecord current) {
-        current.getMapFields().remove(partitionName);
-        return current;
-      }
-    }, existingState);
+    ZNRecord rec = new ZNRecord(existingState.getId());
+    rec.getMapFields().put(partitionName, null);
+    ZNRecordDelta delta = new ZNRecordDelta(rec, ZNRecordDelta.MergeOperation.SUBTRACT);
+    List<ZNRecordDelta> deltaList = new ArrayList<ZNRecordDelta>();
+    deltaList.add(delta);
+    existingState.setDeltaList(deltaList);
+    _helixDataAccessor.updateProperty(propertyKey, existingState);
   }
 }
diff --git a/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixDataAccessor.java b/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixDataAccessor.java
index d2b6077..35cc663 100644
--- a/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixDataAccessor.java
+++ b/helix-core/src/main/java/org/apache/helix/manager/zk/ZKHelixDataAccessor.java
@@ -185,17 +185,18 @@ public class ZKHelixDataAccessor implements HelixDataAccessor {
 
     boolean success = false;
     switch (type) {
-    case CURRENTSTATES:
-      success = _groupCommit.commit(_baseDataAccessor, options, path, value.getRecord(), true);
-      break;
-    case STATUSUPDATES:
-      if (LOG.isTraceEnabled()) {
-        LOG.trace("Update status. path: " + key.getPath() + ", record: " + value.getRecord());
-      }
-      break;
-    default:
-      success = _baseDataAccessor.update(path, updater, options);
-      break;
+      case CURRENTSTATES:
+      case CUSTOMIZEDSTATES:
+        success = _groupCommit.commit(_baseDataAccessor, options, path, value.getRecord(), true);
+        break;
+      case STATUSUPDATES:
+        if (LOG.isTraceEnabled()) {
+          LOG.trace("Update status. path: " + key.getPath() + ", record: " + value.getRecord());
+        }
+        break;
+      default:
+        success = _baseDataAccessor.update(path, updater, options);
+        break;
     }
     return success;
   }
diff --git a/helix-core/src/test/java/org/apache/helix/integration/paticipant/TestCustomizedStateUpdate.java b/helix-core/src/test/java/org/apache/helix/integration/paticipant/TestCustomizedStateUpdate.java
index ed1338a..c9b741c 100644
--- a/helix-core/src/test/java/org/apache/helix/integration/paticipant/TestCustomizedStateUpdate.java
+++ b/helix-core/src/test/java/org/apache/helix/integration/paticipant/TestCustomizedStateUpdate.java
@@ -161,6 +161,11 @@ public class TestCustomizedStateUpdate extends ZkStandAloneCMTestBase {
     mapView = customizedState.getRecord().getMapFields();
     Assert.assertEquals(mapView.keySet().size(), 1);
     Assert.assertEquals(mapView.keySet().iterator().next(), PARTITION_NAME2);
+
+    _mockProvider
+        .deletePerPartitionCustomizedState(CUSTOMIZE_STATE_NAME, RESOURCE_NAME, PARTITION_NAME2);
+    customizedState = _mockProvider.getCustomizedState(CUSTOMIZE_STATE_NAME, RESOURCE_NAME);
+    Assert.assertNull(customizedState);
   }
 
   @Test