@Override public void open(Listener listener, IdFilter waveletFilter) { open(listener, waveletFilter, Collections.<KnownWavelet>emptyList()); }
public void onFailed(CorruptionDetail detail) { // Attempt to close the mux *during* the failure callback. mux.close(); }
@Override public void open(Listener listener, IdFilter waveletFilter, Collection<KnownWavelet> knownWavelets) { this.muxListener = listener; this.waveletFilter = waveletFilter; try { if (!knownWavelets.isEmpty()) { for (KnownWavelet knownWavelet : knownWavelets) { Preconditions.checkNotNull(knownWavelet.snapshot, "Snapshot has no wavelet"); Preconditions.checkNotNull(knownWavelet.committedVersion, "Known wavelet has null committed version"); boolean dropAdditionalSnapshot = false; addOperationChannel(knownWavelet.snapshot.getWaveletId(), knownWavelet.snapshot, knownWavelet.committedVersion, knownWavelet.accessibility, dropAdditionalSnapshot); } // consider the wave as if open has finished. maybeOpenFinished(); } Map<WaveletId, List<HashedVersion>> knownSignatures = signaturesFromWavelets(knownWavelets); connect(knownSignatures); } catch (ChannelException e) { shutdown("Multiplexer open failed.", e); } }
/** * Creates a multiplexer. * * WARNING: the scheduler should provide back-off. Providing a scheduler which * executes immediately or does not back off may cause denial-of-service-like * reconnection attempts against the servers. Use something like * {@link FuzzingBackOffScheduler}. * * @param waveId wave id to open * @param viewFactory factory for opening view channels * @param dataFactory factory for making snapshots of empty wavelets * @param loggers log targets * @param unsavedDataListenerFactory a factory for adding listeners * @param scheduler scheduler for reconnection * @param hashFactory factory for hashed versions */ public OperationChannelMultiplexerImpl(WaveId waveId, ViewChannelFactory viewFactory, ObservableWaveletData.Factory<?> dataFactory, LoggerContext loggers, UnsavedDataListenerFactory unsavedDataListenerFactory, Scheduler scheduler, HashedVersionFactory hashFactory) { // Construct default dependency implementations, based on given arguments. this(waveId, createDeltaChannelFactory(loggers.delta), createOperationChannelFactory(waveId, unsavedDataListenerFactory, loggers), viewFactory, dataFactory, scheduler, loggers.view, unsavedDataListenerFactory, hashFactory); Preconditions.checkNotNull(dataFactory, "null dataFactory"); }
private void connect(Map<WaveletId, List<HashedVersion>> knownWavelets) { Preconditions.checkState(state != State.CONNECTED, "Cannot connect already-connected channel"); checkConnectVersions(knownWavelets); logger.trace().log("Multiplexer reconnecting wave " + waveId); viewChannel = viewFactory.create(waveId); viewChannel.open(createViewListener(knownWavelets), waveletFilter, knownWavelets); }
public void testMuxCloseClosesAllUnsavedDataUpdaters() { mux.open(muxListener, IdFilters.ALL_IDS); MockOperationChannelListener listener1 = new MockOperationChannelListener(); MockOperationChannelListener listener2 = new MockOperationChannelListener(); OperationChannel ch1 = createOperationChannel(WAVELET_ID_1, USER_NAME); OperationChannel ch2 = createOperationChannel(WAVELET_ID_2, USER_NAME); ch1.setListener(listener1); ch2.setListener(listener2); mux.close(); assertEquals(2, fakeUnsavedDataListener.closeCalls); }
@Override public void setUp() { ViewChannelImpl.setMaxViewChannelsPerWave(Integer.MAX_VALUE); viewFactory = new MockViewChannel.Factory(); UnsavedDataListenerFactory fakeListenerFactory = new UnsavedDataListenerFactory() { @Override public UnsavedDataListener create(WaveletId waveletId) { return null; } @Override public void destroy(WaveletId waveletId) { } }; mux = new OperationChannelMultiplexerImpl(WAVE_ID, viewFactory, DATA_FACTORY, LOGGERS, fakeListenerFactory, new ImmediateExcecutionScheduler(), FakeHashedVersionFactory.INSTANCE, null); muxListener = new MockMuxListener(); }
private OperationChannel createOperationChannel(WaveletId waveletId, ParticipantId address) { mux.createOperationChannel(waveletId, address); return muxListener.verifyOperationChannelCreated( DATA_FACTORY.create( new EmptyWaveletSnapshot(WAVE_ID, waveletId, address, HashedVersion.unsigned(0), 1273307837000L /* arbitrary time */)), Accessibility.READ_WRITE); }
@Override public void createOperationChannel(WaveletId waveletId, ParticipantId creator) { if (channels.containsKey(waveletId)) { Preconditions.illegalArgument("Operation channel already exists for: " + waveletId); } // Create the new channel, and fake an initial snapshot. // TODO(anorth): inject a clock for providing timestamps. HashedVersion v0 = hashFactory.createVersionZero(WaveletName.of(waveId, waveletId)); final ObservableWaveletData emptySnapshot = dataFactory.create( new EmptyWaveletSnapshot(waveId, waveletId, creator, v0, System.currentTimeMillis())); try { boolean dropAdditionalSnapshot = true; addOperationChannel(waveletId, emptySnapshot, v0, Accessibility.READ_WRITE, dropAdditionalSnapshot); } catch (ChannelException e) { shutdown("Creating operation channel failed.", e); } }
public void testMuxCloseClosesAllUnsavedDataUpdaters() { mux.open(muxListener, IdFilters.ALL_IDS); MockOperationChannelListener listener1 = new MockOperationChannelListener(); MockOperationChannelListener listener2 = new MockOperationChannelListener(); OperationChannel ch1 = createOperationChannel(WAVELET_ID_1, USER_NAME); OperationChannel ch2 = createOperationChannel(WAVELET_ID_2, USER_NAME); ch1.setListener(listener1); ch2.setListener(listener2); mux.close(); assertEquals(2, fakeUnsavedDataListener.closeCalls); }
@Override public void setUp() { ViewChannelImpl.setMaxViewChannelsPerWave(Integer.MAX_VALUE); viewFactory = new MockViewChannel.Factory(); UnsavedDataListenerFactory fakeListenerFactory = new UnsavedDataListenerFactory() { @Override public UnsavedDataListener create(WaveletId waveletId) { return null; } @Override public void destroy(WaveletId waveletId) { } }; mux = new OperationChannelMultiplexerImpl(WAVE_ID, viewFactory, DATA_FACTORY, LOGGERS, fakeListenerFactory, new ImmediateExcecutionScheduler(), FakeHashedVersionFactory.INSTANCE); muxListener = new MockMuxListener(); }
private OperationChannel createOperationChannel(WaveletId waveletId, ParticipantId address) { mux.createOperationChannel(waveletId, address); return muxListener.verifyOperationChannelCreated( DATA_FACTORY.create( new EmptyWaveletSnapshot(WAVE_ID, waveletId, address, HashedVersion.unsigned(0), 1273307837000L /* arbitrary time */)), Accessibility.READ_WRITE); }
/** * Create a wave, send Op which is unacked and expect unsaved data. */ public void testCreatingWave() throws ChannelException { // Connect to the server mux.open(muxListener, IdFilters.ALL_IDS); muxListener.verifyNoMoreInteractions(); OperationChannel channel = createOperationChannel(WAVELET_ID_1, USER_NAME); channel.send(createAddParticipantOp()); // Expect the delta channel to not be ready, so we expect an open call, but // no success on open and no submit call going through. assertEquals(1, waveViewService.opens.size()); assertEquals(0, waveViewService.submits.size()); muxListener.verifyNoMoreInteractions(); // We do expect unsaved data. assertUnsavedDataInfo(1, 1, 0, 0, 0); // Now bail out of the connection with an op pending, should close. mux.close(); assertEquals(1, fakeUnsavedDataListener.closeCalls); }
private MockViewChannel openMux(IdFilter idFilter) { MockViewChannel viewChannel = viewFactory.expectCreate(); viewChannel.expectOpen(idFilter, NO_KNOWN_WAVELETS); mux.open(muxListener, idFilter); return viewChannel; }
@Override protected void setUp() { ViewChannelImpl.setMaxViewChannelsPerWave(Integer.MAX_VALUE); waveViewService = new MockWaveViewService(); viewFactory = ViewChannelImpl.factory(waveViewService, logger); fakeUnsavedDataListener = new FakeUnsavedDataListener(); mux = new OperationChannelMultiplexerImpl(WAVE_ID, viewFactory, DATA_FACTORY, LOGGERS, new UnsavedDataListenerFactory() { public UnsavedDataListener create(WaveletId dummy) { return fakeUnsavedDataListener; } public void destroy(WaveletId waveletId) { } }, new ImmediateExcecutionScheduler(), FakeHashedVersionFactory.INSTANCE, null); muxListener = new MockMuxListener(); }
private ConnectedChannel createOperationChannel(WaveletId waveletId, ParticipantId address) { mux.createOperationChannel(waveletId, address); OperationChannel channel = muxListener.verifyOperationChannelCreated(createSnapshot( WAVELET_ID_1, 0, NOSIG), Accessibility.READ_WRITE); MockOperationChannelListener channelListener = new MockOperationChannelListener(); channel.setListener(channelListener); return new ConnectedChannel(channel, channelListener); }
public void onFailed(CorruptionDetail detail) { // Attempt to close the mux *during* the failure callback. mux.close(); }
/** * Create a wave, send Op which is unacked and expect unsaved data. */ public void testCreatingWave() throws ChannelException { // Connect to the server mux.open(muxListener, IdFilters.ALL_IDS); muxListener.verifyNoMoreInteractions(); OperationChannel channel = createOperationChannel(WAVELET_ID_1, USER_NAME); channel.send(createAddParticipantOp()); // Expect the delta channel to not be ready, so we expect an open call, but // no success on open and no submit call going through. assertEquals(1, waveViewService.opens.size()); assertEquals(0, waveViewService.submits.size()); muxListener.verifyNoMoreInteractions(); // We do expect unsaved data. assertUnsavedDataInfo(1, 1, 0, 0, 0); // Now bail out of the connection with an op pending, should close. mux.close(); assertEquals(1, fakeUnsavedDataListener.closeCalls); }
private MockViewChannel openMux(IdFilter idFilter) { MockViewChannel viewChannel = viewFactory.expectCreate(); viewChannel.expectOpen(idFilter, NO_KNOWN_WAVELETS); mux.open(muxListener, idFilter); return viewChannel; }
@Override protected void setUp() { ViewChannelImpl.setMaxViewChannelsPerWave(Integer.MAX_VALUE); waveViewService = new MockWaveViewService(); viewFactory = ViewChannelImpl.factory(waveViewService, logger); fakeUnsavedDataListener = new FakeUnsavedDataListener(); mux = new OperationChannelMultiplexerImpl(WAVE_ID, viewFactory, DATA_FACTORY, LOGGERS, new UnsavedDataListenerFactory() { public UnsavedDataListener create(WaveletId dummy) { return fakeUnsavedDataListener; } public void destroy(WaveletId waveletId) { } }, new ImmediateExcecutionScheduler(), FakeHashedVersionFactory.INSTANCE); muxListener = new MockMuxListener(); }