Committed by
Pavlin Radoslavov
ONOS-944: Implemented a Group operation failure handler in GroupManger and SimpleGroupStore.
Change-Id: Ib3be4d534ceff04af2dad0c062fd4cd63d49ee82
Showing
9 changed files
with
260 additions
and
11 deletions
| ... | @@ -41,6 +41,21 @@ public class GroupEvent extends AbstractEvent<GroupEvent.Type, Group> { | ... | @@ -41,6 +41,21 @@ public class GroupEvent extends AbstractEvent<GroupEvent.Type, Group> { |
| 41 | */ | 41 | */ |
| 42 | GROUP_UPDATED, | 42 | GROUP_UPDATED, |
| 43 | 43 | ||
| 44 | + /** | ||
| 45 | + * Signifies that a request to create Group has failed. | ||
| 46 | + */ | ||
| 47 | + GROUP_ADD_FAILED, | ||
| 48 | + | ||
| 49 | + /** | ||
| 50 | + * Signifies that a request to remove Group has failed. | ||
| 51 | + */ | ||
| 52 | + GROUP_REMOVE_FAILED, | ||
| 53 | + | ||
| 54 | + /** | ||
| 55 | + * Signifies that a request to update Group has failed. | ||
| 56 | + */ | ||
| 57 | + GROUP_UPDATE_FAILED, | ||
| 58 | + | ||
| 44 | // internal event between Manager <-> Store | 59 | // internal event between Manager <-> Store |
| 45 | 60 | ||
| 46 | /* | 61 | /* |
| ... | @@ -55,6 +70,8 @@ public class GroupEvent extends AbstractEvent<GroupEvent.Type, Group> { | ... | @@ -55,6 +70,8 @@ public class GroupEvent extends AbstractEvent<GroupEvent.Type, Group> { |
| 55 | * Signifies that a request to delete Group has been added to the store. | 70 | * Signifies that a request to delete Group has been added to the store. |
| 56 | */ | 71 | */ |
| 57 | GROUP_REMOVE_REQUESTED, | 72 | GROUP_REMOVE_REQUESTED, |
| 73 | + | ||
| 74 | + | ||
| 58 | } | 75 | } |
| 59 | 76 | ||
| 60 | /** | 77 | /** | ... | ... |
| ... | @@ -29,9 +29,10 @@ public interface GroupProviderService extends ProviderService<GroupProvider> { | ... | @@ -29,9 +29,10 @@ public interface GroupProviderService extends ProviderService<GroupProvider> { |
| 29 | /** | 29 | /** |
| 30 | * Notifies core if any failure from data plane during group operations. | 30 | * Notifies core if any failure from data plane during group operations. |
| 31 | * | 31 | * |
| 32 | + * @param deviceId the device ID | ||
| 32 | * @param operation offended group operation | 33 | * @param operation offended group operation |
| 33 | */ | 34 | */ |
| 34 | - void groupOperationFailed(GroupOperation operation); | 35 | + void groupOperationFailed(DeviceId deviceId, GroupOperation operation); |
| 35 | 36 | ||
| 36 | /** | 37 | /** |
| 37 | * Pushes the collection of group detected in the data plane along | 38 | * Pushes the collection of group detected in the data plane along | ... | ... |
| ... | @@ -143,4 +143,12 @@ public interface GroupStore extends Store<GroupEvent, GroupStoreDelegate> { | ... | @@ -143,4 +143,12 @@ public interface GroupStore extends Store<GroupEvent, GroupStoreDelegate> { |
| 143 | * @return initial group audit status | 143 | * @return initial group audit status |
| 144 | */ | 144 | */ |
| 145 | boolean deviceInitialAuditStatus(DeviceId deviceId); | 145 | boolean deviceInitialAuditStatus(DeviceId deviceId); |
| 146 | + | ||
| 147 | + /** | ||
| 148 | + * Indicates the group operations failed. | ||
| 149 | + * | ||
| 150 | + * @param deviceId the device ID | ||
| 151 | + * @param operation the group operation failed | ||
| 152 | + */ | ||
| 153 | + void groupOperationFailed(DeviceId deviceId, GroupOperation operation); | ||
| 146 | } | 154 | } | ... | ... |
| ... | @@ -263,6 +263,9 @@ public class GroupManager | ... | @@ -263,6 +263,9 @@ public class GroupManager |
| 263 | case GROUP_ADDED: | 263 | case GROUP_ADDED: |
| 264 | case GROUP_UPDATED: | 264 | case GROUP_UPDATED: |
| 265 | case GROUP_REMOVED: | 265 | case GROUP_REMOVED: |
| 266 | + case GROUP_ADD_FAILED: | ||
| 267 | + case GROUP_UPDATE_FAILED: | ||
| 268 | + case GROUP_REMOVE_FAILED: | ||
| 266 | eventDispatcher.post(event); | 269 | eventDispatcher.post(event); |
| 267 | break; | 270 | break; |
| 268 | 271 | ||
| ... | @@ -281,9 +284,9 @@ public class GroupManager | ... | @@ -281,9 +284,9 @@ public class GroupManager |
| 281 | } | 284 | } |
| 282 | 285 | ||
| 283 | @Override | 286 | @Override |
| 284 | - public void groupOperationFailed(GroupOperation operation) { | 287 | + public void groupOperationFailed(DeviceId deviceId, |
| 285 | - // TODO Auto-generated method stub | 288 | + GroupOperation operation) { |
| 286 | - | 289 | + store.groupOperationFailed(deviceId, operation); |
| 287 | } | 290 | } |
| 288 | 291 | ||
| 289 | private void groupMissing(Group group) { | 292 | private void groupMissing(Group group) { | ... | ... |
| ... | @@ -15,11 +15,6 @@ | ... | @@ -15,11 +15,6 @@ |
| 15 | */ | 15 | */ |
| 16 | package org.onosproject.net.group.impl; | 16 | package org.onosproject.net.group.impl; |
| 17 | 17 | ||
| 18 | -import static org.junit.Assert.assertEquals; | ||
| 19 | -import static org.junit.Assert.assertFalse; | ||
| 20 | -import static org.junit.Assert.assertNotEquals; | ||
| 21 | -import static org.junit.Assert.assertTrue; | ||
| 22 | - | ||
| 23 | import java.util.ArrayList; | 18 | import java.util.ArrayList; |
| 24 | import java.util.Arrays; | 19 | import java.util.Arrays; |
| 25 | import java.util.Collections; | 20 | import java.util.Collections; |
| ... | @@ -61,6 +56,8 @@ import org.onosproject.store.trivial.impl.SimpleGroupStore; | ... | @@ -61,6 +56,8 @@ import org.onosproject.store.trivial.impl.SimpleGroupStore; |
| 61 | 56 | ||
| 62 | import com.google.common.collect.Iterables; | 57 | import com.google.common.collect.Iterables; |
| 63 | 58 | ||
| 59 | +import static org.junit.Assert.*; | ||
| 60 | + | ||
| 64 | /** | 61 | /** |
| 65 | * Test codifying the group service & group provider service contracts. | 62 | * Test codifying the group service & group provider service contracts. |
| 66 | */ | 63 | */ |
| ... | @@ -317,6 +314,90 @@ public class GroupManagerTest { | ... | @@ -317,6 +314,90 @@ public class GroupManagerTest { |
| 317 | internalListener.validateEvent(Arrays.asList(GroupEvent.Type.GROUP_REMOVED)); | 314 | internalListener.validateEvent(Arrays.asList(GroupEvent.Type.GROUP_REMOVED)); |
| 318 | } | 315 | } |
| 319 | 316 | ||
| 317 | + /** | ||
| 318 | + * Test GroupOperationFailure function in Group Manager. | ||
| 319 | + * a)GroupAddFailure | ||
| 320 | + * b)GroupUpdateFailure | ||
| 321 | + * c)GroupRemoteFailure | ||
| 322 | + */ | ||
| 323 | + @Test | ||
| 324 | + public void testGroupOperationFailure() { | ||
| 325 | + PortNumber[] ports1 = {PortNumber.portNumber(31), | ||
| 326 | + PortNumber.portNumber(32)}; | ||
| 327 | + PortNumber[] ports2 = {PortNumber.portNumber(41), | ||
| 328 | + PortNumber.portNumber(42)}; | ||
| 329 | + // Test Group creation before AUDIT process | ||
| 330 | + TestGroupKey key = new TestGroupKey("group1BeforeAudit"); | ||
| 331 | + List<GroupBucket> buckets = new ArrayList<GroupBucket>(); | ||
| 332 | + List<PortNumber> outPorts = new ArrayList<PortNumber>(); | ||
| 333 | + outPorts.addAll(Arrays.asList(ports1)); | ||
| 334 | + outPorts.addAll(Arrays.asList(ports2)); | ||
| 335 | + for (PortNumber portNumber: outPorts) { | ||
| 336 | + TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder(); | ||
| 337 | + tBuilder.setOutput(portNumber) | ||
| 338 | + .setEthDst(MacAddress.valueOf("00:00:00:00:00:02")) | ||
| 339 | + .setEthSrc(MacAddress.valueOf("00:00:00:00:00:01")) | ||
| 340 | + .pushMpls() | ||
| 341 | + .setMpls(106); | ||
| 342 | + buckets.add(DefaultGroupBucket.createSelectGroupBucket( | ||
| 343 | + tBuilder.build())); | ||
| 344 | + } | ||
| 345 | + GroupBuckets groupBuckets = new GroupBuckets(buckets); | ||
| 346 | + GroupDescription newGroupDesc = new DefaultGroupDescription(DID, | ||
| 347 | + Group.Type.SELECT, | ||
| 348 | + groupBuckets, | ||
| 349 | + key, | ||
| 350 | + appId); | ||
| 351 | + groupService.addGroup(newGroupDesc); | ||
| 352 | + | ||
| 353 | + // Test initial group audit process | ||
| 354 | + GroupId gId1 = new DefaultGroupId(1); | ||
| 355 | + Group group1 = createSouthboundGroupEntry(gId1, | ||
| 356 | + Arrays.asList(ports1), | ||
| 357 | + 0); | ||
| 358 | + GroupId gId2 = new DefaultGroupId(2); | ||
| 359 | + // Non zero reference count will make the group manager to queue | ||
| 360 | + // the extraneous groups until reference count is zero. | ||
| 361 | + Group group2 = createSouthboundGroupEntry(gId2, | ||
| 362 | + Arrays.asList(ports2), | ||
| 363 | + 2); | ||
| 364 | + List<Group> groupEntries = Arrays.asList(group1, group2); | ||
| 365 | + providerService.pushGroupMetrics(DID, groupEntries); | ||
| 366 | + Group createdGroup = groupService.getGroup(DID, key); | ||
| 367 | + | ||
| 368 | + // Group Add failure test | ||
| 369 | + GroupOperation groupAddOp = GroupOperation. | ||
| 370 | + createAddGroupOperation(createdGroup.id(), | ||
| 371 | + createdGroup.type(), | ||
| 372 | + createdGroup.buckets()); | ||
| 373 | + providerService.groupOperationFailed(DID, groupAddOp); | ||
| 374 | + internalListener.validateEvent(Arrays.asList(GroupEvent.Type.GROUP_ADD_FAILED)); | ||
| 375 | + | ||
| 376 | + // Group Mod failure test | ||
| 377 | + groupService.addGroup(newGroupDesc); | ||
| 378 | + createdGroup = groupService.getGroup(DID, key); | ||
| 379 | + assertNotNull(createdGroup); | ||
| 380 | + | ||
| 381 | + GroupOperation groupModOp = GroupOperation. | ||
| 382 | + createModifyGroupOperation(createdGroup.id(), | ||
| 383 | + createdGroup.type(), | ||
| 384 | + createdGroup.buckets()); | ||
| 385 | + providerService.groupOperationFailed(DID, groupModOp); | ||
| 386 | + internalListener.validateEvent(Arrays.asList(GroupEvent.Type.GROUP_UPDATE_FAILED)); | ||
| 387 | + | ||
| 388 | + // Group Delete failure test | ||
| 389 | + groupService.addGroup(newGroupDesc); | ||
| 390 | + createdGroup = groupService.getGroup(DID, key); | ||
| 391 | + assertNotNull(createdGroup); | ||
| 392 | + | ||
| 393 | + GroupOperation groupDelOp = GroupOperation. | ||
| 394 | + createDeleteGroupOperation(createdGroup.id(), | ||
| 395 | + createdGroup.type()); | ||
| 396 | + providerService.groupOperationFailed(DID, groupDelOp); | ||
| 397 | + internalListener.validateEvent(Arrays.asList(GroupEvent.Type.GROUP_REMOVE_FAILED)); | ||
| 398 | + | ||
| 399 | + } | ||
| 400 | + | ||
| 320 | private Group createSouthboundGroupEntry(GroupId gId, | 401 | private Group createSouthboundGroupEntry(GroupId gId, |
| 321 | List<PortNumber> ports, | 402 | List<PortNumber> ports, |
| 322 | long referenceCount) { | 403 | long referenceCount) { | ... | ... |
| ... | @@ -43,6 +43,7 @@ import org.onosproject.net.group.GroupDescription; | ... | @@ -43,6 +43,7 @@ import org.onosproject.net.group.GroupDescription; |
| 43 | import org.onosproject.net.group.GroupEvent; | 43 | import org.onosproject.net.group.GroupEvent; |
| 44 | import org.onosproject.net.group.GroupEvent.Type; | 44 | import org.onosproject.net.group.GroupEvent.Type; |
| 45 | import org.onosproject.net.group.GroupKey; | 45 | import org.onosproject.net.group.GroupKey; |
| 46 | +import org.onosproject.net.group.GroupOperation; | ||
| 46 | import org.onosproject.net.group.GroupStore; | 47 | import org.onosproject.net.group.GroupStore; |
| 47 | import org.onosproject.net.group.GroupStoreDelegate; | 48 | import org.onosproject.net.group.GroupStoreDelegate; |
| 48 | import org.onosproject.net.group.StoredGroupEntry; | 49 | import org.onosproject.net.group.StoredGroupEntry; |
| ... | @@ -474,6 +475,41 @@ public class SimpleGroupStore | ... | @@ -474,6 +475,41 @@ public class SimpleGroupStore |
| 474 | } | 475 | } |
| 475 | 476 | ||
| 476 | @Override | 477 | @Override |
| 478 | + public void groupOperationFailed(DeviceId deviceId, GroupOperation operation) { | ||
| 479 | + | ||
| 480 | + StoredGroupEntry existing = (groupEntriesById.get( | ||
| 481 | + deviceId) != null) ? | ||
| 482 | + groupEntriesById.get(deviceId).get(operation.groupId()) : | ||
| 483 | + null; | ||
| 484 | + | ||
| 485 | + if (existing == null) { | ||
| 486 | + log.warn("No group entry with ID {} found ", operation.groupId()); | ||
| 487 | + return; | ||
| 488 | + } | ||
| 489 | + | ||
| 490 | + switch (operation.opType()) { | ||
| 491 | + case ADD: | ||
| 492 | + notifyDelegate(new GroupEvent(Type.GROUP_ADD_FAILED, existing)); | ||
| 493 | + break; | ||
| 494 | + case MODIFY: | ||
| 495 | + notifyDelegate(new GroupEvent(Type.GROUP_UPDATE_FAILED, existing)); | ||
| 496 | + break; | ||
| 497 | + case DELETE: | ||
| 498 | + notifyDelegate(new GroupEvent(Type.GROUP_REMOVE_FAILED, existing)); | ||
| 499 | + break; | ||
| 500 | + default: | ||
| 501 | + log.warn("Unknown group operation type {}", operation.opType()); | ||
| 502 | + } | ||
| 503 | + | ||
| 504 | + ConcurrentMap<GroupKey, StoredGroupEntry> keyTable = | ||
| 505 | + getGroupKeyTable(existing.deviceId()); | ||
| 506 | + ConcurrentMap<GroupId, StoredGroupEntry> idTable = | ||
| 507 | + getGroupIdTable(existing.deviceId()); | ||
| 508 | + idTable.remove(existing.id()); | ||
| 509 | + keyTable.remove(existing.appCookie()); | ||
| 510 | + } | ||
| 511 | + | ||
| 512 | + @Override | ||
| 477 | public void addOrUpdateExtraneousGroupEntry(Group group) { | 513 | public void addOrUpdateExtraneousGroupEntry(Group group) { |
| 478 | ConcurrentMap<GroupId, Group> extraneousIdTable = | 514 | ConcurrentMap<GroupId, Group> extraneousIdTable = |
| 479 | getExtraneousGroupIdTable(group.deviceId()); | 515 | getExtraneousGroupIdTable(group.deviceId()); |
| ... | @@ -497,4 +533,6 @@ public class SimpleGroupStore | ... | @@ -497,4 +533,6 @@ public class SimpleGroupStore |
| 497 | return FluentIterable.from( | 533 | return FluentIterable.from( |
| 498 | getExtraneousGroupIdTable(deviceId).values()); | 534 | getExtraneousGroupIdTable(deviceId).values()); |
| 499 | } | 535 | } |
| 536 | + | ||
| 537 | + | ||
| 500 | } | 538 | } | ... | ... |
| ... | @@ -40,6 +40,7 @@ import org.onosproject.net.group.GroupBuckets; | ... | @@ -40,6 +40,7 @@ import org.onosproject.net.group.GroupBuckets; |
| 40 | import org.onosproject.net.group.GroupDescription; | 40 | import org.onosproject.net.group.GroupDescription; |
| 41 | import org.onosproject.net.group.GroupEvent; | 41 | import org.onosproject.net.group.GroupEvent; |
| 42 | import org.onosproject.net.group.GroupKey; | 42 | import org.onosproject.net.group.GroupKey; |
| 43 | +import org.onosproject.net.group.GroupOperation; | ||
| 43 | import org.onosproject.net.group.GroupStore.UpdateType; | 44 | import org.onosproject.net.group.GroupStore.UpdateType; |
| 44 | import org.onosproject.net.group.GroupStoreDelegate; | 45 | import org.onosproject.net.group.GroupStoreDelegate; |
| 45 | 46 | ||
| ... | @@ -129,6 +130,18 @@ public class SimpleGroupStoreTest { | ... | @@ -129,6 +130,18 @@ public class SimpleGroupStoreTest { |
| 129 | createdGroupId = event.subject().id(); | 130 | createdGroupId = event.subject().id(); |
| 130 | assertEquals(Group.GroupState.PENDING_DELETE, | 131 | assertEquals(Group.GroupState.PENDING_DELETE, |
| 131 | event.subject().state()); | 132 | event.subject().state()); |
| 133 | + } else if (expectedEvent == GroupEvent.Type.GROUP_ADD_FAILED) { | ||
| 134 | + createdGroupId = event.subject().id(); | ||
| 135 | + assertEquals(Group.GroupState.PENDING_ADD, | ||
| 136 | + event.subject().state()); | ||
| 137 | + } else if (expectedEvent == GroupEvent.Type.GROUP_UPDATE_FAILED) { | ||
| 138 | + createdGroupId = event.subject().id(); | ||
| 139 | + assertEquals(Group.GroupState.PENDING_UPDATE, | ||
| 140 | + event.subject().state()); | ||
| 141 | + } else if (expectedEvent == GroupEvent.Type.GROUP_REMOVE_FAILED) { | ||
| 142 | + createdGroupId = event.subject().id(); | ||
| 143 | + assertEquals(Group.GroupState.PENDING_DELETE, | ||
| 144 | + event.subject().state()); | ||
| 132 | } | 145 | } |
| 133 | } | 146 | } |
| 134 | 147 | ||
| ... | @@ -310,6 +323,92 @@ public class SimpleGroupStoreTest { | ... | @@ -310,6 +323,92 @@ public class SimpleGroupStoreTest { |
| 310 | 323 | ||
| 311 | simpleGroupStore.unsetDelegate(removeGroupEntryDelegate); | 324 | simpleGroupStore.unsetDelegate(removeGroupEntryDelegate); |
| 312 | 325 | ||
| 326 | + | ||
| 327 | + } | ||
| 328 | + | ||
| 329 | + @Test | ||
| 330 | + public void testGroupOperationFailure() { | ||
| 331 | + | ||
| 332 | + simpleGroupStore.deviceInitialAuditCompleted(D1); | ||
| 333 | + | ||
| 334 | + ApplicationId appId = | ||
| 335 | + new DefaultApplicationId(2, "org.groupstore.test"); | ||
| 336 | + TestGroupKey key = new TestGroupKey("group1"); | ||
| 337 | + PortNumber[] ports = {PortNumber.portNumber(31), | ||
| 338 | + PortNumber.portNumber(32)}; | ||
| 339 | + List<PortNumber> outPorts = new ArrayList<PortNumber>(); | ||
| 340 | + outPorts.add(ports[0]); | ||
| 341 | + outPorts.add(ports[1]); | ||
| 342 | + | ||
| 343 | + List<GroupBucket> buckets = new ArrayList<GroupBucket>(); | ||
| 344 | + for (PortNumber portNumber: outPorts) { | ||
| 345 | + TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder(); | ||
| 346 | + tBuilder.setOutput(portNumber) | ||
| 347 | + .setEthDst(MacAddress.valueOf("00:00:00:00:00:02")) | ||
| 348 | + .setEthSrc(MacAddress.valueOf("00:00:00:00:00:01")) | ||
| 349 | + .pushMpls() | ||
| 350 | + .setMpls(106); | ||
| 351 | + buckets.add(DefaultGroupBucket.createSelectGroupBucket( | ||
| 352 | + tBuilder.build())); | ||
| 353 | + } | ||
| 354 | + GroupBuckets groupBuckets = new GroupBuckets(buckets); | ||
| 355 | + GroupDescription groupDesc = new DefaultGroupDescription( | ||
| 356 | + D1, | ||
| 357 | + Group.Type.SELECT, | ||
| 358 | + groupBuckets, | ||
| 359 | + key, | ||
| 360 | + appId); | ||
| 361 | + InternalGroupStoreDelegate checkStoreGroupDelegate = | ||
| 362 | + new InternalGroupStoreDelegate(key, | ||
| 363 | + groupBuckets, | ||
| 364 | + GroupEvent.Type.GROUP_ADD_REQUESTED); | ||
| 365 | + simpleGroupStore.setDelegate(checkStoreGroupDelegate); | ||
| 366 | + // Testing storeGroup operation | ||
| 367 | + simpleGroupStore.storeGroupDescription(groupDesc); | ||
| 368 | + simpleGroupStore.unsetDelegate(checkStoreGroupDelegate); | ||
| 369 | + | ||
| 370 | + // Testing Group add operation failure | ||
| 371 | + Group createdGroup = simpleGroupStore.getGroup(D1, key); | ||
| 372 | + checkStoreGroupDelegate.verifyGroupId(createdGroup.id()); | ||
| 373 | + | ||
| 374 | + GroupOperation groupAddOp = GroupOperation. | ||
| 375 | + createAddGroupOperation(createdGroup.id(), | ||
| 376 | + createdGroup.type(), | ||
| 377 | + createdGroup.buckets()); | ||
| 378 | + InternalGroupStoreDelegate checkGroupAddFailureDelegate = | ||
| 379 | + new InternalGroupStoreDelegate(key, | ||
| 380 | + groupBuckets, | ||
| 381 | + GroupEvent.Type.GROUP_ADD_FAILED); | ||
| 382 | + simpleGroupStore.setDelegate(checkGroupAddFailureDelegate); | ||
| 383 | + simpleGroupStore.groupOperationFailed(D1, groupAddOp); | ||
| 384 | + | ||
| 385 | + | ||
| 386 | + // Testing Group modify operation failure | ||
| 387 | + simpleGroupStore.unsetDelegate(checkGroupAddFailureDelegate); | ||
| 388 | + GroupOperation groupModOp = GroupOperation. | ||
| 389 | + createModifyGroupOperation(createdGroup.id(), | ||
| 390 | + createdGroup.type(), | ||
| 391 | + createdGroup.buckets()); | ||
| 392 | + InternalGroupStoreDelegate checkGroupModFailureDelegate = | ||
| 393 | + new InternalGroupStoreDelegate(key, | ||
| 394 | + groupBuckets, | ||
| 395 | + GroupEvent.Type.GROUP_UPDATE_FAILED); | ||
| 396 | + simpleGroupStore.setDelegate(checkGroupModFailureDelegate); | ||
| 397 | + simpleGroupStore.groupOperationFailed(D1, groupModOp); | ||
| 398 | + | ||
| 399 | + // Testing Group modify operation failure | ||
| 400 | + simpleGroupStore.unsetDelegate(checkGroupModFailureDelegate); | ||
| 401 | + GroupOperation groupDelOp = GroupOperation. | ||
| 402 | + createDeleteGroupOperation(createdGroup.id(), | ||
| 403 | + createdGroup.type()); | ||
| 404 | + InternalGroupStoreDelegate checkGroupDelFailureDelegate = | ||
| 405 | + new InternalGroupStoreDelegate(key, | ||
| 406 | + groupBuckets, | ||
| 407 | + GroupEvent.Type.GROUP_REMOVE_FAILED); | ||
| 408 | + simpleGroupStore.setDelegate(checkGroupDelFailureDelegate); | ||
| 409 | + simpleGroupStore.groupOperationFailed(D1, groupDelOp); | ||
| 410 | + | ||
| 411 | + | ||
| 313 | } | 412 | } |
| 314 | } | 413 | } |
| 315 | 414 | ... | ... |
| ... | @@ -282,8 +282,10 @@ public class OpenFlowGroupProvider extends AbstractProvider implements GroupProv | ... | @@ -282,8 +282,10 @@ public class OpenFlowGroupProvider extends AbstractProvider implements GroupProv |
| 282 | } else { | 282 | } else { |
| 283 | GroupOperation operation = | 283 | GroupOperation operation = |
| 284 | pendingGroupOperations.get(pendingGroupId); | 284 | pendingGroupOperations.get(pendingGroupId); |
| 285 | + DeviceId deviceId = DeviceId.deviceId(Dpid.uri(dpid)); | ||
| 285 | if (operation != null) { | 286 | if (operation != null) { |
| 286 | - providerService.groupOperationFailed(operation); | 287 | + providerService.groupOperationFailed(deviceId, |
| 288 | + operation); | ||
| 287 | pendingGroupOperations.remove(pendingGroupId); | 289 | pendingGroupOperations.remove(pendingGroupId); |
| 288 | pendingXidMaps.remove(pendingGroupId); | 290 | pendingXidMaps.remove(pendingGroupId); |
| 289 | log.warn("Received an group mod error {}", msg); | 291 | log.warn("Received an group mod error {}", msg); | ... | ... |
| ... | @@ -177,7 +177,7 @@ public class OpenFlowGroupProviderTest { | ... | @@ -177,7 +177,7 @@ public class OpenFlowGroupProviderTest { |
| 177 | } | 177 | } |
| 178 | 178 | ||
| 179 | @Override | 179 | @Override |
| 180 | - public void groupOperationFailed(GroupOperation operation) { | 180 | + public void groupOperationFailed(DeviceId deviceId, GroupOperation operation) { |
| 181 | this.failedOperation = operation; | 181 | this.failedOperation = operation; |
| 182 | } | 182 | } |
| 183 | 183 | ... | ... |
-
Please register or login to post a comment