package com.bagri.server.hazelcast.task.node;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import com.bagri.core.system.Node;
import com.bagri.server.hazelcast.task.EntityProcessor;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IExecutorService;
import com.hazelcast.core.Member;
import com.hazelcast.map.EntryBackupProcessor;
import com.hazelcast.map.EntryProcessor;
import com.hazelcast.spring.context.SpringAware;
import static com.bagri.core.Constants.pn_cluster_node_name;
import static com.bagri.core.server.api.CacheConstants.PN_XDM_SYSTEM_POOL;
@SpringAware
public abstract class NodeProcessor extends EntityProcessor implements EntryProcessor<String, Node>,
EntryBackupProcessor<String, Node> {
protected final transient Logger logger = LoggerFactory.getLogger(getClass());
protected transient HazelcastInstance hzInstance;
public NodeProcessor() {
//
}
public NodeProcessor(int version, String admin) {
super(version, admin);
}
@Autowired
public void setHzInstance(HazelcastInstance hzInstance) {
this.hzInstance = hzInstance;
//logger.trace("setSchemaManager; got manager: {}", schemaManager);
}
@Override
public void processBackup(Entry<String, Node> entry) {
process(entry);
}
@Override
public EntryBackupProcessor<String, Node> getBackupProcessor() {
return this;
}
protected int updateNodesInCluster(Node node, String comment) {
logger.trace("updateNodesInCluster.enter; node: {}", node);
// do this on Named nodes only, not on ALL nodes!
Set<Member> all = hzInstance.getCluster().getMembers();
List<Member> named = new ArrayList<Member>(all.size());
String name = node.getName();
for (Member member: all) {
if (name.equals(member.getStringAttribute(pn_cluster_node_name))) {
named.add(member);
}
}
int cnt = 0;
if (named.size() > 0) {
logger.info("updateNodesInCluster; going to update {} Members", named.size());
NodeOptionSetter setter = new NodeOptionSetter(getAdmin(), comment, node.getOptions());
IExecutorService execService = hzInstance.getExecutorService(PN_XDM_SYSTEM_POOL);
Map<Member, Future<Boolean>> result = execService.submitToMembers(setter, named);
for (Map.Entry<Member, Future<Boolean>> entry: result.entrySet()) {
try {
Boolean ok = entry.getValue().get();
if (ok) cnt++;
logger.debug("updateNodesInCluster; Member {} {}updated", entry.getKey(), ok ? "" : "NOT ");
} catch (InterruptedException | ExecutionException ex) {
logger.error("updateNodesInCluster.error; ", ex);
}
}
}
logger.info("updateNodesInCluster.exit; {} Members updated", cnt);
return cnt;
}
}