This was introduced by a recent patch. onBucketsUpdated iterates the
routesUpdateCallbacks however one of the callbacks in receiveGetRouter
removes itself from the list causing the ConcurrentModificationEx.
I changed onBucketsUpdated to first copy the list to an array to prevent
this.
Change-Id: I44c9a89b4b433f711cf4f90bf28e6955d8784f5f
Signed-off-by: Tom Pantelis <tpanteli@brocade.com>
@Override
protected void onBucketsUpdated() {
@Override
protected void onBucketsUpdated() {
- for(Runnable callBack: routesUpdatedCallbacks) {
+ if(routesUpdatedCallbacks.isEmpty()) {
+ return;
+ }
+
+ for(Runnable callBack: routesUpdatedCallbacks.toArray(new Runnable[routesUpdatedCallbacks.size()])) {
registry2.tell(new SetLocalRouter(mockBroker2.getRef()), mockBroker2.getRef());
List<RpcRouter.RouteIdentifier<?, ?, ?>> routeIds = createRouteIds();
registry2.tell(new SetLocalRouter(mockBroker2.getRef()), mockBroker2.getRef());
List<RpcRouter.RouteIdentifier<?, ?, ?>> routeIds = createRouteIds();
+ routeIds.addAll(createRouteIds());
- registry1.tell(new FindRouters(routeIds.get(0)), mockBroker1.getRef());
+ JavaTestKit replyKit1 = new JavaTestKit(node1);
+ registry1.tell(new FindRouters(routeIds.get(0)), replyKit1.getRef());
+ JavaTestKit replyKit2 = new JavaTestKit(node1);
+ registry1.tell(new FindRouters(routeIds.get(1)), replyKit2.getRef());
registry2.tell(new AddOrUpdateRoutes(routeIds), mockBroker2.getRef());
registry2.tell(new AddOrUpdateRoutes(routeIds), mockBroker2.getRef());
- FindRoutersReply reply = mockBroker1.expectMsgClass(Duration.create(7, TimeUnit.SECONDS),
+ FindRoutersReply reply = replyKit1.expectMsgClass(Duration.create(7, TimeUnit.SECONDS),
- List<Pair<ActorRef, Long>> respList = reply.getRouterWithUpdateTime();
- Assert.assertEquals("getRouterWithUpdateTime size", 1, respList.size());
+ Assert.assertEquals("getRouterWithUpdateTime size", 1, reply.getRouterWithUpdateTime().size());
+
+ reply = replyKit2.expectMsgClass(Duration.create(7, TimeUnit.SECONDS),
+ FindRoutersReply.class);
+ Assert.assertEquals("getRouterWithUpdateTime size", 1, reply.getRouterWithUpdateTime().size());