Committed by
Gerrit Code Review
ONOS-1981: Move expensive work off of event loop thread
Change-Id: I200d9b727a7d501d5b055574ddb0907b8f4756a2
Showing
1 changed file
with
52 additions
and
42 deletions
| ... | @@ -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 | ... | ... |
-
Please register or login to post a comment