package org.goldenorb.server;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.AsyncCallback.StatCallback;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.goldenorb.client.OrbTrackerMemberData;
import org.goldenorb.conf.OrbConfigurable;
import org.goldenorb.conf.OrbConfiguration;
import org.goldenorb.jet.OrbTrackerMember;
import org.goldenorb.zookeeper.OrbZKFailure;
import org.goldenorb.zookeeper.ZookeeperUtils;
/**
* An implementation of Watcher that watches the child nodes of the LeaderGroup node in ZooKeeper and notifies
* an OrbTrackermemberDataServiceImpl servlet when ever the data of those nodes change.
*/
public class LeaderGroupMemberMonitor implements Watcher {
private OrbTrackerMember orbTrackerMember;
private ZooKeeper zk;
private String path;
private String name;
private OrbTrackerMemberDataServiceImpl statusServer;
public LeaderGroupMemberMonitor(String path,
ZooKeeper zk,
String name,
OrbTrackerMemberDataServiceImpl statusServer) throws OrbZKFailure {
this.path = path;
this.name = name;
this.zk = zk;
this.statusServer = statusServer;
orbTrackerMember = (OrbTrackerMember) ZookeeperUtils.getNodeWritable(zk, path, new OrbTrackerMember(),
this);
if (orbTrackerMember != null) {
upDateServer();
}
}
@Override
public void process(WatchedEvent event) {
if (event.getType() != Event.EventType.NodeDeleted) {
try {
orbTrackerMember = (OrbTrackerMember) ZookeeperUtils.getNodeWritable(zk, path,
new OrbTrackerMember(), this);
} catch (OrbZKFailure e) {
System.err.println("ERROR RETRIEVING MEMBER NODE DATA FROM ZOOKER : " + path);
e.printStackTrace();
}
if (event.getType() == Event.EventType.NodeDataChanged && orbTrackerMember != null) {
upDateServer();
}
} else { // node was deleted
statusServer.removeNodeData(name);
}
}
private void upDateServer() {
statusServer.updateNodeData(new OrbTrackerMemberData(name, orbTrackerMember.getPartitionCapacity(),
orbTrackerMember.getAvailablePartitions(), orbTrackerMember.getReservedPartitions(), orbTrackerMember
.getInUsePartitions(), orbTrackerMember.getHostname(), orbTrackerMember.isLeader(),
orbTrackerMember.getPort()));
}
}