Madan Jampani
Committed by Gerrit Code Review

ONOS-1981: Move expensive work off of event loop thread

Change-Id: I200d9b727a7d501d5b055574ddb0907b8f4756a2
...@@ -613,56 +613,66 @@ public class DeviceManager ...@@ -613,56 +613,66 @@ public class DeviceManager
613 } 613 }
614 } 614 }
615 615
616 - // Intercepts mastership events 616 + private void handleMastershipEvent(MastershipEvent event) {
617 - private class InternalMastershipListener implements MastershipListener { 617 + if (event.type() != MastershipEvent.Type.MASTER_CHANGED) {
618 + // Don't care if backup list changed.
619 + return;
620 + }
618 621
619 - @Override 622 + final DeviceId did = event.subject();
620 - public void event(MastershipEvent event) {
621 - if (event.type() != MastershipEvent.Type.MASTER_CHANGED) {
622 - // Don't care if backup list changed.
623 - return;
624 - }
625 623
626 - final DeviceId did = event.subject(); 624 + // myRole suggested by MastershipService
627 - 625 + MastershipRole myNextRole;
628 - // myRole suggested by MastershipService 626 + if (localNodeId.equals(event.roleInfo().master())) {
629 - MastershipRole myNextRole; 627 + // confirm latest info
630 - if (localNodeId.equals(event.roleInfo().master())) { 628 + MastershipTerm term = termService.getMastershipTerm(did);
631 - // confirm latest info 629 + final boolean iHaveControl = term != null && localNodeId.equals(term.master());
632 - MastershipTerm term = termService.getMastershipTerm(did); 630 + if (iHaveControl) {
633 - final boolean iHaveControl = term != null && localNodeId.equals(term.master()); 631 + deviceClockProviderService.setMastershipTerm(did, term);
634 - if (iHaveControl) { 632 + myNextRole = MASTER;
635 - deviceClockProviderService.setMastershipTerm(did, term);
636 - myNextRole = MASTER;
637 - } else {
638 - myNextRole = STANDBY;
639 - }
640 - } else if (event.roleInfo().backups().contains(localNodeId)) {
641 - myNextRole = STANDBY;
642 } else { 633 } else {
643 - myNextRole = NONE; 634 + myNextRole = STANDBY;
644 } 635 }
636 + } else if (event.roleInfo().backups().contains(localNodeId)) {
637 + myNextRole = STANDBY;
638 + } else {
639 + myNextRole = NONE;
640 + }
645 641
646 642
647 - final boolean isReachable = isReachable(did); 643 + final boolean isReachable = isReachable(did);
648 - if (!isReachable) { 644 + if (!isReachable) {
649 - // device is not connected to this node 645 + // device is not connected to this node
650 - if (myNextRole != NONE) { 646 + if (myNextRole != NONE) {
651 - log.warn("Node was instructed to be {} role for {}, " 647 + log.warn("Node was instructed to be {} role for {}, "
652 - + "but this node cannot reach the device. " 648 + + "but this node cannot reach the device. "
653 - + "Relinquishing role. ", 649 + + "Relinquishing role. ",
654 - myNextRole, did); 650 + myNextRole, did);
655 - mastershipService.relinquishMastership(did); 651 + mastershipService.relinquishMastership(did);
656 - }
657 - return;
658 } 652 }
653 + return;
654 + }
659 655
660 - // device is connected to this node: 656 + // device is connected to this node:
661 - if (store.getDevice(did) != null) { 657 + if (store.getDevice(did) != null) {
662 - reassertRole(did, myNextRole); 658 + reassertRole(did, myNextRole);
663 - } else { 659 + } else {
664 - log.debug("Device is not yet/no longer in the store: {}", did); 660 + log.debug("Device is not yet/no longer in the store: {}", did);
665 - } 661 + }
662 + }
663 +
664 + // Intercepts mastership events
665 + private class InternalMastershipListener implements MastershipListener {
666 +
667 + @Override
668 + public void event(MastershipEvent event) {
669 + backgroundService.submit(() -> {
670 + try {
671 + handleMastershipEvent(event);
672 + } catch (Exception e) {
673 + log.warn("Failed to handle {}", event, e);
674 + }
675 + });
666 } 676 }
667 } 677 }
668 678
......