package edu.berkeley.thebes.twopl.server; import java.util.Collections; import java.util.List; import org.apache.thrift.TException; import org.apache.thrift.transport.TTransportException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Lists; import edu.berkeley.thebes.common.config.Config; import edu.berkeley.thebes.common.thrift.ServerAddress; import edu.berkeley.thebes.common.thrift.ThriftDataItem; import edu.berkeley.thebes.twopl.common.thrift.TwoPLSlaveReplicaService; import edu.berkeley.thebes.twopl.common.thrift.TwoPLThriftUtil; public class TwoPLSlaveReplicationService { private static Logger logger = LoggerFactory.getLogger(TwoPLSlaveReplicationService.class); private List<TwoPLSlaveReplicaService.Client> slaveReplicas; public TwoPLSlaveReplicationService() { this.slaveReplicas = Collections.emptyList(); } public void connectSlaves() { slaveReplicas = Lists.newArrayList(); try { Thread.sleep(5000); } catch (Exception e) { } logger.debug("Bootstrapping slave replication service..."); for (ServerAddress slave : Config.getSiblingServers()) { while (true) { try { slaveReplicas.add( TwoPLThriftUtil.getSlaveReplicaServiceClient(slave.getIP(), slave.getPort())); break; } catch (TTransportException e) { System.err.println("Exception while bootstrapping connection with slave: " + slave); e.printStackTrace(); } } } logger.debug("...slave replication service bootstrapped"); } // TODO: race condition between serving and when we've connected to neighbors public void sendToSlaves(String key, ThriftDataItem value) throws TException { for (TwoPLSlaveReplicaService.Client slave : slaveReplicas) { slave.put(key, value); } } }