@Override protected String getRequestUri() { // We need to know the last replication number that we have received on // a previous run. To do this we need to retrieve the replication state // from our downstream replication task by initializing. invokeSinkInit(); // The downstream task returns the next sequence number. long requestSequenceNumber = replicationState.getSequenceNumber(); return pathPrefix + "/replicationData/" + requestSequenceNumber + "/tail"; }
@Override public void initialize(Map<String, Object> metaData) { // Initialise the replication meta data. stateWriter.initialize(metaData); // Get the replication state for this pipeline run. state = (ReplicationState) metaData.get(ReplicationState.META_DATA_KEY); // Initialize a new change writer for the current sequence number. if (state.getSequenceNumber() > 0) { changeWriter = replicationStore.saveData(state.getSequenceNumber()); } }
@Override public void initialize(Map<String, Object> metaData) { // Initialise the replication meta data. stateWriter.initialize(metaData); // Get the replication state for this pipeline run. state = (ReplicationState) metaData.get(ReplicationState.META_DATA_KEY); // Initialize a new change writer for the current sequence number. if (state.getSequenceNumber() > 0) { changeWriter = replicationStore.saveData(state.getSequenceNumber()); } }
@Override public void initialize(Map<String, Object> metaData) { // Initialise the replication meta data. stateWriter.initialize(metaData); // Get the replication state for this pipeline run. state = (ReplicationState) metaData.get(ReplicationState.META_DATA_KEY); // Initialise the downstream tasks passing everything except the // replication state. if (state.getSequenceNumber() > 0) { Map<String, Object> downstreamMetaData = new HashMap<String, Object>(metaData); downstreamMetaData.remove(ReplicationState.META_DATA_KEY); changeSink.initialize(downstreamMetaData); } }
@Override public void initialize(Map<String, Object> metaData) { // Initialise the replication meta data. stateWriter.initialize(metaData); // Get the replication state for this pipeline run. state = (ReplicationState) metaData.get(ReplicationState.META_DATA_KEY); // Initialise the downstream tasks passing everything except the // replication state. if (state.getSequenceNumber() > 0) { Map<String, Object> downstreamMetaData = new HashMap<String, Object>(metaData); downstreamMetaData.remove(ReplicationState.META_DATA_KEY); changeSink.initialize(downstreamMetaData); } }
@Override public void process(ChangeContainer change) { if (!lockObtained) { throw new OsmosisRuntimeException("initialize has not been called"); } if (state.getSequenceNumber() == 0) { throw new OsmosisRuntimeException("No changes can be included for replication sequence 0."); } }
@Override public void complete() { // We must complete downstream before we complete the replication writer // so that we know the replication data has been committed before we // persist replication state. if (state.getSequenceNumber() > 0) { changeSink.complete(); } stateWriter.complete(); }
private long getCurrentSequenceNumber() { try { return new ServerStateReader().getServerState(dataDirectory.toURI().toURL()).getSequenceNumber(); } catch (MalformedURLException e) { throw new OsmosisRuntimeException("Unable to get the current sequence number", e); } }
@Override public void process(ChangeContainer change) { if (!lockObtained) { throw new OsmosisRuntimeException("initialize has not been called"); } if (state.getSequenceNumber() == 0) { throw new OsmosisRuntimeException("No changes can be included for replication sequence 0."); } }
@Override public void complete() { // We must complete downstream before we complete the replication writer // so that we know the replication data has been committed before we // persist replication state. if (state.getSequenceNumber() > 0) { changeSink.complete(); } stateWriter.complete(); }
/** * {@inheritDoc} */ @Override protected void processComplete() { if (sinkActive) { LOG.finer("Closing change sink for interval with sequence number " + currentDataState.getSequenceNumber()); changeSink.complete(); replicationStore.saveState(currentDataState); changeSink.close(); changeSink = null; sinkActive = false; } }
/** * {@inheritDoc} */ @Override protected void processComplete() { if (sinkActive) { LOG.finer("Closing change sink for interval with sequence number " + currentDataState.getSequenceNumber()); changeSink.complete(); replicationStore.saveState(currentDataState); changeSink.close(); changeSink = null; sinkActive = false; } }
@Override public void initialize(Map<String, Object> metaData) { // Get the replication state from the upstream task. if (!metaData.containsKey(ReplicationState.META_DATA_KEY)) { throw new OsmosisRuntimeException("No replication state has been provided in metadata key " + ReplicationState.META_DATA_KEY + "."); } state = (ReplicationState) metaData.get(ReplicationState.META_DATA_KEY); // Call the downstream initialize which will among other things // initialise the state. changeSink.initialize(metaData); // We must only read from the state object during initialize and // complete because it may be updated by other threads at other times. sequenceNumber = state.getSequenceNumber(); // If the sequence id is still 0 then replication hasn't been fully // initialized and we can't start the server yet. if (sequenceNumber > 0 && !serverStarted) { // We can start the server now. We give it the previous sequence // number because the current one is still in progress. server.start(sequenceNumber - 1); serverStarted = true; } }
@Override public void initialize(Map<String, Object> metaData) { if (lockObtained) { throw new OsmosisRuntimeException("initialize has already been called"); } // Lock the working directory. fileLock.lock(); lockObtained = true; // Get the replication state from the upstream task. if (!metaData.containsKey(ReplicationState.META_DATA_KEY)) { throw new OsmosisRuntimeException("No replication state has been provided in metadata key " + ReplicationState.META_DATA_KEY + "."); } state = (ReplicationState) metaData.get(ReplicationState.META_DATA_KEY); // Populate the state from the existing state if it exists. if (statePersistor.exists()) { state.load(statePersistor.loadMap()); // The current sequence number must now be incremented. state.setSequenceNumber(state.getSequenceNumber() + 1); if (LOG.isLoggable(Level.FINER)) { LOG.finer("Replication sequence number is " + state.getSequenceNumber() + "."); } } }
@Override public void initialize(Map<String, Object> metaData) { if (lockObtained) { throw new OsmosisRuntimeException("initialize has already been called"); } // Lock the working directory. fileLock.lock(); lockObtained = true; // Get the replication state from the upstream task. if (!metaData.containsKey(ReplicationState.META_DATA_KEY)) { throw new OsmosisRuntimeException("No replication state has been provided in metadata key " + ReplicationState.META_DATA_KEY + "."); } state = (ReplicationState) metaData.get(ReplicationState.META_DATA_KEY); // Populate the state from the existing state if it exists. if (statePersistor.exists()) { state.load(statePersistor.loadMap()); // The current sequence number must now be incremented. state.setSequenceNumber(state.getSequenceNumber() + 1); if (LOG.isLoggable(Level.FINER)) { LOG.finer("Replication sequence number is " + state.getSequenceNumber() + "."); } } }
@Override public void complete() { if (state.getSequenceNumber() > 0) { // Complete the writing of the change file. changeWriter.complete(); changeWriter.close(); changeWriter = null; } // Write the sequenced state file. replicationStore.saveState(state); // We must only complete the state writer after we've finished writing // the replication data and sequence numbered state. stateWriter.complete(); }
@Override public void complete() { if (state.getSequenceNumber() > 0) { // Complete the writing of the change file. changeWriter.complete(); changeWriter.close(); changeWriter = null; } // Write the sequenced state file. replicationStore.saveState(state); // We must only complete the state writer after we've finished writing // the replication data and sequence numbered state. stateWriter.complete(); }
@Override public void saveState(ReplicationState state) { File stateFile = sequenceFormatter.getFormattedName(state.getSequenceNumber(), ".state.txt"); new PropertiesPersister(stateFile).store(state.store()); if (saveCurrentState) { currentStatePersister.store(state.store()); } }
/** * {@inheritDoc} */ public void initialize(Map<String, Object> metaData) { // Get the replication state from the upstream task. if (!metaData.containsKey(ReplicationState.META_DATA_KEY)) { throw new OsmosisRuntimeException( "No replication state has been provided in metadata key " + ReplicationState.META_DATA_KEY + "."); } currentState = (ReplicationState) metaData.get(ReplicationState.META_DATA_KEY); // Initialise the state from the stored state if it exists and increment // the sequence number. if (stateExists) { currentState.load(storedState); currentState.setSequenceNumber(currentState.getSequenceNumber() + 1); } }
@Override public void saveState(ReplicationState state) { File stateFile = sequenceFormatter.getFormattedName(state.getSequenceNumber(), ".state.txt"); new PropertiesPersister(stateFile).store(state.store()); if (saveCurrentState) { currentStatePersister.store(state.store()); } }