Committed by
Gerrit Code Review
ONOS-4018 - Enhance the DistributedRegionStore to make sure that a
device ID appears in at most one Region's list of devices. Change-Id: I6d30fab2c09544c68f49b11682f08ee8ded060fe
Showing
2 changed files
with
19 additions
and
0 deletions
| ... | @@ -169,6 +169,16 @@ public class DistributedRegionStore | ... | @@ -169,6 +169,16 @@ public class DistributedRegionStore |
| 169 | 169 | ||
| 170 | @Override | 170 | @Override |
| 171 | public void addDevices(RegionId regionId, Collection<DeviceId> deviceIds) { | 171 | public void addDevices(RegionId regionId, Collection<DeviceId> deviceIds) { |
| 172 | + // Devices can only be a member in one region. Remove the device if it belongs to | ||
| 173 | + // a different region than the region for which we are attempting to add it. | ||
| 174 | + for (DeviceId deviceId : deviceIds) { | ||
| 175 | + Region region = getRegionForDevice(deviceId); | ||
| 176 | + if ((region != null) && (!regionId.id().equals(region.id().id()))) { | ||
| 177 | + Set<DeviceId> deviceIdSet1 = ImmutableSet.of(deviceId); | ||
| 178 | + removeDevices(region.id(), deviceIdSet1); | ||
| 179 | + } | ||
| 180 | + } | ||
| 181 | + | ||
| 172 | membershipRepo.compute(regionId, (id, existingDevices) -> { | 182 | membershipRepo.compute(regionId, (id, existingDevices) -> { |
| 173 | if (existingDevices == null) { | 183 | if (existingDevices == null) { |
| 174 | return ImmutableSet.copyOf(deviceIds); | 184 | return ImmutableSet.copyOf(deviceIds); | ... | ... |
| ... | @@ -137,6 +137,15 @@ public class DistributedRegionStoreTest { | ... | @@ -137,6 +137,15 @@ public class DistributedRegionStoreTest { |
| 137 | deviceIds = store.getRegionDevices(RID1); | 137 | deviceIds = store.getRegionDevices(RID1); |
| 138 | assertEquals("incorrect device count", 3, deviceIds.size()); | 138 | assertEquals("incorrect device count", 3, deviceIds.size()); |
| 139 | 139 | ||
| 140 | + // Test adding DID3 to RID2 but it is already in RID1. | ||
| 141 | + // DID3 will be removed from RID1 and added to RID2. | ||
| 142 | + Region r2 = store.createRegion(RID2, "R2", CAMPUS, MASTERS); | ||
| 143 | + store.addDevices(RID2, ImmutableSet.of(DID3)); | ||
| 144 | + deviceIds = store.getRegionDevices(RID1); | ||
| 145 | + assertEquals("incorrect device count", 2, deviceIds.size()); | ||
| 146 | + deviceIds = store.getRegionDevices(RID2); | ||
| 147 | + assertEquals("incorrect device count", 1, deviceIds.size()); | ||
| 148 | + | ||
| 140 | store.removeDevices(RID1, ImmutableSet.of(DID2, DID3)); | 149 | store.removeDevices(RID1, ImmutableSet.of(DID2, DID3)); |
| 141 | deviceIds = store.getRegionDevices(RID1); | 150 | deviceIds = store.getRegionDevices(RID1); |
| 142 | assertEquals("incorrect device count", 1, deviceIds.size()); | 151 | assertEquals("incorrect device count", 1, deviceIds.size()); | ... | ... |
-
Please register or login to post a comment