package com.sungardas.enhancedsnapshots.cluster; import com.datish.copycat.Server; import com.sungardas.enhancedsnapshots.aws.dynamodb.model.EventEntry; import com.sungardas.enhancedsnapshots.aws.dynamodb.model.NodeEntry; import com.sungardas.enhancedsnapshots.aws.dynamodb.repository.NodeRepository; import com.sungardas.enhancedsnapshots.components.ConfigurationMediator; import com.sungardas.enhancedsnapshots.service.AWSCommunicationService; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.io.File; import java.util.concurrent.ConcurrentHashMap; @Service public class CopyCatWrapper implements ClusterEventListener { private static final Logger LOG = LogManager.getLogger(CopyCatWrapper.class); @Autowired private ConfigurationMediator configurationMediator; @Autowired private NodeRepository nodeRepository; @Autowired private AWSCommunicationService awsCommunicationService; @Value("${enhancedsnapshots.copycat.persist.path}") private String persistPath; @Value("${enhancedsnapshots.copycat.port}") private int port; private ConcurrentHashMap<String, Server> serverMap = new ConcurrentHashMap<>(); @PostConstruct private void init() { Server.PERSISTENCE_PATH = persistPath; if (configurationMediator.isClusterMode()) { for (NodeEntry node : nodeRepository.findAll()) { try { String hostName = getHostName(node.getNodeId()); LOG.info("CopyCat server, volumeId={}, hostName={}, port={} started", node.getSdfsVolumeId(), hostName, port); deleteCopyCatTempData(node.getSdfsVolumeId()); Server server = new Server(node.getSdfsVolumeId(), hostName, port, configurationMediator.getConfigurationId(), true, true); serverMap.put(node.getNodeId(), server); } catch (Exception e) { LOG.error("CopyCat server start failed", e); } } } } private void deleteCopyCatTempData(long volumeId) { try { new File(Server.PERSISTENCE_PATH + File.separator + volumeId + ".db").delete(); } catch (Exception e) { //skip } } @Override public void launched(EventEntry eventEntry) { try { String hostName = getHostName(eventEntry.getInstanceId()); deleteCopyCatTempData(eventEntry.getVolumeId()); LOG.info("CopyCat server, volumeId={}, hostName={}, port={} started", eventEntry.getVolumeId(), hostName, port); Server server = new Server(eventEntry.getVolumeId(), hostName, port, configurationMediator.getConfigurationId(), true, true); serverMap.put(eventEntry.getInstanceId(), server); } catch (Exception e) { LOG.error("CopyCat server start failed", e); } } @Override public void terminated(EventEntry eventEntry) { try { serverMap.remove(eventEntry.getInstanceId()).close(); deleteCopyCatTempData(eventEntry.getVolumeId()); } catch (Exception e) { LOG.error("CopyCat server stop failed", e); } } private String getHostName(String nodeId) { return awsCommunicationService.getDNSName(nodeId); } }