@Override public RemoteWaveletContainer create(WaveletNotificationSubscriber notifiee, WaveletName waveletName, String waveDomain) { return new RemoteWaveletContainerImpl(waveletName, notifiee, loadWaveletState( waveletLoadExecutor, deltaStore, waveletName, waveletLoadExecutor), storageContinuationExecutor); } };
@Override public void commit(HashedVersion version) { try { awaitLoad(); } catch(WaveletStateException ex) { LOG.warning("Failed to load " + getWaveletName() + " to perform commit.", ex); acquireWriteLock(); markStateCorrupted(); releaseWriteLock(); return; } acquireWriteLock(); try { attemptCommit(version); } finally { releaseWriteLock(); } }
/** * Commits the resulting deltas, notifying the server of them. * Assumes that everything in resultingDeltas is now in-order, since * even if the original stream was non-contiguous, we have requestedHistory. * Even if not, it is still safe to commit up to the fragmented point. */ private void commitAndNotifyResultingDeltas( ImmutableList.Builder<WaveletDeltaRecord> resultingDeltas, final SettableFuture<Void> futureResult) { if(!resultingDeltas.build().isEmpty()) { notifyOfDeltas(resultingDeltas.build(), ImmutableSet.<String>of()); futureResult.set(null); //Attempt to run any pending commit if(pendingCommit) { releaseWriteLock(); commit(pendingCommitVersion); acquireWriteLock(); } } else { LOG.info("No deltas in list (fetching history?), ignoring callback"); } }
awaitLoad(); LOG.warning("Failed to load " + getWaveletName() + " to perform update.", ex); acquireWriteLock(); markStateCorrupted(); releaseWriteLock(); return; acquireWriteLock(); try { checkStateOk(); // TODO(soren): if CORRUPTED, throw away wavelet and start again HashedVersion expectedVersion = getCurrentVersion(); boolean haveRequestedHistory = false; certificateManager.verifyDelta(appliedDelta.getMessage().getSignedOriginalDelta()); } catch (SignatureException e) { LOG.warning("Verification failure for " + domain + " incoming " + getWaveletName(), e); throw new WaveServerException("Verification failure", e); } catch (UnknownSignerException e) { LOG.severe("Unknown signer for " + domain + " incoming " + getWaveletName() + ", this is BAD! We were supposed to have prefetched it!", e); throw new WaveServerException("Unknown signer", e); appliedAt = AppliedDeltaUtil.getHashedVersionAppliedAt(appliedDelta); } catch (InvalidProtocolBufferException e) { markStateCorrupted(); throw new WaveServerException( "Authoritative server sent delta with badly formed original wavelet delta", e);
@Override public void setUp() throws Exception { super.setUp(); WaveletNotificationSubscriber notifiee = mock(WaveletNotificationSubscriber.class); DeltaStore deltaStore = new MemoryDeltaStore(); AccessController localAccessController = mock(AccessController.class); AccessController remoteAccessController = mock(AccessController.class); WaveletState localWaveletState = DeltaStoreBasedWaveletState.create(deltaStore.open(localWaveletName), PERSIST_EXECUTOR); localWavelet = new LocalWaveletContainerImpl(localWaveletName, notifiee, Futures.immediateFuture(localWaveletState), localDomain, STORAGE_CONTINUATION_EXECUTOR, localAccessController); localWavelet.awaitLoad(); WaveletState remoteWaveletState = DeltaStoreBasedWaveletState.create(deltaStore.open(remoteWaveletName), PERSIST_EXECUTOR); remoteWavelet = new RemoteWaveletContainerImpl(remoteWaveletName, notifiee, Futures.immediateFuture(remoteWaveletState), STORAGE_CONTINUATION_EXECUTOR, remoteAccessController); remoteWavelet.awaitLoad(); }
appliedDeltas.add(ByteStringMessage.parseProtocolAppliedWaveletDelta(delta)); } catch (InvalidProtocolBufferException e) { LOG.info("Invalid applied delta protobuf for incoming " + getWaveletName(), e); acquireWriteLock(); try { markStateCorrupted(); } finally { releaseWriteLock(); numSignerInfoPrefetched.incrementAndGet(); certificateManager.prefetchDeltaSignerInfo(federationProvider, sig.getSignerId(), getWaveletName(), deltaEndVersion, prefetchListener);
Preconditions.checkState(hashedVersion.equals(getCurrentVersion()), "Applied delta must apply to current version"); WaveletDelta transformed = maybeTransformSubmittedDelta(delta); if (transformed.getTargetVersion().equals(delta.getTargetVersion())) { markStateCorrupted(); throw new WaveServerException("Couldn't apply authoritative delta, " + "it transformed away at version " + transformed.getTargetVersion().getVersion()); markStateCorrupted(); throw new WaveServerException("Couldn't apply authoritative delta, " + "it transformed to wrong version. Expected " + hashedVersion + return applyDelta(appliedDelta, transformed);
/** * Attempts to commit at the given version. * This will only succeed if we are actually up to date. * If not, then the history is assumed to be coming, and so we can just skip the whole task. * */ private void attemptCommit(HashedVersion version) { HashedVersion expectedVersion = getCurrentVersion(); if(expectedVersion == null || version.getVersion() == expectedVersion.getVersion()) { LOG.info("Committed " + getWaveletName() + " at version " + version.getVersion()); persist(version, ImmutableSet.<String>of()); if(pendingCommitVersion == null || (version.getVersion() >= pendingCommitVersion.getVersion())) { pendingCommit = false; } } else { LOG.info("Ignoring commit request at " + version.getVersion() + " since only at " + expectedVersion.getVersion()); if(pendingCommitVersion == null || (pendingCommitVersion != null && pendingCommitVersion.getVersion() < version.getVersion())) { pendingCommitVersion = version; } LOG.info("pendingCommitVersion is now " + pendingCommitVersion.getVersion()); pendingCommit = true; } }
@Override public void setUp() throws Exception { super.setUp(); WaveletNotificationSubscriber notifiee = mock(WaveletNotificationSubscriber.class); DeltaStore deltaStore = new MemoryDeltaStore(); WaveletState localWaveletState = DeltaStoreBasedWaveletState.create(deltaStore.open(localWaveletName), PERSIST_EXECUTOR); localWavelet = new LocalWaveletContainerImpl(localWaveletName, notifiee, Futures.immediateFuture(localWaveletState), localDomain, STORAGE_CONTINUATION_EXECUTOR); localWavelet.awaitLoad(); WaveletState remoteWaveletState = DeltaStoreBasedWaveletState.create(deltaStore.open(remoteWaveletName), PERSIST_EXECUTOR); remoteWavelet = new RemoteWaveletContainerImpl(remoteWaveletName, notifiee, Futures.immediateFuture(remoteWaveletState), STORAGE_CONTINUATION_EXECUTOR); remoteWavelet.awaitLoad(); }