package org.dcache.services.topology;
import com.google.common.collect.Sets;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashSet;
import java.util.Set;
import diskCacheV111.util.SpreadAndWait;
import dmg.cells.network.CellDomainNode;
import dmg.cells.nucleus.CellPath;
import org.dcache.cells.CellStub;
/**
*
* @author jans
*/
public class CellsHostnameService implements HostnameService
{
private static final Logger LOGGER =
LoggerFactory.getLogger(CellsHostnameService.class);
private CellsTopology _topology;
private Set<String> _hostnames = new HashSet<>();
private CellStub _stub;
@Override
public synchronized String getHostnames() {
return _hostnames.toString();
}
@Override
public void updateHostnames() {
CellDomainNode[] info = _topology.getInfoMap();
if (info == null) {
LOGGER.info("Cannot update host names. Domains not known yet. Try to run update first.");
return;
}
LOGGER.debug("Host name update started");
SpreadAndWait<String> spreader = new SpreadAndWait<>(_stub);
for (CellDomainNode domain : info) {
spreader.send(new CellPath(domain.getAddress()), String.class, "get hostname");
}
try {
spreader.waitForReplies();
setHostnames(spreader.getReplies().values());
LOGGER.debug("Host name update finished");
} catch (InterruptedException ignored) {
}
}
private synchronized void setHostnames(Iterable<String> hostnames) {
_hostnames = Sets.newHashSet(hostnames);
}
public void setTopology(CellsTopology topology) {
_topology = topology;
}
public void setCellStub(CellStub stub) {
_stub = stub;
}
}