Skip to content

Commit 39325a2

Browse files
committed
add resource
1 parent 6ddbf7d commit 39325a2

3 files changed

Lines changed: 71 additions & 41 deletions

File tree

helix-gateway/src/main/java/org/apache/helix/gateway/service/GatewayServiceManager.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ public void run() {
137137
}
138138
}
139139

140-
141140
public void startService() throws IOException {
142141
_gatewayServiceChannel.start();
143142
}
@@ -149,10 +148,6 @@ public void stopService() {
149148
_helixGatewayParticipantMap.clear();
150149
}
151150

152-
public GatewayCurrentStateCache getCurrentStateCache(String clusterName) {
153-
return _currentStateCacheMap.computeIfAbsent(clusterName, k -> new GatewayCurrentStateCache(clusterName));
154-
}
155-
156151
private void createHelixGatewayParticipant(String clusterName, String instanceName,
157152
Map<String, Map<String, String>> initialShardStateMap) {
158153
// Create and add the participant to the participant map

helix-gateway/src/main/java/org/apache/helix/gateway/util/GatewayCurrentStateCache.java

Lines changed: 21 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,20 @@ public class GatewayCurrentStateCache {
4040
// instance -> resource state (resource -> shard -> target state)
4141
Map<String, ShardStateMap> _targetStateMap;
4242

43-
boolean _targetStateChanged = false;
44-
final Object _targetStateLock;
45-
4643
public GatewayCurrentStateCache(String clusterName) {
4744
_clusterName = clusterName;
4845
_currentStateMap = new HashMap<>();
4946
_targetStateMap = new HashMap<>();
50-
_targetStateLock = new Object();
5147
}
5248

5349
public String getCurrentState(String instance, String resource, String shard) {
5450
return _currentStateMap.get(instance).getState(resource, shard);
5551
}
5652

53+
public String getTargetState(String instance, String resource, String shard) {
54+
return _targetStateMap.get(instance).getState(resource, shard);
55+
}
56+
5757
/**
5858
* Update the cached current state of instances in a cluster, and return the diff of the change.
5959
* @param newCurrentStateMap The new current state map of instances in the cluster
@@ -62,7 +62,7 @@ public String getCurrentState(String instance, String resource, String shard) {
6262
public Map<String, Map<String, Map<String, String>>> updateCacheWithNewCurrentStateAndGetDiff(
6363
Map<String, Map<String, Map<String, String>>> newCurrentStateMap) {
6464
Map<String, Map<String, Map<String, String>>> diff = new HashMap<>();
65-
for(String instance : newCurrentStateMap.keySet()) {
65+
for (String instance : newCurrentStateMap.keySet()) {
6666
Map<String, Map<String, String>> newCurrentState = newCurrentStateMap.get(instance);
6767
diff.put(instance, _currentStateMap.computeIfAbsent(instance, k -> new ShardStateMap(new HashMap<>()))
6868
.updateMapAndGetDiff(newCurrentState));
@@ -89,50 +89,40 @@ public void updateCacheWithCurrentStateDiff(Map<String, Map<String, Map<String,
8989
* @param targetStateChangeMap
9090
*/
9191
public void updateTargetStateWithDiff(String instance, Map<String, Map<String, String>> targetStateChangeMap) {
92-
synchronized (_targetStateLock) {
93-
_targetStateChanged = _targetStateMap.get(instance).updateShardStateMapWithDiff(targetStateChangeMap);
94-
}
92+
_targetStateMap.computeIfAbsent(instance, k -> new ShardStateMap(new HashMap<>()))
93+
.updateShardStateMapWithDiff(targetStateChangeMap);
9594
}
9695

9796
/**
98-
* Get the target state map if it has changed since last time and reset the _targetStateChanged flag in.
99-
* @return The target state map if it has changed, otherwise return null.
100-
*/
101-
public Map<String, ShardStateMap> getTargetStateMapIfChanged() {
102-
synchronized (_targetStateLock) {
103-
if (_targetStateChanged) {
104-
_targetStateChanged = false;
105-
return _targetStateMap;
106-
}
107-
return null;
108-
}
109-
}
110-
111-
/**
112-
* Serialize the target state assignments to a JSON string.
97+
* Serialize the target state assignments to a JSON Node.
11398
* example : {"instance1":{"resource1":{"shard1":"ONLINE","shard2":"OFFLINE"}}}}
11499
*/
115-
public String serializeTargetAssignments() {
100+
public ObjectNode serializeTargetAssignmentsToJSON() {
116101
ObjectNode root = mapper.createObjectNode();
117102
for (Map.Entry<String, ShardStateMap> entry : _targetStateMap.entrySet()) {
118-
root.set(entry.getKey(), entry.getValue().serialize());
103+
root.set(entry.getKey(), entry.getValue().toJSONNode());
119104
}
120-
return root.toString();
105+
return root;
121106
}
122107

123-
124108
public class ShardStateMap {
125109
Map<String, Map<String, String>> _stateMap;
110+
126111
public ShardStateMap(Map<String, Map<String, String>> stateMap) {
127112
_stateMap = stateMap;
128113
}
114+
129115
public String getState(String instance, String shard) {
130116
return _stateMap.get(instance).get(shard);
131117
}
132118

133-
private boolean updateShardStateMapWithDiff(Map<String, Map<String, String>> diffMap) {
119+
private Map<String, Map<String, String>> getShardStateMap() {
120+
return _stateMap;
121+
}
122+
123+
private void updateShardStateMapWithDiff(Map<String, Map<String, String>> diffMap) {
134124
if (diffMap == null || diffMap.isEmpty()) {
135-
return false;
125+
return;
136126
}
137127
for (Map.Entry<String, Map<String, String>> diffEntry : diffMap.entrySet()) {
138128
String resource = diffEntry.getKey();
@@ -148,11 +138,9 @@ private boolean updateShardStateMapWithDiff(Map<String, Map<String, String>> dif
148138
_stateMap.put(resource, diffCurrentState);
149139
}
150140
}
151-
return true;
152141
}
153142

154-
private Map<String, Map<String, String>> updateMapAndGetDiff(
155-
Map<String, Map<String, String>> newCurrentStateMap) {
143+
private Map<String, Map<String, String>> updateMapAndGetDiff(Map<String, Map<String, String>> newCurrentStateMap) {
156144
Map<String, Map<String, String>> diff = new HashMap<>();
157145
for (Map.Entry<String, Map<String, String>> entry : newCurrentStateMap.entrySet()) {
158146
String instance = entry.getKey();
@@ -178,7 +166,7 @@ private Map<String, Map<String, String>> updateMapAndGetDiff(
178166
* Serialize the shard state map to a JSON object.
179167
* @return a JSON object representing the shard state map. Example: {"shard1":"ONLINE","shard2":"OFFLINE"}
180168
*/
181-
public ObjectNode serialize() {
169+
public ObjectNode toJSONNode() {
182170
ObjectNode root = mapper.createObjectNode();
183171
for (Map.Entry<String, Map<String, String>> entry : _stateMap.entrySet()) {
184172
String resource = entry.getKey();
@@ -190,7 +178,5 @@ public ObjectNode serialize() {
190178
}
191179
return root;
192180
}
193-
194181
}
195182
}
196-

helix-gateway/src/test/java/org/apache/helix/gateway/utils/TestGatewayCurrentStateCache.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,60 @@
2323
import java.util.Map;
2424
import org.apache.helix.gateway.util.GatewayCurrentStateCache;
2525
import org.testng.Assert;
26+
import org.testng.annotations.BeforeMethod;
2627
import org.testng.annotations.Test;
2728

2829

2930
public class TestGatewayCurrentStateCache {
30-
private GatewayCurrentStateCache cache = new GatewayCurrentStateCache("TestCluster");;
31+
private GatewayCurrentStateCache cache;
3132

33+
@BeforeMethod
34+
public void setUp() {
35+
cache = new GatewayCurrentStateCache("TestCluster");
36+
}
3237

38+
@Test
39+
public void testUpdateCacheWithNewCurrentStateAndGetDiff() {
40+
Map<String, Map<String, Map<String, String>>> newState = new HashMap<>();
41+
Map<String, Map<String, String>> instanceState = new HashMap<>();
42+
Map<String, String> shardState = new HashMap<>();
43+
shardState.put("shard1", "ONLINE");
44+
instanceState.put("resource1", shardState);
45+
newState.put("instance1", instanceState);
46+
47+
Map<String, Map<String, Map<String, String>>> diff = cache.updateCacheWithNewCurrentStateAndGetDiff(newState);
48+
49+
Assert.assertNotNull(diff);
50+
Assert.assertEquals(diff.size(), 1);
51+
Assert.assertEquals(diff.get("instance1").get("resource1").get("shard1"), "ONLINE");
52+
}
53+
54+
@Test
55+
public void testUpdateCacheWithCurrentStateDiff() {
56+
Map<String, Map<String, Map<String, String>>> diff = new HashMap<>();
57+
Map<String, Map<String, String>> instanceState = new HashMap<>();
58+
Map<String, String> shardState = new HashMap<>();
59+
shardState.put("shard2", "ONLINE");
60+
shardState.put("shard1", "ONLINE");
61+
instanceState.put("resource1", shardState);
62+
diff.put("instance1", instanceState);
63+
64+
cache.updateCacheWithCurrentStateDiff(diff);
65+
66+
Assert.assertEquals(cache.getCurrentState("instance1", "resource1", "shard1"), "ONLINE");
67+
Assert.assertEquals(cache.getCurrentState("instance1", "resource1", "shard2"), "ONLINE");
68+
}
69+
70+
@Test
71+
public void testUpdateTargetStateWithDiff() {
72+
Map<String, Map<String, String>> targetStateChange = new HashMap<>();
73+
Map<String, String> shardState = new HashMap<>();
74+
shardState.put("shard1", "OFFLINE");
75+
targetStateChange.put("resource1", shardState);
76+
77+
cache.updateTargetStateWithDiff("instance1", targetStateChange);
78+
79+
Assert.assertEquals(cache.getTargetState("instance1", "resource1", "shard1"), "OFFLINE");
80+
Assert.assertEquals(cache.serializeTargetAssignmentsToJSON().toString(), "{\"instance1\":{\"resource1\":{\"shard1\":\"OFFLINE\"}}}");
81+
}
3382
}

0 commit comments

Comments
 (0)