public StreamPlan(String description, long repairedAt, int connectionsPerHost) { this.description = description; this.repairedAt = repairedAt; this.coordinator = new StreamCoordinator(connectionsPerHost, connectionFactory); }
public void connect(StreamResultFuture future) { if (this.connectSequentially) connectSequentially(future); else connectAllStreamSessions(); }
/** * @return Current snapshot of streaming progress. */ public StreamState getCurrentState() { return new StreamState(planId, description, coordinator.getAllSessionInfo()); }
private void connectSequentially(StreamResultFuture future) { sessionsToConnect = getAllStreamSessions().iterator(); future.addEventListener(new StreamEventHandler() { public void handleStreamEvent(StreamEvent event) { if (event.eventType == StreamEvent.Type.STREAM_PREPARED || event.eventType == StreamEvent.Type.STREAM_COMPLETE) connectNext(); } public void onSuccess(StreamState result) { } public void onFailure(Throwable t) { } }); connectNext(); }
/** * Create new StreamResult of given {@code planId} and type. * * Constructor is package private. You need to use {@link StreamPlan#execute()} to get the instance. * * @param planId Stream plan ID * @param description Stream description */ private StreamResultFuture(UUID planId, String description, StreamCoordinator coordinator) { this.planId = planId; this.description = description; this.coordinator = coordinator; // if there is no session to listen to, we immediately set result for returning if (!coordinator.isReceiving() && !coordinator.hasActiveSessions()) set(getCurrentState()); }
public synchronized void transferFiles(InetAddress to, Collection<StreamSession.SSTableStreamingSections> sstableDetails) { HostStreamingData sessionList = getOrCreateHostData(to); if (connectionsPerHost > 1) { List<List<StreamSession.SSTableStreamingSections>> buckets = sliceSSTableDetails(sstableDetails); for (List<StreamSession.SSTableStreamingSections> subList : buckets) { StreamSession session = sessionList.getOrCreateNextSession(to, to); session.addTransferFiles(subList); } } else { StreamSession session = sessionList.getOrCreateNextSession(to, to); session.addTransferFiles(sstableDetails); } }
public synchronized void addSessionInfo(SessionInfo session) { HostStreamingData data = getOrCreateHostData(session.peer); data.addSessionInfo(session); }
static StreamResultFuture init(UUID planId, String description, Collection<StreamEventHandler> listeners, StreamCoordinator coordinator) { StreamResultFuture future = createAndRegister(planId, description, coordinator); if (listeners != null) { for (StreamEventHandler listener : listeners) future.addEventListener(listener); } logger.info("[Stream #{}] Executing streaming plan for {}", planId, description); // Initialize and start all sessions for (final StreamSession session : coordinator.getAllStreamSessions()) { session.init(future); } coordinator.connect(future); return future; }
void handleSessionComplete(StreamSession session) { logger.info("[Stream #{}] Session with {} is complete", session.planId(), session.peer); fireStreamEvent(new StreamEvent.SessionCompleteEvent(session)); SessionInfo sessionInfo = session.getSessionInfo(); coordinator.addSessionInfo(sessionInfo); maybeComplete(); }
/** * @return true if this plan has no plan to execute */ public boolean isEmpty() { return !coordinator.hasActiveSessions(); }
/** * Add transfer task to send data of specific {@code columnFamilies} under {@code keyspace} and {@code ranges}. * * @param to endpoint address of receiver * @param connecting Actual connecting address of the endpoint * @param keyspace name of keyspace * @param ranges ranges to send * @param columnFamilies specific column families * @return this object for chaining */ public StreamPlan transferRanges(InetAddress to, InetAddress connecting, String keyspace, Collection<Range<Token>> ranges, String... columnFamilies) { StreamSession session = coordinator.getOrCreateNextSession(to, connecting); session.addTransferRanges(keyspace, ranges, Arrays.asList(columnFamilies), flushBeforeTransfer, repairedAt); return this; }
static StreamResultFuture init(UUID planId, String description, Collection<StreamEventHandler> listeners, StreamCoordinator coordinator) { StreamResultFuture future = createAndRegister(planId, description, coordinator); if (listeners != null) { for (StreamEventHandler listener : listeners) future.addEventListener(listener); } logger.info("[Stream #{}] Executing streaming plan for {}", planId, description); // Initialize and start all sessions for (final StreamSession session : coordinator.getAllStreamSessions()) { session.init(future); } coordinator.connectAllStreamSessions(); return future; }
private void attachConnection(InetAddress from, int sessionIndex, IncomingStreamingConnection connection, boolean isForOutgoing, int version) throws IOException { StreamSession session = coordinator.getOrCreateSessionById(from, sessionIndex, connection.socket.getInetAddress()); session.init(this); session.handler.initiateOnReceivingSide(connection, isForOutgoing, version); }
public synchronized void updateProgress(ProgressInfo info) { getHostData(info.peer).updateProgress(info); }
/** * Create new StreamResult of given {@code planId} and type. * * Constructor is package private. You need to use {@link StreamPlan#execute()} to get the instance. * * @param planId Stream plan ID * @param description Stream description */ private StreamResultFuture(UUID planId, String description, StreamCoordinator coordinator) { this.planId = planId; this.description = description; this.coordinator = coordinator; // if there is no session to listen to, we immediately set result for returning if (!coordinator.isReceiving() && !coordinator.hasActiveSessions()) set(getCurrentState()); }
public synchronized void transferFiles(InetAddress to, Collection<StreamSession.SSTableStreamingSections> sstableDetails) { HostStreamingData sessionList = getOrCreateHostData(to); if (connectionsPerHost > 1) { List<List<StreamSession.SSTableStreamingSections>> buckets = sliceSSTableDetails(sstableDetails); for (List<StreamSession.SSTableStreamingSections> subList : buckets) { StreamSession session = sessionList.getOrCreateNextSession(to, to); session.addTransferFiles(subList); } } else { StreamSession session = sessionList.getOrCreateNextSession(to, to); session.addTransferFiles(sstableDetails); } }
public synchronized void addSessionInfo(SessionInfo session) { HostStreamingData data = getOrCreateHostData(session.peer); data.addSessionInfo(session); }
private void connectSequentially(StreamResultFuture future) { sessionsToConnect = getAllStreamSessions().iterator(); future.addEventListener(new StreamEventHandler() { public void handleStreamEvent(StreamEvent event) { if (event.eventType == StreamEvent.Type.STREAM_PREPARED || event.eventType == StreamEvent.Type.STREAM_COMPLETE) connectNext(); } public void onSuccess(StreamState result) { } public void onFailure(Throwable t) { } }); connectNext(); }
static StreamResultFuture init(UUID planId, String description, Collection<StreamEventHandler> listeners, StreamCoordinator coordinator) { StreamResultFuture future = createAndRegister(planId, description, coordinator); if (listeners != null) { for (StreamEventHandler listener : listeners) future.addEventListener(listener); } logger.info("[Stream #{}] Executing streaming plan for {}", planId, description); // Initialize and start all sessions for (final StreamSession session : coordinator.getAllStreamSessions()) { session.init(future); } coordinator.connect(future); return future; }
void handleSessionComplete(StreamSession session) { logger.info("[Stream #{}] Session with {} is complete", session.planId(), session.peer); fireStreamEvent(new StreamEvent.SessionCompleteEvent(session)); SessionInfo sessionInfo = session.getSessionInfo(); coordinator.addSessionInfo(sessionInfo); maybeComplete(); }