@Override public HashedVersion getAppliedAtVersion(long version) throws IOException { return delegate().getAppliedAtVersion(version); }
@Override public ByteStringMessage<ProtocolAppliedWaveletDelta> getAppliedDelta(long version) throws IOException { return delegate().getAppliedDelta(version); }
@Override public WaveletDeltaRecord getDelta(long version) throws IOException { return delegate().getDelta(version); }
@Override public boolean hasNext() { return !reader.isEmpty() && nextVersion < reader.getEndVersion().getVersion(); }
/** * Reads all deltas from persistent storage. */ private static ImmutableList<WaveletDeltaRecord> readAll(WaveletDeltaRecordReader reader, ConcurrentNavigableMap<HashedVersion, WaveletDeltaRecord> cachedDeltas) throws IOException { HashedVersion startVersion = HASH_FACTORY.createVersionZero(reader.getWaveletName()); HashedVersion endVersion = reader.getEndVersion(); ListReceiver<WaveletDeltaRecord> receiver = new ListReceiver<WaveletDeltaRecord>(); readDeltasInRange(reader, cachedDeltas, startVersion, endVersion, receiver); return ImmutableList.copyOf(receiver); }
@Override public TransformedWaveletDelta getTransformedDelta(long version) throws IOException { return delegate().getTransformedDelta(version); } }
@Override public HashedVersion getEndVersion() { return delegate().getEndVersion(); }
@Override public HashedVersion getResultingVersion(long version) throws IOException { return delegate().getResultingVersion(version); }
@Override public WaveletDeltaRecord getDeltaByEndVersion(long version) throws IOException { return delegate().getDeltaByEndVersion(version); }
@Override public boolean isEmpty() { return delegate().isEmpty(); }
@Override public WaveletName getWaveletName() { return delegate().getWaveletName(); }
/** * Reads all deltas and applies them all to construct the end wavelet state. */ private static ReadableWaveletData buildWaveletFromDeltaReader(WaveletDeltaRecordReader reader) throws PersistenceException { try { // TODO(soren): better error handling of IllegalStateExceptions and // OperationExceptions thrown from here ReadableWaveletData wavelet = WaveletDataUtil.buildWaveletFromDeltas(reader.getWaveletName(), new TransformedWaveletDeltaIterator(reader)); Preconditions.checkState(wavelet.getHashedVersion().equals(reader.getEndVersion())); return wavelet; } catch (OperationException e) { throw new PersistenceException(e); } catch (RuntimeIOException e) { throw new PersistenceException(e.getIOException()); } }
/** * {@inheritDoc} * * @throws RuntimeIOException if the underlying reader throws * {@link IOException} * @throws IllegalStateException if there are gaps between deltas or * the next delta is empty */ @Override public TransformedWaveletDelta next() { try { TransformedWaveletDelta delta = reader.getTransformedDelta(nextVersion); Preconditions.checkState(delta != null, "no delta at version %s", nextVersion); Preconditions.checkState( delta.getAppliedAtVersion() < delta.getResultingVersion().getVersion(), "delta [%s, %s) is empty", delta.getAppliedAtVersion(), delta.getResultingVersion()); nextVersion = delta.getResultingVersion().getVersion(); return delta; } catch (IOException e) { throw new RuntimeIOException(e); } }
private static WaveletDeltaRecord getDelta(WaveletDeltaRecordReader reader, ConcurrentNavigableMap<HashedVersion, WaveletDeltaRecord> cachedDeltas, HashedVersion version) throws IOException { WaveletDeltaRecord delta = reader.getDelta(version.getVersion()); if (delta == null && cachedDeltas != null) { delta = cachedDeltas.get(version); } return delta; }