diff --git a/community/io/src/main/java/org/neo4j/io/pagecache/impl/muninn/MuninnPagedFile.java b/community/io/src/main/java/org/neo4j/io/pagecache/impl/muninn/MuninnPagedFile.java index 0d238a655d8dd..9e3fff8e9e293 100644 --- a/community/io/src/main/java/org/neo4j/io/pagecache/impl/muninn/MuninnPagedFile.java +++ b/community/io/src/main/java/org/neo4j/io/pagecache/impl/muninn/MuninnPagedFile.java @@ -77,7 +77,7 @@ final class MuninnPagedFile implements PagedFile, Flushable /** * The header state includes both the reference count of the PagedFile – 15 bits – and the ID of the last page in * the file – 48 bits, plus an empty file marker bit. Because our pages are usually 2^13 bytes, this means that we - * only loose 3 bits to the reference count, in terms of keeping large files byte addressable. + * only lose 3 bits to the reference count, in terms of keeping large files byte addressable. * * The layout looks like this: * diff --git a/community/io/src/main/java/org/neo4j/io/pagecache/tracing/cursor/DefaultPageCursorTracerSupplier.java b/community/io/src/main/java/org/neo4j/io/pagecache/tracing/cursor/DefaultPageCursorTracerSupplier.java index 652ab8173afa8..0ae84ab50ff6d 100644 --- a/community/io/src/main/java/org/neo4j/io/pagecache/tracing/cursor/DefaultPageCursorTracerSupplier.java +++ b/community/io/src/main/java/org/neo4j/io/pagecache/tracing/cursor/DefaultPageCursorTracerSupplier.java @@ -25,7 +25,7 @@ public class DefaultPageCursorTracerSupplier implements PageCursorTracerSupplier public static final DefaultPageCursorTracerSupplier INSTANCE = new DefaultPageCursorTracerSupplier(); - private DefaultPageCursorTracerSupplier() + public DefaultPageCursorTracerSupplier() { } diff --git a/enterprise/backup/LICENSES.txt b/enterprise/backup/LICENSES.txt index 1313827b89327..5ef84e1176cec 100644 --- a/enterprise/backup/LICENSES.txt +++ b/enterprise/backup/LICENSES.txt @@ -5,6 +5,10 @@ libraries. For an overview of the licenses see the NOTICE.txt file. Apache Software License, Version 2.0 Apache Commons Compress Apache Commons Lang + Apache Shiro :: Core + Caffeine cache + Commons BeanUtils + hazelcast-all Lucene Core Lucene Memory Netty @@ -246,4 +250,33 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +MIT License + SLF4J API Module + SLF4J NOP Binding +------------------------------------------------------------------------------ + +The MIT License + +Copyright (c) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + diff --git a/enterprise/backup/NOTICE.txt b/enterprise/backup/NOTICE.txt index 1e2e5288a418d..8168e1e68136f 100644 --- a/enterprise/backup/NOTICE.txt +++ b/enterprise/backup/NOTICE.txt @@ -27,6 +27,10 @@ Third-party licenses Apache Software License, Version 2.0 Apache Commons Compress Apache Commons Lang + Apache Shiro :: Core + Caffeine cache + Commons BeanUtils + hazelcast-all Lucene Core Lucene Memory Netty @@ -36,3 +40,7 @@ Bouncy Castle License Bouncy Castle PKIX, CMS, EAC, TSP, PKCS, OCSP, CMP, and CRMF APIs Bouncy Castle Provider +MIT License + SLF4J API Module + SLF4J NOP Binding + diff --git a/enterprise/backup/pom.xml b/enterprise/backup/pom.xml index a631aaec3d69f..209f22b197ea8 100644 --- a/enterprise/backup/pom.xml +++ b/enterprise/backup/pom.xml @@ -76,6 +76,11 @@ com.google.code.findbugs annotations + + org.neo4j + neo4j-causal-clustering + ${project.version} + org.neo4j neo4j-com @@ -109,6 +114,13 @@ junit test + + org.neo4j + neo4j-causal-clustering + ${project.version} + test + test-jar + commons-codec commons-codec @@ -147,6 +159,13 @@ test-jar test + + org.neo4j + neo4j-enterprise-kernel + ${project.version} + test-jar + test + org.neo4j neo4j-io diff --git a/enterprise/backup/src/test/java/org/neo4j/backup/OnlineBackupCommandIT.java b/enterprise/backup/src/test/java/org/neo4j/backup/OnlineBackupCommandIT.java index df2c0d4dafb76..013196d3c6d95 100644 --- a/enterprise/backup/src/test/java/org/neo4j/backup/OnlineBackupCommandIT.java +++ b/enterprise/backup/src/test/java/org/neo4j/backup/OnlineBackupCommandIT.java @@ -20,7 +20,6 @@ package org.neo4j.backup; import org.apache.commons.lang3.SystemUtils; -import org.junit.ClassRule; import org.junit.Rule; import org.junit.Test; import org.junit.rules.RuleChain; @@ -30,36 +29,29 @@ import org.junit.runners.Parameterized.Parameters; import java.io.File; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import org.neo4j.commandline.admin.AdminTool; import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.Node; import org.neo4j.graphdb.RelationshipType; import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.factory.GraphDatabaseSettings; -import org.neo4j.io.proc.ProcessUtil; import org.neo4j.kernel.configuration.Settings; import org.neo4j.kernel.impl.store.format.highlimit.HighLimit; import org.neo4j.kernel.impl.store.format.standard.Standard; import org.neo4j.test.DbRepresentation; -import org.neo4j.test.ProcessStreamHandler; import org.neo4j.test.rule.EmbeddedDatabaseRule; import org.neo4j.test.rule.SuppressOutput; -import org.neo4j.test.rule.TestDirectory; +import org.neo4j.util.JvmRunner; import static org.junit.Assert.assertEquals; import static org.junit.Assume.assumeFalse; @RunWith( Parameterized.class ) -public class OnlineBackupCommandIT +public class OnlineBackupCommandIT extends JvmRunner { - @ClassRule - public static final TestDirectory testDirectory = TestDirectory.testDirectory(); - - private final EmbeddedDatabaseRule db = new EmbeddedDatabaseRule( testDirectory.directory( "db" ) ).startLazily(); + private final EmbeddedDatabaseRule db = new EmbeddedDatabaseRule().startLazily(); @Rule public final RuleChain ruleChain = RuleChain.outerRule( SuppressOutput.suppressAll() ).around( db ); @@ -154,26 +146,6 @@ private void startDb( String backupPort ) createSomeData( db ); } - private static int runBackupToolFromOtherJvmToGetExitCode( String... args ) - throws Exception - { - return runBackupToolFromOtherJvmToGetExitCode( testDirectory.absolutePath(), args ); - } - - public static int runBackupToolFromOtherJvmToGetExitCode( File neo4jHome, String... args ) - throws Exception - { - List allArgs = new ArrayList<>( Arrays.asList( - ProcessUtil.getJavaExecutable().toString(), "-cp", ProcessUtil.getClassPath(), - AdminTool.class.getName() ) ); - allArgs.add( "backup" ); - allArgs.addAll( Arrays.asList( args ) ); - - Process process = Runtime.getRuntime().exec( allArgs.toArray( new String[allArgs.size()] ), - new String[] {"NEO4J_HOME=" + neo4jHome.getAbsolutePath()} ); - return new ProcessStreamHandler( process, true ).waitForResult(); - } - private DbRepresentation getDbRepresentation() { return DbRepresentation.of( db ); diff --git a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/backup/BackupCoreIT.java b/enterprise/backup/src/test/java/org/neo4j/backup/causalclustering/BackupCoreIT.java similarity index 97% rename from enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/backup/BackupCoreIT.java rename to enterprise/backup/src/test/java/org/neo4j/backup/causalclustering/BackupCoreIT.java index 61cafc225f29a..e176fc125a5c7 100644 --- a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/backup/BackupCoreIT.java +++ b/enterprise/backup/src/test/java/org/neo4j/backup/causalclustering/BackupCoreIT.java @@ -17,7 +17,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -package org.neo4j.causalclustering.backup; +package org.neo4j.backup.causalclustering; import org.junit.Before; import org.junit.Rule; @@ -44,7 +44,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; -import static org.neo4j.backup.OnlineBackupCommandIT.runBackupToolFromOtherJvmToGetExitCode; +import static org.neo4j.util.JvmRunner.runBackupToolFromOtherJvmToGetExitCode; import static org.neo4j.graphdb.Label.label; public class BackupCoreIT diff --git a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/backup/BackupReadReplicaIT.java b/enterprise/backup/src/test/java/org/neo4j/backup/causalclustering/BackupReadReplicaIT.java similarity index 94% rename from enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/backup/BackupReadReplicaIT.java rename to enterprise/backup/src/test/java/org/neo4j/backup/causalclustering/BackupReadReplicaIT.java index 93ec846fb1db0..5b193ab71485a 100644 --- a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/backup/BackupReadReplicaIT.java +++ b/enterprise/backup/src/test/java/org/neo4j/backup/causalclustering/BackupReadReplicaIT.java @@ -17,7 +17,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -package org.neo4j.causalclustering.backup; +package org.neo4j.backup.causalclustering; import org.junit.Before; import org.junit.Rule; @@ -42,11 +42,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; -import static org.neo4j.backup.OnlineBackupCommandIT.runBackupToolFromOtherJvmToGetExitCode; -import static org.neo4j.causalclustering.backup.BackupCoreIT.backupArguments; -import static org.neo4j.causalclustering.backup.BackupCoreIT.createSomeData; -import static org.neo4j.causalclustering.backup.BackupCoreIT.getConfig; +import static org.neo4j.backup.causalclustering.BackupCoreIT.backupArguments; +import static org.neo4j.backup.causalclustering.BackupCoreIT.createSomeData; +import static org.neo4j.backup.causalclustering.BackupCoreIT.getConfig; import static org.neo4j.function.Predicates.awaitEx; +import static org.neo4j.util.JvmRunner.runBackupToolFromOtherJvmToGetExitCode; public class BackupReadReplicaIT { diff --git a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/backup/ClusterSeedingIT.java b/enterprise/backup/src/test/java/org/neo4j/backup/causalclustering/ClusterSeedingIT.java similarity index 97% rename from enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/backup/ClusterSeedingIT.java rename to enterprise/backup/src/test/java/org/neo4j/backup/causalclustering/ClusterSeedingIT.java index 1893c7c039eba..0426279f9e54b 100644 --- a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/backup/ClusterSeedingIT.java +++ b/enterprise/backup/src/test/java/org/neo4j/backup/causalclustering/ClusterSeedingIT.java @@ -17,7 +17,7 @@ * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ -package org.neo4j.causalclustering.backup; +package org.neo4j.backup.causalclustering; import org.junit.After; import org.junit.Before; @@ -44,10 +44,10 @@ import static java.util.Collections.emptyMap; import static java.util.Collections.singletonMap; import static org.junit.Assert.assertEquals; -import static org.neo4j.backup.OnlineBackupCommandIT.runBackupToolFromOtherJvmToGetExitCode; -import static org.neo4j.causalclustering.backup.BackupCoreIT.backupAddress; +import static org.neo4j.backup.causalclustering.BackupCoreIT.backupAddress; import static org.neo4j.causalclustering.discovery.Cluster.dataMatchesEventually; import static org.neo4j.causalclustering.helpers.DataCreator.createEmptyNodes; +import static org.neo4j.util.JvmRunner.runBackupToolFromOtherJvmToGetExitCode; public class ClusterSeedingIT { diff --git a/enterprise/causal-clustering/pom.xml b/enterprise/causal-clustering/pom.xml index 53a7b2b2c967f..16cf4cca9377e 100644 --- a/enterprise/causal-clustering/pom.xml +++ b/enterprise/causal-clustering/pom.xml @@ -159,20 +159,6 @@ test - - org.neo4j - neo4j-backup - ${project.version} - - - - org.neo4j - neo4j-backup - ${project.version} - test-jar - test - - org.neo4j neo4j-cypher diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/CausalClusterConfigurationValidator.java b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/CausalClusterConfigurationValidator.java index a8eb4b658c5f1..4d81af7542945 100644 --- a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/CausalClusterConfigurationValidator.java +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/CausalClusterConfigurationValidator.java @@ -25,8 +25,8 @@ import javax.annotation.Nonnull; import org.neo4j.causalclustering.load_balancing.LoadBalancingPluginLoader; -import org.neo4j.cluster.ClusterSettings; -import org.neo4j.cluster.ClusterSettings.Mode; +import org.neo4j.kernel.impl.enterprise.configuration.EnterpriseEditionSettings; +import org.neo4j.kernel.impl.enterprise.configuration.EnterpriseEditionSettings.Mode; import org.neo4j.graphdb.config.InvalidSettingException; import org.neo4j.graphdb.config.SettingValidator; import org.neo4j.kernel.configuration.Config; @@ -43,7 +43,7 @@ public Map validate( @Nonnull Collection settin @Nonnull Map rawConfig, @Nonnull Log log, boolean parsingFile ) throws InvalidSettingException { // Make sure mode is CC - Mode mode = ClusterSettings.mode.apply( rawConfig::get ); + Mode mode = EnterpriseEditionSettings.mode.apply( rawConfig::get ); if ( !mode.equals( Mode.CORE ) && !mode.equals( Mode.READ_REPLICA ) ) { // Nothing to validate diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/server/CoreServerModule.java b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/server/CoreServerModule.java index b02fd15a18deb..3e5176132332a 100644 --- a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/server/CoreServerModule.java +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/server/CoreServerModule.java @@ -22,8 +22,6 @@ import java.io.File; import java.util.function.Supplier; -import org.neo4j.backup.OnlineBackupKernelExtension; -import org.neo4j.backup.OnlineBackupSettings; import org.neo4j.causalclustering.ReplicationModule; import org.neo4j.causalclustering.catchup.CatchUpClient; import org.neo4j.causalclustering.catchup.CatchupServer; @@ -62,13 +60,11 @@ import org.neo4j.causalclustering.messaging.CoreReplicatedContentMarshal; import org.neo4j.causalclustering.messaging.LoggingInbound; import org.neo4j.io.fs.FileSystemAbstraction; -import org.neo4j.kernel.NeoStoreDataSource; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.factory.PlatformModule; import org.neo4j.kernel.impl.logging.LogService; import org.neo4j.kernel.impl.transaction.log.LogicalTransactionStore; import org.neo4j.kernel.impl.transaction.log.TransactionIdStore; -import org.neo4j.kernel.impl.transaction.state.DataSourceManager; import org.neo4j.kernel.impl.util.Dependencies; import org.neo4j.kernel.impl.util.JobScheduler; import org.neo4j.kernel.internal.DatabaseHealth; @@ -136,29 +132,6 @@ public CoreServerModule( IdentityModule identityModule, final PlatformModule pla LifeSupport servicesToStopOnStoreCopy = new LifeSupport(); - if ( config.get( OnlineBackupSettings.online_backup_enabled ) ) - { - platformModule.dataSourceManager.addListener( new DataSourceManager.Listener() - { - @Override - public void registered( NeoStoreDataSource dataSource ) - { - servicesToStopOnStoreCopy.add( pickBackupExtension( dataSource ) ); - } - - @Override - public void unregistered( NeoStoreDataSource dataSource ) - { - servicesToStopOnStoreCopy.remove( pickBackupExtension( dataSource ) ); - } - - private OnlineBackupKernelExtension pickBackupExtension( NeoStoreDataSource dataSource ) - { - return dataSource.getDependencyResolver().resolveDependency( OnlineBackupKernelExtension.class ); - } - } ); - } - CoreState coreState = new CoreState( coreStateMachinesModule.coreStateMachines, replicationModule.getSessionTracker(), lastFlushedStorage ); diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/readreplica/EnterpriseReadReplicaEditionModule.java b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/readreplica/EnterpriseReadReplicaEditionModule.java index 2db7671c6de5e..caca5304c8d28 100644 --- a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/readreplica/EnterpriseReadReplicaEditionModule.java +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/readreplica/EnterpriseReadReplicaEditionModule.java @@ -25,8 +25,6 @@ import java.util.function.Predicate; import java.util.function.Supplier; -import org.neo4j.backup.OnlineBackupKernelExtension; -import org.neo4j.backup.OnlineBackupSettings; import org.neo4j.causalclustering.catchup.CatchUpClient; import org.neo4j.causalclustering.catchup.CatchupServer; import org.neo4j.causalclustering.catchup.CheckpointerSupplier; @@ -57,7 +55,6 @@ import org.neo4j.io.fs.FileSystemAbstraction; import org.neo4j.io.pagecache.PageCache; import org.neo4j.kernel.DatabaseAvailability; -import org.neo4j.kernel.NeoStoreDataSource; import org.neo4j.kernel.api.bolt.BoltConnectionTracker; import org.neo4j.kernel.api.exceptions.KernelException; import org.neo4j.kernel.configuration.Config; @@ -94,7 +91,6 @@ import org.neo4j.kernel.impl.transaction.log.PhysicalLogFile; import org.neo4j.kernel.impl.transaction.log.TransactionAppender; import org.neo4j.kernel.impl.transaction.log.TransactionIdStore; -import org.neo4j.kernel.impl.transaction.state.DataSourceManager; import org.neo4j.kernel.internal.DatabaseHealth; import org.neo4j.kernel.internal.DefaultKernelData; import org.neo4j.kernel.lifecycle.LifeSupport; @@ -236,28 +232,6 @@ public class EnterpriseReadReplicaEditionModule extends EditionModule txPulling.add( copiedStoreRecovery ); LifeSupport servicesToStopOnStoreCopy = new LifeSupport(); - if ( config.get( OnlineBackupSettings.online_backup_enabled ) ) - { - platformModule.dataSourceManager.addListener( new DataSourceManager.Listener() - { - @Override - public void registered( NeoStoreDataSource dataSource ) - { - servicesToStopOnStoreCopy.add( pickBackupExtension( dataSource ) ); - } - - @Override - public void unregistered( NeoStoreDataSource dataSource ) - { - servicesToStopOnStoreCopy.remove( pickBackupExtension( dataSource ) ); - } - - private OnlineBackupKernelExtension pickBackupExtension( NeoStoreDataSource dataSource ) - { - return dataSource.getDependencyResolver().resolveDependency( OnlineBackupKernelExtension.class ); - } - } ); - } StoreCopyProcess storeCopyProcess = new StoreCopyProcess( fileSystem, pageCache, localDatabase, copiedStoreRecovery, remoteStore, diff --git a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/core/CausalClusterConfigurationValidatorTest.java b/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/core/CausalClusterConfigurationValidatorTest.java index 8deef6897363a..4a5746c66efca 100644 --- a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/core/CausalClusterConfigurationValidatorTest.java +++ b/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/core/CausalClusterConfigurationValidatorTest.java @@ -29,11 +29,12 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.neo4j.cluster.ClusterSettings; import org.neo4j.graphdb.config.InvalidSettingException; import org.neo4j.helpers.AdvertisedSocketAddress; import org.neo4j.kernel.configuration.BoltConnector; import org.neo4j.kernel.configuration.Config; +import org.neo4j.kernel.impl.enterprise.configuration.EnterpriseEditionSettings; +import org.neo4j.kernel.impl.enterprise.configuration.EnterpriseEditionSettings.Mode; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; @@ -48,12 +49,12 @@ public class CausalClusterConfigurationValidatorTest public ExpectedException expected = ExpectedException.none(); @Parameterized.Parameter - public ClusterSettings.Mode mode; + public Mode mode; @Parameterized.Parameters( name = "{0}" ) - public static List recordFormats() + public static List recordFormats() { - return Arrays.asList( ClusterSettings.Mode.CORE, ClusterSettings.Mode.READ_REPLICA ); + return Arrays.asList( Mode.CORE, Mode.READ_REPLICA ); } @Test @@ -61,7 +62,7 @@ public void validateOnlyIfModeIsCoreOrReplica() throws Exception { // when Config config = Config.embeddedDefaults( - stringMap( ClusterSettings.mode.name(), ClusterSettings.Mode.SINGLE.name(), + stringMap( mode.name(), Mode.SINGLE.name(), initial_discovery_members.name(), "" ), Collections.singleton( new CausalClusterConfigurationValidator() ) ); @@ -74,7 +75,7 @@ public void validateSuccess() throws Exception { // when Config config = Config.embeddedDefaults( - stringMap( ClusterSettings.mode.name(), mode.name(), + stringMap( mode.name(), mode.name(), initial_discovery_members.name(), "localhost:99,remotehost:2", new BoltConnector( "bolt" ).enabled.name(), "true" ), Collections.singleton( new CausalClusterConfigurationValidator() ) ); @@ -94,7 +95,7 @@ public void missingInitialMembers() throws Exception // when Config.embeddedDefaults( - stringMap( ClusterSettings.mode.name(), mode.name() ), + stringMap( EnterpriseEditionSettings.mode.name(), mode.name() ), Collections.singleton( new CausalClusterConfigurationValidator() ) ); } @@ -107,7 +108,7 @@ public void missingBoltConnector() throws Exception // when Config.embeddedDefaults( - stringMap( ClusterSettings.mode.name(), mode.name(), + stringMap( EnterpriseEditionSettings.mode.name(), mode.name(), initial_discovery_members.name(), "localhost:99,remotehost:2" ), Collections.singleton( new CausalClusterConfigurationValidator() ) ); } diff --git a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/discovery/CoreClusterMember.java b/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/discovery/CoreClusterMember.java index 56cf32e4fb0f6..597a78d2e1657 100644 --- a/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/discovery/CoreClusterMember.java +++ b/enterprise/causal-clustering/src/test/java/org/neo4j/causalclustering/discovery/CoreClusterMember.java @@ -34,7 +34,6 @@ import org.neo4j.causalclustering.core.state.ClusterStateDirectory; import org.neo4j.causalclustering.core.state.RaftLogPruner; import org.neo4j.causalclustering.identity.MemberId; -import org.neo4j.cluster.ClusterSettings; import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.helpers.AdvertisedSocketAddress; import org.neo4j.io.fs.DefaultFileSystemAbstraction; @@ -44,6 +43,7 @@ import org.neo4j.kernel.configuration.HttpConnector; import org.neo4j.kernel.configuration.HttpConnector.Encryption; import org.neo4j.kernel.configuration.Settings; +import org.neo4j.kernel.impl.enterprise.configuration.EnterpriseEditionSettings; import org.neo4j.logging.Level; import static java.lang.String.format; @@ -85,7 +85,7 @@ public CoreClusterMember( int serverId, int clusterSize, String initialMembers = addresses.stream().map( AdvertisedSocketAddress::toString ).collect( joining( "," ) ); boltAdvertisedSocketAddress = advertisedAddress( advertisedAddress, boltPort ); - config.put( ClusterSettings.mode.name(), ClusterSettings.Mode.CORE.name() ); + config.put( EnterpriseEditionSettings.mode.name(), EnterpriseEditionSettings.Mode.CORE.name() ); config.put( GraphDatabaseSettings.default_advertised_address.name(), advertisedAddress ); config.put( CausalClusteringSettings.initial_discovery_members.name(), initialMembers ); config.put( CausalClusteringSettings.discovery_listen_address.name(), listenAddress( listenAddress, hazelcastPort ) ); diff --git a/enterprise/cluster/pom.xml b/enterprise/cluster/pom.xml index f1e96d6e73a30..6fb32291507bb 100644 --- a/enterprise/cluster/pom.xml +++ b/enterprise/cluster/pom.xml @@ -104,5 +104,10 @@ mockito-core test + + org.neo4j + neo4j-enterprise-kernel + ${project.version} + diff --git a/enterprise/cluster/src/main/java/org/neo4j/cluster/ClusterSettings.java b/enterprise/cluster/src/main/java/org/neo4j/cluster/ClusterSettings.java index 733e0c3d8e451..c9077fb73e248 100644 --- a/enterprise/cluster/src/main/java/org/neo4j/cluster/ClusterSettings.java +++ b/enterprise/cluster/src/main/java/org/neo4j/cluster/ClusterSettings.java @@ -72,21 +72,6 @@ public String toString() } }; - public enum Mode - { - SINGLE, - HA, - ARBITER, - CORE, - READ_REPLICA - } - - @Description( "Configure the operating mode of the database -- 'SINGLE' for stand-alone operation, " + - "'HA' for operating as a member in an HA cluster, 'ARBITER' for a cluster member with no database in an HA cluster, " + - "'CORE' for operating as a core member of a Causal Cluster, " + - "or 'READ_REPLICA' for operating as a read replica member of a Causal Cluster." ) - public static final Setting mode = setting( "dbms.mode", options( Mode.class ), Mode.SINGLE.name() ); - @Description( "Id for a cluster instance. Must be unique within the cluster." ) public static final Setting server_id = setting( "ha.server_id", INSTANCE_ID, NO_DEFAULT ); diff --git a/enterprise/cluster/src/main/java/org/neo4j/configuration/HaConfigurationValidator.java b/enterprise/cluster/src/main/java/org/neo4j/configuration/HaConfigurationValidator.java index f6ad83609af9b..4aaf1756bc3c3 100644 --- a/enterprise/cluster/src/main/java/org/neo4j/configuration/HaConfigurationValidator.java +++ b/enterprise/cluster/src/main/java/org/neo4j/configuration/HaConfigurationValidator.java @@ -25,13 +25,13 @@ import java.util.function.Function; import javax.annotation.Nonnull; -import org.neo4j.cluster.ClusterSettings; -import org.neo4j.cluster.ClusterSettings.Mode; import org.neo4j.graphdb.config.InvalidSettingException; import org.neo4j.graphdb.config.SettingValidator; import org.neo4j.helpers.HostnamePort; import org.neo4j.kernel.configuration.ConfigurationValidator; import org.neo4j.logging.Log; +import org.neo4j.kernel.impl.enterprise.configuration.EnterpriseEditionSettings; +import org.neo4j.kernel.impl.enterprise.configuration.EnterpriseEditionSettings.Mode; import static org.neo4j.cluster.ClusterSettings.initial_hosts; import static org.neo4j.cluster.ClusterSettings.server_id; @@ -44,7 +44,7 @@ public Map validate( @Nonnull Collection settin @Nonnull Map rawConfig, @Nonnull Log log, boolean parsingFile ) throws InvalidSettingException { // Make sure mode is HA - Mode mode = ClusterSettings.mode.apply( rawConfig::get ); + Mode mode = EnterpriseEditionSettings.mode.apply( rawConfig::get ); if ( !mode.equals( Mode.HA ) && !mode.equals( Mode.ARBITER ) ) { // Nothing to validate diff --git a/enterprise/cluster/src/test/java/org/neo4j/configuration/HaConfigurationValidatorTest.java b/enterprise/cluster/src/test/java/org/neo4j/configuration/HaConfigurationValidatorTest.java index 904c7b69be6e4..c84093f45f1db 100644 --- a/enterprise/cluster/src/test/java/org/neo4j/configuration/HaConfigurationValidatorTest.java +++ b/enterprise/cluster/src/test/java/org/neo4j/configuration/HaConfigurationValidatorTest.java @@ -34,6 +34,7 @@ import org.neo4j.graphdb.config.InvalidSettingException; import org.neo4j.helpers.HostnamePort; import org.neo4j.kernel.configuration.Config; +import org.neo4j.kernel.impl.enterprise.configuration.EnterpriseEditionSettings; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; @@ -46,12 +47,12 @@ public class HaConfigurationValidatorTest public ExpectedException expected = ExpectedException.none(); @Parameterized.Parameter - public ClusterSettings.Mode mode; + public EnterpriseEditionSettings.Mode mode; @Parameterized.Parameters( name = "{0}" ) - public static List recordFormats() + public static List recordFormats() { - return Arrays.asList( ClusterSettings.Mode.HA, ClusterSettings.Mode.ARBITER ); + return Arrays.asList( EnterpriseEditionSettings.Mode.HA, EnterpriseEditionSettings.Mode.ARBITER ); } @Test @@ -59,7 +60,7 @@ public void validateOnlyIfModeIsHA() throws Exception { // when Config config = Config.embeddedDefaults( - stringMap( ClusterSettings.mode.name(), ClusterSettings.Mode.SINGLE.name(), + stringMap( EnterpriseEditionSettings.mode.name(), EnterpriseEditionSettings.Mode.SINGLE.name(), ClusterSettings.initial_hosts.name(), "" ), Collections.singleton( new HaConfigurationValidator() ) ); @@ -72,7 +73,7 @@ public void validateSuccess() throws Exception { // when Config config = Config.embeddedDefaults( - stringMap( ClusterSettings.mode.name(), mode.name(), + stringMap( EnterpriseEditionSettings.mode.name(), mode.name(), ClusterSettings.server_id.name(), "1", ClusterSettings.initial_hosts.name(), "localhost,remotehost" ), Collections.singleton( new HaConfigurationValidator() ) ); @@ -93,7 +94,7 @@ public void missingServerId() throws Exception // when Config.embeddedDefaults( - stringMap( ClusterSettings.mode.name(), mode.name() ), + stringMap( EnterpriseEditionSettings.mode.name(), mode.name() ), Collections.singleton( new HaConfigurationValidator() ) ); } @@ -106,7 +107,7 @@ public void missingInitialHosts() throws Exception // when Config.embeddedDefaults( - stringMap( ClusterSettings.mode.name(), mode.name(), + stringMap( EnterpriseEditionSettings.mode.name(), mode.name(), ClusterSettings.server_id.name(), "1" ), Collections.singleton( new HaConfigurationValidator() ) ); } @@ -120,7 +121,7 @@ public void initialHostsEmpty() throws Exception // when Config.embeddedDefaults( - stringMap( ClusterSettings.mode.name(), mode.name(), + stringMap( EnterpriseEditionSettings.mode.name(), mode.name(), ClusterSettings.server_id.name(), "1", ClusterSettings.initial_hosts.name(), "," ), Collections.singleton( new HaConfigurationValidator() ) ); diff --git a/enterprise/ha/LICENSES.txt b/enterprise/ha/LICENSES.txt index 3045fe5249963..2e57b8b075347 100644 --- a/enterprise/ha/LICENSES.txt +++ b/enterprise/ha/LICENSES.txt @@ -17,6 +17,8 @@ Apache Software License, Version 2.0 Apache Shiro :: Event Apache Shiro :: Lang Caffeine cache + Commons BeanUtils + hazelcast-all Lucene codecs Lucene Common Analyzers Lucene Core diff --git a/enterprise/ha/NOTICE.txt b/enterprise/ha/NOTICE.txt index af702c1fcb180..41f75f7d9b773 100644 --- a/enterprise/ha/NOTICE.txt +++ b/enterprise/ha/NOTICE.txt @@ -39,6 +39,8 @@ Apache Software License, Version 2.0 Apache Shiro :: Event Apache Shiro :: Lang Caffeine cache + Commons BeanUtils + hazelcast-all Lucene codecs Lucene Common Analyzers Lucene Core diff --git a/enterprise/ha/pom.xml b/enterprise/ha/pom.xml index 638fdca7033da..feb15ee76f07b 100644 --- a/enterprise/ha/pom.xml +++ b/enterprise/ha/pom.xml @@ -56,6 +56,13 @@ neo4j-enterprise-kernel ${project.version} + + org.neo4j + neo4j-enterprise-kernel + ${project.version} + test-jar + test + org.neo4j neo4j-jmx diff --git a/enterprise/ha/src/test/java/org/neo4j/ha/BackupHaIT.java b/enterprise/ha/src/test/java/org/neo4j/ha/BackupHaIT.java index 37c67a8793ce5..e8acffa80e792 100644 --- a/enterprise/ha/src/test/java/org/neo4j/ha/BackupHaIT.java +++ b/enterprise/ha/src/test/java/org/neo4j/ha/BackupHaIT.java @@ -37,7 +37,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; import static org.neo4j.backup.OnlineBackupCommandIT.createSomeData; -import static org.neo4j.backup.OnlineBackupCommandIT.runBackupToolFromOtherJvmToGetExitCode; +import static org.neo4j.util.JvmRunner.runBackupToolFromOtherJvmToGetExitCode; public class BackupHaIT { diff --git a/enterprise/kernel/src/main/java/org/neo4j/kernel/impl/enterprise/configuration/EnterpriseEditionSettings.java b/enterprise/kernel/src/main/java/org/neo4j/kernel/impl/enterprise/configuration/EnterpriseEditionSettings.java index f00494e6aa0bc..74a7c59c06a84 100644 --- a/enterprise/kernel/src/main/java/org/neo4j/kernel/impl/enterprise/configuration/EnterpriseEditionSettings.java +++ b/enterprise/kernel/src/main/java/org/neo4j/kernel/impl/enterprise/configuration/EnterpriseEditionSettings.java @@ -29,6 +29,7 @@ import static org.neo4j.kernel.configuration.Settings.STRING; import static org.neo4j.kernel.configuration.Settings.list; +import static org.neo4j.kernel.configuration.Settings.options; import static org.neo4j.kernel.configuration.Settings.optionsIgnoreCase; import static org.neo4j.kernel.configuration.Settings.setting; import static org.neo4j.kernel.impl.store.id.IdType.NODE; @@ -50,4 +51,19 @@ public class EnterpriseEditionSettings implements LoadableConfig @Internal public static final Setting security_module = setting( "unsupported.dbms.security.module", STRING, ENTERPRISE_SECURITY_MODULE_ID ); + + @Description( "Configure the operating mode of the database -- 'SINGLE' for stand-alone operation, " + + "'HA' for operating as a member in an HA cluster, 'ARBITER' for a cluster member with no database in an HA cluster, " + + "'CORE' for operating as a core member of a Causal Cluster, " + + "or 'READ_REPLICA' for operating as a read replica member of a Causal Cluster." ) + public static final Setting mode = setting( "dbms.mode", options( Mode.class ), Mode.SINGLE.name() ); + + public enum Mode + { + SINGLE, + HA, + ARBITER, + CORE, + READ_REPLICA + } } diff --git a/enterprise/kernel/src/test/java/org/neo4j/util/JvmRunner.java b/enterprise/kernel/src/test/java/org/neo4j/util/JvmRunner.java new file mode 100644 index 0000000000000..b77f0b6a3022c --- /dev/null +++ b/enterprise/kernel/src/test/java/org/neo4j/util/JvmRunner.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2002-2017 "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.util; + +import org.junit.ClassRule; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.neo4j.commandline.admin.AdminTool; +import org.neo4j.io.proc.ProcessUtil; +import org.neo4j.test.ProcessStreamHandler; +import org.neo4j.test.rule.TestDirectory; + +public class JvmRunner +{ + @ClassRule + public static final TestDirectory testDirectory = TestDirectory.testDirectory(); + + public static int runBackupToolFromOtherJvmToGetExitCode( String... args ) throws Exception + { + return runBackupToolFromOtherJvmToGetExitCode( testDirectory.absolutePath(), args ); + } + + public static int runBackupToolFromOtherJvmToGetExitCode( File neo4jHome, String... args ) throws Exception + { + List allArgs = + new ArrayList<>( Arrays.asList( ProcessUtil.getJavaExecutable().toString(), "-cp", ProcessUtil.getClassPath(), AdminTool.class.getName() ) ); + allArgs.add( "backup" ); + allArgs.addAll( Arrays.asList( args ) ); + + Process process = Runtime.getRuntime().exec( allArgs.toArray( new String[allArgs.size()] ), new String[]{"NEO4J_HOME=" + neo4jHome.getAbsolutePath()} ); + return new ProcessStreamHandler( process, true ).waitForResult(); + } +} diff --git a/enterprise/neo4j-harness-enterprise/src/main/java/org/neo4j/harness/CausalClusterInProcessRunner.java b/enterprise/neo4j-harness-enterprise/src/main/java/org/neo4j/harness/CausalClusterInProcessRunner.java index 20cc270123ffe..3a9c847d6549e 100644 --- a/enterprise/neo4j-harness-enterprise/src/main/java/org/neo4j/harness/CausalClusterInProcessRunner.java +++ b/enterprise/neo4j-harness-enterprise/src/main/java/org/neo4j/harness/CausalClusterInProcessRunner.java @@ -35,6 +35,7 @@ import org.neo4j.kernel.configuration.BoltConnector; import org.neo4j.kernel.configuration.HttpConnector; import org.neo4j.kernel.configuration.Settings; +import org.neo4j.kernel.impl.enterprise.configuration.EnterpriseEditionSettings; import org.neo4j.logging.Log; import org.neo4j.logging.LogProvider; import org.neo4j.server.configuration.ServerSettings; @@ -121,7 +122,7 @@ void boot() throws IOException, InterruptedException builder.withConfig( GraphDatabaseSettings.neo4j_home.name(), homePath ); builder.withConfig( GraphDatabaseSettings.pagecache_memory.name(), "8m" ); - builder.withConfig( ClusterSettings.mode.name(), ClusterSettings.Mode.CORE.name() ); + builder.withConfig( EnterpriseEditionSettings.mode.name(), EnterpriseEditionSettings.Mode.CORE.name() ); builder.withConfig( CausalClusteringSettings.multi_dc_license.name(), "true" ); builder.withConfig( CausalClusteringSettings.initial_discovery_members.name(), String.join( ",", initialMembers ) ); @@ -164,7 +165,7 @@ void boot() throws IOException, InterruptedException builder.withConfig( GraphDatabaseSettings.neo4j_home.name(), homePath ); builder.withConfig( GraphDatabaseSettings.pagecache_memory.name(), "8m" ); - builder.withConfig( ClusterSettings.mode.name(), ClusterSettings.Mode.READ_REPLICA.name() ); + builder.withConfig( EnterpriseEditionSettings.mode.name(), EnterpriseEditionSettings.Mode.READ_REPLICA.name() ); builder.withConfig( CausalClusteringSettings.initial_discovery_members.name(), String.join( ",", initialMembers ) ); builder.withConfig( CausalClusteringSettings.transaction_listen_address.name(), specifyPortOnly( txPort ) ); diff --git a/enterprise/server-enterprise/src/main/java/org/neo4j/server/enterprise/EnterpriseNeoServer.java b/enterprise/server-enterprise/src/main/java/org/neo4j/server/enterprise/EnterpriseNeoServer.java index 2aace260441be..7d53e63fe49fb 100644 --- a/enterprise/server-enterprise/src/main/java/org/neo4j/server/enterprise/EnterpriseNeoServer.java +++ b/enterprise/server-enterprise/src/main/java/org/neo4j/server/enterprise/EnterpriseNeoServer.java @@ -31,13 +31,14 @@ import org.neo4j.causalclustering.core.CoreGraphDatabase; import org.neo4j.causalclustering.readreplica.ReadReplicaGraphDatabase; import org.neo4j.cluster.ClusterSettings; -import org.neo4j.cluster.ClusterSettings.Mode; import org.neo4j.dbms.DatabaseManagementSystemSettings; import org.neo4j.helpers.collection.Iterables; import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.enterprise.EnterpriseGraphDatabase; import org.neo4j.kernel.ha.HaSettings; import org.neo4j.kernel.ha.HighlyAvailableGraphDatabase; +import org.neo4j.kernel.impl.enterprise.configuration.EnterpriseEditionSettings; +import org.neo4j.kernel.impl.enterprise.configuration.EnterpriseEditionSettings.Mode; import org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory.Dependencies; import org.neo4j.kernel.impl.util.UnsatisfiedDependencyException; import org.neo4j.logging.LogProvider; @@ -93,7 +94,7 @@ public EnterpriseNeoServer( Config config, Dependencies dependencies, LogProvide protected static Database.Factory createDbFactory( Config config ) { - final Mode mode = config.get( ClusterSettings.mode ); + final Mode mode = config.get( EnterpriseEditionSettings.mode ); switch ( mode ) { diff --git a/enterprise/server-enterprise/src/main/java/org/neo4j/server/enterprise/EnterpriseServerSettings.java b/enterprise/server-enterprise/src/main/java/org/neo4j/server/enterprise/EnterpriseServerSettings.java index abaa93b106efb..d9a29b219bf8c 100644 --- a/enterprise/server-enterprise/src/main/java/org/neo4j/server/enterprise/EnterpriseServerSettings.java +++ b/enterprise/server-enterprise/src/main/java/org/neo4j/server/enterprise/EnterpriseServerSettings.java @@ -27,7 +27,6 @@ import static org.neo4j.kernel.configuration.Settings.BOOLEAN; import static org.neo4j.kernel.configuration.Settings.DURATION; -import static org.neo4j.kernel.configuration.Settings.STRING; import static org.neo4j.kernel.configuration.Settings.TRUE; import static org.neo4j.kernel.configuration.Settings.setting; diff --git a/enterprise/server-enterprise/src/test/java/org/neo4j/server/enterprise/EnterpriseBootstrapperTest.java b/enterprise/server-enterprise/src/test/java/org/neo4j/server/enterprise/EnterpriseBootstrapperTest.java index a991ccd3e8b8b..6ce8b09539d4f 100644 --- a/enterprise/server-enterprise/src/test/java/org/neo4j/server/enterprise/EnterpriseBootstrapperTest.java +++ b/enterprise/server-enterprise/src/test/java/org/neo4j/server/enterprise/EnterpriseBootstrapperTest.java @@ -31,6 +31,7 @@ import org.neo4j.cluster.ClusterSettings; import org.neo4j.kernel.GraphDatabaseDependencies; import org.neo4j.kernel.configuration.Config; +import org.neo4j.kernel.impl.enterprise.configuration.EnterpriseEditionSettings; import org.neo4j.logging.LogProvider; import org.neo4j.server.BaseBootstrapperTest; import org.neo4j.server.NeoServer; @@ -76,7 +77,7 @@ public void shouldBeAbleToStartInSingleMode() throws Exception // When int resultCode = ServerBootstrapper.start( bootstrapper, "--home-dir", tempDir.newFolder( "home-dir" ).getAbsolutePath(), - "-c", configOption( ClusterSettings.mode, "SINGLE" ), + "-c", configOption( EnterpriseEditionSettings.mode, "SINGLE" ), "-c", configOption( data_directory, getRelativePath( folder.getRoot(), data_directory ) ), "-c", configOption( logs_directory, tempDir.getRoot().getAbsolutePath() ), "-c", configOption( certificates_directory, getRelativePath( folder.getRoot(), certificates_directory ) ), @@ -95,7 +96,7 @@ public void shouldBeAbleToStartInHAMode() throws Exception // When int resultCode = ServerBootstrapper.start( bootstrapper, "--home-dir", tempDir.newFolder( "home-dir" ).getAbsolutePath(), - "-c", configOption( ClusterSettings.mode, "HA" ), + "-c", configOption( EnterpriseEditionSettings.mode, "HA" ), "-c", configOption( ClusterSettings.server_id, "1" ), "-c", configOption( ClusterSettings.initial_hosts, "127.0.0.1:5001" ), "-c", configOption( data_directory, getRelativePath( folder.getRoot(), data_directory ) ), diff --git a/enterprise/server-enterprise/src/test/java/org/neo4j/server/enterprise/functional/EnterpriseServerIT.java b/enterprise/server-enterprise/src/test/java/org/neo4j/server/enterprise/functional/EnterpriseServerIT.java index e2856eee7523a..e8f698dcdf6d4 100644 --- a/enterprise/server-enterprise/src/test/java/org/neo4j/server/enterprise/functional/EnterpriseServerIT.java +++ b/enterprise/server-enterprise/src/test/java/org/neo4j/server/enterprise/functional/EnterpriseServerIT.java @@ -39,7 +39,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.neo4j.cluster.ClusterSettings.initial_hosts; -import static org.neo4j.cluster.ClusterSettings.mode; +import static org.neo4j.kernel.impl.enterprise.configuration.EnterpriseEditionSettings.mode; import static org.neo4j.cluster.ClusterSettings.server_id; public class EnterpriseServerIT