Madan Jampani
Committed by Gerrit Code Review

Moving group store to consistent map

Change-Id: Id3c23c0cd9d7c713bceffc7bd9125aa3de99c45e
...@@ -56,11 +56,12 @@ import org.onosproject.store.AbstractStore; ...@@ -56,11 +56,12 @@ import org.onosproject.store.AbstractStore;
56 import org.onosproject.store.cluster.messaging.ClusterCommunicationService; 56 import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
57 import org.onosproject.store.service.MultiValuedTimestamp; 57 import org.onosproject.store.service.MultiValuedTimestamp;
58 import org.onosproject.store.serializers.KryoNamespaces; 58 import org.onosproject.store.serializers.KryoNamespaces;
59 -import org.onosproject.store.service.EventuallyConsistentMap; 59 +import org.onosproject.store.service.ConsistentMap;
60 -import org.onosproject.store.service.EventuallyConsistentMapBuilder; 60 +import org.onosproject.store.service.MapEvent;
61 -import org.onosproject.store.service.EventuallyConsistentMapEvent; 61 +import org.onosproject.store.service.MapEventListener;
62 -import org.onosproject.store.service.EventuallyConsistentMapListener; 62 +import org.onosproject.store.service.Serializer;
63 import org.onosproject.store.service.StorageService; 63 import org.onosproject.store.service.StorageService;
64 +import org.onosproject.store.service.Versioned;
64 import org.slf4j.Logger; 65 import org.slf4j.Logger;
65 66
66 import java.util.ArrayList; 67 import java.util.ArrayList;
...@@ -70,6 +71,7 @@ import java.util.HashMap; ...@@ -70,6 +71,7 @@ import java.util.HashMap;
70 import java.util.HashSet; 71 import java.util.HashSet;
71 import java.util.Iterator; 72 import java.util.Iterator;
72 import java.util.List; 73 import java.util.List;
74 +import java.util.Map;
73 import java.util.Map.Entry; 75 import java.util.Map.Entry;
74 import java.util.Objects; 76 import java.util.Objects;
75 import java.util.Optional; 77 import java.util.Optional;
...@@ -79,7 +81,6 @@ import java.util.concurrent.ConcurrentMap; ...@@ -79,7 +81,6 @@ import java.util.concurrent.ConcurrentMap;
79 import java.util.concurrent.ExecutorService; 81 import java.util.concurrent.ExecutorService;
80 import java.util.concurrent.Executors; 82 import java.util.concurrent.Executors;
81 import java.util.concurrent.atomic.AtomicInteger; 83 import java.util.concurrent.atomic.AtomicInteger;
82 -import java.util.concurrent.atomic.AtomicLong;
83 import java.util.stream.Collectors; 84 import java.util.stream.Collectors;
84 85
85 import static org.apache.commons.lang3.concurrent.ConcurrentUtils.createIfAbsentUnchecked; 86 import static org.apache.commons.lang3.concurrent.ConcurrentUtils.createIfAbsentUnchecked;
...@@ -113,12 +114,12 @@ public class DistributedGroupStore ...@@ -113,12 +114,12 @@ public class DistributedGroupStore
113 protected MastershipService mastershipService; 114 protected MastershipService mastershipService;
114 115
115 // Per device group table with (device id + app cookie) as key 116 // Per device group table with (device id + app cookie) as key
116 - private EventuallyConsistentMap<GroupStoreKeyMapKey, 117 + private ConsistentMap<GroupStoreKeyMapKey,
117 StoredGroupEntry> groupStoreEntriesByKey = null; 118 StoredGroupEntry> groupStoreEntriesByKey = null;
118 // Per device group table with (device id + group id) as key 119 // Per device group table with (device id + group id) as key
119 private final ConcurrentMap<DeviceId, ConcurrentMap<GroupId, StoredGroupEntry>> 120 private final ConcurrentMap<DeviceId, ConcurrentMap<GroupId, StoredGroupEntry>>
120 groupEntriesById = new ConcurrentHashMap<>(); 121 groupEntriesById = new ConcurrentHashMap<>();
121 - private EventuallyConsistentMap<GroupStoreKeyMapKey, 122 + private ConsistentMap<GroupStoreKeyMapKey,
122 StoredGroupEntry> auditPendingReqQueue = null; 123 StoredGroupEntry> auditPendingReqQueue = null;
123 private final ConcurrentMap<DeviceId, ConcurrentMap<GroupId, Group>> 124 private final ConcurrentMap<DeviceId, ConcurrentMap<GroupId, Group>>
124 extraneousGroupEntriesById = new ConcurrentHashMap<>(); 125 extraneousGroupEntriesById = new ConcurrentHashMap<>();
...@@ -131,8 +132,6 @@ public class DistributedGroupStore ...@@ -131,8 +132,6 @@ public class DistributedGroupStore
131 132
132 private KryoNamespace.Builder kryoBuilder = null; 133 private KryoNamespace.Builder kryoBuilder = null;
133 134
134 - private final AtomicLong sequenceNumber = new AtomicLong(0);
135 -
136 private KryoNamespace clusterMsgSerializer; 135 private KryoNamespace clusterMsgSerializer;
137 136
138 @Activate 137 @Activate
...@@ -169,29 +168,21 @@ public class DistributedGroupStore ...@@ -169,29 +168,21 @@ public class DistributedGroupStore
169 this::process, 168 this::process,
170 messageHandlingExecutor); 169 messageHandlingExecutor);
171 170
172 - log.debug("Creating EC map groupstorekeymap"); 171 + log.debug("Creating Consistent map onos-group-store-keymap");
173 - EventuallyConsistentMapBuilder<GroupStoreKeyMapKey, StoredGroupEntry>
174 - keyMapBuilder = storageService.eventuallyConsistentMapBuilder();
175 172
176 - groupStoreEntriesByKey = keyMapBuilder 173 + groupStoreEntriesByKey = storageService.<GroupStoreKeyMapKey, StoredGroupEntry>consistentMapBuilder()
177 - .withName("groupstorekeymap") 174 + .withName("onos-group-store-keymap")
178 - .withSerializer(kryoBuilder) 175 + .withSerializer(Serializer.using(kryoBuilder.build()))
179 - .withTimestampProvider((k, v) -> new MultiValuedTimestamp<>(System.currentTimeMillis(),
180 - sequenceNumber.getAndIncrement()))
181 .build(); 176 .build();
182 groupStoreEntriesByKey.addListener(new GroupStoreKeyMapListener()); 177 groupStoreEntriesByKey.addListener(new GroupStoreKeyMapListener());
183 log.debug("Current size of groupstorekeymap:{}", 178 log.debug("Current size of groupstorekeymap:{}",
184 groupStoreEntriesByKey.size()); 179 groupStoreEntriesByKey.size());
185 180
186 - log.debug("Creating EC map pendinggroupkeymap"); 181 + log.debug("Creating Consistent map pendinggroupkeymap");
187 - EventuallyConsistentMapBuilder<GroupStoreKeyMapKey, StoredGroupEntry>
188 - auditMapBuilder = storageService.eventuallyConsistentMapBuilder();
189 182
190 - auditPendingReqQueue = auditMapBuilder 183 + auditPendingReqQueue = storageService.<GroupStoreKeyMapKey, StoredGroupEntry>consistentMapBuilder()
191 - .withName("pendinggroupkeymap") 184 + .withName("onos-pending-group-keymap")
192 - .withSerializer(kryoBuilder) 185 + .withSerializer(Serializer.using(kryoBuilder.build()))
193 - .withTimestampProvider((k, v) -> new MultiValuedTimestamp<>(System.currentTimeMillis(),
194 - sequenceNumber.getAndIncrement()))
195 .build(); 186 .build();
196 log.debug("Current size of pendinggroupkeymap:{}", 187 log.debug("Current size of pendinggroupkeymap:{}",
197 auditPendingReqQueue.size()); 188 auditPendingReqQueue.size());
...@@ -222,9 +213,9 @@ public class DistributedGroupStore ...@@ -222,9 +213,9 @@ public class DistributedGroupStore
222 * 213 *
223 * @return Map representing group key table. 214 * @return Map representing group key table.
224 */ 215 */
225 - private EventuallyConsistentMap<GroupStoreKeyMapKey, StoredGroupEntry> 216 + private Map<GroupStoreKeyMapKey, StoredGroupEntry>
226 getGroupStoreKeyMap() { 217 getGroupStoreKeyMap() {
227 - return groupStoreEntriesByKey; 218 + return groupStoreEntriesByKey.asJavaMap();
228 } 219 }
229 220
230 /** 221 /**
...@@ -243,9 +234,9 @@ public class DistributedGroupStore ...@@ -243,9 +234,9 @@ public class DistributedGroupStore
243 * 234 *
244 * @return Map representing group key table. 235 * @return Map representing group key table.
245 */ 236 */
246 - private EventuallyConsistentMap<GroupStoreKeyMapKey, StoredGroupEntry> 237 + private Map<GroupStoreKeyMapKey, StoredGroupEntry>
247 getPendingGroupKeyTable() { 238 getPendingGroupKeyTable() {
248 - return auditPendingReqQueue; 239 + return auditPendingReqQueue.asJavaMap();
249 } 240 }
250 241
251 /** 242 /**
...@@ -445,7 +436,7 @@ public class DistributedGroupStore ...@@ -445,7 +436,7 @@ public class DistributedGroupStore
445 groupDesc.deviceId()); 436 groupDesc.deviceId());
446 StoredGroupEntry group = new DefaultGroup(dummyGroupId, groupDesc); 437 StoredGroupEntry group = new DefaultGroup(dummyGroupId, groupDesc);
447 group.setState(GroupState.WAITING_AUDIT_COMPLETE); 438 group.setState(GroupState.WAITING_AUDIT_COMPLETE);
448 - EventuallyConsistentMap<GroupStoreKeyMapKey, StoredGroupEntry> pendingKeyTable = 439 + Map<GroupStoreKeyMapKey, StoredGroupEntry> pendingKeyTable =
449 getPendingGroupKeyTable(); 440 getPendingGroupKeyTable();
450 pendingKeyTable.put(new GroupStoreKeyMapKey(groupDesc.deviceId(), 441 pendingKeyTable.put(new GroupStoreKeyMapKey(groupDesc.deviceId(),
451 groupDesc.appCookie()), 442 groupDesc.appCookie()),
...@@ -851,7 +842,7 @@ public class DistributedGroupStore ...@@ -851,7 +842,7 @@ public class DistributedGroupStore
851 Set<Entry<GroupStoreKeyMapKey, StoredGroupEntry>> entryPendingRemove = 842 Set<Entry<GroupStoreKeyMapKey, StoredGroupEntry>> entryPendingRemove =
852 new HashSet<>(); 843 new HashSet<>();
853 844
854 - groupStoreEntriesByKey.entrySet().stream() 845 + getGroupStoreKeyMap().entrySet().stream()
855 .filter(entry -> entry.getKey().deviceId().equals(deviceId)) 846 .filter(entry -> entry.getKey().deviceId().equals(deviceId))
856 .forEach(entryPendingRemove::add); 847 .forEach(entryPendingRemove::add);
857 848
...@@ -987,14 +978,13 @@ public class DistributedGroupStore ...@@ -987,14 +978,13 @@ public class DistributedGroupStore
987 * Map handler to receive any events when the group key map is updated. 978 * Map handler to receive any events when the group key map is updated.
988 */ 979 */
989 private class GroupStoreKeyMapListener implements 980 private class GroupStoreKeyMapListener implements
990 - EventuallyConsistentMapListener<GroupStoreKeyMapKey, StoredGroupEntry> { 981 + MapEventListener<GroupStoreKeyMapKey, StoredGroupEntry> {
991 982
992 @Override 983 @Override
993 - public void event(EventuallyConsistentMapEvent<GroupStoreKeyMapKey, 984 + public void event(MapEvent<GroupStoreKeyMapKey, StoredGroupEntry> mapEvent) {
994 - StoredGroupEntry> mapEvent) {
995 GroupEvent groupEvent = null; 985 GroupEvent groupEvent = null;
996 GroupStoreKeyMapKey key = mapEvent.key(); 986 GroupStoreKeyMapKey key = mapEvent.key();
997 - StoredGroupEntry group = mapEvent.value(); 987 + StoredGroupEntry group = Versioned.valueOrNull(mapEvent.newValue());
998 if ((key == null) && (group == null)) { 988 if ((key == null) && (group == null)) {
999 log.error("GroupStoreKeyMapListener: Received " 989 log.error("GroupStoreKeyMapListener: Received "
1000 + "event {} with null entry", mapEvent.type()); 990 + "event {} with null entry", mapEvent.type());
...@@ -1014,25 +1004,24 @@ public class DistributedGroupStore ...@@ -1014,25 +1004,24 @@ public class DistributedGroupStore
1014 mapEvent.type(), 1004 mapEvent.type(),
1015 group.id(), 1005 group.id(),
1016 key.deviceId()); 1006 key.deviceId());
1017 - if (mapEvent.type() == EventuallyConsistentMapEvent.Type.PUT) { 1007 + if (mapEvent.type() == MapEvent.Type.INSERT || mapEvent.type() == MapEvent.Type.UPDATE) {
1018 // Update the group ID table 1008 // Update the group ID table
1019 getGroupIdTable(group.deviceId()).put(group.id(), group); 1009 getGroupIdTable(group.deviceId()).put(group.id(), group);
1020 - if (mapEvent.value().state() == Group.GroupState.ADDED) { 1010 + StoredGroupEntry value = Versioned.valueOrNull(mapEvent.newValue());
1021 - if (mapEvent.value().isGroupStateAddedFirstTime()) { 1011 + if (value.state() == Group.GroupState.ADDED) {
1022 - groupEvent = new GroupEvent(Type.GROUP_ADDED, 1012 + if (value.isGroupStateAddedFirstTime()) {
1023 - mapEvent.value()); 1013 + groupEvent = new GroupEvent(Type.GROUP_ADDED, value);
1024 log.trace("Received first time GROUP_ADDED state update for id {} in device {}", 1014 log.trace("Received first time GROUP_ADDED state update for id {} in device {}",
1025 group.id(), 1015 group.id(),
1026 group.deviceId()); 1016 group.deviceId());
1027 } else { 1017 } else {
1028 - groupEvent = new GroupEvent(Type.GROUP_UPDATED, 1018 + groupEvent = new GroupEvent(Type.GROUP_UPDATED, value);
1029 - mapEvent.value());
1030 log.trace("Received following GROUP_ADDED state update for id {} in device {}", 1019 log.trace("Received following GROUP_ADDED state update for id {} in device {}",
1031 group.id(), 1020 group.id(),
1032 group.deviceId()); 1021 group.deviceId());
1033 } 1022 }
1034 } 1023 }
1035 - } else if (mapEvent.type() == EventuallyConsistentMapEvent.Type.REMOVE) { 1024 + } else if (mapEvent.type() == MapEvent.Type.REMOVE) {
1036 groupEvent = new GroupEvent(Type.GROUP_REMOVED, group); 1025 groupEvent = new GroupEvent(Type.GROUP_REMOVED, group);
1037 // Remove the entry from the group ID table 1026 // Remove the entry from the group ID table
1038 getGroupIdTable(group.deviceId()).remove(group.id(), group); 1027 getGroupIdTable(group.deviceId()).remove(group.id(), group);
......
...@@ -46,7 +46,7 @@ import org.onosproject.net.group.GroupOperation; ...@@ -46,7 +46,7 @@ import org.onosproject.net.group.GroupOperation;
46 import org.onosproject.net.group.GroupStore; 46 import org.onosproject.net.group.GroupStore;
47 import org.onosproject.net.group.GroupStoreDelegate; 47 import org.onosproject.net.group.GroupStoreDelegate;
48 import org.onosproject.store.cluster.messaging.ClusterCommunicationServiceAdapter; 48 import org.onosproject.store.cluster.messaging.ClusterCommunicationServiceAdapter;
49 -import org.onosproject.store.service.EventuallyConsistentMap; 49 +import org.onosproject.store.service.ConsistentMap;
50 import org.onosproject.store.service.TestStorageService; 50 import org.onosproject.store.service.TestStorageService;
51 51
52 import com.google.common.collect.ImmutableList; 52 import com.google.common.collect.ImmutableList;
...@@ -109,7 +109,7 @@ public class DistributedGroupStoreTest { ...@@ -109,7 +109,7 @@ public class DistributedGroupStoreTest {
109 109
110 DistributedGroupStore groupStoreImpl; 110 DistributedGroupStore groupStoreImpl;
111 GroupStore groupStore; 111 GroupStore groupStore;
112 - EventuallyConsistentMap auditPendingReqQueue; 112 + ConsistentMap auditPendingReqQueue;
113 113
114 static class MasterOfAll extends MastershipServiceAdapter { 114 static class MasterOfAll extends MastershipServiceAdapter {
115 @Override 115 @Override
......