diff --git a/enterprise/com/src/main/java/org/neo4j/com/Client.java b/enterprise/com/src/main/java/org/neo4j/com/Client.java index 41222df08f262..86669f53e9c3f 100644 --- a/enterprise/com/src/main/java/org/neo4j/com/Client.java +++ b/enterprise/com/src/main/java/org/neo4j/com/Client.java @@ -179,7 +179,7 @@ private ComException traceComException( ComException exception, String tracePoin protected Protocol createProtocol( int chunkSize, byte applicationProtocolVersion ) { - return new Protocol310( chunkSize, applicationProtocolVersion, getInternalProtocolVersion() ); + return new Protocol320( chunkSize, applicationProtocolVersion, getInternalProtocolVersion() ); } public abstract ProtocolVersion getProtocolVersion(); diff --git a/enterprise/com/src/main/java/org/neo4j/com/Protocol320.java b/enterprise/com/src/main/java/org/neo4j/com/Protocol320.java new file mode 100644 index 0000000000000..fd0c996290ab2 --- /dev/null +++ b/enterprise/com/src/main/java/org/neo4j/com/Protocol320.java @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2002-2016 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.neo4j.com; + +public class Protocol320 extends Protocol310 +{ + public Protocol320( int chunkSize, byte applicationProtocolVersion, byte internalProtocolVersion ) + { + super( chunkSize, applicationProtocolVersion, internalProtocolVersion ); + } +} diff --git a/enterprise/ha/src/main/java/org/neo4j/kernel/ha/MasterClient310.java b/enterprise/ha/src/main/java/org/neo4j/kernel/ha/MasterClient310.java index 4ab00efa14623..ad91cd348e9f5 100644 --- a/enterprise/ha/src/main/java/org/neo4j/kernel/ha/MasterClient310.java +++ b/enterprise/ha/src/main/java/org/neo4j/kernel/ha/MasterClient310.java @@ -36,7 +36,6 @@ public class MasterClient310 extends MasterClient214 { - /* Version 1 first version * Version 2 since 2012-01-24 * Version 3 since 2012-02-16 diff --git a/enterprise/ha/src/main/java/org/neo4j/kernel/ha/MasterClient320.java b/enterprise/ha/src/main/java/org/neo4j/kernel/ha/MasterClient320.java new file mode 100644 index 0000000000000..272aad7cb4cae --- /dev/null +++ b/enterprise/ha/src/main/java/org/neo4j/kernel/ha/MasterClient320.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2002-2016 "Neo Technology," + * Network Engine for Objects in Lund AB [http://neotechnology.com] + * + * This file is part of Neo4j. + * + * Neo4j is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ +package org.neo4j.kernel.ha; + +import org.neo4j.com.Protocol; +import org.neo4j.com.Protocol320; +import org.neo4j.com.ProtocolVersion; +import org.neo4j.com.monitor.RequestMonitor; +import org.neo4j.com.storecopy.ResponseUnpacker; +import org.neo4j.kernel.impl.store.StoreId; +import org.neo4j.kernel.impl.transaction.log.ReadableClosablePositionAwareChannel; +import org.neo4j.kernel.impl.transaction.log.entry.LogEntryReader; +import org.neo4j.kernel.monitoring.ByteCounterMonitor; +import org.neo4j.logging.LogProvider; + +import static org.neo4j.com.ProtocolVersion.INTERNAL_PROTOCOL_VERSION; + +public class MasterClient320 extends MasterClient310 +{ + /* Version 1 first version + * Version 2 since 2012-01-24 + * Version 3 since 2012-02-16 + * Version 4 since 2012-07-05 + * Version 5 since ? + * Version 6 since 2014-01-07 + * Version 7 since 2014-03-18 + * Version 8 since 2014-08-27 + * Version 9 since 3.1.0, 2016-09-20 + * Version 10 since 3.2.0, 2016-12-07 + */ + public static final ProtocolVersion PROTOCOL_VERSION = new ProtocolVersion( (byte) 10, INTERNAL_PROTOCOL_VERSION ); + + public MasterClient320( String destinationHostNameOrIp, int destinationPort, String originHostNameOrIp, + LogProvider logProvider, StoreId storeId, + long readTimeoutMillis, long lockReadTimeout, int maxConcurrentChannels, int chunkSize, + ResponseUnpacker unpacker, + ByteCounterMonitor byteCounterMonitor, + RequestMonitor requestMonitor, + LogEntryReader entryReader ) + { + super( destinationHostNameOrIp, destinationPort, originHostNameOrIp, logProvider, storeId, readTimeoutMillis, + lockReadTimeout, maxConcurrentChannels, chunkSize, unpacker, byteCounterMonitor, requestMonitor, + entryReader ); + } + + @Override + protected Protocol createProtocol( int chunkSize, byte applicationProtocolVersion ) + { + return new Protocol320( chunkSize, applicationProtocolVersion, getInternalProtocolVersion() ); + } + + @Override + public ProtocolVersion getProtocolVersion() + { + return PROTOCOL_VERSION; + } +} diff --git a/enterprise/ha/src/main/java/org/neo4j/kernel/ha/com/slave/MasterClient.java b/enterprise/ha/src/main/java/org/neo4j/kernel/ha/com/slave/MasterClient.java index 9be190d3c99e3..5eb3100a1100c 100644 --- a/enterprise/ha/src/main/java/org/neo4j/kernel/ha/com/slave/MasterClient.java +++ b/enterprise/ha/src/main/java/org/neo4j/kernel/ha/com/slave/MasterClient.java @@ -35,7 +35,7 @@ import org.neo4j.com.storecopy.ResponseUnpacker.TxHandler; import org.neo4j.com.storecopy.StoreWriter; import org.neo4j.helpers.Exceptions; -import org.neo4j.kernel.ha.MasterClient310; +import org.neo4j.kernel.ha.MasterClient320; import org.neo4j.kernel.ha.com.master.Master; import org.neo4j.kernel.ha.lock.LockResult; import org.neo4j.kernel.ha.lock.LockStatus; @@ -105,7 +105,7 @@ private String beginningOfBufferAsHexString( ChannelBuffer buffer, int maxBytesT } }; - public static final ProtocolVersion CURRENT = MasterClient310.PROTOCOL_VERSION; + public static final ProtocolVersion CURRENT = MasterClient320.PROTOCOL_VERSION; @Override public Response createRelationshipType( RequestContext context, final String name ); diff --git a/enterprise/ha/src/main/java/org/neo4j/kernel/ha/com/slave/MasterClientResolver.java b/enterprise/ha/src/main/java/org/neo4j/kernel/ha/com/slave/MasterClientResolver.java index f59301f63e6bc..0e8bd98e8a93d 100644 --- a/enterprise/ha/src/main/java/org/neo4j/kernel/ha/com/slave/MasterClientResolver.java +++ b/enterprise/ha/src/main/java/org/neo4j/kernel/ha/com/slave/MasterClientResolver.java @@ -31,6 +31,7 @@ import org.neo4j.com.storecopy.ResponseUnpacker; import org.neo4j.kernel.ha.MasterClient214; import org.neo4j.kernel.ha.MasterClient310; +import org.neo4j.kernel.ha.MasterClient320; import org.neo4j.kernel.ha.com.master.InvalidEpochException; import org.neo4j.kernel.impl.store.StoreId; import org.neo4j.kernel.impl.transaction.log.ReadableClosablePositionAwareChannel; @@ -76,11 +77,13 @@ public MasterClientResolver( LogProvider logProvider, ResponseUnpacker responseU this.responseUnpacker = responseUnpacker; this.invalidEpochHandler = invalidEpochHandler; - protocolToFactoryMapping = new HashMap<>( 2, 1 ); + protocolToFactoryMapping = new HashMap<>( 3, 1 ); protocolToFactoryMapping.put( MasterClient214.PROTOCOL_VERSION, new F214( logProvider, readTimeoutMillis, lockReadTimeout, channels, chunkSize ) ); protocolToFactoryMapping.put( MasterClient310.PROTOCOL_VERSION, new F310( logProvider, readTimeoutMillis, lockReadTimeout, channels, chunkSize ) ); + protocolToFactoryMapping.put( MasterClient320.PROTOCOL_VERSION, new F320( logProvider, readTimeoutMillis, lockReadTimeout, + channels, chunkSize ) ); } @Override @@ -120,7 +123,7 @@ private MasterClientFactory getFor( ProtocolVersion protocolVersion ) private MasterClientFactory assignDefaultFactory() { - return getFor( MasterClient310.PROTOCOL_VERSION ); + return getFor( MasterClient320.PROTOCOL_VERSION ); } private abstract static class StaticMasterClientFactory implements MasterClientFactory @@ -156,8 +159,8 @@ public MasterClient instantiate( String destinationHostNameOrIp, int destination { return life.add( new MasterClient214( destinationHostNameOrIp, destinationPort, originHostNameOrIp, logProvider, storeId, readTimeoutMillis, lockReadTimeout, maxConcurrentChannels, chunkSize, - responseUnpacker, monitors.newMonitor( ByteCounterMonitor.class, MasterClient310.class ), - monitors.newMonitor( RequestMonitor.class, MasterClient310.class ), logEntryReader.get() ) ); + responseUnpacker, monitors.newMonitor( ByteCounterMonitor.class, MasterClient320.class ), + monitors.newMonitor( RequestMonitor.class, MasterClient320.class ), logEntryReader.get() ) ); } } @@ -175,8 +178,27 @@ public MasterClient instantiate( String destinationHostNameOrIp, int destination { return life.add( new MasterClient310( destinationHostNameOrIp, destinationPort, originHostNameOrIp, logProvider, storeId, readTimeoutMillis, lockReadTimeout, maxConcurrentChannels, chunkSize, - responseUnpacker, monitors.newMonitor( ByteCounterMonitor.class, MasterClient310.class ), - monitors.newMonitor( RequestMonitor.class, MasterClient310.class ), logEntryReader.get() ) ); + responseUnpacker, monitors.newMonitor( ByteCounterMonitor.class, MasterClient320.class ), + monitors.newMonitor( RequestMonitor.class, MasterClient320.class ), logEntryReader.get() ) ); + } + } + + private final class F320 extends StaticMasterClientFactory + { + private F320( LogProvider logProvider, int readTimeoutMillis, int lockReadTimeout, int maxConcurrentChannels, + int chunkSize ) + { + super( logProvider, readTimeoutMillis, lockReadTimeout, maxConcurrentChannels, chunkSize ); + } + + @Override + public MasterClient instantiate( String destinationHostNameOrIp, int destinationPort, String originHostNameOrIp, + Monitors monitors, StoreId storeId, LifeSupport life ) + { + return life.add( new MasterClient320( destinationHostNameOrIp, destinationPort, originHostNameOrIp, + logProvider, storeId, readTimeoutMillis, lockReadTimeout, maxConcurrentChannels, chunkSize, + responseUnpacker, monitors.newMonitor( ByteCounterMonitor.class, MasterClient320.class ), + monitors.newMonitor( RequestMonitor.class, MasterClient320.class ), logEntryReader.get() ) ); } } } diff --git a/enterprise/ha/src/test/java/org/neo4j/ha/upgrade/MasterClientTest.java b/enterprise/ha/src/test/java/org/neo4j/ha/upgrade/MasterClientTest.java index e556119fb5228..c2802b10f841e 100644 --- a/enterprise/ha/src/test/java/org/neo4j/ha/upgrade/MasterClientTest.java +++ b/enterprise/ha/src/test/java/org/neo4j/ha/upgrade/MasterClientTest.java @@ -40,7 +40,7 @@ import org.neo4j.helpers.HostnamePort; import org.neo4j.helpers.collection.Visitor; import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.ha.MasterClient310; +import org.neo4j.kernel.ha.MasterClient320; import org.neo4j.kernel.ha.com.master.ConversationManager; import org.neo4j.kernel.ha.com.master.HandshakeResult; import org.neo4j.kernel.ha.com.master.MasterImpl; @@ -111,7 +111,7 @@ public void newClientsShouldNotIgnoreStoreIdDifferences() throws Throwable newMasterServer( masterImplSPI ); StoreId storeId = StoreIdTestFactory.newStoreIdForCurrentVersion( 5, 6, 7, 8 ); - MasterClient masterClient = newMasterClient310( storeId ); + MasterClient masterClient = newMasterClient320( storeId ); // When masterClient.handshake( 1, storeId ); @@ -135,7 +135,7 @@ public void clientShouldReadAndApplyTransactionLogsOnNewLockSessionRequest() thr ResponseUnpacker unpacker = life.add( new TransactionCommittingResponseUnpacker( deps, DEFAULT_BATCH_SIZE, 0 ) ); - MasterClient masterClient = newMasterClient310( StoreId.DEFAULT, unpacker ); + MasterClient masterClient = newMasterClient320( StoreId.DEFAULT, unpacker ); // When masterClient.newLockSession( new RequestContext( 1, 2, 3, 4, 5 ) ); @@ -160,7 +160,7 @@ public void endLockSessionDoesNotUnpackResponse() throws Throwable newMasterServer( masterImplSPI ); - MasterClient client = newMasterClient310( storeId, responseUnpacker ); + MasterClient client = newMasterClient320( storeId, responseUnpacker ); HandshakeResult handshakeResult; try ( Response handshakeResponse = client.handshake( 1, storeId ) ) @@ -205,17 +205,17 @@ private MasterServer newMasterServer( MasterImpl masterImpl ) throws Throwable ConversationManager.class ), logEntryReader ) ); } - private MasterClient newMasterClient310( StoreId storeId ) throws Throwable + private MasterClient newMasterClient320( StoreId storeId ) throws Throwable { - return newMasterClient310( storeId, NO_OP_RESPONSE_UNPACKER ); + return newMasterClient320( storeId, NO_OP_RESPONSE_UNPACKER ); } - private MasterClient newMasterClient310( StoreId storeId, ResponseUnpacker responseUnpacker ) throws Throwable + private MasterClient newMasterClient320( StoreId storeId, ResponseUnpacker responseUnpacker ) throws Throwable { - return life.add( new MasterClient310( MASTER_SERVER_HOST, MASTER_SERVER_PORT, null, NullLogProvider.getInstance(), + return life.add( new MasterClient320( MASTER_SERVER_HOST, MASTER_SERVER_PORT, null, NullLogProvider.getInstance(), storeId, TIMEOUT, TIMEOUT, 1, CHUNK_SIZE, responseUnpacker, - monitors.newMonitor( ByteCounterMonitor.class, MasterClient310.class ), - monitors.newMonitor( RequestMonitor.class, MasterClient310.class ), logEntryReader ) ); + monitors.newMonitor( ByteCounterMonitor.class, MasterClient320.class ), + monitors.newMonitor( RequestMonitor.class, MasterClient320.class ), logEntryReader ) ); } private static Response voidResponseWithTransactionLogs() diff --git a/enterprise/ha/src/test/java/org/neo4j/kernel/ha/cluster/SwitchToSlaveBranchThenCopyTest.java b/enterprise/ha/src/test/java/org/neo4j/kernel/ha/cluster/SwitchToSlaveBranchThenCopyTest.java index 3e7f3613ee577..c63a47754af9e 100644 --- a/enterprise/ha/src/test/java/org/neo4j/kernel/ha/cluster/SwitchToSlaveBranchThenCopyTest.java +++ b/enterprise/ha/src/test/java/org/neo4j/kernel/ha/cluster/SwitchToSlaveBranchThenCopyTest.java @@ -20,8 +20,6 @@ package org.neo4j.kernel.ha.cluster; import org.junit.Test; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; import java.io.File; import java.io.IOException; @@ -50,7 +48,7 @@ import org.neo4j.kernel.ha.BranchedDataException; import org.neo4j.kernel.ha.BranchedDataPolicy; import org.neo4j.kernel.ha.DelegateInvocationHandler; -import org.neo4j.kernel.ha.MasterClient310; +import org.neo4j.kernel.ha.MasterClient320; import org.neo4j.kernel.ha.PullerFactory; import org.neo4j.kernel.ha.SlaveUpdatePuller; import org.neo4j.kernel.ha.UpdatePuller; @@ -80,7 +78,7 @@ import org.neo4j.kernel.monitoring.Monitors; import org.neo4j.logging.NullLogProvider; -import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import static org.mockito.Matchers.any; @@ -251,14 +249,10 @@ public void updatesPulledAndPullingScheduledOnSwitchToSlave() throws Throwable when( pullerFactory.createUpdatePullerScheduler( updatePuller ) ).thenReturn( pullerScheduler ); // emulate lifecycle start call on scheduler - doAnswer( new Answer() + doAnswer( invocationOnMock -> { - @Override - public Object answer( InvocationOnMock invocationOnMock ) throws Throwable - { - pullerScheduler.init(); - return null; - } + pullerScheduler.init(); + return null; } ).when( communicationLife ).start(); switchToSlave.switchToSlave( communicationLife, localhost, localhost, mock( CancellationRequest.class ) ); @@ -297,7 +291,7 @@ private SwitchToSlaveBranchThenCopy newSwitchToSlaveSpy( PageCache pageCacheMock when( master.getHARole() ).thenReturn( HighAvailabilityModeSwitcher.MASTER ); when( master.hasRole( eq( HighAvailabilityModeSwitcher.MASTER ) ) ).thenReturn( true ); when( master.getInstanceId() ).thenReturn( new InstanceId( 1 ) ); - when( clusterMembers.getMembers() ).thenReturn( asList( master ) ); + when( clusterMembers.getMembers() ).thenReturn( singletonList( master ) ); Dependencies resolver = new Dependencies(); resolver.satisfyDependencies( requestContextFactory, clusterMembers, @@ -318,7 +312,7 @@ private SwitchToSlaveBranchThenCopy newSwitchToSlaveSpy( PageCache pageCacheMock Response response = mock( Response.class ); when( response.response() ).thenReturn( new HandshakeResult( 42, 2 ) ); when( masterClient.handshake( anyLong(), any( StoreId.class ) ) ).thenReturn( response ); - when( masterClient.getProtocolVersion() ).thenReturn( MasterClient310.PROTOCOL_VERSION ); + when( masterClient.getProtocolVersion() ).thenReturn( MasterClient320.PROTOCOL_VERSION ); TransactionIdStore transactionIdStoreMock = mock( TransactionIdStore.class ); // note that the checksum (the second member of the array) is the same as the one in the handshake mock above diff --git a/enterprise/ha/src/test/java/org/neo4j/kernel/ha/com/slave/MasterClientResolverTest.java b/enterprise/ha/src/test/java/org/neo4j/kernel/ha/com/slave/MasterClientResolverTest.java index b7561b57ef183..6eda34be117c1 100644 --- a/enterprise/ha/src/test/java/org/neo4j/kernel/ha/com/slave/MasterClientResolverTest.java +++ b/enterprise/ha/src/test/java/org/neo4j/kernel/ha/com/slave/MasterClientResolverTest.java @@ -26,6 +26,7 @@ import org.neo4j.function.Suppliers; import org.neo4j.kernel.ha.MasterClient214; import org.neo4j.kernel.ha.MasterClient310; +import org.neo4j.kernel.ha.MasterClient320; import org.neo4j.kernel.impl.store.StoreId; import org.neo4j.kernel.impl.transaction.log.ReadableClosablePositionAwareChannel; import org.neo4j.kernel.impl.transaction.log.entry.LogEntryReader; @@ -55,7 +56,7 @@ ResponseUnpacker.NO_OP_RESPONSE_UNPACKER, mock( InvalidEpochExceptionHandler.cla life.start(); MasterClient masterClient1 = resolver.instantiate( "cluster://localhost", 44, null, new Monitors(), StoreId.DEFAULT, life ); - assertThat( masterClient1, instanceOf( MasterClient310.class ) ); + assertThat( masterClient1, instanceOf( MasterClient320.class ) ); } finally { diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/cluster/NetworkMetrics.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/cluster/NetworkMetrics.java index 1efa019eedad5..5f405d6dcaf11 100644 --- a/enterprise/metrics/src/main/java/org/neo4j/metrics/source/cluster/NetworkMetrics.java +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/source/cluster/NetworkMetrics.java @@ -23,7 +23,7 @@ import com.codahale.metrics.MetricRegistry; import org.neo4j.com.storecopy.ToNetworkStoreWriter; -import org.neo4j.kernel.ha.MasterClient310; +import org.neo4j.kernel.ha.MasterClient320; import org.neo4j.kernel.ha.com.master.MasterServer; import org.neo4j.kernel.impl.annotations.Documented; import org.neo4j.kernel.lifecycle.LifecycleAdapter; @@ -64,7 +64,7 @@ public void start() monitors.addMonitorListener( masterNetworkTransactionWrites, MasterServer.class.getName() ); monitors.addMonitorListener( masterNetworkStoreWrites, ToNetworkStoreWriter.class.getName(), ToNetworkStoreWriter.STORE_COPIER_MONITOR_TAG ); - monitors.addMonitorListener( slaveNetworkTransactionWrites, MasterClient310.class.getName() ); + monitors.addMonitorListener( slaveNetworkTransactionWrites, MasterClient320.class.getName() ); registry.register( MASTER_NETWORK_TX_WRITES, (Gauge) masterNetworkTransactionWrites::getBytesWritten ); registry.register( MASTER_NETWORK_STORE_WRITES, (Gauge) masterNetworkStoreWrites::getBytesWritten );