Ayaka Koshibe

MastershipEvent carries RoleInfo as a subject

Change-Id: I8f850ad1f21bfbdc23fedda1a53f4ccedb1b8d32
......@@ -21,7 +21,7 @@ import org.onlab.onos.net.device.DeviceService;
description = "Lists mastership roles of nodes for each device.")
public class RolesCommand extends AbstractShellCommand {
private static final String FMT_HDR = "%s: master=%s, standbys=%s";
private static final String FMT_HDR = "%s: master=%s, standbys=[ %s]";
@Override
protected void execute() {
......
......@@ -3,10 +3,11 @@ package org.onlab.onos.cluster;
import java.util.List;
import java.util.Objects;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableList;
/**
* A container for detailed role information for a device,
* An immutable container for role information for a device,
* within the current cluster. Role attributes include current
* master and a preference-ordered list of backup nodes.
*/
......@@ -52,12 +53,9 @@ public class RoleInfo {
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
builder.append("master:").append(master).append(",");
builder.append("backups:");
for (NodeId n : backups) {
builder.append(" ").append(n);
}
return builder.toString();
return MoreObjects.toStringHelper(this.getClass())
.add("master", master)
.add("backups", backups)
.toString();
}
}
......
package org.onlab.onos.mastership;
import org.onlab.onos.cluster.NodeId;
import org.onlab.onos.cluster.RoleInfo;
import org.onlab.onos.event.AbstractEvent;
import org.onlab.onos.net.DeviceId;
......@@ -9,9 +10,8 @@ import org.onlab.onos.net.DeviceId;
*/
public class MastershipEvent extends AbstractEvent<MastershipEvent.Type, DeviceId> {
//do we worry about explicitly setting slaves/equals? probably not,
//to keep it simple
NodeId node;
//Contains master and standby information.
RoleInfo roleInfo;
/**
* Type of mastership events.
......@@ -29,16 +29,16 @@ public class MastershipEvent extends AbstractEvent<MastershipEvent.Type, DeviceI
}
/**
* Creates an event of a given type and for the specified device, master,
* and the current time.
* Creates an event of a given type and for the specified device,
* role information, and the current time.
*
* @param type device event type
* @param device event device subject
* @param node master ID subject
* @param info mastership role information subject
*/
public MastershipEvent(Type type, DeviceId device, NodeId node) {
public MastershipEvent(Type type, DeviceId device, RoleInfo info) {
super(type, device);
this.node = node;
this.roleInfo = info;
}
/**
......@@ -50,9 +50,9 @@ public class MastershipEvent extends AbstractEvent<MastershipEvent.Type, DeviceI
* @param master master ID subject
* @param time occurrence time
*/
public MastershipEvent(Type type, DeviceId device, NodeId master, long time) {
public MastershipEvent(Type type, DeviceId device, RoleInfo info, long time) {
super(type, device, time);
this.node = master;
this.roleInfo = info;
}
/**
......@@ -63,7 +63,17 @@ public class MastershipEvent extends AbstractEvent<MastershipEvent.Type, DeviceI
*
* @return node ID as a subject
*/
//XXX to-be removed - or keep for convenience?
public NodeId node() {
return node;
return roleInfo.master();
}
/**
* Returns the current role state for the subject.
*
* @return RoleInfo associated with Device ID subject
*/
public RoleInfo roleInfo() {
return roleInfo;
}
}
......
......@@ -5,6 +5,7 @@ import static org.junit.Assert.*;
import java.util.Collections;
import java.util.Map;
import java.util.LinkedList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
......@@ -12,6 +13,7 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.onos.cluster.NodeId;
import org.onlab.onos.cluster.RoleInfo;
import org.onlab.onos.event.AbstractListenerRegistry;
import org.onlab.onos.event.DefaultEventSinkRegistry;
import org.onlab.onos.event.Event;
......@@ -87,7 +89,8 @@ public class ReplicaInfoManagerTest {
service.addListener(new MasterNodeCheck(latch, DID1, NID1));
// fake MastershipEvent
eventDispatcher.post(new MastershipEvent(Type.MASTER_CHANGED, DID1, NID1));
eventDispatcher.post(new MastershipEvent(Type.MASTER_CHANGED, DID1,
new RoleInfo(NID1, new LinkedList<NodeId>())));
assertTrue(latch.await(1, TimeUnit.SECONDS));
}
......
......@@ -136,13 +136,13 @@ implements MastershipStore {
rv.reassign(nodeId, STANDBY, NONE);
roleMap.put(deviceId, rv);
updateTerm(deviceId);
return new MastershipEvent(MASTER_CHANGED, deviceId, nodeId);
return new MastershipEvent(MASTER_CHANGED, deviceId, rv.roleInfo());
case NONE:
rv.add(MASTER, nodeId);
rv.reassign(nodeId, STANDBY, NONE);
roleMap.put(deviceId, rv);
updateTerm(deviceId);
return new MastershipEvent(MASTER_CHANGED, deviceId, nodeId);
return new MastershipEvent(MASTER_CHANGED, deviceId, rv.roleInfo());
default:
log.warn("unknown Mastership Role {}", role);
return null;
......@@ -306,7 +306,7 @@ implements MastershipStore {
roleMap.put(deviceId, rv);
Integer term = terms.get(deviceId);
terms.put(deviceId, ++term);
return new MastershipEvent(MASTER_CHANGED, deviceId, backup);
return new MastershipEvent(MASTER_CHANGED, deviceId, rv.roleInfo());
}
}
......@@ -373,7 +373,7 @@ implements MastershipStore {
return;
}
notifyDelegate(new MastershipEvent(
MASTER_CHANGED, event.getKey(), event.getValue().get(MASTER)));
MASTER_CHANGED, event.getKey(), event.getValue().roleInfo()));
}
@Override
......
......@@ -10,6 +10,9 @@ import org.onlab.onos.cluster.NodeId;
import org.onlab.onos.cluster.RoleInfo;
import org.onlab.onos.net.MastershipRole;
import com.google.common.base.MoreObjects;
import com.google.common.base.MoreObjects.ToStringHelper;
/**
* A structure that holds node mastership roles associated with a
* {@link DeviceId}. This structure needs to be locked through IMap.
......@@ -109,14 +112,10 @@ public class RoleValue {
@Override
public String toString() {
final StringBuilder builder = new StringBuilder();
ToStringHelper helper = MoreObjects.toStringHelper(this.getClass());
for (Map.Entry<MastershipRole, List<NodeId>> el : value.entrySet()) {
builder.append(el.getKey().toString()).append(": [");
for (NodeId n : el.getValue()) {
builder.append(n);
}
builder.append("]\n");
helper.add(el.getKey().toString(), el.getValue());
}
return builder.toString();
return helper.toString();
}
}
......
......@@ -29,6 +29,8 @@ import org.onlab.onos.store.AbstractStore;
import org.onlab.packet.IpPrefix;
import org.slf4j.Logger;
import com.google.common.collect.Lists;
import static org.onlab.onos.mastership.MastershipEvent.Type.*;
/**
......@@ -89,7 +91,8 @@ public class SimpleMastershipStore
}
}
return new MastershipEvent(MASTER_CHANGED, deviceId, nodeId);
return new MastershipEvent(MASTER_CHANGED, deviceId,
new RoleInfo(nodeId, Lists.newLinkedList(backups)));
}
@Override
......@@ -196,7 +199,8 @@ public class SimpleMastershipStore
} else {
masterMap.put(deviceId, backup);
termMap.get(deviceId).incrementAndGet();
return new MastershipEvent(MASTER_CHANGED, deviceId, backup);
return new MastershipEvent(MASTER_CHANGED, deviceId,
new RoleInfo(backup, Lists.newLinkedList(backups)));
}
case STANDBY:
case NONE:
......