DistributedMastershipStore
- try to avoid unnecessary remote writes - avoid reads from blocking if possible - atomically read term info Change-Id: I50badc718726261ccb14a6feefc578b420d28923
Showing
3 changed files
with
30 additions
and
10 deletions
This diff is collapsed. Click to expand it.
... | @@ -15,6 +15,10 @@ | ... | @@ -15,6 +15,10 @@ |
15 | */ | 15 | */ |
16 | package org.onlab.onos.store.mastership.impl; | 16 | package org.onlab.onos.store.mastership.impl; |
17 | 17 | ||
18 | +import static org.onlab.onos.net.MastershipRole.MASTER; | ||
19 | +import static org.onlab.onos.net.MastershipRole.NONE; | ||
20 | +import static org.onlab.onos.net.MastershipRole.STANDBY; | ||
21 | + | ||
18 | import java.util.Collections; | 22 | import java.util.Collections; |
19 | import java.util.EnumMap; | 23 | import java.util.EnumMap; |
20 | import java.util.LinkedList; | 24 | import java.util.LinkedList; |
... | @@ -59,18 +63,30 @@ final class RoleValue { | ... | @@ -59,18 +63,30 @@ final class RoleValue { |
59 | return value.get(type).contains(nodeId); | 63 | return value.get(type).contains(nodeId); |
60 | } | 64 | } |
61 | 65 | ||
66 | + public MastershipRole getRole(NodeId nodeId) { | ||
67 | + if (contains(MASTER, nodeId)) { | ||
68 | + return MASTER; | ||
69 | + } | ||
70 | + if (contains(STANDBY, nodeId)) { | ||
71 | + return STANDBY; | ||
72 | + } | ||
73 | + return NONE; | ||
74 | + } | ||
75 | + | ||
62 | /** | 76 | /** |
63 | * Associates a node to a certain role. | 77 | * Associates a node to a certain role. |
64 | * | 78 | * |
65 | * @param type the role | 79 | * @param type the role |
66 | * @param nodeId the node ID of the node to associate | 80 | * @param nodeId the node ID of the node to associate |
81 | + * @return true if modified | ||
67 | */ | 82 | */ |
68 | - public void add(MastershipRole type, NodeId nodeId) { | 83 | + public boolean add(MastershipRole type, NodeId nodeId) { |
69 | List<NodeId> nodes = value.get(type); | 84 | List<NodeId> nodes = value.get(type); |
70 | 85 | ||
71 | if (!nodes.contains(nodeId)) { | 86 | if (!nodes.contains(nodeId)) { |
72 | - nodes.add(nodeId); | 87 | + return nodes.add(nodeId); |
73 | } | 88 | } |
89 | + return false; | ||
74 | } | 90 | } |
75 | 91 | ||
76 | /** | 92 | /** |
... | @@ -78,7 +94,7 @@ final class RoleValue { | ... | @@ -78,7 +94,7 @@ final class RoleValue { |
78 | * | 94 | * |
79 | * @param type the role | 95 | * @param type the role |
80 | * @param nodeId the ID of the node to remove | 96 | * @param nodeId the ID of the node to remove |
81 | - * @return | 97 | + * @return true if modified |
82 | */ | 98 | */ |
83 | public boolean remove(MastershipRole type, NodeId nodeId) { | 99 | public boolean remove(MastershipRole type, NodeId nodeId) { |
84 | List<NodeId> nodes = value.get(type); | 100 | List<NodeId> nodes = value.get(type); |
... | @@ -96,10 +112,12 @@ final class RoleValue { | ... | @@ -96,10 +112,12 @@ final class RoleValue { |
96 | * @param nodeId the Node ID of node changing roles | 112 | * @param nodeId the Node ID of node changing roles |
97 | * @param from the old role | 113 | * @param from the old role |
98 | * @param to the new role | 114 | * @param to the new role |
115 | + * @return true if modified | ||
99 | */ | 116 | */ |
100 | - public void reassign(NodeId nodeId, MastershipRole from, MastershipRole to) { | 117 | + public boolean reassign(NodeId nodeId, MastershipRole from, MastershipRole to) { |
101 | - remove(from, nodeId); | 118 | + boolean modified = remove(from, nodeId); |
102 | - add(to, nodeId); | 119 | + modified |= add(to, nodeId); |
120 | + return modified; | ||
103 | } | 121 | } |
104 | 122 | ||
105 | /** | 123 | /** |
... | @@ -109,10 +127,12 @@ final class RoleValue { | ... | @@ -109,10 +127,12 @@ final class RoleValue { |
109 | * @param from the old NodeId to replace | 127 | * @param from the old NodeId to replace |
110 | * @param to the new NodeId | 128 | * @param to the new NodeId |
111 | * @param type the role associated with the old NodeId | 129 | * @param type the role associated with the old NodeId |
130 | + * @return true if modified | ||
112 | */ | 131 | */ |
113 | - public void replace(NodeId from, NodeId to, MastershipRole type) { | 132 | + public boolean replace(NodeId from, NodeId to, MastershipRole type) { |
114 | - remove(type, from); | 133 | + boolean modified = remove(type, from); |
115 | - add(type, to); | 134 | + modified |= add(type, to); |
135 | + return modified; | ||
116 | } | 136 | } |
117 | 137 | ||
118 | /** | 138 | /** | ... | ... |
... | @@ -142,7 +142,7 @@ public class DistributedMastershipStoreTest { | ... | @@ -142,7 +142,7 @@ public class DistributedMastershipStoreTest { |
142 | testStore.setCurrent(CN1); | 142 | testStore.setCurrent(CN1); |
143 | 143 | ||
144 | //if already MASTER, nothing should happen | 144 | //if already MASTER, nothing should happen |
145 | - testStore.put(DID2, N1, true, false, false); | 145 | + testStore.put(DID2, N1, true, false, true); |
146 | assertEquals("wrong role for MASTER:", MASTER, dms.requestRole(DID2)); | 146 | assertEquals("wrong role for MASTER:", MASTER, dms.requestRole(DID2)); |
147 | 147 | ||
148 | //populate maps with DID1, N1 thru NONE case | 148 | //populate maps with DID1, N1 thru NONE case | ... | ... |
-
Please register or login to post a comment