GossipStores: remove potentially blocking method out of netty thread
Change-Id: I2da9ba745c3a63bf9709fb77c1f260ea8f4529a8
Showing
3 changed files
with
167 additions
and
29 deletions
| ... | @@ -78,6 +78,8 @@ import java.util.Map.Entry; | ... | @@ -78,6 +78,8 @@ import java.util.Map.Entry; |
| 78 | import java.util.Objects; | 78 | import java.util.Objects; |
| 79 | import java.util.Set; | 79 | import java.util.Set; |
| 80 | import java.util.concurrent.ConcurrentMap; | 80 | import java.util.concurrent.ConcurrentMap; |
| 81 | +import java.util.concurrent.ExecutorService; | ||
| 82 | +import java.util.concurrent.Executors; | ||
| 81 | import java.util.concurrent.ScheduledExecutorService; | 83 | import java.util.concurrent.ScheduledExecutorService; |
| 82 | import java.util.concurrent.TimeUnit; | 84 | import java.util.concurrent.TimeUnit; |
| 83 | 85 | ||
| ... | @@ -160,8 +162,11 @@ public class GossipDeviceStore | ... | @@ -160,8 +162,11 @@ public class GossipDeviceStore |
| 160 | } | 162 | } |
| 161 | }; | 163 | }; |
| 162 | 164 | ||
| 165 | + private ExecutorService executor; | ||
| 166 | + | ||
| 163 | private ScheduledExecutorService backgroundExecutor; | 167 | private ScheduledExecutorService backgroundExecutor; |
| 164 | 168 | ||
| 169 | + | ||
| 165 | @Activate | 170 | @Activate |
| 166 | public void activate() { | 171 | public void activate() { |
| 167 | clusterCommunicator.addSubscriber( | 172 | clusterCommunicator.addSubscriber( |
| ... | @@ -178,6 +183,8 @@ public class GossipDeviceStore | ... | @@ -178,6 +183,8 @@ public class GossipDeviceStore |
| 178 | clusterCommunicator.addSubscriber( | 183 | clusterCommunicator.addSubscriber( |
| 179 | GossipDeviceStoreMessageSubjects.DEVICE_ADVERTISE, new InternalDeviceAdvertisementListener()); | 184 | GossipDeviceStoreMessageSubjects.DEVICE_ADVERTISE, new InternalDeviceAdvertisementListener()); |
| 180 | 185 | ||
| 186 | + executor = Executors.newCachedThreadPool(namedThreads("device-fg-%d")); | ||
| 187 | + | ||
| 181 | backgroundExecutor = | 188 | backgroundExecutor = |
| 182 | newSingleThreadScheduledExecutor(minPriority(namedThreads("device-bg-%d"))); | 189 | newSingleThreadScheduledExecutor(minPriority(namedThreads("device-bg-%d"))); |
| 183 | 190 | ||
| ... | @@ -194,6 +201,8 @@ public class GossipDeviceStore | ... | @@ -194,6 +201,8 @@ public class GossipDeviceStore |
| 194 | @Deactivate | 201 | @Deactivate |
| 195 | public void deactivate() { | 202 | public void deactivate() { |
| 196 | 203 | ||
| 204 | + executor.shutdownNow(); | ||
| 205 | + | ||
| 197 | backgroundExecutor.shutdownNow(); | 206 | backgroundExecutor.shutdownNow(); |
| 198 | try { | 207 | try { |
| 199 | boolean timedout = backgroundExecutor.awaitTermination(5, TimeUnit.SECONDS); | 208 | boolean timedout = backgroundExecutor.awaitTermination(5, TimeUnit.SECONDS); |
| ... | @@ -1258,32 +1267,54 @@ public class GossipDeviceStore | ... | @@ -1258,32 +1267,54 @@ public class GossipDeviceStore |
| 1258 | } | 1267 | } |
| 1259 | } | 1268 | } |
| 1260 | 1269 | ||
| 1261 | - private class InternalDeviceEventListener implements ClusterMessageHandler { | 1270 | + private final class InternalDeviceEventListener |
| 1271 | + implements ClusterMessageHandler { | ||
| 1262 | @Override | 1272 | @Override |
| 1263 | public void handle(ClusterMessage message) { | 1273 | public void handle(ClusterMessage message) { |
| 1264 | 1274 | ||
| 1265 | log.debug("Received device update event from peer: {}", message.sender()); | 1275 | log.debug("Received device update event from peer: {}", message.sender()); |
| 1266 | - InternalDeviceEvent event = (InternalDeviceEvent) SERIALIZER.decode(message.payload()); | 1276 | + InternalDeviceEvent event = SERIALIZER.decode(message.payload()); |
| 1267 | 1277 | ||
| 1268 | ProviderId providerId = event.providerId(); | 1278 | ProviderId providerId = event.providerId(); |
| 1269 | DeviceId deviceId = event.deviceId(); | 1279 | DeviceId deviceId = event.deviceId(); |
| 1270 | Timestamped<DeviceDescription> deviceDescription = event.deviceDescription(); | 1280 | Timestamped<DeviceDescription> deviceDescription = event.deviceDescription(); |
| 1271 | 1281 | ||
| 1272 | - notifyDelegateIfNotNull(createOrUpdateDeviceInternal(providerId, deviceId, deviceDescription)); | 1282 | + executor.submit(new Runnable() { |
| 1283 | + | ||
| 1284 | + @Override | ||
| 1285 | + public void run() { | ||
| 1286 | + try { | ||
| 1287 | + notifyDelegateIfNotNull(createOrUpdateDeviceInternal(providerId, deviceId, deviceDescription)); | ||
| 1288 | + } catch (Exception e) { | ||
| 1289 | + log.warn("Exception thrown handling device update", e); | ||
| 1290 | + } | ||
| 1291 | + } | ||
| 1292 | + }); | ||
| 1273 | } | 1293 | } |
| 1274 | } | 1294 | } |
| 1275 | 1295 | ||
| 1276 | - private class InternalDeviceOfflineEventListener implements ClusterMessageHandler { | 1296 | + private final class InternalDeviceOfflineEventListener |
| 1297 | + implements ClusterMessageHandler { | ||
| 1277 | @Override | 1298 | @Override |
| 1278 | public void handle(ClusterMessage message) { | 1299 | public void handle(ClusterMessage message) { |
| 1279 | 1300 | ||
| 1280 | log.debug("Received device offline event from peer: {}", message.sender()); | 1301 | log.debug("Received device offline event from peer: {}", message.sender()); |
| 1281 | - InternalDeviceOfflineEvent event = (InternalDeviceOfflineEvent) SERIALIZER.decode(message.payload()); | 1302 | + InternalDeviceOfflineEvent event = SERIALIZER.decode(message.payload()); |
| 1282 | 1303 | ||
| 1283 | DeviceId deviceId = event.deviceId(); | 1304 | DeviceId deviceId = event.deviceId(); |
| 1284 | Timestamp timestamp = event.timestamp(); | 1305 | Timestamp timestamp = event.timestamp(); |
| 1285 | 1306 | ||
| 1286 | - notifyDelegateIfNotNull(markOfflineInternal(deviceId, timestamp)); | 1307 | + executor.submit(new Runnable() { |
| 1308 | + | ||
| 1309 | + @Override | ||
| 1310 | + public void run() { | ||
| 1311 | + try { | ||
| 1312 | + notifyDelegateIfNotNull(markOfflineInternal(deviceId, timestamp)); | ||
| 1313 | + } catch (Exception e) { | ||
| 1314 | + log.warn("Exception thrown handling device offline", e); | ||
| 1315 | + } | ||
| 1316 | + } | ||
| 1317 | + }); | ||
| 1287 | } | 1318 | } |
| 1288 | } | 1319 | } |
| 1289 | 1320 | ||
| ... | @@ -1293,30 +1324,53 @@ public class GossipDeviceStore | ... | @@ -1293,30 +1324,53 @@ public class GossipDeviceStore |
| 1293 | public void handle(ClusterMessage message) { | 1324 | public void handle(ClusterMessage message) { |
| 1294 | log.debug("Received device remove request from peer: {}", message.sender()); | 1325 | log.debug("Received device remove request from peer: {}", message.sender()); |
| 1295 | DeviceId did = SERIALIZER.decode(message.payload()); | 1326 | DeviceId did = SERIALIZER.decode(message.payload()); |
| 1296 | - removeDevice(did); | 1327 | + |
| 1328 | + executor.submit(new Runnable() { | ||
| 1329 | + | ||
| 1330 | + @Override | ||
| 1331 | + public void run() { | ||
| 1332 | + try { | ||
| 1333 | + removeDevice(did); | ||
| 1334 | + } catch (Exception e) { | ||
| 1335 | + log.warn("Exception thrown handling device remove", e); | ||
| 1336 | + } | ||
| 1337 | + } | ||
| 1338 | + }); | ||
| 1297 | } | 1339 | } |
| 1298 | } | 1340 | } |
| 1299 | 1341 | ||
| 1300 | - private class InternalDeviceRemovedEventListener implements ClusterMessageHandler { | 1342 | + private final class InternalDeviceRemovedEventListener |
| 1343 | + implements ClusterMessageHandler { | ||
| 1301 | @Override | 1344 | @Override |
| 1302 | public void handle(ClusterMessage message) { | 1345 | public void handle(ClusterMessage message) { |
| 1303 | 1346 | ||
| 1304 | log.debug("Received device removed event from peer: {}", message.sender()); | 1347 | log.debug("Received device removed event from peer: {}", message.sender()); |
| 1305 | - InternalDeviceRemovedEvent event = (InternalDeviceRemovedEvent) SERIALIZER.decode(message.payload()); | 1348 | + InternalDeviceRemovedEvent event = SERIALIZER.decode(message.payload()); |
| 1306 | 1349 | ||
| 1307 | DeviceId deviceId = event.deviceId(); | 1350 | DeviceId deviceId = event.deviceId(); |
| 1308 | Timestamp timestamp = event.timestamp(); | 1351 | Timestamp timestamp = event.timestamp(); |
| 1309 | 1352 | ||
| 1310 | - notifyDelegateIfNotNull(removeDeviceInternal(deviceId, timestamp)); | 1353 | + executor.submit(new Runnable() { |
| 1354 | + | ||
| 1355 | + @Override | ||
| 1356 | + public void run() { | ||
| 1357 | + try { | ||
| 1358 | + notifyDelegateIfNotNull(removeDeviceInternal(deviceId, timestamp)); | ||
| 1359 | + } catch (Exception e) { | ||
| 1360 | + log.warn("Exception thrown handling device removed", e); | ||
| 1361 | + } | ||
| 1362 | + } | ||
| 1363 | + }); | ||
| 1311 | } | 1364 | } |
| 1312 | } | 1365 | } |
| 1313 | 1366 | ||
| 1314 | - private class InternalPortEventListener implements ClusterMessageHandler { | 1367 | + private final class InternalPortEventListener |
| 1368 | + implements ClusterMessageHandler { | ||
| 1315 | @Override | 1369 | @Override |
| 1316 | public void handle(ClusterMessage message) { | 1370 | public void handle(ClusterMessage message) { |
| 1317 | 1371 | ||
| 1318 | log.debug("Received port update event from peer: {}", message.sender()); | 1372 | log.debug("Received port update event from peer: {}", message.sender()); |
| 1319 | - InternalPortEvent event = (InternalPortEvent) SERIALIZER.decode(message.payload()); | 1373 | + InternalPortEvent event = SERIALIZER.decode(message.payload()); |
| 1320 | 1374 | ||
| 1321 | ProviderId providerId = event.providerId(); | 1375 | ProviderId providerId = event.providerId(); |
| 1322 | DeviceId deviceId = event.deviceId(); | 1376 | DeviceId deviceId = event.deviceId(); |
| ... | @@ -1328,16 +1382,27 @@ public class GossipDeviceStore | ... | @@ -1328,16 +1382,27 @@ public class GossipDeviceStore |
| 1328 | return; | 1382 | return; |
| 1329 | } | 1383 | } |
| 1330 | 1384 | ||
| 1331 | - notifyDelegate(updatePortsInternal(providerId, deviceId, portDescriptions)); | 1385 | + executor.submit(new Runnable() { |
| 1386 | + | ||
| 1387 | + @Override | ||
| 1388 | + public void run() { | ||
| 1389 | + try { | ||
| 1390 | + notifyDelegate(updatePortsInternal(providerId, deviceId, portDescriptions)); | ||
| 1391 | + } catch (Exception e) { | ||
| 1392 | + log.warn("Exception thrown handling port update", e); | ||
| 1393 | + } | ||
| 1394 | + } | ||
| 1395 | + }); | ||
| 1332 | } | 1396 | } |
| 1333 | } | 1397 | } |
| 1334 | 1398 | ||
| 1335 | - private class InternalPortStatusEventListener implements ClusterMessageHandler { | 1399 | + private final class InternalPortStatusEventListener |
| 1400 | + implements ClusterMessageHandler { | ||
| 1336 | @Override | 1401 | @Override |
| 1337 | public void handle(ClusterMessage message) { | 1402 | public void handle(ClusterMessage message) { |
| 1338 | 1403 | ||
| 1339 | log.debug("Received port status update event from peer: {}", message.sender()); | 1404 | log.debug("Received port status update event from peer: {}", message.sender()); |
| 1340 | - InternalPortStatusEvent event = (InternalPortStatusEvent) SERIALIZER.decode(message.payload()); | 1405 | + InternalPortStatusEvent event = SERIALIZER.decode(message.payload()); |
| 1341 | 1406 | ||
| 1342 | ProviderId providerId = event.providerId(); | 1407 | ProviderId providerId = event.providerId(); |
| 1343 | DeviceId deviceId = event.deviceId(); | 1408 | DeviceId deviceId = event.deviceId(); |
| ... | @@ -1349,7 +1414,17 @@ public class GossipDeviceStore | ... | @@ -1349,7 +1414,17 @@ public class GossipDeviceStore |
| 1349 | return; | 1414 | return; |
| 1350 | } | 1415 | } |
| 1351 | 1416 | ||
| 1352 | - notifyDelegateIfNotNull(updatePortStatusInternal(providerId, deviceId, portDescription)); | 1417 | + executor.submit(new Runnable() { |
| 1418 | + | ||
| 1419 | + @Override | ||
| 1420 | + public void run() { | ||
| 1421 | + try { | ||
| 1422 | + notifyDelegateIfNotNull(updatePortStatusInternal(providerId, deviceId, portDescription)); | ||
| 1423 | + } catch (Exception e) { | ||
| 1424 | + log.warn("Exception thrown handling port update", e); | ||
| 1425 | + } | ||
| 1426 | + } | ||
| 1427 | + }); | ||
| 1353 | } | 1428 | } |
| 1354 | } | 1429 | } |
| 1355 | 1430 | ... | ... |
| ... | @@ -34,6 +34,8 @@ import java.util.Map; | ... | @@ -34,6 +34,8 @@ import java.util.Map; |
| 34 | import java.util.Map.Entry; | 34 | import java.util.Map.Entry; |
| 35 | import java.util.Set; | 35 | import java.util.Set; |
| 36 | import java.util.concurrent.ConcurrentHashMap; | 36 | import java.util.concurrent.ConcurrentHashMap; |
| 37 | +import java.util.concurrent.ExecutorService; | ||
| 38 | +import java.util.concurrent.Executors; | ||
| 37 | import java.util.concurrent.ScheduledExecutorService; | 39 | import java.util.concurrent.ScheduledExecutorService; |
| 38 | import java.util.concurrent.TimeUnit; | 40 | import java.util.concurrent.TimeUnit; |
| 39 | 41 | ||
| ... | @@ -137,6 +139,8 @@ public class GossipHostStore | ... | @@ -137,6 +139,8 @@ public class GossipHostStore |
| 137 | } | 139 | } |
| 138 | }; | 140 | }; |
| 139 | 141 | ||
| 142 | + private ExecutorService executor; | ||
| 143 | + | ||
| 140 | private ScheduledExecutorService backgroundExecutor; | 144 | private ScheduledExecutorService backgroundExecutor; |
| 141 | 145 | ||
| 142 | @Activate | 146 | @Activate |
| ... | @@ -151,6 +155,8 @@ public class GossipHostStore | ... | @@ -151,6 +155,8 @@ public class GossipHostStore |
| 151 | GossipHostStoreMessageSubjects.HOST_ANTI_ENTROPY_ADVERTISEMENT, | 155 | GossipHostStoreMessageSubjects.HOST_ANTI_ENTROPY_ADVERTISEMENT, |
| 152 | new InternalHostAntiEntropyAdvertisementListener()); | 156 | new InternalHostAntiEntropyAdvertisementListener()); |
| 153 | 157 | ||
| 158 | + executor = Executors.newCachedThreadPool(namedThreads("host-fg-%d")); | ||
| 159 | + | ||
| 154 | backgroundExecutor = | 160 | backgroundExecutor = |
| 155 | newSingleThreadScheduledExecutor(minPriority(namedThreads("host-bg-%d"))); | 161 | newSingleThreadScheduledExecutor(minPriority(namedThreads("host-bg-%d"))); |
| 156 | 162 | ||
| ... | @@ -166,6 +172,7 @@ public class GossipHostStore | ... | @@ -166,6 +172,7 @@ public class GossipHostStore |
| 166 | 172 | ||
| 167 | @Deactivate | 173 | @Deactivate |
| 168 | public void deactivate() { | 174 | public void deactivate() { |
| 175 | + executor.shutdownNow(); | ||
| 169 | backgroundExecutor.shutdownNow(); | 176 | backgroundExecutor.shutdownNow(); |
| 170 | try { | 177 | try { |
| 171 | if (!backgroundExecutor.awaitTermination(5, TimeUnit.SECONDS)) { | 178 | if (!backgroundExecutor.awaitTermination(5, TimeUnit.SECONDS)) { |
| ... | @@ -459,33 +466,58 @@ public class GossipHostStore | ... | @@ -459,33 +466,58 @@ public class GossipHostStore |
| 459 | } | 466 | } |
| 460 | } | 467 | } |
| 461 | 468 | ||
| 462 | - private class InternalHostEventListener implements ClusterMessageHandler { | 469 | + private final class InternalHostEventListener |
| 470 | + implements ClusterMessageHandler { | ||
| 463 | @Override | 471 | @Override |
| 464 | public void handle(ClusterMessage message) { | 472 | public void handle(ClusterMessage message) { |
| 465 | 473 | ||
| 466 | log.debug("Received host update event from peer: {}", message.sender()); | 474 | log.debug("Received host update event from peer: {}", message.sender()); |
| 467 | - InternalHostEvent event = (InternalHostEvent) SERIALIZER.decode(message.payload()); | 475 | + InternalHostEvent event = SERIALIZER.decode(message.payload()); |
| 468 | 476 | ||
| 469 | ProviderId providerId = event.providerId(); | 477 | ProviderId providerId = event.providerId(); |
| 470 | HostId hostId = event.hostId(); | 478 | HostId hostId = event.hostId(); |
| 471 | HostDescription hostDescription = event.hostDescription(); | 479 | HostDescription hostDescription = event.hostDescription(); |
| 472 | Timestamp timestamp = event.timestamp(); | 480 | Timestamp timestamp = event.timestamp(); |
| 473 | 481 | ||
| 474 | - notifyDelegateIfNotNull(createOrUpdateHostInternal(providerId, hostId, hostDescription, timestamp)); | 482 | + executor.submit(new Runnable() { |
| 483 | + | ||
| 484 | + @Override | ||
| 485 | + public void run() { | ||
| 486 | + try { | ||
| 487 | + notifyDelegateIfNotNull(createOrUpdateHostInternal(providerId, | ||
| 488 | + hostId, | ||
| 489 | + hostDescription, | ||
| 490 | + timestamp)); | ||
| 491 | + } catch (Exception e) { | ||
| 492 | + log.warn("Exception thrown handling host removed", e); | ||
| 493 | + } | ||
| 494 | + } | ||
| 495 | + }); | ||
| 475 | } | 496 | } |
| 476 | } | 497 | } |
| 477 | 498 | ||
| 478 | - private class InternalHostRemovedEventListener implements ClusterMessageHandler { | 499 | + private final class InternalHostRemovedEventListener |
| 500 | + implements ClusterMessageHandler { | ||
| 479 | @Override | 501 | @Override |
| 480 | public void handle(ClusterMessage message) { | 502 | public void handle(ClusterMessage message) { |
| 481 | 503 | ||
| 482 | log.debug("Received host removed event from peer: {}", message.sender()); | 504 | log.debug("Received host removed event from peer: {}", message.sender()); |
| 483 | - InternalHostRemovedEvent event = (InternalHostRemovedEvent) SERIALIZER.decode(message.payload()); | 505 | + InternalHostRemovedEvent event = SERIALIZER.decode(message.payload()); |
| 484 | 506 | ||
| 485 | HostId hostId = event.hostId(); | 507 | HostId hostId = event.hostId(); |
| 486 | Timestamp timestamp = event.timestamp(); | 508 | Timestamp timestamp = event.timestamp(); |
| 487 | 509 | ||
| 488 | - notifyDelegateIfNotNull(removeHostInternal(hostId, timestamp)); | 510 | + executor.submit(new Runnable() { |
| 511 | + | ||
| 512 | + @Override | ||
| 513 | + public void run() { | ||
| 514 | + try { | ||
| 515 | + notifyDelegateIfNotNull(removeHostInternal(hostId, timestamp)); | ||
| 516 | + } catch (Exception e) { | ||
| 517 | + log.warn("Exception thrown handling host removed", e); | ||
| 518 | + } | ||
| 519 | + } | ||
| 520 | + }); | ||
| 489 | } | 521 | } |
| 490 | } | 522 | } |
| 491 | 523 | ||
| ... | @@ -636,8 +668,8 @@ public class GossipHostStore | ... | @@ -636,8 +668,8 @@ public class GossipHostStore |
| 636 | } | 668 | } |
| 637 | } | 669 | } |
| 638 | 670 | ||
| 639 | - private final class InternalHostAntiEntropyAdvertisementListener implements | 671 | + private final class InternalHostAntiEntropyAdvertisementListener |
| 640 | - ClusterMessageHandler { | 672 | + implements ClusterMessageHandler { |
| 641 | 673 | ||
| 642 | @Override | 674 | @Override |
| 643 | public void handle(ClusterMessage message) { | 675 | public void handle(ClusterMessage message) { | ... | ... |
| ... | @@ -71,6 +71,8 @@ import java.util.Objects; | ... | @@ -71,6 +71,8 @@ import java.util.Objects; |
| 71 | import java.util.Set; | 71 | import java.util.Set; |
| 72 | import java.util.concurrent.ConcurrentHashMap; | 72 | import java.util.concurrent.ConcurrentHashMap; |
| 73 | import java.util.concurrent.ConcurrentMap; | 73 | import java.util.concurrent.ConcurrentMap; |
| 74 | +import java.util.concurrent.ExecutorService; | ||
| 75 | +import java.util.concurrent.Executors; | ||
| 74 | import java.util.concurrent.ScheduledExecutorService; | 76 | import java.util.concurrent.ScheduledExecutorService; |
| 75 | import java.util.concurrent.TimeUnit; | 77 | import java.util.concurrent.TimeUnit; |
| 76 | 78 | ||
| ... | @@ -141,6 +143,8 @@ public class GossipLinkStore | ... | @@ -141,6 +143,8 @@ public class GossipLinkStore |
| 141 | } | 143 | } |
| 142 | }; | 144 | }; |
| 143 | 145 | ||
| 146 | + private ExecutorService executor; | ||
| 147 | + | ||
| 144 | private ScheduledExecutorService backgroundExecutors; | 148 | private ScheduledExecutorService backgroundExecutors; |
| 145 | 149 | ||
| 146 | @Activate | 150 | @Activate |
| ... | @@ -156,6 +160,8 @@ public class GossipLinkStore | ... | @@ -156,6 +160,8 @@ public class GossipLinkStore |
| 156 | GossipLinkStoreMessageSubjects.LINK_ANTI_ENTROPY_ADVERTISEMENT, | 160 | GossipLinkStoreMessageSubjects.LINK_ANTI_ENTROPY_ADVERTISEMENT, |
| 157 | new InternalLinkAntiEntropyAdvertisementListener()); | 161 | new InternalLinkAntiEntropyAdvertisementListener()); |
| 158 | 162 | ||
| 163 | + executor = Executors.newCachedThreadPool(namedThreads("link-fg-%d")); | ||
| 164 | + | ||
| 159 | backgroundExecutors = | 165 | backgroundExecutors = |
| 160 | newSingleThreadScheduledExecutor(minPriority(namedThreads("link-bg-%d"))); | 166 | newSingleThreadScheduledExecutor(minPriority(namedThreads("link-bg-%d"))); |
| 161 | 167 | ||
| ... | @@ -172,6 +178,8 @@ public class GossipLinkStore | ... | @@ -172,6 +178,8 @@ public class GossipLinkStore |
| 172 | @Deactivate | 178 | @Deactivate |
| 173 | public void deactivate() { | 179 | public void deactivate() { |
| 174 | 180 | ||
| 181 | + executor.shutdownNow(); | ||
| 182 | + | ||
| 175 | backgroundExecutors.shutdownNow(); | 183 | backgroundExecutors.shutdownNow(); |
| 176 | try { | 184 | try { |
| 177 | if (!backgroundExecutors.awaitTermination(5, TimeUnit.SECONDS)) { | 185 | if (!backgroundExecutors.awaitTermination(5, TimeUnit.SECONDS)) { |
| ... | @@ -762,7 +770,8 @@ public class GossipLinkStore | ... | @@ -762,7 +770,8 @@ public class GossipLinkStore |
| 762 | } | 770 | } |
| 763 | } | 771 | } |
| 764 | 772 | ||
| 765 | - private class InternalLinkEventListener implements ClusterMessageHandler { | 773 | + private final class InternalLinkEventListener |
| 774 | + implements ClusterMessageHandler { | ||
| 766 | @Override | 775 | @Override |
| 767 | public void handle(ClusterMessage message) { | 776 | public void handle(ClusterMessage message) { |
| 768 | 777 | ||
| ... | @@ -772,11 +781,22 @@ public class GossipLinkStore | ... | @@ -772,11 +781,22 @@ public class GossipLinkStore |
| 772 | ProviderId providerId = event.providerId(); | 781 | ProviderId providerId = event.providerId(); |
| 773 | Timestamped<LinkDescription> linkDescription = event.linkDescription(); | 782 | Timestamped<LinkDescription> linkDescription = event.linkDescription(); |
| 774 | 783 | ||
| 775 | - notifyDelegateIfNotNull(createOrUpdateLinkInternal(providerId, linkDescription)); | 784 | + executor.submit(new Runnable() { |
| 785 | + | ||
| 786 | + @Override | ||
| 787 | + public void run() { | ||
| 788 | + try { | ||
| 789 | + notifyDelegateIfNotNull(createOrUpdateLinkInternal(providerId, linkDescription)); | ||
| 790 | + } catch (Exception e) { | ||
| 791 | + log.warn("Exception thrown handling link event", e); | ||
| 792 | + } | ||
| 793 | + } | ||
| 794 | + }); | ||
| 776 | } | 795 | } |
| 777 | } | 796 | } |
| 778 | 797 | ||
| 779 | - private class InternalLinkRemovedEventListener implements ClusterMessageHandler { | 798 | + private final class InternalLinkRemovedEventListener |
| 799 | + implements ClusterMessageHandler { | ||
| 780 | @Override | 800 | @Override |
| 781 | public void handle(ClusterMessage message) { | 801 | public void handle(ClusterMessage message) { |
| 782 | 802 | ||
| ... | @@ -786,11 +806,22 @@ public class GossipLinkStore | ... | @@ -786,11 +806,22 @@ public class GossipLinkStore |
| 786 | LinkKey linkKey = event.linkKey(); | 806 | LinkKey linkKey = event.linkKey(); |
| 787 | Timestamp timestamp = event.timestamp(); | 807 | Timestamp timestamp = event.timestamp(); |
| 788 | 808 | ||
| 789 | - notifyDelegateIfNotNull(removeLinkInternal(linkKey, timestamp)); | 809 | + executor.submit(new Runnable() { |
| 810 | + | ||
| 811 | + @Override | ||
| 812 | + public void run() { | ||
| 813 | + try { | ||
| 814 | + notifyDelegateIfNotNull(removeLinkInternal(linkKey, timestamp)); | ||
| 815 | + } catch (Exception e) { | ||
| 816 | + log.warn("Exception thrown handling link removed", e); | ||
| 817 | + } | ||
| 818 | + } | ||
| 819 | + }); | ||
| 790 | } | 820 | } |
| 791 | } | 821 | } |
| 792 | 822 | ||
| 793 | - private final class InternalLinkAntiEntropyAdvertisementListener implements ClusterMessageHandler { | 823 | + private final class InternalLinkAntiEntropyAdvertisementListener |
| 824 | + implements ClusterMessageHandler { | ||
| 794 | 825 | ||
| 795 | @Override | 826 | @Override |
| 796 | public void handle(ClusterMessage message) { | 827 | public void handle(ClusterMessage message) { | ... | ... |
-
Please register or login to post a comment