diff --git a/community/bolt/src/main/java/org/neo4j/bolt/BoltKernelExtension.java b/community/bolt/src/main/java/org/neo4j/bolt/BoltKernelExtension.java index 0d151751bcb61..5b8897f282098 100644 --- a/community/bolt/src/main/java/org/neo4j/bolt/BoltKernelExtension.java +++ b/community/bolt/src/main/java/org/neo4j/bolt/BoltKernelExtension.java @@ -86,7 +86,7 @@ public class BoltKernelExtension extends KernelExtensionFactory ssl_policy = setting( "bolt.ssl_policy", STRING, LEGACY_POLICY_NAME ).build(); + public static Setting ssl_policy = setting( "bolt.ssl_policy", STRING, LEGACY_POLICY_NAME ); } public interface Dependencies diff --git a/community/consistency-check/src/main/java/org/neo4j/consistency/ConsistencyCheckSettings.java b/community/consistency-check/src/main/java/org/neo4j/consistency/ConsistencyCheckSettings.java index 3bfc9732c9c8e..4359faa0c442f 100644 --- a/community/consistency-check/src/main/java/org/neo4j/consistency/ConsistencyCheckSettings.java +++ b/community/consistency-check/src/main/java/org/neo4j/consistency/ConsistencyCheckSettings.java @@ -40,25 +40,25 @@ public class ConsistencyCheckSettings implements LoadableConfig "However, the check is very expensive in time and memory, so it is skipped by default." ) @Deprecated public static final Setting consistency_check_property_owners = - setting( "tools.consistency_checker.check_property_owners", BOOLEAN, FALSE ).build(); + setting( "tools.consistency_checker.check_property_owners", BOOLEAN, FALSE ); @Description( "This setting is deprecated. See commandline arguments for neoj4-admin check-consistency " + "instead. Perform checks on the label scan store. Checking this store is more expensive than " + "checking the native stores, so it may be useful to turn off this check for very large databases." ) @Deprecated public static final Setting consistency_check_label_scan_store = - setting( "tools.consistency_checker.check_label_scan_store", BOOLEAN, TRUE ).build(); + setting( "tools.consistency_checker.check_label_scan_store", BOOLEAN, TRUE ); @Description( "This setting is deprecated. See commandline arguments for neoj4-admin check-consistency " + "instead. Perform checks on indexes. Checking indexes is more expensive than " + "checking the native stores, so it may be useful to turn off this check for very large databases." ) @Deprecated public static final Setting consistency_check_indexes = - setting( "tools.consistency_checker.check_indexes", BOOLEAN, TRUE ).build(); + setting( "tools.consistency_checker.check_indexes", BOOLEAN, TRUE ); @Description( "This setting is deprecated. See commandline arguments for neoj4-admin check-consistency " + "instead. Perform checks between nodes, relationships, properties, types and tokens." ) @Deprecated public static final Setting consistency_check_graph = - setting( "tools.consistency_checker.check_graph", BOOLEAN, TRUE ).build(); + setting( "tools.consistency_checker.check_graph", BOOLEAN, TRUE ); } diff --git a/community/consistency-check/src/test/java/org/neo4j/consistency/ConsistencyCheckToolTest.java b/community/consistency-check/src/test/java/org/neo4j/consistency/ConsistencyCheckToolTest.java index 065a6737130b0..7cf6fc65a29a0 100644 --- a/community/consistency-check/src/test/java/org/neo4j/consistency/ConsistencyCheckToolTest.java +++ b/community/consistency-check/src/test/java/org/neo4j/consistency/ConsistencyCheckToolTest.java @@ -108,7 +108,7 @@ public void passesOnConfigurationIfProvided() throws Exception { // given File storeDir = storeDirectory.directory(); - File configFile = storeDirectory.file( "neo4j.conf" ); + File configFile = storeDirectory.file( Config.DEFAULT_CONFIG_FILE_NAME ); Properties properties = new Properties(); properties.setProperty( ConsistencyCheckSettings.consistency_check_property_owners.name(), "true" ); properties.store( new FileWriter( configFile ), null ); diff --git a/community/dbms/src/main/java/org/neo4j/commandline/dbms/DumpCommand.java b/community/dbms/src/main/java/org/neo4j/commandline/dbms/DumpCommand.java index 60786e1af1436..a7d3e775e92b3 100644 --- a/community/dbms/src/main/java/org/neo4j/commandline/dbms/DumpCommand.java +++ b/community/dbms/src/main/java/org/neo4j/commandline/dbms/DumpCommand.java @@ -99,7 +99,7 @@ public void execute( String[] args ) throws IncorrectUsage, CommandFailed private Path toDatabaseDirectory( String databaseName ) { - return Config.fromFile( configDir.resolve( "neo4j.conf" ) ) + return Config.fromFile( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ) ) .withHome( homeDir ) .withConnectorsDisabled() .withSetting( DatabaseManagementSystemSettings.active_database, databaseName ) diff --git a/community/dbms/src/main/java/org/neo4j/commandline/dbms/ImportCommand.java b/community/dbms/src/main/java/org/neo4j/commandline/dbms/ImportCommand.java index 28aedc24c6d84..08a2d53181589 100644 --- a/community/dbms/src/main/java/org/neo4j/commandline/dbms/ImportCommand.java +++ b/community/dbms/src/main/java/org/neo4j/commandline/dbms/ImportCommand.java @@ -286,7 +286,7 @@ private Map loadAdditionalConfig( Optional additionalConfig private static Config loadNeo4jConfig( Path homeDir, Path configDir, String databaseName, Map additionalConfig ) { - return Config.fromFile( configDir.resolve( "neo4j.conf" ) ) + return Config.fromFile( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ) ) .withHome( homeDir ) .withSetting( DatabaseManagementSystemSettings.active_database, databaseName ) .withSettings( additionalConfig ) diff --git a/community/dbms/src/main/java/org/neo4j/dbms/DatabaseManagementSystemSettings.java b/community/dbms/src/main/java/org/neo4j/dbms/DatabaseManagementSystemSettings.java index 11516dd1a2c17..aff40f2746e91 100644 --- a/community/dbms/src/main/java/org/neo4j/dbms/DatabaseManagementSystemSettings.java +++ b/community/dbms/src/main/java/org/neo4j/dbms/DatabaseManagementSystemSettings.java @@ -35,7 +35,7 @@ public class DatabaseManagementSystemSettings implements LoadableConfig { @Description( "Name of the database to load" ) - public static final Setting active_database = setting( "dbms.active_database", STRING, "graph.db" ).build(); + public static final Setting active_database = setting( "dbms.active_database", STRING, "graph.db" ); @Description( "Path of the data directory. You must not configure more than one Neo4j installation to use the " + "same data directory." ) diff --git a/community/dbms/src/test/java/org/neo4j/commandline/dbms/DumpCommandTest.java b/community/dbms/src/test/java/org/neo4j/commandline/dbms/DumpCommandTest.java index cee3ee140aa48..9d19dcc84006d 100644 --- a/community/dbms/src/test/java/org/neo4j/commandline/dbms/DumpCommandTest.java +++ b/community/dbms/src/test/java/org/neo4j/commandline/dbms/DumpCommandTest.java @@ -19,6 +19,12 @@ */ package org.neo4j.commandline.dbms; +import org.apache.commons.lang3.SystemUtils; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + import java.io.ByteArrayOutputStream; import java.io.Closeable; import java.io.File; @@ -32,12 +38,6 @@ import java.nio.file.Paths; import java.util.function.Predicate; -import org.apache.commons.lang3.SystemUtils; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - import org.neo4j.commandline.admin.CommandFailed; import org.neo4j.commandline.admin.CommandLocator; import org.neo4j.commandline.admin.IncorrectUsage; @@ -45,6 +45,7 @@ import org.neo4j.dbms.archive.Dumper; import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.impl.store.MetaDataStore; import org.neo4j.kernel.impl.storemigration.StoreFileType; import org.neo4j.kernel.internal.locker.StoreLocker; @@ -53,7 +54,6 @@ import static java.lang.String.format; import static java.util.Arrays.asList; import static java.util.Collections.emptySet; - import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertEquals; @@ -66,7 +66,6 @@ import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; - import static org.neo4j.dbms.DatabaseManagementSystemSettings.data_directory; import static org.neo4j.dbms.archive.TestUtils.withPermissions; @@ -107,7 +106,7 @@ public void shouldCalculateTheDatabaseDirectoryFromConfig() throws Exception Path dataDir = testDirectory.directory( "some-other-path" ).toPath(); Path databaseDir = dataDir.resolve( "databases/foo.db" ); putStoreInDirectory( databaseDir ); - Files.write( configDir.resolve( "neo4j.conf" ), + Files.write( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ), asList( format( "%s=%s", data_directory.name(), dataDir.toString().replace( '\\', '/' ) ) ) ); execute( "foo.db" ); @@ -129,7 +128,7 @@ public void shouldHandleDatabaseSymlink() throws Exception Files.createDirectories( dataDir.resolve( "databases" ) ); Files.createSymbolicLink( databaseDir, realDatabaseDir ); - Files.write( configDir.resolve( "neo4j.conf" ), + Files.write( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ), asList( format( "%s=%s", data_directory.name(), dataDir.toString().replace( '\\', '/' ) ) ) ); execute( "foo.db" ); @@ -265,7 +264,7 @@ public void shouldDefaultToGraphDB() throws Exception Path dataDir = testDirectory.directory( "some-other-path" ).toPath(); Path databaseDir = dataDir.resolve( "databases/graph.db" ); putStoreInDirectory( databaseDir ); - Files.write( configDir.resolve( "neo4j.conf" ), + Files.write( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ), asList( format( "%s=%s", data_directory.name(), dataDir.toString().replace( '\\', '/' ) ) ) ); new DumpCommand( homeDir, configDir, dumper ).execute( new String[]{"--to=" + archive} ); diff --git a/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java b/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java index 66b0cb1ff06f9..37491787c69e6 100644 --- a/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java +++ b/community/dbms/src/test/java/org/neo4j/commandline/dbms/LoadCommandTest.java @@ -45,6 +45,7 @@ import org.neo4j.helpers.ArrayUtil; import org.neo4j.io.fs.DefaultFileSystemAbstraction; import org.neo4j.io.fs.FileSystemAbstraction; +import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.internal.locker.StoreLocker; import org.neo4j.test.rule.TestDirectory; @@ -96,7 +97,7 @@ public void shouldCalculateTheDatabaseDirectoryFromConfig() Path dataDir = testDirectory.directory( "some-other-path" ).toPath(); Path databaseDir = dataDir.resolve( "databases/foo.db" ); Files.createDirectories( databaseDir ); - Files.write( configDir.resolve( "neo4j.conf" ), + Files.write( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ), asList( format( "%s=%s", data_directory.name(), dataDir.toString().replace( '\\', '/' ) ) ) ); execute( "foo.db" ); @@ -119,7 +120,7 @@ public void shouldHandleSymlinkToDatabaseDir() throws IOException, CommandFailed Files.createSymbolicLink( databaseDir, realDatabaseDir ); - Files.write( configDir.resolve( "neo4j.conf" ), + Files.write( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ), asList( format( "%s=%s", data_directory.name(), dataDir.toString().replace( '\\', '/' ) ) ) ); execute( "foo.db" ); @@ -132,7 +133,7 @@ public void shouldMakeFromCanonical() throws IOException, CommandFailed, Incorre Path dataDir = testDirectory.directory( "some-other-path" ).toPath(); Path databaseDir = dataDir.resolve( "databases/foo.db" ); Files.createDirectories( databaseDir ); - Files.write( configDir.resolve( "neo4j.conf" ), + Files.write( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ), asList( format( "%s=%s", data_directory.name(), dataDir.toString().replace( '\\', '/' ) ) ) ); new LoadCommand( homeDir, configDir, loader ) diff --git a/community/import-tool/src/main/java/org/neo4j/tooling/ImportTool.java b/community/import-tool/src/main/java/org/neo4j/tooling/ImportTool.java index 7946b36fb6bb7..2c20da2c0cf41 100644 --- a/community/import-tool/src/main/java/org/neo4j/tooling/ImportTool.java +++ b/community/import-tool/src/main/java/org/neo4j/tooling/ImportTool.java @@ -216,10 +216,10 @@ enum Options + "Skipped columns will be logged, containing at most number of entities specified by " + BAD_TOLERANCE.key() + ", unless " + "otherwise specified by " + SKIP_BAD_ENTRIES_LOGGING.key() + "option." ), - DATABASE_CONFIG( "db-config", null, "", + DATABASE_CONFIG( "db-config", null, "", "(advanced) Option is deprecated and replaced by 'additional-config'. " ), ADDITIONAL_CONFIG( "additional-config", null, - "", + "", "(advanced) File specifying database-specific configuration. For more information consult " + "manual about available configuration options for a neo4j configuration file. " + "Only configuration affecting store at time of creation will be read. " diff --git a/community/kernel/src/main/java/org/neo4j/graphdb/factory/GraphDatabaseFactory.java b/community/kernel/src/main/java/org/neo4j/graphdb/factory/GraphDatabaseFactory.java index 8d6cb0900ab22..77a3c255d08ba 100644 --- a/community/kernel/src/main/java/org/neo4j/graphdb/factory/GraphDatabaseFactory.java +++ b/community/kernel/src/main/java/org/neo4j/graphdb/factory/GraphDatabaseFactory.java @@ -103,7 +103,7 @@ public GraphDatabaseService newDatabase( Map config ) @Override public GraphDatabaseService newDatabase( @Nonnull Config config ) { - config.augment( "unsupported.dbms.ephemeral", "false" ); + config.augment( GraphDatabaseFacadeFactory.Configuration.ephemeral, "false" ); return GraphDatabaseFactory.this.newEmbeddedDatabase( storeDir, config, state.databaseDependencies() ); } }; diff --git a/community/kernel/src/main/java/org/neo4j/graphdb/factory/GraphDatabaseSettings.java b/community/kernel/src/main/java/org/neo4j/graphdb/factory/GraphDatabaseSettings.java index c414e8c78c226..97d29c8b29765 100644 --- a/community/kernel/src/main/java/org/neo4j/graphdb/factory/GraphDatabaseSettings.java +++ b/community/kernel/src/main/java/org/neo4j/graphdb/factory/GraphDatabaseSettings.java @@ -61,6 +61,7 @@ import static org.neo4j.kernel.configuration.Settings.STRING_LIST; import static org.neo4j.kernel.configuration.Settings.TRUE; import static org.neo4j.kernel.configuration.Settings.advertisedAddress; +import static org.neo4j.kernel.configuration.Settings.buildSetting; import static org.neo4j.kernel.configuration.Settings.derivedSetting; import static org.neo4j.kernel.configuration.Settings.illegalValueMessage; import static org.neo4j.kernel.configuration.Settings.legacyFallback; @@ -97,55 +98,55 @@ public class GraphDatabaseSettings implements LoadableConfig @Description( "Root relative to which directory settings are resolved. This is set in code and should never be " + "configured explicitly." ) public static final Setting neo4j_home = - setting( "unsupported.dbms.directories.neo4j_home", PATH, NO_DEFAULT ).build(); + setting( "unsupported.dbms.directories.neo4j_home", PATH, NO_DEFAULT ); @Title( "Read only database" ) @Description( "Only allow read operations from this Neo4j instance. " + "This mode still requires write access to the directory for lock purposes." ) - public static final Setting read_only = setting( "dbms.read_only", BOOLEAN, FALSE ).build(); + public static final Setting read_only = setting( "dbms.read_only", BOOLEAN, FALSE ); @Title( "Disconnected" ) @Internal @Description( "Disable all protocol connectors." ) - public static final Setting disconnected = setting( "unsupported.dbms.disconnected", BOOLEAN, FALSE ).build(); + public static final Setting disconnected = setting( "unsupported.dbms.disconnected", BOOLEAN, FALSE ); @Description( "Print out the effective Neo4j configuration after startup." ) @Internal public static final Setting dump_configuration = setting( "unsupported.dbms.report_configuration", - BOOLEAN, FALSE ).build(); + BOOLEAN, FALSE ); @Description( "A strict configuration validation will prevent the database from starting up if unknown " + "configuration options are specified in the neo4j settings namespace (such as dbms., ha., cypher., etc). " + "This is currently false by default but will be true by default in 4.0." ) public static final Setting strict_config_validation = - setting( "dbms.config.strict_validation", BOOLEAN, FALSE ).build(); + setting( "dbms.config.strict_validation", BOOLEAN, FALSE ); @Description( "Whether to allow a store upgrade in case the current version of the database starts against an " + "older store version. " + "Setting this to `true` does not guarantee successful upgrade, it just " + "allows an upgrade to be performed." ) public static final Setting allow_store_upgrade = setting( "dbms.allow_format_migration", BOOLEAN, - FALSE ).build(); + FALSE ); @Description( "Database record format. Enterprise edition only. Valid values: `standard`, `high_limit`. " + "Default value: `standard`." ) - public static final Setting record_format = setting( "dbms.record_format", Settings.STRING, "" ).build(); + public static final Setting record_format = setting( "dbms.record_format", Settings.STRING, "" ); // Cypher settings // TODO: These should live with cypher @Description( "Set this to specify the default parser (language version)." ) public static final Setting cypher_parser_version = setting( "cypher.default_language_version", - options( "2.3", "3.1", "3.2", "3.3", DEFAULT ), DEFAULT ).build(); + options( "2.3", "3.1", "3.2", "3.3", DEFAULT ), DEFAULT ); @Description( "Set this to specify the default planner for the default language version." ) public static final Setting cypher_planner = setting( "cypher.planner", - options( "COST", "RULE", DEFAULT ), DEFAULT ).build(); + options( "COST", "RULE", DEFAULT ), DEFAULT ); @Description( "Set this to specify the behavior when Cypher planner or runtime hints cannot be fulfilled. " + "If true, then non-conformance will result in an error, otherwise only a warning is generated." ) - public static final Setting cypher_hints_error = setting( "cypher.hints_error", BOOLEAN, FALSE ).build(); + public static final Setting cypher_hints_error = setting( "cypher.hints_error", BOOLEAN, FALSE ); @Description( "This setting is associated with performance optimization. Set this to `true` in situations where " + "it is preferable to have any queries using the 'shortestPath' function terminate as soon as " + @@ -163,7 +164,7 @@ public class GraphDatabaseSettings implements LoadableConfig "However, please note that if no paths are found, an error will be thrown at run time, which will " + "need to be handled by the application." ) public static final Setting forbid_exhaustive_shortestpath = setting( - "cypher.forbid_exhaustive_shortestpath", BOOLEAN, FALSE ).build(); + "cypher.forbid_exhaustive_shortestpath", BOOLEAN, FALSE ); @Description( "This setting is associated with performance optimization. The shortest path algorithm does not " + "work when the start and end nodes are the same. With this setting set to `false` no path will " + @@ -175,54 +176,55 @@ public class GraphDatabaseSettings implements LoadableConfig "between two common nodes, then re-write the query using a standard Cypher variable length pattern " + "expression followed by ordering by path length and limiting to one result." ) public static final Setting forbid_shortestpath_common_nodes = setting( - "cypher.forbid_shortestpath_common_nodes", BOOLEAN, TRUE ).build(); + "cypher.forbid_shortestpath_common_nodes", BOOLEAN, TRUE ); @Description( "Set this to specify the default runtime for the default language version." ) @Internal public static final Setting cypher_runtime = setting( "unsupported.cypher.runtime", - options( "INTERPRETED", "COMPILED", "ENTERPRISE-INTERPRETED" , DEFAULT ), DEFAULT ).build(); + options( "INTERPRETED", "COMPILED", "ENTERPRISE-INTERPRETED" , DEFAULT ), DEFAULT ); @Description( "Enable tracing of compilation in cypher." ) @Internal - public static final Setting cypher_compiler_tracing = setting( "unsupported.cypher.compiler_tracing", BOOLEAN, FALSE ).build(); + public static final Setting cypher_compiler_tracing = setting( "unsupported.cypher.compiler_tracing", BOOLEAN, FALSE ); @Description( "The number of Cypher query execution plans that are cached." ) - public static Setting query_cache_size = setting( "dbms.query_cache_size", INTEGER, "1000" ).constraint( min( 0 ) ).build(); + public static Setting query_cache_size = + buildSetting( "dbms.query_cache_size", INTEGER, "1000" ).constraint( min( 0 ) ).build(); @Description( "The threshold when a plan is considered stale. If any of the underlying" + " statistics used to create the plan has changed more than this value, " + "the plan is considered stale and will be replanned. " + "A value of 0 means always replan, and 1 means never replan." ) - public static Setting query_statistics_divergence_threshold = setting( + public static Setting query_statistics_divergence_threshold = buildSetting( "cypher.statistics_divergence_threshold", DOUBLE, "0.75" ).constraint( range( 0.0, 1.0 ) ).build(); @Description( "The threshold when a warning is generated if a label scan is done after a load csv " + "where the label has no index" ) @Internal public static Setting query_non_indexed_label_warning_threshold = setting( - "unsupported.cypher.non_indexed_label_warning_threshold", LONG, "10000" ).build(); + "unsupported.cypher.non_indexed_label_warning_threshold", LONG, "10000" ); @Description( "To improve IDP query planning time, we can restrict the internal planning table size, " + "triggering compaction of candidate plans. The smaller the threshold the faster the planning, " + "but the higher the risk of sub-optimal plans." ) @Internal - public static Setting cypher_idp_solver_table_threshold = setting( + public static Setting cypher_idp_solver_table_threshold = buildSetting( "unsupported.cypher.idp_solver_table_threshold", INTEGER, "128" ).constraint( min( 16 ) ).build(); @Description( "To improve IDP query planning time, we can restrict the internal planning loop duration, " + "triggering more frequent compaction of candidate plans. The smaller the threshold the " + "faster the planning, but the higher the risk of sub-optimal plans." ) @Internal - public static Setting cypher_idp_solver_duration_threshold = setting( + public static Setting cypher_idp_solver_duration_threshold = buildSetting( "unsupported.cypher.idp_solver_duration_threshold", LONG, "1000" ).constraint( min( 10L ) ).build(); @Description( "The minimum lifetime of a query plan before a query is considered for replanning" ) - public static Setting cypher_min_replan_interval = setting( "cypher.min_replan_interval", DURATION, "10s" ).build(); + public static Setting cypher_min_replan_interval = setting( "cypher.min_replan_interval", DURATION, "10s" ); @Description( "Determines if Cypher will allow using file URLs when loading data using `LOAD CSV`. Setting this " + "value to `false` will cause Neo4j to fail `LOAD CSV` clauses that load data from the file system." ) - public static Setting allow_file_urls = setting( "dbms.security.allow_csv_import_from_file_urls", BOOLEAN, TRUE ).build(); + public static Setting allow_file_urls = setting( "dbms.security.allow_csv_import_from_file_urls", BOOLEAN, TRUE ); @Description( "Sets the root directory for file URLs used with the Cypher `LOAD CSV` clause. This must be set to a single " + "directory, restricting access to only those files within that directory and its subdirectories." ) @@ -235,38 +237,39 @@ public class GraphDatabaseSettings implements LoadableConfig "include quotes in-lined in fields." ) public static Setting csv_legacy_quote_escaping = setting( "dbms.import.csv.legacy_quote_escaping", BOOLEAN, - Boolean.toString( Configuration.DEFAULT_LEGACY_STYLE_QUOTING ) ).build(); + Boolean.toString( Configuration.DEFAULT_LEGACY_STYLE_QUOTING ) ); @Description( "The maximum amount of time to wait for the database to become available, when " + "starting a new transaction." ) @Internal public static final Setting transaction_start_timeout = - setting( "unsupported.dbms.transaction_start_timeout", DURATION, "1s" ).build(); + setting( "unsupported.dbms.transaction_start_timeout", DURATION, "1s" ); @Internal @Description( "Please use dbms.transaction.timeout instead." ) @Deprecated @ReplacedBy( "dbms.transaction.timeout" ) public static final Setting execution_guard_enabled = - setting( "unsupported.dbms.executiontime_limit.enabled", BOOLEAN, FALSE ).build(); + setting( "unsupported.dbms.executiontime_limit.enabled", BOOLEAN, FALSE ); @Description( "The maximum time interval of a transaction within which it should be completed." ) @Dynamic public static final Setting transaction_timeout = setting( "dbms.transaction.timeout", DURATION, String - .valueOf( UNSPECIFIED_TIMEOUT ) ).build(); + .valueOf( UNSPECIFIED_TIMEOUT ) ); @Description( "The maximum time interval within which lock should be acquired." ) public static final Setting lock_acquisition_timeout = setting( "dbms.lock.acquisition.timeout", DURATION, - String.valueOf( UNSPECIFIED_TIMEOUT ) ).build(); + String.valueOf( UNSPECIFIED_TIMEOUT ) ); @Description( "Configures the time interval between transaction monitor checks. Determines how often " + "monitor thread will check transaction for timeout." ) - public static final Setting transaction_monitor_check_interval = setting( "dbms.transaction.monitor.check.interval", DURATION, "5s" ); + public static final Setting transaction_monitor_check_interval = + setting( "dbms.transaction.monitor.check.interval", DURATION, "5s" ); @Description( "The maximum amount of time to wait for running transactions to complete before allowing " + "initiated database shutdown to continue" ) public static final Setting shutdown_transaction_end_timeout = - setting( "dbms.shutdown_transaction_end_timeout", DURATION, "10s" ).build(); + setting( "dbms.shutdown_transaction_end_timeout", DURATION, "10s" ); @Description( "Location of the database plugin directory. Compiled Java JAR files that contain database " + "procedures will be loaded if they are placed in this directory." ) @@ -274,29 +277,29 @@ public class GraphDatabaseSettings implements LoadableConfig @Description( "Threshold for rotation of the debug log." ) public static final Setting store_internal_log_rotation_threshold = - setting( "dbms.logs.debug.rotation.size", BYTES, "20m" ).constraint( range( 0L, Long.MAX_VALUE ) ).build(); + buildSetting( "dbms.logs.debug.rotation.size", BYTES, "20m" ).constraint( range( 0L, Long.MAX_VALUE ) ).build(); @Description( "Debug log contexts that should output debug level logging" ) @Internal public static final Setting> store_internal_debug_contexts = setting( "unsupported.dbms.logs.debug.debug_loggers", - list( ",", STRING ), "org.neo4j.diagnostics,org.neo4j.cluster.protocol,org.neo4j.kernel.ha" ).build(); + list( ",", STRING ), "org.neo4j.diagnostics,org.neo4j.cluster.protocol,org.neo4j.kernel.ha" ); @Description( "Debug log level threshold." ) public static final Setting store_internal_log_level = setting( "dbms.logs.debug.level", - options( Level.class ), "INFO" ).build(); + options( Level.class ), "INFO" ); @Description( "Maximum time to wait for active transaction completion when rotating counts store" ) @Internal public static final Setting counts_store_rotation_timeout = - setting( "unsupported.dbms.counts_store_rotation_timeout", DURATION, "10m" ).build(); + setting( "unsupported.dbms.counts_store_rotation_timeout", DURATION, "10m" ); @Description( "Minimum time interval after last rotation of the debug log before it may be rotated again." ) public static final Setting store_internal_log_rotation_delay = - setting( "dbms.logs.debug.rotation.delay", DURATION, "300s" ).build(); + setting( "dbms.logs.debug.rotation.delay", DURATION, "300s" ); @Description( "Maximum number of history files for the debug log." ) public static final Setting store_internal_log_max_archives = - setting( "dbms.logs.debug.rotation.keep_number", INTEGER, "7" ).constraint( min( 1 ) ).build(); + buildSetting( "dbms.logs.debug.rotation.keep_number", INTEGER, "7" ).constraint( min( 1 ) ).build(); @Description( "Configures the transaction interval between check-points. The database will not check-point more " + "often than this (unless check pointing is triggered by a different event), but might check-point " + @@ -307,7 +310,7 @@ public class GraphDatabaseSettings implements LoadableConfig "the database places on the system, as each check-point implies a flushing and forcing of all the " + "store files. The default is '100000' for a check-point every 100000 transactions." ) public static final Setting check_point_interval_tx = - setting( "dbms.checkpoint.interval.tx", INTEGER, "100000" ).constraint( min( 1 ) ).build(); + buildSetting( "dbms.checkpoint.interval.tx", INTEGER, "100000" ).constraint( min( 1 ) ).build(); @Description( "Configures the time interval between check-points. The database will not check-point more often " + "than this (unless check pointing is triggered by a different event), but might check-point less " + @@ -318,7 +321,7 @@ public class GraphDatabaseSettings implements LoadableConfig "the database places on the system, as each check-point implies a flushing and forcing of all the " + "store files." ) public static final Setting check_point_interval_time = - setting( "dbms.checkpoint.interval.time", DURATION, "15m" ).build(); + setting( "dbms.checkpoint.interval.time", DURATION, "15m" ); @Description( "Limit the number of IOs the background checkpoint process will consume per second. " + "This setting is advisory, is ignored in Neo4j Community Edition, and is followed to " + @@ -332,7 +335,7 @@ public class GraphDatabaseSettings implements LoadableConfig "The configuration can also be commented out to remove the limitation entirely, and " + "let the checkpointer flush data as fast as the hardware will go. " + "Set this to -1 to disable the IOPS limit." ) - public static final Setting check_point_iops_limit = setting( "dbms.checkpoint.iops.limit", INTEGER, "300" ).build(); + public static final Setting check_point_iops_limit = setting( "dbms.checkpoint.iops.limit", INTEGER, "300" ); // Auto Indexing @Description( "Controls the auto indexing feature for nodes. Setting it to `false` shuts it down, " + @@ -340,14 +343,14 @@ public class GraphDatabaseSettings implements LoadableConfig @Internal @Deprecated public static final Setting node_auto_indexing = setting( "dbms.auto_index.nodes.enabled", BOOLEAN, - FALSE ).build(); + FALSE ); @Description( "A list of property names (comma separated) that will be indexed by default. This applies to " + "_nodes_ only." ) @Internal @Deprecated public static final Setting> node_keys_indexable = setting( "dbms.auto_index.nodes.keys", - STRING_LIST, "" ).build(); + STRING_LIST, "" ); @Description( "Controls the auto indexing feature for relationships. Setting it to `false` shuts it down, " + "while `true` enables it by default for properties listed in the dbms.auto_index.relationships.keys " + @@ -355,54 +358,54 @@ public class GraphDatabaseSettings implements LoadableConfig @Internal @Deprecated public static final Setting relationship_auto_indexing = - setting( "dbms.auto_index.relationships.enabled", BOOLEAN, FALSE ).build(); + setting( "dbms.auto_index.relationships.enabled", BOOLEAN, FALSE ); @Description( "A list of property names (comma separated) that will be indexed by default. This applies to " + "_relationships_ only." ) @Internal @Deprecated public static final Setting> relationship_keys_indexable = - setting( "dbms.auto_index.relationships.keys", STRING_LIST, "" ).build(); + setting( "dbms.auto_index.relationships.keys", STRING_LIST, "" ); // Index sampling @Description( "Enable or disable background index sampling" ) public static final Setting index_background_sampling_enabled = - setting( "dbms.index_sampling.background_enabled", BOOLEAN, TRUE ).build(); + setting( "dbms.index_sampling.background_enabled", BOOLEAN, TRUE ); @Description( "Size of buffer used by index sampling. " + "This configuration setting is no longer applicable as from Neo4j 3.0.3. " + "Please use dbms.index_sampling.sample_size_limit instead." ) @Deprecated @ReplacedBy( "dbms.index_sampling.sample_size_limit" ) - public static final Setting index_sampling_buffer_size = setting( "dbms.index_sampling.buffer_size", + public static final Setting index_sampling_buffer_size = buildSetting( "dbms.index_sampling.buffer_size", BYTES, "64m" ).constraint( range( /* 1m */ 1048576L, (long) Integer.MAX_VALUE ) ).build(); @Description( "Index sampling chunk size limit" ) - public static final Setting index_sample_size_limit = setting( "dbms.index_sampling.sample_size_limit", + public static final Setting index_sample_size_limit = buildSetting( "dbms.index_sampling.sample_size_limit", INTEGER, String.valueOf( ByteUnit.mebiBytes( 8 ) ) ).constraint( range( (int) ByteUnit.mebiBytes( 1 ), Integer.MAX_VALUE ) ).build(); @Description( "Percentage of index updates of total index size required before sampling of a given index is " + "triggered" ) public static final Setting index_sampling_update_percentage = - setting( "dbms.index_sampling.update_percentage", INTEGER, "5" ).constraint( min( 0 ) ).build(); + buildSetting( "dbms.index_sampling.update_percentage", INTEGER, "5" ).constraint( min( 0 ) ).build(); // Lucene settings @Description( "The maximum number of open Lucene index searchers." ) - public static Setting lucene_searcher_cache_size = setting( "dbms.index_searcher_cache_size",INTEGER, + public static Setting lucene_searcher_cache_size = buildSetting( "dbms.index_searcher_cache_size",INTEGER, Integer.toString( Integer.MAX_VALUE ) ).constraint( min( 1 ) ).build(); // Lucene schema indexes @Internal public static final Setting multi_threaded_schema_index_population_enabled = - setting( "unsupported.dbms.multi_threaded_schema_index_population_enabled", BOOLEAN, TRUE ).build(); + setting( "unsupported.dbms.multi_threaded_schema_index_population_enabled", BOOLEAN, TRUE ); // Store settings @Description( "Make Neo4j keep the logical transaction logs for being able to backup the database. " + "Can be used for specifying the threshold to prune logical logs after. For example \"10 days\" will " + "prune logical logs that only contains transactions older than 10 days from the current time, " + "or \"100k txs\" will keep the 100k latest transactions and prune any older transactions." ) - public static final Setting keep_logical_logs = setting( "dbms.tx_log.rotation.retention_policy", + public static final Setting keep_logical_logs = buildSetting( "dbms.tx_log.rotation.retention_policy", STRING, "7 days" ).constraint( illegalValueMessage( "must be `true`/`false` or " + "of format ' ' for example `100M size` for " + "limiting logical log space on disk to 100Mb," + @@ -411,13 +414,13 @@ public class GraphDatabaseSettings implements LoadableConfig @Description( "Specifies at which file size the logical log will auto-rotate. " + "`0` means that no rotation will automatically occur based on file size. " ) public static final Setting logical_log_rotation_threshold = - setting( "dbms.tx_log.rotation.size", BYTES, "250M" ).constraint( min( ByteUnit.mebiBytes( 1 ) ) ).build(); + buildSetting( "dbms.tx_log.rotation.size", BYTES, "250M" ).constraint( min( ByteUnit.mebiBytes( 1 ) ) ).build(); @Description( "Use a quick approach for rebuilding the ID generators. This give quicker recovery time, " + "but will limit the ability to reuse the space of deleted entities." ) @Internal public static final Setting rebuild_idgenerators_fast = - setting( "unsupported.dbms.id_generator_fast_rebuild_enabled", BOOLEAN, TRUE ).build(); + setting( "unsupported.dbms.id_generator_fast_rebuild_enabled", BOOLEAN, TRUE ); // Store memory settings @Description( "Target size for pages of mapped memory. If set to 0, then a reasonable default is chosen, " + @@ -425,7 +428,7 @@ public class GraphDatabaseSettings implements LoadableConfig @Internal @Deprecated public static final Setting mapped_memory_page_size = - setting( "unsupported.dbms.memory.pagecache.pagesize", BYTES, "0" ).build(); + setting( "unsupported.dbms.memory.pagecache.pagesize", BYTES, "0" ); @SuppressWarnings( "unchecked" ) @Description( "The amount of memory to use for mapping the store files, in bytes (or kilobytes with the 'k' " + @@ -435,13 +438,13 @@ public class GraphDatabaseSettings implements LoadableConfig "the page cache. If no page cache memory is configured, then a heuristic setting is computed based " + "on available system resources." ) public static final Setting pagecache_memory = - setting( "dbms.memory.pagecache.size", BYTES, null) + buildSetting( "dbms.memory.pagecache.size", BYTES, null) .constraint( min( 8192 * 30L ) ).build(); @Description( "Specify which page swapper to use for doing paged IO. " + "This is only used when integrating with proprietary storage technology." ) public static final Setting pagecache_swapper = - setting( "dbms.memory.pagecache.swapper", STRING, null ).build(); + setting( "dbms.memory.pagecache.swapper", STRING, null ); /** * Block size properties values depends from selected record format. @@ -456,7 +459,7 @@ public class GraphDatabaseSettings implements LoadableConfig "Also note that each block carries a ~10B of overhead so record size on disk will be slightly larger " + "than the configured block size" ) @Internal - public static final Setting string_block_size = setting( "unsupported.dbms.block_size.strings", INTEGER, + public static final Setting string_block_size = buildSetting( "unsupported.dbms.block_size.strings", INTEGER, "0" ).constraint( min( 0 ) ).build(); @Description( "Specifies the block size for storing arrays. This parameter is only honored when the store is " + @@ -464,7 +467,7 @@ public class GraphDatabaseSettings implements LoadableConfig "Also note that each block carries a ~10B of overhead so record size on disk will be slightly larger " + "than the configured block size" ) @Internal - public static final Setting array_block_size = setting( "unsupported.dbms.block_size.array_properties", + public static final Setting array_block_size = buildSetting( "unsupported.dbms.block_size.array_properties", INTEGER, "0" ).constraint( min( 0 ) ).build(); @Description( "Specifies the block size for storing labels exceeding in-lined space in node record. " + @@ -472,13 +475,13 @@ public class GraphDatabaseSettings implements LoadableConfig "Also note that each block carries a ~10B of overhead so record size on disk will be slightly larger " + "than the configured block size" ) @Internal - public static final Setting label_block_size = setting( "unsupported.dbms.block_size.labels", INTEGER, + public static final Setting label_block_size = buildSetting( "unsupported.dbms.block_size.labels", INTEGER, "0" ).constraint( min( 0 ) ).build(); @Description( "An identifier that uniquely identifies this graph database instance within this JVM. " + "Defaults to an auto-generated number depending on how many instance are started in this JVM." ) @Internal - public static final Setting forced_kernel_id = setting( "unsupported.dbms.kernel_id", STRING, NO_DEFAULT ).constraint( + public static final Setting forced_kernel_id = buildSetting( "unsupported.dbms.kernel_id", STRING, NO_DEFAULT ).constraint( illegalValueMessage( "has to be a valid kernel identifier", matches( "[a-zA-Z0-9]*" ) ) ).build(); @SuppressWarnings( "unused" ) @@ -494,7 +497,7 @@ public class GraphDatabaseSettings implements LoadableConfig @Description( "Relationship count threshold for considering a node to be dense" ) public static final Setting dense_node_threshold = - setting( "dbms.relationship_grouping_threshold", INTEGER, "50" ).constraint( min( 1 ) ).build(); + buildSetting( "dbms.relationship_grouping_threshold", INTEGER, "50" ).constraint( min( 1 ) ).build(); @Description( "Log executed queries that take longer than the configured threshold, dbms.logs.query.threshold. " + "Log entries are by default written to the file _query.log_ located in the Logs directory. " + @@ -502,7 +505,7 @@ public class GraphDatabaseSettings implements LoadableConfig "This feature is available in the Neo4j Enterprise Edition." ) @Dynamic public static final Setting log_queries = - setting( "dbms.logs.query.enabled", BOOLEAN, FALSE ).build(); + setting( "dbms.logs.query.enabled", BOOLEAN, FALSE ); @Description( "Path of the logs directory." ) public static final Setting logs_directory = pathSetting( "dbms.directories.logs", "logs" ); @@ -521,40 +524,40 @@ public class GraphDatabaseSettings implements LoadableConfig @Description( "Log parameters for the executed queries being logged." ) public static final Setting log_queries_parameter_logging_enabled = - setting( "dbms.logs.query.parameter_logging_enabled", BOOLEAN, TRUE ).build(); + setting( "dbms.logs.query.parameter_logging_enabled", BOOLEAN, TRUE ); @Description( "Log detailed time information for the executed queries being logged." ) public static final Setting log_queries_detailed_time_logging_enabled = - setting( "dbms.logs.query.time_logging_enabled", BOOLEAN, FALSE ).build(); + setting( "dbms.logs.query.time_logging_enabled", BOOLEAN, FALSE ); @Description( "Log allocated bytes for the executed queries being logged." ) public static final Setting log_queries_allocation_logging_enabled = - setting( "dbms.logs.query.allocation_logging_enabled", BOOLEAN, FALSE ).build(); + setting( "dbms.logs.query.allocation_logging_enabled", BOOLEAN, FALSE ); @Description( "Log page hits and page faults for the executed queries being logged." ) public static final Setting log_queries_page_detail_logging_enabled = - setting( "dbms.logs.query.page_logging_enabled", BOOLEAN, FALSE ).build(); + setting( "dbms.logs.query.page_logging_enabled", BOOLEAN, FALSE ); @Description( "If the execution of query takes more time than this threshold, the query is logged - " + "provided query logging is enabled. Defaults to 0 seconds, that is all queries are logged." ) @Dynamic public static final Setting log_queries_threshold = - setting( "dbms.logs.query.threshold", DURATION, "0s" ).build(); + setting( "dbms.logs.query.threshold", DURATION, "0s" ); @Description( "The file size in bytes at which the query log will auto-rotate. If set to zero then no rotation " + "will occur. Accepts a binary suffix `k`, `m` or `g`." ) - public static final Setting log_queries_rotation_threshold = setting( "dbms.logs.query.rotation.size", + public static final Setting log_queries_rotation_threshold = buildSetting( "dbms.logs.query.rotation.size", BYTES, "20m" ).constraint( range( 0L, Long.MAX_VALUE ) ).build(); @Description( "Maximum number of history files for the query log." ) - public static final Setting log_queries_max_archives = setting( "dbms.logs.query.rotation.keep_number", + public static final Setting log_queries_max_archives = buildSetting( "dbms.logs.query.rotation.keep_number", INTEGER, "7" ).constraint( min( 1 ) ).build(); @Description( "Specifies number of operations that batch inserter will try to group into one batch before " + "flushing data into underlying storage." ) @Internal public static final Setting batch_inserter_batch_size = setting( "unsupported.tools.batch_inserter.batch_size", INTEGER, - "10000" ).build(); + "10000" ); /** * @deprecated - lucene label index has been removed. @@ -586,12 +589,12 @@ public enum LabelIndex @Internal public static final Setting label_index = setting( "dbms.label_index", optionsIgnoreCase( LabelIndex.NATIVE.name(), LabelIndex.AUTO.name() ), - LabelIndex.NATIVE.name() ).build(); + LabelIndex.NATIVE.name() ); // Security settings @Description( "Enable auth requirement to access Neo4j." ) - public static final Setting auth_enabled = setting( "dbms.security.auth_enabled", BOOLEAN, FALSE ).build(); + public static final Setting auth_enabled = setting( "dbms.security.auth_enabled", BOOLEAN, FALSE ); @Internal public static final Setting auth_store = @@ -599,19 +602,19 @@ public enum LabelIndex @Internal public static final Setting auth_max_failed_attempts = - setting( "unsupported.dbms.security.auth_max_failed_attempts", INTEGER, "3" ).constraint( min( 0 ) ).build(); + buildSetting( "unsupported.dbms.security.auth_max_failed_attempts", INTEGER, "3" ).constraint( min( 0 ) ).build(); @Description( "A list of procedures and user defined functions (comma separated) that are allowed full access to " + "the database. The list may contain both fully-qualified procedure names, and partial names with the " + "wildcard '*'. Note that this enables these procedures to bypass security. Use with caution." ) public static final Setting procedure_unrestricted = - setting( "dbms.security.procedures.unrestricted", Settings.STRING, "" ).build(); + setting( "dbms.security.procedures.unrestricted", Settings.STRING, "" ); @Description( "A list of procedures (comma separated) that are to be loaded. " + "The list may contain both fully-qualified procedure names, and partial names with the wildcard '*'. " + "If this setting is left empty no procedures will be loaded." ) public static final Setting procedure_whitelist = - setting( "dbms.security.procedures.whitelist", Settings.STRING, "*" ).build(); + setting( "dbms.security.procedures.whitelist", Settings.STRING, "*" ); // Bolt Settings @Description( "Default network interface to listen for incoming connections. " + @@ -619,18 +622,18 @@ public enum LabelIndex "To bind specific connectors to a specific network interfaces, " + "specify the +listen_address+ properties for the specific connector." ) public static final Setting default_listen_address = - setting( "dbms.connectors.default_listen_address", STRING, "127.0.0.1" ).build(); + setting( "dbms.connectors.default_listen_address", STRING, "127.0.0.1" ); @Description( "Default hostname or IP address the server uses to advertise itself to its connectors. " + "To advertise a specific hostname or IP address for a specific connector, " + "specify the +advertised_address+ property for the specific connector." ) public static final Setting default_advertised_address = - setting( "dbms.connectors.default_advertised_address", STRING, "localhost" ).build(); + setting( "dbms.connectors.default_advertised_address", STRING, "localhost" ); @Description( "Create an archive of an index before re-creating it if failing to load on startup." ) @Internal public static final Setting archive_failed_index = setting( - "unsupported.dbms.index.archive_failed", BOOLEAN, FALSE ).build(); + "unsupported.dbms.index.archive_failed", BOOLEAN, FALSE ); // Needed to validate config, accessed via reflection @SuppressWarnings( "unused" ) @@ -641,7 +644,7 @@ public enum LabelIndex public static final SslPolicyConfigValidator sslPolicyConfigValidator = new SslPolicyConfigValidator(); @Description( "The maximum amount of time to wait for the database state represented by the bookmark." ) - public static final Setting bookmark_ready_timeout = setting( + public static final Setting bookmark_ready_timeout = buildSetting( "dbms.transaction.bookmark_ready_timeout", DURATION, "30s" ).constraint( min( Duration.ofSeconds( 1 ) ) ).build(); // Needed to validate config, accessed via reflection @@ -681,8 +684,8 @@ public static class Connector public Connector( String key, @SuppressWarnings( "UnusedParameters" ) String typeDefault ) { group = new GroupSettingSupport( Connector.class, key ); - enabled = group.scope( setting( "enabled", BOOLEAN, FALSE ).build() ); - type = group.scope( setting( "type", options( ConnectorType.class ), NO_DEFAULT ).build() ); + enabled = group.scope( setting( "enabled", BOOLEAN, FALSE ) ); + type = group.scope( setting( "type", options( ConnectorType.class ), NO_DEFAULT ) ); } public enum ConnectorType @@ -728,7 +731,7 @@ public BoltConnector( String key ) { super( key, null ); encryption_level = group.scope( - setting( "tls_level", options( EncryptionLevel.class ), EncryptionLevel.OPTIONAL.name() ).build() ); + setting( "tls_level", options( EncryptionLevel.class ), EncryptionLevel.OPTIONAL.name() ) ); Setting legacyAddressSetting = listenAddress( "address", 7687 ); Setting listenAddressSetting = legacyFallback( legacyAddressSetting, listenAddress( "listen_address", 7687 ) ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/configuration/BoltConnector.java b/community/kernel/src/main/java/org/neo4j/kernel/configuration/BoltConnector.java index d7fdebf6802e7..6299d435b1131 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/configuration/BoltConnector.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/configuration/BoltConnector.java @@ -61,7 +61,7 @@ public BoltConnector( String key ) { super( key ); encryption_level = group.scope( - Settings.setting( "tls_level", options( EncryptionLevel.class ), OPTIONAL.name() ).build() ); + Settings.setting( "tls_level", options( EncryptionLevel.class ), OPTIONAL.name() ) ); Setting legacyAddressSetting = listenAddress( "address", 7687 ); Setting listenAddressSetting = legacyFallback( legacyAddressSetting, listenAddress( "listen_address", 7687 ) ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/configuration/BoltConnectorValidator.java b/community/kernel/src/main/java/org/neo4j/kernel/configuration/BoltConnectorValidator.java index 7354acefb2398..556a0628ea790 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/configuration/BoltConnectorValidator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/configuration/BoltConnectorValidator.java @@ -57,19 +57,19 @@ protected Optional> getSettingFor( @Nonnull String settingName, switch ( subsetting ) { case "enabled": - setting = (BaseSetting) setting( settingName, BOOLEAN, "false" ).build(); + setting = (BaseSetting) setting( settingName, BOOLEAN, "false" ); setting.setDescription( "Enable this connector." ); break; case "type": setting = - (BaseSetting) setting( settingName, options( Connector.ConnectorType.class ), NO_DEFAULT ).build(); + (BaseSetting) setting( settingName, options( Connector.ConnectorType.class ), NO_DEFAULT ); setting.setDeprecated( true ); setting.setDescription( "Connector type. This setting is deprecated and its value will instead be " + "inferred from the name of the connector." ); break; case "tls_level": setting = (BaseSetting) setting( settingName, options( BoltConnector.EncryptionLevel.class ), - OPTIONAL.name() ).build(); + OPTIONAL.name() ); setting.setDescription( "Encryption level to require this connector to use." ); break; case "address": diff --git a/community/kernel/src/main/java/org/neo4j/kernel/configuration/Config.java b/community/kernel/src/main/java/org/neo4j/kernel/configuration/Config.java index 4e36f6a164a89..8846ad1fe1345 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/configuration/Config.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/configuration/Config.java @@ -24,9 +24,8 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; +import java.util.Comparator; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -77,7 +76,7 @@ public class Config implements DiagnosticsProvider, Configuration private final List configOptions; - private final Map params = new CopyOnWriteHashMap<>(); + private final Map params = new CopyOnWriteHashMap<>(); // Read heavy workload private final ConfigurationMigrator migrator; private final List validators = new ArrayList<>(); private final Map overriddenDefaults = new CopyOnWriteHashMap<>(); // TODO : has bo be reapplied every update @@ -355,17 +354,6 @@ public static Config defaults( @Nonnull final Map initialSettings return builder().withSettings( initialSettings ).build(); } - /** - * Constructs a Config with default values and sets the supplied setting to the value. - * @param setting The initial setting to use. - * @param value The initial value to give the setting. - */ - @Nonnull - public static Config defaults( @Nonnull final String setting, @Nonnull final String value ) - { - return builder().withSetting( setting, value ).build(); - } - /** * Constructs a Config with default values and sets the supplied setting to the value. * @param setting The initial setting to use. @@ -436,14 +424,31 @@ public boolean isConfigured( Setting setting ) } /** - * Extract all identifiers within a group, e.g. giving that prefix is {@code "dbms.ssl.policy"}), the - * setting {@code "dbms.ssl.policy.default.base_directory"} will return {@code "default"}. + * Returns the currently configured identifiers for grouped settings. + * + * Identifiers for groups exists to allow multiple configured settings of the same setting type. + * E.g. giving that prefix of a group is {@code dbms.ssl.policy} and the following settings are configured: + *
    + *
  • {@code dbms.ssl.policy.default.base_directory} + *
  • {@code dbms.ssl.policy.other.base_directory} + *
+ * a call to this will method return {@code ["default", "other"]}. + *

+ * The key difference to these identifiers are that they are only known at runtime after a valid configuration is + * parsed and validated. * - * @param prefix group prefix for the settings interested in - * @return A set of uniquely and sorted group keys. + * @param groupClass A class that represents a setting group. Must be annotated with {@link Group} + * @return A set of configured identifiers for the given group. + * @throws IllegalArgumentException if the provided class is not annotated with {@link Group}. */ - public Set identifiersFromPrefix( String prefix ) + public Set identifiersFromGroup( Class groupClass ) { + if ( !groupClass.isAnnotationPresent( Group.class ) ) + { + throw new IllegalArgumentException( "Class must be annotated with @Group" ); + } + + String prefix = groupClass.getAnnotation( Group.class ).value(); Pattern pattern = Pattern.compile( Pattern.quote( prefix ) + "\\.([^.]+)\\.(.+)" ); Set identifiers = new TreeSet<>(); @@ -503,30 +508,14 @@ public void augment( Config config ) throws InvalidSettingException /** * Augment the existing config with new settings, ignoring any conflicting settings. * - * @param additionalDefaults settings to add and override + * @param setting settings to add and override * @throws InvalidSettingException when and invalid setting is found and {@link * GraphDatabaseSettings#strict_config_validation} is true. */ - public void augmentDefaults( Map additionalDefaults ) throws InvalidSettingException - { - additionalDefaults.forEach( this::augmentDefaults ); - } - - /** - * @see Config#augmentDefaults(Map) - */ - public void augmentDefaults( String setting, String value ) throws InvalidSettingException - { - overriddenDefaults.put( setting, value ); - params.putIfAbsent( setting, value ); - } - - /** - * @see Config#augmentDefaults(Map) - */ public void augmentDefaults( Setting setting, String value ) throws InvalidSettingException { - augmentDefaults( setting.name(), value ); + overriddenDefaults.put( setting.name(), value ); + params.putIfAbsent( setting.name(), value ); } /** @@ -698,7 +687,7 @@ public Set allConnectorIdentifiers() @Nonnull public Set allConnectorIdentifiers( @Nonnull Map params ) { - return identifiersFromPrefix("dbms.connector"); + return identifiersFromGroup( Connector.class ); } /** @@ -803,15 +792,9 @@ private List enabledHttpConnectors( @Nonnull Map p @Override public String toString() { - List keys = new ArrayList<>( params.keySet() ); - Collections.sort( keys ); - LinkedHashMap output = new LinkedHashMap<>(); - for ( String key : keys ) - { - output.put( key, params.get( key ) ); - } - - return output.toString(); + return params.entrySet().stream() + .sorted( Comparator.comparing( Map.Entry::getKey ) ) + .map( entry -> entry.getKey() + "=" + entry.getValue() ) + .collect( Collectors.joining( ", ") ); } - } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/configuration/Connector.java b/community/kernel/src/main/java/org/neo4j/kernel/configuration/Connector.java index 938a867679308..b94bf2ff972c3 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/configuration/Connector.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/configuration/Connector.java @@ -57,8 +57,8 @@ public Connector( String key, @SuppressWarnings( "UnusedParameters" ) String typ public Connector( String key ) { group = new GroupSettingSupport( Connector.class, key ); - enabled = group.scope( setting( "enabled", BOOLEAN, "false" ).build() ); - type = group.scope( setting( "type", options( ConnectorType.class ), NO_DEFAULT ).build() ); + enabled = group.scope( setting( "enabled", BOOLEAN, "false" ) ); + type = group.scope( setting( "type", options( ConnectorType.class ), NO_DEFAULT ) ); } public enum ConnectorType diff --git a/community/kernel/src/main/java/org/neo4j/kernel/configuration/ConnectorValidator.java b/community/kernel/src/main/java/org/neo4j/kernel/configuration/ConnectorValidator.java index bdaf022974131..10d7c2750a45f 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/configuration/ConnectorValidator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/configuration/ConnectorValidator.java @@ -47,7 +47,7 @@ public abstract class ConnectorValidator implements SettingGroup static final String DEPRECATED_CONNECTOR_MSG = "Warning: connectors with names other than [http,https,bolt] are%n" + "deprecated and support for them will be removed in a future%n" + - "version of Neo4j. Offending lines in neo4j.conf:%n%n%s"; + "version of Neo4j. Offending lines in " + Config.DEFAULT_CONFIG_FILE_NAME + ":%n%n%s"; protected final Connector.ConnectorType type; public ConnectorValidator( @Nonnull Connector.ConnectorType type ) @@ -108,8 +108,7 @@ else if ( groupKey.equalsIgnoreCase( "bolt" ) ) // If this is a connector not called bolt or http, then we require the type if ( typeValue == null ) { - throw new InvalidSettingException( format( "Missing mandatory value for '%s'", - typeKey ) ); + throw new InvalidSettingException( format( "Missing mandatory value for '%s'", typeKey ) ); } if ( !validTypes.contains( typeValue ) ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/configuration/HttpConnector.java b/community/kernel/src/main/java/org/neo4j/kernel/configuration/HttpConnector.java index b613e01ff20bb..40a7746aa518d 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/configuration/HttpConnector.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/configuration/HttpConnector.java @@ -73,7 +73,7 @@ public HttpConnector( String key, Encryption encryptionLevel ) { super( key ); this.encryptionLevel = encryptionLevel; - encryption = group.scope( setting( "encryption", options( HttpConnector.Encryption.class ), NO_DEFAULT ).build() ); + encryption = group.scope( setting( "encryption", options( HttpConnector.Encryption.class ), NO_DEFAULT ) ); Setting legacyAddressSetting = listenAddress( "address", encryptionLevel.defaultPort ); Setting listenAddressSetting = legacyFallback( legacyAddressSetting, listenAddress( "listen_address", encryptionLevel.defaultPort ) ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/configuration/HttpConnectorValidator.java b/community/kernel/src/main/java/org/neo4j/kernel/configuration/HttpConnectorValidator.java index ba3c6005e8e50..39772ba73f20a 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/configuration/HttpConnectorValidator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/configuration/HttpConnectorValidator.java @@ -71,12 +71,12 @@ protected Optional> getSettingFor( @Nonnull String settingName, switch ( subsetting ) { case "enabled": - setting = (BaseSetting) setting( settingName, BOOLEAN, "false" ).build(); + setting = (BaseSetting) setting( settingName, BOOLEAN, "false" ); setting.setDescription( "Enable this connector." ); break; case "type": setting = - (BaseSetting) setting( settingName, options( Connector.ConnectorType.class ), NO_DEFAULT ).build(); + (BaseSetting) setting( settingName, options( Connector.ConnectorType.class ), NO_DEFAULT ); setting.setDeprecated( true ); setting.setDescription( "Connector type. This setting is deprecated and its value will instead be " + "inferred from the name of the connector." ); @@ -177,7 +177,7 @@ public static BaseSetting encryptionSetting( @Nonnull defaultValue ) { Setting s = setting( "dbms.connector." + name + ".encryption", - options( Encryption.class ), defaultValue.name() ).build(); + options( Encryption.class ), defaultValue.name() ); return new BaseSetting() { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/configuration/ServerConfigurationValidator.java b/community/kernel/src/main/java/org/neo4j/kernel/configuration/ServerConfigurationValidator.java index 8e81791d6418c..defb734fa32dd 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/configuration/ServerConfigurationValidator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/configuration/ServerConfigurationValidator.java @@ -42,7 +42,7 @@ public Map validate( @Nonnull Config config, @Nonnull Log log ) t // Add missing type info -- validation has succeeded so we can do this with confidence boolean hasEnabledConnector = false; - for ( String identifier : config.identifiersFromPrefix( "dbms.connector" ) ) + for ( String identifier : config.identifiersFromGroup( Connector.class ) ) { Connector connector = new Connector( identifier ); if ( "http".equalsIgnoreCase( connector.group.groupKey ) || "https".equalsIgnoreCase( connector.group.groupKey ) ) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/configuration/Settings.java b/community/kernel/src/main/java/org/neo4j/kernel/configuration/Settings.java index d826ba44c1935..643d7bdbac75a 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/configuration/Settings.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/configuration/Settings.java @@ -181,6 +181,21 @@ public Setting build() } } + /** + * Constructs a {@link Setting} with a specified default value. + * + * @param name of the setting, e.g. "dbms.transaction.timeout". + * @param parser that will convert the string representation to the concrete type T. + * @param defaultValue the string representation of the default value. + * @param the concrete type of the setting. + */ + @Nonnull + public static Setting setting( @Nonnull final String name, @Nonnull final Function parser, + @Nullable final String defaultValue ) + { + return new SettingBuilder<>( name, parser, defaultValue ).build(); + } + /** * Start building a setting with default value set to {@link Settings#NO_DEFAULT}. * @@ -189,20 +204,21 @@ public Setting build() * @param the concrete type of the setting. */ @Nonnull - public static SettingBuilder setting( @Nonnull final String name, @Nonnull final Function parser ) + public static SettingBuilder buildSetting( @Nonnull final String name, @Nonnull final Function parser ) { - return setting( name, parser, NO_DEFAULT ); + return buildSetting( name, parser, NO_DEFAULT ); } /** - * Start building a setting. + * Start building a setting with a specified default value. * * @param name of the setting, e.g. "dbms.transaction.timeout". * @param parser that will convert the string representation to the concrete type T. * @param defaultValue the string representation of the default value. * @param the concrete type of the setting. */ - public static SettingBuilder setting( @Nonnull final String name, @Nonnull final Function parser, + @Nonnull + public static SettingBuilder buildSetting( @Nonnull final String name, @Nonnull final Function parser, @Nullable final String defaultValue ) { return new SettingBuilder<>( name, parser, defaultValue ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/configuration/ssl/SslPolicyConfig.java b/community/kernel/src/main/java/org/neo4j/kernel/configuration/ssl/SslPolicyConfig.java index b945a8575b6eb..b945a5d5b8558 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/configuration/ssl/SslPolicyConfig.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/configuration/ssl/SslPolicyConfig.java @@ -88,18 +88,18 @@ public SslPolicyConfig( String policyName ) GroupSettingSupport group = new GroupSettingSupport( SslPolicyConfig.class, policyName ); this.base_directory = group.scope( pathSetting( "base_directory", NO_DEFAULT ) ); - this.allow_key_generation = group.scope( setting( "allow_key_generation", BOOLEAN, FALSE ).build() ); - this.trust_all = group.scope( setting( "trust_all", BOOLEAN, FALSE ).build() ); + this.allow_key_generation = group.scope( setting( "allow_key_generation", BOOLEAN, FALSE ) ); + this.trust_all = group.scope( setting( "trust_all", BOOLEAN, FALSE ) ); this.private_key = group.scope( derivedDefault( "private_key", base_directory, "private.key" ) ); this.public_certificate = group.scope( derivedDefault( "public_certificate", base_directory, "public.crt" ) ); this.trusted_dir = group.scope( derivedDefault( "trusted_dir", base_directory, "trusted" ) ); this.revoked_dir = group.scope( derivedDefault( "revoked_dir", base_directory, "revoked" ) ); - this.private_key_password = group.scope( setting( "private_key_password", STRING, NO_DEFAULT ).build() ); - this.client_auth = group.scope( setting( "client_auth", options( ClientAuth.class, true ), ClientAuth.REQUIRE.name() ).build() ); - this.tls_versions = group.scope( setting( "tls_versions", STRING_LIST, TLS_VERSION_DEFAULTS ).build() ); - this.ciphers = group.scope( setting( "ciphers", STRING_LIST, NO_DEFAULT ).build() ); + this.private_key_password = group.scope( setting( "private_key_password", STRING, NO_DEFAULT ) ); + this.client_auth = group.scope( setting( "client_auth", options( ClientAuth.class, true ), ClientAuth.REQUIRE.name() ) ); + this.tls_versions = group.scope( setting( "tls_versions", STRING_LIST, TLS_VERSION_DEFAULTS ) ); + this.ciphers = group.scope( setting( "ciphers", STRING_LIST, NO_DEFAULT ) ); } // TODO: can we make this handle relative paths? diff --git a/community/kernel/src/main/java/org/neo4j/kernel/configuration/ssl/SslPolicyLoader.java b/community/kernel/src/main/java/org/neo4j/kernel/configuration/ssl/SslPolicyLoader.java index 0851e9e5931c0..0c40850e4a87c 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/configuration/ssl/SslPolicyLoader.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/configuration/ssl/SslPolicyLoader.java @@ -47,7 +47,6 @@ import javax.net.ssl.TrustManagerFactory; import org.neo4j.kernel.configuration.Config; -import org.neo4j.kernel.configuration.Group; import org.neo4j.logging.Log; import org.neo4j.logging.LogProvider; import org.neo4j.ssl.ClientAuth; @@ -161,7 +160,7 @@ private SslPolicy loadOrCreateLegacyPolicy() private void load( Config config, Log log ) { - Set policyNames = config.identifiersFromPrefix( SslPolicyConfig.class.getAnnotation( Group.class ).value() ); + Set policyNames = config.identifiersFromGroup( SslPolicyConfig.class ); for ( String policyName : policyNames ) { diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/cache/MonitorGc.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/cache/MonitorGc.java index 446f1d2675e15..e072e97237280 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/cache/MonitorGc.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/cache/MonitorGc.java @@ -34,9 +34,9 @@ public class MonitorGc implements Lifecycle public static class Configuration { public static final Setting gc_monitor_wait_time = setting( "unsupported.dbms.gc_monitor_wait_time", - DURATION, "100ms" ).build(); + DURATION, "100ms" ); public static final Setting gc_monitor_threshold = setting("unsupported.dbms.gc_monitor_threshold", - DURATION, "200ms" ).build(); + DURATION, "200ms" ); } private final Config config; diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacadeFactory.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacadeFactory.java index 1ddbd42a82b61..89e6e084414bc 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacadeFactory.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/factory/GraphDatabaseFacadeFactory.java @@ -43,6 +43,8 @@ import org.neo4j.logging.LogProvider; import org.neo4j.logging.Logger; +import static org.neo4j.kernel.configuration.Settings.BOOLEAN; +import static org.neo4j.kernel.configuration.Settings.STRING; import static org.neo4j.kernel.configuration.Settings.setting; import static org.neo4j.kernel.impl.query.QueryEngineProvider.noEngine; @@ -86,19 +88,19 @@ public static class Configuration implements LoadableConfig { @Internal public static final Setting ephemeral = - setting( "unsupported.dbms.ephemeral", Settings.BOOLEAN, Settings.FALSE ).build(); + setting( "unsupported.dbms.ephemeral", BOOLEAN, Settings.FALSE ); @Internal public static final Setting lock_manager = - setting( "unsupported.dbms.lock_manager", Settings.STRING, "" ).build(); + setting( "unsupported.dbms.lock_manager", STRING, "" ); @Internal public static final Setting tracer = - setting( "unsupported.dbms.tracer", Settings.STRING ).build(); // 'null' default. + setting( "unsupported.dbms.tracer", STRING, Settings.NO_DEFAULT ); @Internal public static final Setting editionName = - setting( "unsupported.dbms.edition", Settings.STRING, Edition.unknown.toString() ).build(); + setting( "unsupported.dbms.edition", STRING, Edition.unknown.toString() ); } protected final DatabaseInfo databaseInfo; diff --git a/community/kernel/src/test/java/org/neo4j/graphdb/factory/GraphDatabaseSettingsTest.java b/community/kernel/src/test/java/org/neo4j/graphdb/factory/GraphDatabaseSettingsTest.java index 33492329fe257..9aced2a0eaf1f 100644 --- a/community/kernel/src/test/java/org/neo4j/graphdb/factory/GraphDatabaseSettingsTest.java +++ b/community/kernel/src/test/java/org/neo4j/graphdb/factory/GraphDatabaseSettingsTest.java @@ -62,10 +62,9 @@ public void mustHaveNullDefaultPageCacheMemorySizeInBytes() throws Exception public void pageCacheSettingMustAcceptArbitraryUserSpecifiedValue() throws Exception { Setting setting = GraphDatabaseSettings.pagecache_memory; - String name = setting.name(); - assertThat( Config.defaults( name, "245760" ).get( setting ), + assertThat( Config.defaults( setting, "245760" ).get( setting ), is( ByteUnit.kibiBytes( 240 ) ) ); - assertThat( Config.defaults( name, "2244g" ).get( setting ), + assertThat( Config.defaults( setting, "2244g" ).get( setting ), is( ByteUnit.gibiBytes( 2244 ) ) ); } @@ -74,9 +73,8 @@ public void pageCacheSettingMustRejectOverlyConstrainedMemorySetting() throws Ex { long pageSize = Config.defaults().get( GraphDatabaseSettings.mapped_memory_page_size ); Setting setting = GraphDatabaseSettings.pagecache_memory; - String name = setting.name(); // We configure the page cache to have one byte less than two pages worth of memory. This must throw: - Config.defaults( name, "" + ( pageSize * 2 - 1 ) ).get( setting ); + Config.defaults( setting, "" + ( pageSize * 2 - 1 ) ).get( setting ); } @Test @@ -137,7 +135,7 @@ public void shouldEnableBoltByDefault() throws Exception public void shouldBeAbleToDisableBoltConnectorWithJustOneParameter() throws Exception { // given - Config config = Config.defaults( "dbms.connector.bolt.enabled", "false" ); + Config config = Config.defaults( new BoltConnector( "bolt" ).enabled, "false" ); // then assertThat( config.boltConnectors().size(), is( 1 ) ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/configuration/ConfigTest.java b/community/kernel/src/test/java/org/neo4j/kernel/configuration/ConfigTest.java index 9aa412840a60c..1b718bb0e1d6f 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/configuration/ConfigTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/configuration/ConfigTest.java @@ -77,25 +77,25 @@ public void setValueWithOldSetting( String value, Map rawConfigur } }; - public static Setting newer = setting( "newer", STRING, "" ).build(); + public static Setting newer = setting( "newer", STRING, "" ); } public static class MySettingsWithDefaults implements LoadableConfig { - public static final Setting hello = setting( "hello", STRING, "Hello, World!" ).build(); + public static final Setting hello = setting( "hello", STRING, "Hello, World!" ); - public static final Setting boolSetting = setting( "bool_setting", BOOLEAN, Settings.TRUE ).build(); + public static final Setting boolSetting = setting( "bool_setting", BOOLEAN, Settings.TRUE ); @Internal @DocumentedDefaultValue( "" ) - public static final Setting secretSetting = setting( "secret_setting", BOOLEAN, Settings.TRUE ).build(); + public static final Setting secretSetting = setting( "secret_setting", BOOLEAN, Settings.TRUE ); @Deprecated @ReplacedBy( "hello" ) - public static final Setting oldHello = setting( "old_hello", STRING, "Hello, Bob" ).build(); + public static final Setting oldHello = setting( "old_hello", STRING, "Hello, Bob" ); @Deprecated - public static final Setting oldSetting = setting( "some_setting", STRING, "Has no replacement" ).build(); + public static final Setting oldSetting = setting( "some_setting", STRING, "Has no replacement" ); } private static class HelloHasToBeNeo4jConfigurationValidator implements ConfigurationValidator @@ -288,8 +288,13 @@ public void validatorsShouldBeCalledWhenBuilding() throws Exception .withConfigClasses( Arrays.asList( mySettingsWithDefaults, myMigratingSettings ) ).build(); } + @Group( "a.b.c" ) + private static class GroupedSetting + { + } + @Test - public void identifiersFromPrefix() throws Exception + public void identifiersFromGroup() throws Exception { // Given File confFile = testDirectory.file( "test.conf" ); @@ -302,7 +307,7 @@ public void identifiersFromPrefix() throws Exception .withSetting( "a.b.c.third.jibberish", "baah" ) .withSetting( "a.b.c.forth.jibberish", "baah" ).build(); - Set identifiers = config.identifiersFromPrefix( "a.b.c" ); + Set identifiers = config.identifiersFromGroup( GroupedSetting.class ); Set expectedIdentifiers = new HashSet<>( Arrays.asList( "first", "second", "third", "forth" ) ); assertEquals( expectedIdentifiers, identifiers ); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/configuration/GroupConfigTest.java b/community/kernel/src/test/java/org/neo4j/kernel/configuration/GroupConfigTest.java index 5be040b54519a..c1b958209f469 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/configuration/GroupConfigTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/configuration/GroupConfigTest.java @@ -54,8 +54,8 @@ static class ConnectorExample ConnectorExample( String key ) { group = new GroupSettingSupport( ConnectorExample.class, key ); - this.enabled = group.scope( setting( "enabled", BOOLEAN, FALSE ).build() ); - this.name = group.scope( setting( "name", STRING, "Bob Dylan" ).build() ); + this.enabled = group.scope( setting( "enabled", BOOLEAN, FALSE ) ); + this.name = group.scope( setting( "name", STRING, "Bob Dylan" ) ); } } } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/configuration/SettingsTest.java b/community/kernel/src/test/java/org/neo4j/kernel/configuration/SettingsTest.java index 5724ad358219a..e3023c380bc12 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/configuration/SettingsTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/configuration/SettingsTest.java @@ -51,6 +51,7 @@ import static org.neo4j.kernel.configuration.Settings.PATH; import static org.neo4j.kernel.configuration.Settings.STRING; import static org.neo4j.kernel.configuration.Settings.STRING_LIST; +import static org.neo4j.kernel.configuration.Settings.buildSetting; import static org.neo4j.kernel.configuration.Settings.list; import static org.neo4j.kernel.configuration.Settings.matches; import static org.neo4j.kernel.configuration.Settings.max; @@ -109,7 +110,7 @@ public void shouldHaveAUsefulToStringWhichIsUsedAsTheValidValuesInDocumentation( @Test public void testInteger() { - Setting setting = setting( "foo", INTEGER, "3" ).build(); + Setting setting = setting( "foo", INTEGER, "3" ); // Ok assertThat( setting.apply( map( stringMap( "foo", "4" ) ) ), equalTo( 4 ) ); @@ -129,39 +130,39 @@ public void testInteger() @Test public void testList() { - Setting> setting = setting( "foo", list( ",", INTEGER ), "1,2,3,4" ).build(); + Setting> setting = setting( "foo", list( ",", INTEGER ), "1,2,3,4" ); assertThat( setting.apply( map( stringMap() ) ).toString(), equalTo( "[1, 2, 3, 4]" ) ); - Setting> setting2 = setting( "foo", list( ",", INTEGER ), "1,2,3,4," ).build(); + Setting> setting2 = setting( "foo", list( ",", INTEGER ), "1,2,3,4," ); assertThat( setting2.apply( map( stringMap() ) ).toString(), equalTo( "[1, 2, 3, 4]" ) ); - Setting> setting3 = setting( "foo", list( ",", INTEGER ), "" ).build(); + Setting> setting3 = setting( "foo", list( ",", INTEGER ), "" ); assertThat( setting3.apply( map( stringMap() ) ).toString(), equalTo( "[]" ) ); - Setting> setting4 = setting( "foo", list( ",", INTEGER ), "1, 2,3, 4, 5 " ).build(); + Setting> setting4 = setting( "foo", list( ",", INTEGER ), "1, 2,3, 4, 5 " ); assertThat( setting4.apply( map( stringMap() ) ).toString(), equalTo( "[1, 2, 3, 4, 5]" ) ); - Setting> setting5 = setting( "foo", list( ",", INTEGER ), "1, 2,3, 4, " ).build(); + Setting> setting5 = setting( "foo", list( ",", INTEGER ), "1, 2,3, 4, " ); assertThat( setting5.apply( map( stringMap() ) ).toString(), equalTo( "[1, 2, 3, 4]" ) ); } @Test public void testStringList() { - Setting> setting1 = setting( "apa", STRING_LIST, "foo,bar,baz" ).build(); + Setting> setting1 = setting( "apa", STRING_LIST, "foo,bar,baz" ); assertEquals( Arrays.asList( "foo", "bar", "baz" ), setting1.apply( map( stringMap() ) ) ); - Setting> setting2 = setting( "apa", STRING_LIST, "foo, bar, BAZ " ).build(); + Setting> setting2 = setting( "apa", STRING_LIST, "foo, bar, BAZ " ); assertEquals( Arrays.asList( "foo", "bar", "BAZ" ), setting2.apply( map( stringMap() ) ) ); - Setting> setting3 = setting( "apa", STRING_LIST, "" ).build(); + Setting> setting3 = setting( "apa", STRING_LIST, "" ); assertEquals( Collections.emptyList(), setting3.apply( map( stringMap() ) ) ); } @Test public void testMin() { - Setting setting = setting( "foo", INTEGER, "3" ).constraint( min( 2 ) ).build(); + Setting setting = buildSetting( "foo", INTEGER, "3" ).constraint( min( 2 ) ).build(); // Ok assertThat( setting.apply( map( stringMap( "foo", "4" ) ) ), equalTo( 4 ) ); @@ -181,7 +182,7 @@ public void testMin() @Test public void testMax() { - Setting setting = setting( "foo", INTEGER, "3" ).constraint( max( 5 ) ).build(); + Setting setting = buildSetting( "foo", INTEGER, "3" ).constraint( max( 5 ) ).build(); // Ok assertThat( setting.apply( map( stringMap( "foo", "4" ) ) ), equalTo( 4 ) ); @@ -201,7 +202,7 @@ public void testMax() @Test public void testRange() { - Setting setting = setting( "foo", INTEGER, "3" ).constraint( range( 2, 5 ) ).build(); + Setting setting = buildSetting( "foo", INTEGER, "3" ).constraint( range( 2, 5 ) ).build(); // Ok assertThat( setting.apply( map( stringMap( "foo", "4" ) ) ), equalTo( 4 ) ); @@ -231,7 +232,7 @@ public void testRange() @Test public void testMatches() { - Setting setting = setting( "foo", STRING, "abc" ).constraint( matches( "a*b*c*" ) ).build(); + Setting setting = buildSetting( "foo", STRING, "abc" ).constraint( matches( "a*b*c*" ) ).build(); // Ok assertThat( setting.apply( map( stringMap( "foo", "aaabbbccc" ) ) ), equalTo( "aaabbbccc" ) ); @@ -252,28 +253,28 @@ public void testMatches() public void testDurationWithBrokenDefault() { // Notice that the default value is less that the minimum - Setting setting = setting( "foo.bar", DURATION, "1s" ).constraint( min( DURATION.apply( "3s" ) ) ).build(); + Setting setting = buildSetting( "foo.bar", DURATION, "1s" ).constraint( min( DURATION.apply( "3s" ) ) ).build(); setting.apply( map( stringMap() ) ); } @Test( expected = InvalidSettingException.class ) public void testDurationWithValueNotWithinConstraint() { - Setting setting = setting( "foo.bar", DURATION, "3s" ).constraint( min( DURATION.apply( "3s" ) ) ).build(); + Setting setting = buildSetting( "foo.bar", DURATION, "3s" ).constraint( min( DURATION.apply( "3s" ) ) ).build(); setting.apply( map( stringMap( "foo.bar", "2s" ) ) ); } @Test public void testDuration() { - Setting setting = setting( "foo.bar", DURATION, "3s").constraint( min( DURATION.apply( "3s" ) ) ).build(); + Setting setting = buildSetting( "foo.bar", DURATION, "3s").constraint( min( DURATION.apply( "3s" ) ) ).build(); assertThat( setting.apply( map( stringMap( "foo.bar", "4s" ) ) ), equalTo( Duration.ofSeconds( 4 ) ) ); } @Test public void testDefault() { - Setting setting = setting( "foo", INTEGER, "3" ).build(); + Setting setting = setting( "foo", INTEGER, "3" ); // Ok assertThat( setting.apply( map( stringMap() ) ), equalTo( 3 ) ); @@ -283,7 +284,7 @@ public void testDefault() public void testPaths() { File directory = new File( "myDirectory" ); - Setting config = setting( "config", PATH, new File( directory, "config.properties" ).getAbsolutePath() ).constraint( + Setting config = buildSetting( "config", PATH, new File( directory, "config.properties" ).getAbsolutePath() ).constraint( isFile ).build(); assertThat( config.apply( map( stringMap() ) ).getAbsolutePath(), equalTo( new File( directory, "config.properties" ).getAbsolutePath() ) ); @@ -292,8 +293,8 @@ public void testPaths() @Test public void testInheritOneLevel() { - Setting root = setting( "root", INTEGER, "4" ).build(); - Setting setting = setting( "foo", INTEGER ).inherits( root ).build(); + Setting root = setting( "root", INTEGER, "4" ); + Setting setting = buildSetting( "foo", INTEGER ).inherits( root ).build(); // Ok assertThat( setting.apply( map( stringMap( "foo", "1" ) ) ), equalTo( 1 ) ); @@ -304,11 +305,11 @@ public void testInheritOneLevel() public void testInheritHierarchy() { // Test hierarchies - Setting a = setting( "A", STRING, "A" ).build(); // A defaults to A - Setting b = setting( "B", STRING, "B" ).inherits( a ).build(); // B defaults to B unless A is defined - Setting c = setting( "C", STRING, "C" ).inherits( b ).build(); // C defaults to C unless B is defined - Setting d = setting( "D", STRING ).inherits( b ).build(); // D defaults to B - Setting e = setting( "E", STRING ).inherits( d ).build(); // E defaults to D (hence B) + Setting a = setting( "A", STRING, "A" ); // A defaults to A + Setting b = buildSetting( "B", STRING, "B" ).inherits( a ).build(); // B defaults to B unless A is defined + Setting c = buildSetting( "C", STRING, "C" ).inherits( b ).build(); // C defaults to C unless B is defined + Setting d = buildSetting( "D", STRING ).inherits( b ).build(); // D defaults to B + Setting e = buildSetting( "E", STRING ).inherits( d ).build(); // E defaults to D (hence B) assertThat( c.apply( map( stringMap( "C", "X" ) ) ), equalTo( "X" ) ); assertThat( c.apply( map( stringMap( "B", "X" ) ) ), equalTo( "X" ) ); @@ -338,7 +339,7 @@ public void testLogicalLogRotationThreshold() throws Exception public void testNormalizedRelativeURI() throws Exception { // Given - Setting uri = setting( "mySetting", NORMALIZED_RELATIVE_URI, "http://localhost:7474///db///data///" ).build(); + Setting uri = setting( "mySetting", NORMALIZED_RELATIVE_URI, "http://localhost:7474///db///data///" ); // When && then assertThat( uri.apply( always -> null ).toString(), equalTo( "/db/data" ) ); @@ -347,11 +348,11 @@ public void testNormalizedRelativeURI() throws Exception @Test public void onlySingleInheritanceShouldBeAllowed() throws Exception { - Setting a = setting( "A", STRING, "A" ).build(); - Setting b = setting( "B", STRING, "B" ).build(); + Setting a = setting( "A", STRING, "A" ); + Setting b = setting( "B", STRING, "B" ); try { - Setting c = setting( "C", STRING, "C" ).inherits( a ).inherits( b ).build(); + Setting c = buildSetting( "C", STRING, "C" ).inherits( a ).inherits( b ).build(); fail(); } catch ( AssertionError e ) diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProviderTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProviderTest.java index d2b0c59f596b1..99ff2c37a1755 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProviderTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/index/schema/NativeSchemaNumberIndexProviderTest.java @@ -370,7 +370,7 @@ public void shouldReportInitialStateAsOnlineIfPopulationCompletedSuccessfully() private IndexSamplingConfig samplingConfig() { - return new IndexSamplingConfig( Config.empty() ); + return new IndexSamplingConfig( Config.defaults() ); } private IndexDescriptor descriptor() diff --git a/community/security/src/main/java/org/neo4j/commandline/admin/security/SetDefaultAdminCommand.java b/community/security/src/main/java/org/neo4j/commandline/admin/security/SetDefaultAdminCommand.java index bed6e73c2a794..5d8e4ac55339a 100644 --- a/community/security/src/main/java/org/neo4j/commandline/admin/security/SetDefaultAdminCommand.java +++ b/community/security/src/main/java/org/neo4j/commandline/admin/security/SetDefaultAdminCommand.java @@ -125,7 +125,7 @@ private void setDefaultAdmin( String username ) throws Throwable Config loadNeo4jConfig() { - return Config.fromFile( configDir.resolve( "neo4j.conf" ) ) + return Config.fromFile( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ) ) .withHome( homeDir ) .withConnectorsDisabled().build(); } diff --git a/community/security/src/main/java/org/neo4j/commandline/admin/security/SetInitialPasswordCommand.java b/community/security/src/main/java/org/neo4j/commandline/admin/security/SetInitialPasswordCommand.java index d63ab4dd394cc..55b5661339014 100644 --- a/community/security/src/main/java/org/neo4j/commandline/admin/security/SetInitialPasswordCommand.java +++ b/community/security/src/main/java/org/neo4j/commandline/admin/security/SetInitialPasswordCommand.java @@ -112,7 +112,7 @@ private boolean realUsersExist( Config config ) Config loadNeo4jConfig() { - return Config.fromFile( configDir.resolve( "neo4j.conf" ).toFile() ) + return Config.fromFile( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ).toFile() ) .withHome( homeDir.toFile() ) .withConnectorsDisabled().build(); } diff --git a/community/server/src/main/java/org/neo4j/server/configuration/ServerSettings.java b/community/server/src/main/java/org/neo4j/server/configuration/ServerSettings.java index baa7f4b224201..6e30ac0b92370 100644 --- a/community/server/src/main/java/org/neo4j/server/configuration/ServerSettings.java +++ b/community/server/src/main/java/org/neo4j/server/configuration/ServerSettings.java @@ -47,6 +47,7 @@ import static org.neo4j.kernel.configuration.Settings.STRING; import static org.neo4j.kernel.configuration.Settings.STRING_LIST; import static org.neo4j.kernel.configuration.Settings.TRUE; +import static org.neo4j.kernel.configuration.Settings.buildSetting; import static org.neo4j.kernel.configuration.Settings.derivedSetting; import static org.neo4j.kernel.configuration.Settings.pathSetting; import static org.neo4j.kernel.configuration.Settings.range; @@ -59,21 +60,21 @@ public class ServerSettings implements LoadableConfig @Description( "Maximum request header size" ) @Internal public static final Setting maximum_request_header_size = - setting( "unsupported.dbms.max_http_request_header_size", INTEGER, "20480" ).build(); + setting( "unsupported.dbms.max_http_request_header_size", INTEGER, "20480" ); @Description( "Maximum response header size" ) @Internal public static final Setting maximum_response_header_size = - setting( "unsupported.dbms.max_http_response_header_size", INTEGER, "20480" ).build(); + setting( "unsupported.dbms.max_http_response_header_size", INTEGER, "20480" ); @Description( "Comma-seperated list of custom security rules for Neo4j to use." ) public static final Setting> security_rules = - setting( "dbms.security.http_authorization_classes", STRING_LIST, EMPTY ).build(); + setting( "dbms.security.http_authorization_classes", STRING_LIST, EMPTY ); @Description( "Number of Neo4j worker threads, your OS might enforce a lower limit than the maximum value " + "specified here." ) @DocumentedDefaultValue( "Number of available processors (max 500)." ) - public static final Setting webserver_max_threads = setting( "dbms.threads.worker_count", INTEGER, + public static final Setting webserver_max_threads = buildSetting( "dbms.threads.worker_count", INTEGER, "" + Math.min( Runtime.getRuntime().availableProcessors(), 500 ) ).constraint( range( 1, JettyThreadCalculator.MAX_THREADS ) ).build(); @@ -82,11 +83,11 @@ public class ServerSettings implements LoadableConfig @Internal @Deprecated public static final Setting webserver_limit_execution_time = setting( "unsupported.dbms" + - ".executiontime_limit.time", DURATION, NO_DEFAULT ).build(); + ".executiontime_limit.time", DURATION, NO_DEFAULT ); @Internal public static final Setting> console_module_engines = setting( - "unsupported.dbms.console_module.engines", STRING_LIST, "SHELL" ).build(); + "unsupported.dbms.console_module.engines", STRING_LIST, "SHELL" ); @Description( "Comma-separated list of = for unmanaged extensions." ) public static final Setting> third_party_packages = setting( "dbms.unmanaged_extension_classes", @@ -127,10 +128,10 @@ private ThirdPartyJaxRsPackage createThirdPartyJaxRsPackage( String packageAndMo return new ThirdPartyJaxRsPackage( pkg, mountPoint ); } }, - EMPTY ).build(); + EMPTY ); @Description( "Enable HTTP request logging." ) - public static final Setting http_logging_enabled = setting( "dbms.logs.http.enabled", BOOLEAN, FALSE ).build(); + public static final Setting http_logging_enabled = setting( "dbms.logs.http.enabled", BOOLEAN, FALSE ); @Description( "Path to HTTP request log." ) public static final Setting http_log_path = @@ -139,30 +140,30 @@ private ThirdPartyJaxRsPackage createThirdPartyJaxRsPackage( String packageAndMo @Description( "Number of HTTP logs to keep." ) public static final Setting http_logging_rotation_keep_number = - setting( "dbms.logs.http.rotation.keep_number", INTEGER, "5" ).build(); + setting( "dbms.logs.http.rotation.keep_number", INTEGER, "5" ); @Description( "Size of each HTTP log that is kept." ) - public static final Setting http_logging_rotation_size = setting( "dbms.logs.http.rotation.size", BYTES, + public static final Setting http_logging_rotation_size = buildSetting( "dbms.logs.http.rotation.size", BYTES, "20m" ).constraint( range(0L, Long.MAX_VALUE ) ).build(); @SuppressWarnings( "unused" ) // used only in the startup scripts @Description( "Enable GC Logging" ) - public static final Setting gc_logging_enabled = setting( "dbms.logs.gc.enabled", BOOLEAN, FALSE).build(); + public static final Setting gc_logging_enabled = setting( "dbms.logs.gc.enabled", BOOLEAN, FALSE); @SuppressWarnings( "unused" ) // used only in the startup scripts @Description( "GC Logging Options" ) public static final Setting gc_logging_options = setting( "dbms.logs.gc.options", STRING, "" + "-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime " + - "-XX:+PrintPromotionFailure -XX:+PrintTenuringDistribution" ).build(); + "-XX:+PrintPromotionFailure -XX:+PrintTenuringDistribution" ); @SuppressWarnings( "unused" ) // used only in the startup scripts @Description( "Number of GC logs to keep." ) public static final Setting gc_logging_rotation_keep_number = - setting( "dbms.logs.gc.rotation.keep_number", INTEGER, "5" ).build(); + setting( "dbms.logs.gc.rotation.keep_number", INTEGER, "5" ); @SuppressWarnings( "unused" ) // used only in the startup scripts @Description( "Size of each GC log that is kept." ) - public static final Setting gc_logging_rotation_size = setting( "dbms.logs.gc.rotation.size", BYTES, + public static final Setting gc_logging_rotation_size = buildSetting( "dbms.logs.gc.rotation.size", BYTES, "20m" ).constraint( range(0L, Long.MAX_VALUE ) ).build(); @SuppressWarnings( "unused" ) // used only in the startup scripts @@ -177,43 +178,43 @@ private ThirdPartyJaxRsPackage createThirdPartyJaxRsPackage( String packageAndMo @Description( "Timeout for idle transactions in the REST endpoint." ) public static final Setting transaction_idle_timeout = setting( "dbms.rest.transaction.idle_timeout", - DURATION, "60s" ).build(); + DURATION, "60s" ); @SuppressWarnings( "unused" ) // accessed from the browser @Description( "Commands to be run when Neo4j Browser successfully connects to this server. Separate multiple " + "commands with semi-colon." ) - public static final Setting browser_postConnectCmd = setting( "browser.post_connect_cmd", STRING, "" ).build(); + public static final Setting browser_postConnectCmd = setting( "browser.post_connect_cmd", STRING, "" ); @SuppressWarnings( "unused" ) // accessed from the browser @Description( "Whitelist of hosts for the Neo4j Browser to be allowed to fetch content from." ) public static final Setting browser_remoteContentHostnameWhitelist = - setting( "browser.remote_content_hostname_whitelist", STRING, "guides.neo4j.com,localhost").build(); + setting( "browser.remote_content_hostname_whitelist", STRING, "guides.neo4j.com,localhost"); @Description( "SSL policy name." ) - public static final Setting ssl_policy = setting( "https.ssl_policy", STRING, LEGACY_POLICY_NAME ).build(); + public static final Setting ssl_policy = setting( "https.ssl_policy", STRING, LEGACY_POLICY_NAME ); @Internal - public static final Setting rest_api_path = setting( "unsupported.dbms.uris.rest", NORMALIZED_RELATIVE_URI, "/db/data" ).build(); + public static final Setting rest_api_path = setting( "unsupported.dbms.uris.rest", NORMALIZED_RELATIVE_URI, "/db/data" ); @Internal public static final Setting management_api_path = setting( "unsupported.dbms.uris.management", - NORMALIZED_RELATIVE_URI, "/db/manage" ).build(); + NORMALIZED_RELATIVE_URI, "/db/manage" ); @Internal - public static final Setting browser_path = setting( "unsupported.dbms.uris.browser", Settings.URI, "/browser/" ).build(); + public static final Setting browser_path = setting( "unsupported.dbms.uris.browser", Settings.URI, "/browser/" ); @Internal public static final Setting script_sandboxing_enabled = - setting( "unsupported.dbms.security.script_sandboxing_enabled", BOOLEAN, TRUE ).build(); + setting( "unsupported.dbms.security.script_sandboxing_enabled", BOOLEAN, TRUE ); @Internal public static final Setting wadl_enabled = setting( "unsupported.dbms.wadl_generation_enabled", BOOLEAN, - FALSE ).build(); + FALSE ); @Internal public static final Setting console_module_enabled = - setting( "unsupported.dbms.console_module.enabled", BOOLEAN, TRUE ).build(); + setting( "unsupported.dbms.console_module.enabled", BOOLEAN, TRUE ); @Internal - public static final Setting jmx_module_enabled = setting( "unsupported.dbms.jmx_module.enabled", BOOLEAN, TRUE ).build(); + public static final Setting jmx_module_enabled = setting( "unsupported.dbms.jmx_module.enabled", BOOLEAN, TRUE ); } diff --git a/community/server/src/test/java/org/neo4j/server/configuration/ServerSettingsTest.java b/community/server/src/test/java/org/neo4j/server/configuration/ServerSettingsTest.java index d50cbf87f4d78..2d723886512f8 100644 --- a/community/server/src/test/java/org/neo4j/server/configuration/ServerSettingsTest.java +++ b/community/server/src/test/java/org/neo4j/server/configuration/ServerSettingsTest.java @@ -27,6 +27,7 @@ import org.neo4j.configuration.ConfigValue; import org.neo4j.kernel.configuration.Config; +import org.neo4j.kernel.configuration.HttpConnector; import static java.util.stream.Collectors.toList; import static org.hamcrest.Matchers.containsInAnyOrder; @@ -72,7 +73,8 @@ public void configValuesContainsConnectors() throws Exception @Test public void connectorSettingHasItsOwnValues() throws Exception { - Config config = Config.builder().withServerDefaults().withSetting( "dbms.connector.http.address", "localhost:123" ).build(); + Config config = Config.builder().withServerDefaults() + .withSetting( new HttpConnector( "http" ).address, "localhost:123" ).build(); ConfigValue address = config.getConfigValues().entrySet().stream() .filter( c -> c.getKey().equals( "dbms.connector.http.address" ) ) diff --git a/community/shell/src/main/java/org/neo4j/shell/ShellSettings.java b/community/shell/src/main/java/org/neo4j/shell/ShellSettings.java index b94ab6642ee06..2b34881d04d99 100644 --- a/community/shell/src/main/java/org/neo4j/shell/ShellSettings.java +++ b/community/shell/src/main/java/org/neo4j/shell/ShellSettings.java @@ -28,6 +28,7 @@ import static org.neo4j.kernel.configuration.Settings.FALSE; import static org.neo4j.kernel.configuration.Settings.INTEGER; import static org.neo4j.kernel.configuration.Settings.STRING; +import static org.neo4j.kernel.configuration.Settings.buildSetting; import static org.neo4j.kernel.configuration.Settings.illegalValueMessage; import static org.neo4j.kernel.configuration.Settings.matches; import static org.neo4j.kernel.configuration.Settings.port; @@ -40,21 +41,21 @@ public class ShellSettings implements LoadableConfig { @Description( "Enable a remote shell server which Neo4j Shell clients can log in to." ) - public static final Setting remote_shell_enabled = setting( "dbms.shell.enabled", BOOLEAN, FALSE ).build(); + public static final Setting remote_shell_enabled = setting( "dbms.shell.enabled", BOOLEAN, FALSE ); @Description( "Remote host for shell. By default, the shell server listens only on the loopback interface, " + "but you can specify the IP address of any network interface or use `0.0.0.0` for all interfaces." ) - public static final Setting remote_shell_host = setting( "dbms.shell.host", STRING, "127.0.0.1" ).constraint( + public static final Setting remote_shell_host = buildSetting( "dbms.shell.host", STRING, "127.0.0.1" ).constraint( illegalValueMessage( "must be a valid name", matches( ANY ) ) ).build(); @Description( "The port the shell will listen on." ) public static final Setting remote_shell_port = - setting( "dbms.shell.port", INTEGER, "1337" ).constraint( port ).build(); + buildSetting( "dbms.shell.port", INTEGER, "1337" ).constraint( port ).build(); @Description( "Read only mode. Will only allow read operations." ) - public static final Setting remote_shell_read_only = setting( "dbms.shell.read_only", BOOLEAN, FALSE ).build(); + public static final Setting remote_shell_read_only = setting( "dbms.shell.read_only", BOOLEAN, FALSE ); @Description( "The name of the shell." ) - public static final Setting remote_shell_name = setting( "dbms.shell.rmi_name", STRING, "shell" ).constraint( + public static final Setting remote_shell_name = buildSetting( "dbms.shell.rmi_name", STRING, "shell" ).constraint( illegalValueMessage( "must be a valid name", matches( ANY ) ) ).build(); } diff --git a/community/shell/src/test/java/org/neo4j/shell/RmiPublicationIT.java b/community/shell/src/test/java/org/neo4j/shell/RmiPublicationIT.java index effaf69141a6f..06c3f0b6e4258 100644 --- a/community/shell/src/test/java/org/neo4j/shell/RmiPublicationIT.java +++ b/community/shell/src/test/java/org/neo4j/shell/RmiPublicationIT.java @@ -30,6 +30,7 @@ import java.util.Properties; import org.neo4j.graphdb.factory.GraphDatabaseSettings; +import org.neo4j.kernel.configuration.Config; import org.neo4j.test.ProcessStreamHandler; import org.neo4j.test.rule.TestDirectory; @@ -41,7 +42,7 @@ public class RmiPublicationIT { public static File createDefaultConfigFile( File path ) throws IOException { - File configFile = new File( path, "neo4j.conf" ); + File configFile = new File( path, Config.DEFAULT_CONFIG_FILE_NAME ); Properties config = new Properties(); config.setProperty( GraphDatabaseSettings.pagecache_memory.name(), "8m" ); try ( Writer writer = new FileWriter( configFile ) ) diff --git a/community/udc/src/main/java/org/neo4j/ext/udc/UdcSettings.java b/community/udc/src/main/java/org/neo4j/ext/udc/UdcSettings.java index 6c7b4858664cf..72f842df991b2 100644 --- a/community/udc/src/main/java/org/neo4j/ext/udc/UdcSettings.java +++ b/community/udc/src/main/java/org/neo4j/ext/udc/UdcSettings.java @@ -34,6 +34,7 @@ import static org.neo4j.kernel.configuration.Settings.INTEGER; import static org.neo4j.kernel.configuration.Settings.STRING; import static org.neo4j.kernel.configuration.Settings.TRUE; +import static org.neo4j.kernel.configuration.Settings.buildSetting; import static org.neo4j.kernel.configuration.Settings.illegalValueMessage; import static org.neo4j.kernel.configuration.Settings.matches; import static org.neo4j.kernel.configuration.Settings.min; @@ -45,31 +46,31 @@ public class UdcSettings implements LoadableConfig /** Configuration key for enabling the UDC extension. */ @Description( "Enable the UDC extension." ) public static final Setting udc_enabled = setting( - "dbms.udc.enabled", Enabled.UNLESS_EXPLICITLY_DISABLED, Enabled.AS_DEFAULT_VALUE ).build(); + "dbms.udc.enabled", Enabled.UNLESS_EXPLICITLY_DISABLED, Enabled.AS_DEFAULT_VALUE ); /** Configuration key for the first delay, expressed in milliseconds. */ @Internal public static final Setting first_delay = - setting( "unsupported.dbms.udc.first_delay", INTEGER, Integer.toString( 10 * 1000 * 60 ) ).constraint( min( 1 ) ).build(); + buildSetting( "unsupported.dbms.udc.first_delay", INTEGER, Integer.toString( 10 * 1000 * 60 ) ).constraint( min( 1 ) ).build(); /** Configuration key for the interval for regular updates, expressed in milliseconds. */ @Internal - public static final Setting interval = setting( "unsupported.dbms.udc.interval", INTEGER, Integer.toString( + public static final Setting interval = buildSetting( "unsupported.dbms.udc.interval", INTEGER, Integer.toString( 1000 * 60 * 60 * 24 ) ).constraint( min( 1 ) ).build(); /** The host address to which UDC updates will be sent. Should be of the form hostname[:port]. */ @Internal public static final Setting udc_host = setting( "unsupported.dbms.udc.host", HOSTNAME_PORT, - "udc.neo4j.org" ).build(); + "udc.neo4j.org" ); /** Configuration key for overriding the source parameter in UDC */ @Internal - public static final Setting udc_source = setting( "unsupported.dbms.udc.source", STRING, Settings.NO_DEFAULT ).constraint( + public static final Setting udc_source = buildSetting( "unsupported.dbms.udc.source", STRING, Settings.NO_DEFAULT ).constraint( illegalValueMessage( "Must be a valid source", matches( ANY ) ) ).build(); /** Unique registration id */ @Internal - public static final Setting udc_registration_key = setting( "unsupported.dbms.udc.reg", STRING, "unreg" ).constraint( + public static final Setting udc_registration_key = buildSetting( "unsupported.dbms.udc.reg", STRING, "unreg" ).constraint( illegalValueMessage( "Must be a valid registration id", matches( ANY ) ) ).build(); private enum Enabled implements Function diff --git a/enterprise/backup/src/main/java/org/neo4j/backup/OnlineBackupCommand.java b/enterprise/backup/src/main/java/org/neo4j/backup/OnlineBackupCommand.java index 868982fe32c44..33bdeac5b5d90 100644 --- a/enterprise/backup/src/main/java/org/neo4j/backup/OnlineBackupCommand.java +++ b/enterprise/backup/src/main/java/org/neo4j/backup/OnlineBackupCommand.java @@ -296,7 +296,7 @@ private String renameExistingBackup( final Path folder, final String oldName ) t private Config loadConfig( Optional additionalConfig ) throws CommandFailed { return withAdditionalConfig( additionalConfig, - Config.fromFile( configDir.resolve( "neo4j.conf" ) ).withHome( homeDir ) + Config.fromFile( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ) ).withHome( homeDir ) .withConnectorsDisabled().build() ); } diff --git a/enterprise/backup/src/main/java/org/neo4j/backup/OnlineBackupSettings.java b/enterprise/backup/src/main/java/org/neo4j/backup/OnlineBackupSettings.java index 54c77aa411305..5c245f034e750 100644 --- a/enterprise/backup/src/main/java/org/neo4j/backup/OnlineBackupSettings.java +++ b/enterprise/backup/src/main/java/org/neo4j/backup/OnlineBackupSettings.java @@ -36,9 +36,9 @@ public class OnlineBackupSettings implements LoadableConfig { @Description( "Enable support for running online backups" ) - public static final Setting online_backup_enabled = setting( "dbms.backup.enabled", BOOLEAN, TRUE ).build(); + public static final Setting online_backup_enabled = setting( "dbms.backup.enabled", BOOLEAN, TRUE ); @Description( "Listening server for online backups" ) public static final Setting online_backup_server = setting( "dbms.backup.address", HOSTNAME_PORT, - "127.0.0.1:6362-6372" ).build(); + "127.0.0.1:6362-6372" ); } diff --git a/enterprise/backup/src/main/java/org/neo4j/restore/RestoreDatabaseCli.java b/enterprise/backup/src/main/java/org/neo4j/restore/RestoreDatabaseCli.java index 95f0102927170..a57bf1fff5150 100644 --- a/enterprise/backup/src/main/java/org/neo4j/restore/RestoreDatabaseCli.java +++ b/enterprise/backup/src/main/java/org/neo4j/restore/RestoreDatabaseCli.java @@ -51,7 +51,7 @@ public RestoreDatabaseCli( Path homeDir, Path configDir ) private static Config loadNeo4jConfig( Path homeDir, Path configDir, String databaseName ) { - return Config.fromFile( configDir.resolve( "neo4j.conf" ) ) + return Config.fromFile( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ) ) .withHome( homeDir ) .withSetting( DatabaseManagementSystemSettings.active_database, databaseName ) .withConnectorsDisabled().build(); diff --git a/enterprise/backup/src/test/java/org/neo4j/backup/BackupToolTest.java b/enterprise/backup/src/test/java/org/neo4j/backup/BackupToolTest.java index 22f235a6b7bb5..b9c6d2eea1563 100644 --- a/enterprise/backup/src/test/java/org/neo4j/backup/BackupToolTest.java +++ b/enterprise/backup/src/test/java/org/neo4j/backup/BackupToolTest.java @@ -181,7 +181,7 @@ public void appliesDefaultTuningConfigurationForConsistencyChecker() throws Exce public void passesOnConfigurationIfProvided() throws Exception { // given - File configFile = testDirectory.file( "neo4j.conf" ); + File configFile = testDirectory.file( Config.DEFAULT_CONFIG_FILE_NAME ); Properties properties = new Properties(); properties.setProperty( ConsistencyCheckSettings.consistency_check_property_owners.name(), "true" ); properties.store( new FileWriter( configFile ), null ); diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/CausalClusteringSettings.java b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/CausalClusteringSettings.java index c1a261f97b8b3..2ff5aaa66add5 100644 --- a/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/CausalClusteringSettings.java +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/causalclustering/core/CausalClusteringSettings.java @@ -51,6 +51,7 @@ import static org.neo4j.kernel.configuration.Settings.STRING; import static org.neo4j.kernel.configuration.Settings.TRUE; import static org.neo4j.kernel.configuration.Settings.advertisedAddress; +import static org.neo4j.kernel.configuration.Settings.buildSetting; import static org.neo4j.kernel.configuration.Settings.derivedSetting; import static org.neo4j.kernel.configuration.Settings.determineDefaultLookup; import static org.neo4j.kernel.configuration.Settings.list; @@ -64,39 +65,39 @@ public class CausalClusteringSettings implements LoadableConfig { @Description( "Time out for a new member to catch up" ) public static final Setting join_catch_up_timeout = - setting( "causal_clustering.join_catch_up_timeout", DURATION, "10m" ).build(); + setting( "causal_clustering.join_catch_up_timeout", DURATION, "10m" ); @Description( "The time limit within which a new leader election will occur if no messages are received." ) public static final Setting leader_election_timeout = - setting( "causal_clustering.leader_election_timeout", DURATION, "7s" ).build(); + setting( "causal_clustering.leader_election_timeout", DURATION, "7s" ); @Description( "Prevents the current instance from volunteering to become Raft leader. Defaults to false, and " + "should only be used in exceptional circumstances by expert users. Using this can result in reduced " + "availability for the cluster." ) public static final Setting refuse_to_be_leader = - setting( "causal_clustering.refuse_to_be_leader", BOOLEAN, FALSE ).build(); + setting( "causal_clustering.refuse_to_be_leader", BOOLEAN, FALSE ); @Description( "The maximum batch size when catching up (in unit of entries)" ) public static final Setting catchup_batch_size = - setting( "causal_clustering.catchup_batch_size", INTEGER, "64" ).build(); + setting( "causal_clustering.catchup_batch_size", INTEGER, "64" ); @Description( "The maximum lag allowed before log shipping pauses (in unit of entries)" ) public static final Setting log_shipping_max_lag = - setting( "causal_clustering.log_shipping_max_lag", INTEGER, "256" ).build(); + setting( "causal_clustering.log_shipping_max_lag", INTEGER, "256" ); @Description( "Size of the RAFT in queue" ) @Internal public static final Setting raft_in_queue_size = - setting( "causal_clustering.raft_in_queue_size", INTEGER, "64" ).build(); + setting( "causal_clustering.raft_in_queue_size", INTEGER, "64" ); @Description( "Largest batch processed by RAFT" ) @Internal public static final Setting raft_in_queue_max_batch = - setting( "causal_clustering.raft_in_queue_max_batch", INTEGER, "64" ).build(); + setting( "causal_clustering.raft_in_queue_max_batch", INTEGER, "64" ); @Description( "Expected number of Core machines in the cluster" ) public static final Setting expected_core_cluster_size = - setting( "causal_clustering.expected_core_cluster_size", INTEGER, "3" ).build(); + setting( "causal_clustering.expected_core_cluster_size", INTEGER, "3" ); @Description( "Network interface and port for the transaction shipping server to listen on." ) public static final Setting transaction_listen_address = @@ -125,7 +126,7 @@ public class CausalClusteringSettings implements LoadableConfig @Description( "A comma-separated list of other members of the cluster to join." ) public static final Setting> initial_discovery_members = setting( "causal_clustering.initial_discovery_members", list( ",", ADVERTISED_SOCKET_ADDRESS ), - NO_DEFAULT ).build(); + NO_DEFAULT ); public enum DiscoveryType { @@ -135,81 +136,81 @@ public enum DiscoveryType @Description( "Configure the discovery type used for cluster name resolution" ) public static final Setting discovery_type = - setting( "causal_clustering.discovery_type", options( DiscoveryType.class ), DiscoveryType.LIST.name() ).build(); + setting( "causal_clustering.discovery_type", options( DiscoveryType.class ), DiscoveryType.LIST.name() ); @Description( "Prevents the network middleware from dumping its own logs. Defaults to true." ) public static final Setting disable_middleware_logging = - setting( "causal_clustering.disable_middleware_logging", BOOLEAN, TRUE ).build(); + setting( "causal_clustering.disable_middleware_logging", BOOLEAN, TRUE ); @Internal // not supported yet @Description( "Hazelcast license key" ) public static final Setting hazelcast_license_key = - setting( "hazelcast.license_key", STRING, NO_DEFAULT ).build(); + setting( "hazelcast.license_key", STRING, NO_DEFAULT ); @Description( "The maximum file size before the storage file is rotated (in unit of entries)" ) public static final Setting last_flushed_state_size = - setting( "causal_clustering.last_applied_state_size", INTEGER, "1000" ).build(); + setting( "causal_clustering.last_applied_state_size", INTEGER, "1000" ); @Description( "The maximum file size before the ID allocation file is rotated (in unit of entries)" ) public static final Setting id_alloc_state_size = - setting( "causal_clustering.id_alloc_state_size", INTEGER, "1000" ).build(); + setting( "causal_clustering.id_alloc_state_size", INTEGER, "1000" ); @Description( "The maximum file size before the membership state file is rotated (in unit of entries)" ) public static final Setting raft_membership_state_size = - setting( "causal_clustering.raft_membership_state_size", INTEGER, "1000" ).build(); + setting( "causal_clustering.raft_membership_state_size", INTEGER, "1000" ); @Description( "The maximum file size before the vote state file is rotated (in unit of entries)" ) public static final Setting vote_state_size = - setting( "causal_clustering.raft_vote_state_size", INTEGER, "1000" ).build(); + setting( "causal_clustering.raft_vote_state_size", INTEGER, "1000" ); @Description( "The maximum file size before the term state file is rotated (in unit of entries)" ) public static final Setting term_state_size = - setting( "causal_clustering.raft_term_state_size", INTEGER, "1000" ).build(); + setting( "causal_clustering.raft_term_state_size", INTEGER, "1000" ); @Description( "The maximum file size before the global session tracker state file is rotated (in unit of entries)" ) public static final Setting global_session_tracker_state_size = - setting( "causal_clustering.global_session_tracker_state_size", INTEGER, "1000" ).build(); + setting( "causal_clustering.global_session_tracker_state_size", INTEGER, "1000" ); @Description( "The maximum file size before the replicated lock token state file is rotated (in unit of entries)" ) public static final Setting replicated_lock_token_state_size = - setting( "causal_clustering.replicated_lock_token_state_size", INTEGER, "1000" ).build(); + setting( "causal_clustering.replicated_lock_token_state_size", INTEGER, "1000" ); @Description( "The number of messages waiting to be sent to other servers in the cluster" ) public static final Setting outgoing_queue_size = - setting( "causal_clustering.outgoing_queue_size", INTEGER, "64" ).build(); + setting( "causal_clustering.outgoing_queue_size", INTEGER, "64" ); @Description( "The number of operations to be processed before the state machines flush to disk" ) public static final Setting state_machine_flush_window_size = - setting( "causal_clustering.state_machine_flush_window_size", INTEGER, "4096" ).build(); + setting( "causal_clustering.state_machine_flush_window_size", INTEGER, "4096" ); @Description( "The maximum number of operations to be batched during applications of operations in the state machines" ) public static final Setting state_machine_apply_max_batch_size = - setting( "causal_clustering.state_machine_apply_max_batch_size", INTEGER, "16" ).build(); + setting( "causal_clustering.state_machine_apply_max_batch_size", INTEGER, "16" ); @Description( "RAFT log pruning strategy" ) public static final Setting raft_log_pruning_strategy = - setting( "causal_clustering.raft_log_prune_strategy", STRING, "1g size" ).build(); + setting( "causal_clustering.raft_log_prune_strategy", STRING, "1g size" ); @Description( "RAFT log implementation" ) public static final Setting raft_log_implementation = - setting( "causal_clustering.raft_log_implementation", STRING, "SEGMENTED" ).build(); + setting( "causal_clustering.raft_log_implementation", STRING, "SEGMENTED" ); @Description( "RAFT log rotation size" ) public static final Setting raft_log_rotation_size = - setting( "causal_clustering.raft_log_rotation_size", BYTES, "250M" ).constraint( min( 1024L ) ).build(); + buildSetting( "causal_clustering.raft_log_rotation_size", BYTES, "250M" ).constraint( min( 1024L ) ).build(); @Description( "RAFT log reader pool size" ) public static final Setting raft_log_reader_pool_size = - setting( "causal_clustering.raft_log_reader_pool_size", INTEGER, "8" ).build(); + setting( "causal_clustering.raft_log_reader_pool_size", INTEGER, "8" ); @Description( "RAFT log pruning frequency" ) public static final Setting raft_log_pruning_frequency = - setting( "causal_clustering.raft_log_pruning_frequency", DURATION, "10m" ).build(); + setting( "causal_clustering.raft_log_pruning_frequency", DURATION, "10m" ); @Description( "Enable or disable the dump of all network messages pertaining to the RAFT protocol" ) @Internal public static final Setting raft_messages_log_enable = - setting( "causal_clustering.raft_messages_log_enable", BOOLEAN, FALSE ).build(); + setting( "causal_clustering.raft_messages_log_enable", BOOLEAN, FALSE ); @Description( "Path to RAFT messages log." ) @Internal @@ -218,151 +219,151 @@ public enum DiscoveryType ( logs ) -> new File( logs, "raft-messages.log" ), PATH ); @Description( "Interval of pulling updates from cores." ) - public static final Setting pull_interval = setting( "causal_clustering.pull_interval", DURATION, "1s" ).build(); + public static final Setting pull_interval = setting( "causal_clustering.pull_interval", DURATION, "1s" ); @Description( "The catch up protocol times out if the given duration elapses with not network activity. " + "Every message received by the client from the server extends the time out duration." ) @Internal public static final Setting catch_up_client_inactivity_timeout = - setting( "causal_clustering.catch_up_client_inactivity_timeout", DURATION, "5s" ).build(); + setting( "causal_clustering.catch_up_client_inactivity_timeout", DURATION, "5s" ); @Description( "Throttle limit for logging unknown cluster member address" ) public static final Setting unknown_address_logging_throttle = - setting( "causal_clustering.unknown_address_logging_throttle", DURATION, "10000ms" ).build(); + setting( "causal_clustering.unknown_address_logging_throttle", DURATION, "10000ms" ); @Description( "Maximum transaction batch size for read replicas when applying transactions pulled from core " + "servers." ) @Internal public static Setting read_replica_transaction_applier_batch_size = - setting( "causal_clustering.read_replica_transaction_applier_batch_size", INTEGER, "64" ).build(); + setting( "causal_clustering.read_replica_transaction_applier_batch_size", INTEGER, "64" ); @Description( "Time To Live before read replica is considered unavailable" ) public static final Setting read_replica_time_to_live = - setting( "causal_clustering.read_replica_time_to_live", DURATION, "1m" ).constraint( min( Duration.ofSeconds( 60 ) ) ).build(); + buildSetting( "causal_clustering.read_replica_time_to_live", DURATION, "1m" ).constraint( min( Duration.ofSeconds( 60 ) ) ).build(); @Description( "How long drivers should cache the data from the `dbms.cluster.routing.getServers()` procedure." ) public static final Setting cluster_routing_ttl = - setting( "causal_clustering.cluster_routing_ttl", DURATION, "5m" ).constraint( min( Duration.ofSeconds( 1 ) ) ).build(); + buildSetting( "causal_clustering.cluster_routing_ttl", DURATION, "5m" ).constraint( min( Duration.ofSeconds( 1 ) ) ).build(); @Description( "Configure if the `dbms.cluster.routing.getServers()` procedure should include followers as read " + "endpoints or return only read replicas. Note: if there are no read replicas in the cluster, followers " + "are returned as read end points regardless the value of this setting. Defaults to true so that followers" + "are available for read-only queries in a typical heterogeneous setup." ) public static final Setting cluster_allow_reads_on_followers = - setting( "causal_clustering.cluster_allow_reads_on_followers", BOOLEAN, TRUE ).build(); + setting( "causal_clustering.cluster_allow_reads_on_followers", BOOLEAN, TRUE ); @Description( "The size of the ID allocation requests Core servers will make when they run out of NODE IDs. " + "Larger values mean less frequent requests but also result in more unused IDs (and unused disk space) " + "in the event of a crash." ) public static final Setting node_id_allocation_size = - setting( "causal_clustering.node_id_allocation_size", INTEGER, "1024" ).build(); + setting( "causal_clustering.node_id_allocation_size", INTEGER, "1024" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of RELATIONSHIP IDs. Larger values mean less frequent requests but also result in more unused IDs " + "(and unused disk space) in the event of a crash." ) public static final Setting relationship_id_allocation_size = - setting( "causal_clustering.relationship_id_allocation_size", INTEGER, "1024" ).build(); + setting( "causal_clustering.relationship_id_allocation_size", INTEGER, "1024" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of PROPERTY IDs. Larger values mean less frequent requests but also result in more unused IDs " + "(and unused disk space) in the event of a crash." ) public static final Setting property_id_allocation_size = - setting( "causal_clustering.property_id_allocation_size", INTEGER, "1024" ).build(); + setting( "causal_clustering.property_id_allocation_size", INTEGER, "1024" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of STRING_BLOCK IDs. Larger values mean less frequent requests but also result in more unused IDs " + "(and unused disk space) in the event of a crash." ) public static final Setting string_block_id_allocation_size = - setting( "causal_clustering.string_block_id_allocation_size", INTEGER, "1024" ).build(); + setting( "causal_clustering.string_block_id_allocation_size", INTEGER, "1024" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of ARRAY_BLOCK IDs. Larger values mean less frequent requests but also result in more unused IDs " + "(and unused disk space) in the event of a crash." ) public static final Setting array_block_id_allocation_size = - setting( "causal_clustering.array_block_id_allocation_size", INTEGER, "1024" ).build(); + setting( "causal_clustering.array_block_id_allocation_size", INTEGER, "1024" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of PROPERTY_KEY_TOKEN IDs. Larger values mean less frequent requests but also result in more unused IDs " + "(and unused disk space) in the event of a crash." ) public static final Setting property_key_token_id_allocation_size = - setting( "causal_clustering.property_key_token_id_allocation_size", INTEGER, "32" ).build(); + setting( "causal_clustering.property_key_token_id_allocation_size", INTEGER, "32" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of PROPERTY_KEY_TOKEN_NAME IDs. Larger values mean less frequent requests but also result in more " + "unused IDs (and unused disk space) in the event of a crash." ) public static final Setting property_key_token_name_id_allocation_size = - setting( "causal_clustering.property_key_token_name_id_allocation_size", INTEGER, "1024" ).build(); + setting( "causal_clustering.property_key_token_name_id_allocation_size", INTEGER, "1024" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of RELATIONSHIP_TYPE_TOKEN IDs. Larger values mean less frequent requests but also result in more " + "unused IDs (and unused disk space) in the event of a crash." ) public static final Setting relationship_type_token_id_allocation_size = - setting( "causal_clustering.relationship_type_token_id_allocation_size", INTEGER, "32" ).build(); + setting( "causal_clustering.relationship_type_token_id_allocation_size", INTEGER, "32" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of RELATIONSHIP_TYPE_TOKEN_NAME IDs. Larger values mean less frequent requests but also result in more " + "unused IDs (and unused disk space) in the event of a crash." ) public static final Setting relationship_type_token_name_id_allocation_size = - setting( "causal_clustering.relationship_type_token_name_id_allocation_size", INTEGER, "1024" ).build(); + setting( "causal_clustering.relationship_type_token_name_id_allocation_size", INTEGER, "1024" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of LABEL_TOKEN IDs. Larger values mean less frequent requests but also result in more " + "unused IDs (and unused disk space) in the event of a crash." ) public static final Setting label_token_id_allocation_size = - setting( "causal_clustering.label_token_id_allocation_size", INTEGER, "32" ).build(); + setting( "causal_clustering.label_token_id_allocation_size", INTEGER, "32" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of LABEL_TOKEN_NAME IDs. Larger values mean less frequent requests but also result in more " + "unused IDs (and unused disk space) in the event of a crash." ) public static final Setting label_token_name_id_allocation_size = - setting( "causal_clustering.label_token_name_id_allocation_size", INTEGER, "1024" ).build(); + setting( "causal_clustering.label_token_name_id_allocation_size", INTEGER, "1024" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of NEOSTORE_BLOCK IDs. Larger values mean less frequent requests but also result in more " + "unused IDs (and unused disk space) in the event of a crash." ) public static final Setting neostore_block_id_allocation_size = - setting( "causal_clustering.neostore_block_id_allocation_size", INTEGER, "1024" ).build(); + setting( "causal_clustering.neostore_block_id_allocation_size", INTEGER, "1024" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of SCHEMA IDs. Larger values mean less frequent requests but also result in more " + "unused IDs (and unused disk space) in the event of a crash." ) public static final Setting schema_id_allocation_size = - setting( "causal_clustering.schema_id_allocation_size", INTEGER, "1024" ).build(); + setting( "causal_clustering.schema_id_allocation_size", INTEGER, "1024" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of NODE_LABELS IDs. Larger values mean less frequent requests but also result in more " + "unused IDs (and unused disk space) in the event of a crash." ) public static final Setting node_labels_id_allocation_size = - setting( "causal_clustering.node_labels_id_allocation_size", INTEGER, "1024" ).build(); + setting( "causal_clustering.node_labels_id_allocation_size", INTEGER, "1024" ); @Description( "The size of the ID allocation requests Core servers will make when they run out " + "of RELATIONSHIP_GROUP IDs. Larger values mean less frequent requests but also result in more " + "unused IDs (and unused disk space) in the event of a crash." ) public static final Setting relationship_group_id_allocation_size = - setting( "causal_clustering.relationship_group_id_allocation_size", INTEGER, "1024" ).build(); + setting( "causal_clustering.relationship_group_id_allocation_size", INTEGER, "1024" ); @Description( "Time between scanning the cluster to refresh current server's view of topology" ) public static final Setting cluster_topology_refresh = - setting( "causal_clustering.cluster_topology_refresh", DURATION, "5s" ).constraint( min( Duration.ofSeconds( 1 ) ) ).build(); + buildSetting( "causal_clustering.cluster_topology_refresh", DURATION, "5s" ).constraint( min( Duration.ofSeconds( 1 ) ) ).build(); @Description( "An ordered list in descending preference of the strategy which read replicas use to choose " + "upstream database server from which to pull transactional updates." ) public static final Setting> upstream_selection_strategy = - setting( "causal_clustering.upstream_selection_strategy", list( ",", STRING ), "default" ).build(); + setting( "causal_clustering.upstream_selection_strategy", list( ",", STRING ), "default" ); @Description( "If the operator specifies the user-defined upstream database selection strategy in " + "causal_clustering.upstream_selection_strategy then the configuration of the upstream dependencies is " + "written here." ) public static final Setting user_defined_upstream_selection_strategy = - setting( "causal_clustering.user_defined_upstream_strategy", STRING, "" ).build(); + setting( "causal_clustering.user_defined_upstream_strategy", STRING, "" ); @Description( "A list of group names for the server used when configuring load balancing and replication policies." ) public static final Setting> server_groups = - setting( "causal_clustering.server_groups", list( ",", STRING ), "" ).build(); + setting( "causal_clustering.server_groups", list( ",", STRING ), "" ); @Description( "The load balancing plugin to use." ) public static final Setting load_balancing_plugin = - setting( "causal_clustering.load_balancing.plugin", STRING, "server_policies" ).build(); + setting( "causal_clustering.load_balancing.plugin", STRING, "server_policies" ); static BaseSetting prefixSetting( final String name, final Function parser, final String defaultValue ) @@ -407,15 +408,15 @@ public Map validate( Map rawConfig, Consumer load_balancing_shuffle = - setting( "causal_clustering.load_balancing.shuffle", BOOLEAN, TRUE ).build(); + setting( "causal_clustering.load_balancing.shuffle", BOOLEAN, TRUE ); @Description( "Require authorization for access to the Causal Clustering status endpoints." ) public static final Setting status_auth_enabled = - setting( "dbms.security.causal_clustering_status_auth_enabled", BOOLEAN, TRUE ).build(); + setting( "dbms.security.causal_clustering_status_auth_enabled", BOOLEAN, TRUE ); @Description( "Enable multi-data center features. Requires appropriate licensing." ) public static final Setting multi_dc_license = - setting( "causal_clustering.multi_dc_license", BOOLEAN, FALSE ).build(); + setting( "causal_clustering.multi_dc_license", BOOLEAN, FALSE ); @Description( "Name of the SSL policy to be used by the clustering, as defined under the dbms.ssl.policy.* settings." + " If no policy is configured then the communication will not be secured." ) diff --git a/enterprise/causal-clustering/src/main/java/org/neo4j/commandline/dbms/UnbindFromClusterCommand.java b/enterprise/causal-clustering/src/main/java/org/neo4j/commandline/dbms/UnbindFromClusterCommand.java index ad48dca346927..034a87226ffc0 100644 --- a/enterprise/causal-clustering/src/main/java/org/neo4j/commandline/dbms/UnbindFromClusterCommand.java +++ b/enterprise/causal-clustering/src/main/java/org/neo4j/commandline/dbms/UnbindFromClusterCommand.java @@ -60,7 +60,7 @@ static Arguments arguments() private static Config loadNeo4jConfig( Path homeDir, Path configDir, String databaseName ) { - return fromFile( configDir.resolve( "neo4j.conf" ) ) + return fromFile( configDir.resolve( Config.DEFAULT_CONFIG_FILE_NAME ) ) .withSetting( DatabaseManagementSystemSettings.active_database, databaseName ) .withHome( homeDir ).build(); } 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 1cdfa8484820e..85c6802d86c4b 100644 --- a/enterprise/cluster/src/main/java/org/neo4j/cluster/ClusterSettings.java +++ b/enterprise/cluster/src/main/java/org/neo4j/cluster/ClusterSettings.java @@ -28,6 +28,7 @@ import org.neo4j.configuration.LoadableConfig; import org.neo4j.graphdb.config.Setting; import org.neo4j.helpers.HostnamePort; +import org.neo4j.kernel.configuration.Settings; import static org.neo4j.kernel.configuration.Settings.ANY; import static org.neo4j.kernel.configuration.Settings.BOOLEAN; @@ -38,6 +39,7 @@ import static org.neo4j.kernel.configuration.Settings.NO_DEFAULT; import static org.neo4j.kernel.configuration.Settings.STRING; import static org.neo4j.kernel.configuration.Settings.TRUE; +import static org.neo4j.kernel.configuration.Settings.buildSetting; import static org.neo4j.kernel.configuration.Settings.illegalValueMessage; import static org.neo4j.kernel.configuration.Settings.list; import static org.neo4j.kernel.configuration.Settings.matches; @@ -86,26 +88,26 @@ public enum Mode "'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() ).build(); + 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 ).build(); + public static final Setting server_id = setting( "ha.server_id", INSTANCE_ID, NO_DEFAULT ); @Description( "The name of a cluster." ) @Internal - public static final Setting cluster_name = setting( "unsupported.ha.cluster_name", STRING, "neo4j.ha" ).constraint( + public static final Setting cluster_name = buildSetting( "unsupported.ha.cluster_name", STRING, "neo4j.ha" ).constraint( illegalValueMessage( "must be a valid cluster name", matches( ANY ) ) ).build(); @Description( "A comma-separated list of other members of the cluster to join." ) public static final Setting> initial_hosts = setting( "ha.initial_hosts", - list( ",", HOSTNAME_PORT ), NO_DEFAULT ).build(); + list( ",", HOSTNAME_PORT ), NO_DEFAULT ); @Description( "Host and port to bind the cluster management communication." ) public static final Setting cluster_server = setting( "ha.host.coordination", HOSTNAME_PORT, - "0.0.0.0:5001-5099" ).build(); + "0.0.0.0:5001-5099" ); @Description( "Whether to allow this instance to create a cluster if unable to join." ) - public static final Setting allow_init_cluster = setting( "ha.allow_init_cluster", BOOLEAN, TRUE ).build(); + public static final Setting allow_init_cluster = setting( "ha.allow_init_cluster", BOOLEAN, TRUE ); // Timeout settings @@ -117,10 +119,10 @@ public enum Mode @Description( "Default timeout used for clustering timeouts. Override specific timeout settings with proper" + " values if necessary. This value is the default value for the ha.heartbeat_interval," + " ha.paxos_timeout and ha.learn_timeout settings." ) - public static final Setting default_timeout = setting( "ha.default_timeout", DURATION, "5s" ).build(); + public static final Setting default_timeout = setting( "ha.default_timeout", DURATION, "5s" ); @Description( "How often heartbeat messages should be sent. Defaults to ha.default_timeout." ) - public static final Setting heartbeat_interval = setting( "ha.heartbeat_interval", DURATION ).inherits( + public static final Setting heartbeat_interval = buildSetting( "ha.heartbeat_interval", DURATION ).inherits( default_timeout ).build(); @Description( "How long to wait for heartbeats from other instances before marking them as suspects for failure. " + @@ -129,7 +131,7 @@ public enum Mode "stable masters but also will result in longer waits before a failover in case of master failure. This " + "value should not be set to less than twice the ha.heartbeat_interval value otherwise there is a high " + "risk of frequent master switches and possibly branched data occurrence." ) - public static final Setting heartbeat_timeout = setting( "ha.heartbeat_timeout", DURATION, "40s" ).build(); + public static final Setting heartbeat_timeout = setting( "ha.heartbeat_timeout", DURATION, "40s" ); /* * ha.join_timeout @@ -137,17 +139,17 @@ public enum Mode */ @Description( "Timeout for broadcasting values in cluster. Must consider end-to-end duration of Paxos algorithm." + " This value is the default value for the ha.join_timeout and ha.leave_timeout settings." ) - public static final Setting broadcast_timeout = setting( "ha.broadcast_timeout", DURATION, "30s" ).build(); + public static final Setting broadcast_timeout = setting( "ha.broadcast_timeout", DURATION, "30s" ); @Description( "Timeout for joining a cluster. Defaults to ha.broadcast_timeout. " + "Note that if the timeout expires during cluster formation, the operator may have to restart the instance or instances." ) - public static final Setting join_timeout = setting( "ha.join_timeout", DURATION ).inherits( broadcast_timeout ).build(); + public static final Setting join_timeout = buildSetting( "ha.join_timeout", DURATION ).inherits( broadcast_timeout ).build(); @Description( "Timeout for waiting for configuration from an existing cluster member during cluster join." ) - public static final Setting configuration_timeout = setting( "ha.configuration_timeout", DURATION, "1s" ).build(); + public static final Setting configuration_timeout = setting( "ha.configuration_timeout", DURATION, "1s" ); @Description( "Timeout for waiting for cluster leave to finish. Defaults to ha.broadcast_timeout." ) - public static final Setting leave_timeout = setting( "ha.leave_timeout", DURATION ).inherits( broadcast_timeout ).build(); + public static final Setting leave_timeout = buildSetting( "ha.leave_timeout", DURATION ).inherits( broadcast_timeout ).build(); /* * ha.phase1_timeout @@ -158,33 +160,33 @@ public enum Mode "ha.phase2_timeout and ha.election_timeout settings. If it is not given a value it " + "defaults to ha.default_timeout and will implicitly change if ha.default_timeout changes. This is an " + "advanced parameter which should only be changed if specifically advised by Neo4j Professional Services." ) - public static final Setting paxos_timeout = setting( "ha.paxos_timeout", DURATION ).inherits( default_timeout ).build(); + public static final Setting paxos_timeout = buildSetting( "ha.paxos_timeout", DURATION ).inherits( default_timeout ).build(); @Description( "Timeout for Paxos phase 1. If it is not given a value it defaults to ha.paxos_timeout and will " + "implicitly change if ha.paxos_timeout changes. This is an advanced parameter which should only be " + "changed if specifically advised by Neo4j Professional Services. " ) - public static final Setting phase1_timeout = setting( "ha.phase1_timeout", DURATION ).inherits( paxos_timeout ).build(); + public static final Setting phase1_timeout = buildSetting( "ha.phase1_timeout", DURATION ).inherits( paxos_timeout ).build(); @Description( "Timeout for Paxos phase 2. If it is not given a value it defaults to ha.paxos_timeout and will " + "implicitly change if ha.paxos_timeout changes. This is an advanced parameter which should only be " + "changed if specifically advised by Neo4j Professional Services. " ) - public static final Setting phase2_timeout = setting( "ha.phase2_timeout", DURATION ).inherits( paxos_timeout ).build(); + public static final Setting phase2_timeout = buildSetting( "ha.phase2_timeout", DURATION ).inherits( paxos_timeout ).build(); @Description( "Timeout for learning values. Defaults to ha.default_timeout." ) - public static final Setting learn_timeout = setting( "ha.learn_timeout", DURATION ).inherits( default_timeout ).build(); + public static final Setting learn_timeout = buildSetting( "ha.learn_timeout", DURATION ).inherits( default_timeout ).build(); @Description( "Timeout for waiting for other members to finish a role election. Defaults to ha.paxos_timeout." ) - public static final Setting election_timeout = setting( "ha.election_timeout", DURATION ).inherits( paxos_timeout ).build(); + public static final Setting election_timeout = buildSetting( "ha.election_timeout", DURATION ).inherits( paxos_timeout ).build(); @Internal - public static final Setting instance_name = setting("unsupported.ha.instance_name", STRING ).build(); + public static final Setting instance_name = setting("unsupported.ha.instance_name", STRING, Settings.NO_DEFAULT ); @Description( "Maximum number of servers to involve when agreeing to membership changes. " + "In very large clusters, the probability of half the cluster failing is low, but protecting against " + "any arbitrary half failing is expensive. Therefore you may wish to set this parameter to a value less " + "than the cluster size." ) - public static final Setting max_acceptors = setting( "ha.max_acceptors", INTEGER, "21" ).constraint( min( 1 ) ).build(); + public static final Setting max_acceptors = buildSetting( "ha.max_acceptors", INTEGER, "21" ).constraint( min( 1 ) ).build(); @Internal - public static final Setting strict_initial_hosts = setting( "ha.strict_initial_hosts", BOOLEAN, FALSE).build(); + public static final Setting strict_initial_hosts = setting( "ha.strict_initial_hosts", BOOLEAN, FALSE); } diff --git a/enterprise/deferred-locks/src/main/java/org/neo4j/kernel/impl/locking/DeferringStatementLocksFactory.java b/enterprise/deferred-locks/src/main/java/org/neo4j/kernel/impl/locking/DeferringStatementLocksFactory.java index e7c6372e598f2..5491ec9e762bd 100644 --- a/enterprise/deferred-locks/src/main/java/org/neo4j/kernel/impl/locking/DeferringStatementLocksFactory.java +++ b/enterprise/deferred-locks/src/main/java/org/neo4j/kernel/impl/locking/DeferringStatementLocksFactory.java @@ -39,7 +39,7 @@ public class DeferringStatementLocksFactory implements StatementLocksFactory, Lo @Description( "Enable deferring of locks to commit time. This feature weakens the isolation level. " + "It can result in both domain and storage level inconsistencies." ) public static final Setting deferred_locks_enabled = - setting( "unsupported.dbms.deferred_locks.enabled", Settings.BOOLEAN, Settings.FALSE ).build(); + setting( "unsupported.dbms.deferred_locks.enabled", Settings.BOOLEAN, Settings.FALSE ); private Locks locks; private boolean deferredLocksEnabled; diff --git a/enterprise/ha/src/main/java/org/neo4j/graphdb/factory/HighlyAvailableGraphDatabaseFactory.java b/enterprise/ha/src/main/java/org/neo4j/graphdb/factory/HighlyAvailableGraphDatabaseFactory.java index 71d767867832a..56ad9c7d9d20f 100644 --- a/enterprise/ha/src/main/java/org/neo4j/graphdb/factory/HighlyAvailableGraphDatabaseFactory.java +++ b/enterprise/ha/src/main/java/org/neo4j/graphdb/factory/HighlyAvailableGraphDatabaseFactory.java @@ -28,6 +28,7 @@ import org.neo4j.kernel.ha.HaSettings; import org.neo4j.kernel.ha.HighlyAvailableGraphDatabase; import org.neo4j.kernel.impl.factory.Edition; +import org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory; import static java.util.Arrays.asList; @@ -65,7 +66,7 @@ public GraphDatabaseService newDatabase( Map config ) @Override public GraphDatabaseService newDatabase( Config config ) { - config.augment( "unsupported.dbms.ephemeral", "false" ); + config.augment( GraphDatabaseFacadeFactory.Configuration.ephemeral, "false" ); return new HighlyAvailableGraphDatabase( storeDir, config, state.databaseDependencies() ); } }; diff --git a/enterprise/ha/src/main/java/org/neo4j/kernel/ha/HaSettings.java b/enterprise/ha/src/main/java/org/neo4j/kernel/ha/HaSettings.java index 5407024d0ba47..50bef82aea09d 100644 --- a/enterprise/ha/src/main/java/org/neo4j/kernel/ha/HaSettings.java +++ b/enterprise/ha/src/main/java/org/neo4j/kernel/ha/HaSettings.java @@ -35,6 +35,7 @@ import static org.neo4j.kernel.configuration.Settings.DURATION; import static org.neo4j.kernel.configuration.Settings.HOSTNAME_PORT; import static org.neo4j.kernel.configuration.Settings.INTEGER; +import static org.neo4j.kernel.configuration.Settings.buildSetting; import static org.neo4j.kernel.configuration.Settings.min; import static org.neo4j.kernel.configuration.Settings.options; import static org.neo4j.kernel.configuration.Settings.setting; @@ -52,52 +53,52 @@ public class HaSettings implements LoadableConfig private static final ConfigurationMigrator migrator = new EnterpriseConfigurationMigrator(); @Description( "How long a slave will wait for response from master before giving up." ) - public static final Setting read_timeout = setting( "ha.slave_read_timeout", DURATION, "20s" ).build(); + public static final Setting read_timeout = setting( "ha.slave_read_timeout", DURATION, "20s" ); @Description( "Timeout for request threads waiting for instance to become master or slave." ) - public static final Setting state_switch_timeout = setting( "ha.role_switch_timeout", DURATION, "120s" ).build(); + public static final Setting state_switch_timeout = setting( "ha.role_switch_timeout", DURATION, "120s" ); @Description( "Timeout for waiting for internal conditions during state switch, like for transactions " + "to complete, before switching to master or slave." ) public static final Setting internal_state_switch_timeout = - setting( "ha.internal_role_switch_timeout", DURATION, "10s" ).build(); + setting( "ha.internal_role_switch_timeout", DURATION, "10s" ); @Description( "Timeout for taking remote (write) locks on slaves. Defaults to ha.slave_read_timeout." ) - public static final Setting lock_read_timeout = setting( "ha.slave_lock_timeout", DURATION ).inherits( read_timeout ).build(); + public static final Setting lock_read_timeout = buildSetting( "ha.slave_lock_timeout", DURATION ).inherits( read_timeout ).build(); @Description( "Maximum number of connections a slave can have to the master." ) public static final Setting max_concurrent_channels_per_slave = - setting( "ha.max_channels_per_slave", INTEGER, "20" ).constraint( min( 1 ) ).build(); + buildSetting( "ha.max_channels_per_slave", INTEGER, "20" ).constraint( min( 1 ) ).build(); @Description( "Hostname and port to bind the HA server." ) - public static final Setting ha_server = setting( "ha.host.data", HOSTNAME_PORT, "0.0.0.0:6001-6011" ).build(); + public static final Setting ha_server = setting( "ha.host.data", HOSTNAME_PORT, "0.0.0.0:6001-6011" ); @Description( "Whether this instance should only participate as slave in cluster. " + "If set to `true`, it will never be elected as master." ) - public static final Setting slave_only = setting( "ha.slave_only", BOOLEAN, Settings.FALSE ).build(); + public static final Setting slave_only = setting( "ha.slave_only", BOOLEAN, Settings.FALSE ); @Description( "Policy for how to handle branched data." ) public static final Setting branched_data_policy = setting( "ha.branched_data_policy", - options( BranchedDataPolicy.class ), "keep_all" ).build(); + options( BranchedDataPolicy.class ), "keep_all" ); @Description( "Require authorization for access to the HA status endpoints." ) public static final Setting ha_status_auth_enabled = - setting( "dbms.security.ha_status_auth_enabled", BOOLEAN, Settings.TRUE ).build(); + setting( "dbms.security.ha_status_auth_enabled", BOOLEAN, Settings.TRUE ); @Description( "Max size of the data chunks that flows between master and slaves in HA. Bigger size may increase " + "throughput, but may also be more sensitive to variations in bandwidth, whereas lower size increases " + "tolerance for bandwidth variations." ) - public static final Setting com_chunk_size = setting( "ha.data_chunk_size", BYTES, "2M" ).constraint( min( 1024L ) ).build(); + public static final Setting com_chunk_size = buildSetting( "ha.data_chunk_size", BYTES, "2M" ).constraint( min( 1024L ) ).build(); @Description( "Interval of pulling updates from master." ) - public static final Setting pull_interval = setting( "ha.pull_interval", DURATION, "0s" ).build(); + public static final Setting pull_interval = setting( "ha.pull_interval", DURATION, "0s" ); @Description( "The amount of slaves the master will ask to replicate a committed transaction. " ) - public static final Setting tx_push_factor = setting( "ha.tx_push_factor", INTEGER, "1" ).constraint( min( 0 ) ).build(); + public static final Setting tx_push_factor = buildSetting( "ha.tx_push_factor", INTEGER, "1" ).constraint( min( 0 ) ).build(); @Description( "Push strategy of a transaction to a slave during commit." ) public static final Setting tx_push_strategy = - setting( "ha.tx_push_strategy", options( TxPushStrategy.class ), fixed_ascending.name() ).build(); + setting( "ha.tx_push_strategy", options( TxPushStrategy.class ), fixed_ascending.name() ); @Description( "Strategy for how to order handling of branched data on slaves and copying of the store from the" + " master. The default is copy_then_branch, which, when combined with the keep_last or keep_none branch" + @@ -105,10 +106,10 @@ public class HaSettings implements LoadableConfig " failure to copy a store (for example, because of network failure) does not leave the instance without" + " a store." ) public static final Setting branched_data_copying_strategy = - setting( "ha.branched_data_copying_strategy", options( BranchedDataCopyingStrategy.class ), branch_then_copy.name() ).build(); + setting( "ha.branched_data_copying_strategy", options( BranchedDataCopyingStrategy.class ), branch_then_copy.name() ); @Description( "Size of batches of transactions applied on slaves when pulling from master" ) - public static final Setting pull_apply_batch_size = setting( "ha.pull_batch_size", INTEGER, "100" ).build(); + public static final Setting pull_apply_batch_size = setting( "ha.pull_batch_size", INTEGER, "100" ); @Description( "Duration for which master will buffer ids and not reuse them to allow slaves read " + "consistently. Slaves will also terminate transactions longer than this duration, when " + @@ -116,7 +117,7 @@ public class HaSettings implements LoadableConfig "inconsistent/reused records." ) @Internal public static final Setting id_reuse_safe_zone_time = setting( "unsupported.dbms.id_reuse_safe_zone", - Settings.DURATION, "1h" ).build(); + Settings.DURATION, "1h" ); public enum BranchedDataCopyingStrategy { diff --git a/enterprise/ha/src/test/java/jmx/HaBeanIT.java b/enterprise/ha/src/test/java/jmx/HaBeanIT.java index b92474ae52069..ca69587bd2ecb 100644 --- a/enterprise/ha/src/test/java/jmx/HaBeanIT.java +++ b/enterprise/ha/src/test/java/jmx/HaBeanIT.java @@ -29,6 +29,7 @@ import org.neo4j.helpers.collection.Iterables; import org.neo4j.jmx.Kernel; import org.neo4j.jmx.impl.JmxKernelExtension; +import org.neo4j.kernel.configuration.Settings; import org.neo4j.kernel.ha.HaSettings; import org.neo4j.kernel.ha.HighlyAvailableGraphDatabase; import org.neo4j.kernel.ha.cluster.modeswitch.HighAvailabilityModeSwitcher; @@ -54,7 +55,7 @@ public class HaBeanIT { @Rule public final ClusterRule clusterRule = new ClusterRule( HaBeanIT.class ) - .withInstanceSetting( setting( "jmx.port", STRING ).build(), intBase( 9912 ) ) + .withInstanceSetting( setting( "jmx.port", STRING, Settings.NO_DEFAULT ), intBase( 9912 ) ) .withInstanceSetting( HaSettings.ha_server, stringWithIntBase( ":", 1136 ) ) .withInstanceSetting( GraphDatabaseSettings.forced_kernel_id, stringWithIntBase( "kernel", 0 ) ); diff --git a/enterprise/kernel/src/main/java/org/neo4j/graphdb/factory/EnterpriseGraphDatabaseFactory.java b/enterprise/kernel/src/main/java/org/neo4j/graphdb/factory/EnterpriseGraphDatabaseFactory.java index 8f652918f7f74..8ecc6abb780f5 100644 --- a/enterprise/kernel/src/main/java/org/neo4j/graphdb/factory/EnterpriseGraphDatabaseFactory.java +++ b/enterprise/kernel/src/main/java/org/neo4j/graphdb/factory/EnterpriseGraphDatabaseFactory.java @@ -26,6 +26,7 @@ import org.neo4j.kernel.configuration.Config; import org.neo4j.kernel.enterprise.EnterpriseGraphDatabase; import org.neo4j.kernel.impl.factory.Edition; +import org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory; import static org.neo4j.kernel.configuration.Settings.FALSE; @@ -51,7 +52,7 @@ public GraphDatabaseService newDatabase( Map config ) @Override public GraphDatabaseService newDatabase( Config config ) { - config.augment( "unsupported.dbms.ephemeral", FALSE ); + config.augment( GraphDatabaseFacadeFactory.Configuration.ephemeral, FALSE ); return new EnterpriseGraphDatabase( storeDir, config, state.databaseDependencies() ); 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 73b2eb5f96d11..074e9eafb66f4 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 @@ -45,9 +45,9 @@ public class EnterpriseEditionSettings implements LoadableConfig "Currently only 'node' and 'relationship' types are supported. " ) public static Setting> idTypesToReuse = setting( "dbms.ids.reuse.types.override", list( ",", optionsIgnoreCase( NODE, RELATIONSHIP ) ), - String.join( ",", IdType.RELATIONSHIP.name(), IdType.NODE.name() ) ).build(); + String.join( ",", IdType.RELATIONSHIP.name(), IdType.NODE.name() ) ); @Internal public static final Setting security_module = setting( "unsupported.dbms.security.module", STRING, - ENTERPRISE_SECURITY_MODULE_ID ).build(); + ENTERPRISE_SECURITY_MODULE_ID ); } diff --git a/enterprise/kernel/src/test/java/org/neo4j/test/TestEnterpriseGraphDatabaseFactory.java b/enterprise/kernel/src/test/java/org/neo4j/test/TestEnterpriseGraphDatabaseFactory.java index d140244a56bab..72fa9b30986c1 100644 --- a/enterprise/kernel/src/test/java/org/neo4j/test/TestEnterpriseGraphDatabaseFactory.java +++ b/enterprise/kernel/src/test/java/org/neo4j/test/TestEnterpriseGraphDatabaseFactory.java @@ -50,7 +50,7 @@ protected GraphDatabaseBuilder.DatabaseCreator createDatabaseCreator( File store { Config config = Config.builder() .withSettings( params ) - .withSetting( "unsupported.dbms.ephemeral", "false" ).build(); + .withSetting( GraphDatabaseFacadeFactory.Configuration.ephemeral, "false" ).build(); return new GraphDatabaseFacadeFactory( DatabaseInfo.ENTERPRISE, EnterpriseEditionModule::new ) { @Override diff --git a/enterprise/metrics/src/main/java/org/neo4j/metrics/MetricsSettings.java b/enterprise/metrics/src/main/java/org/neo4j/metrics/MetricsSettings.java index 04f0184fba091..715176af71226 100644 --- a/enterprise/metrics/src/main/java/org/neo4j/metrics/MetricsSettings.java +++ b/enterprise/metrics/src/main/java/org/neo4j/metrics/MetricsSettings.java @@ -32,6 +32,7 @@ import static org.neo4j.kernel.configuration.Settings.FALSE; import static org.neo4j.kernel.configuration.Settings.HOSTNAME_PORT; import static org.neo4j.kernel.configuration.Settings.STRING; +import static org.neo4j.kernel.configuration.Settings.buildSetting; import static org.neo4j.kernel.configuration.Settings.pathSetting; import static org.neo4j.kernel.configuration.Settings.setting; @@ -44,82 +45,82 @@ public class MetricsSettings implements LoadableConfig // Common settings @Description( "A common prefix for the reported metrics field names. By default, this is either be 'neo4j', " + "or a computed value based on the cluster and instance names, when running in an HA configuration." ) - public static Setting metricsPrefix = setting( "metrics.prefix", STRING, "neo4j" ).build(); + public static Setting metricsPrefix = setting( "metrics.prefix", STRING, "neo4j" ); // The below settings define what metrics to gather // By default everything is on @Description( "The default enablement value for all the supported metrics. Set this to `false` to turn off all " + "metrics by default. The individual settings can then be used to selectively re-enable specific " + "metrics." ) - public static Setting metricsEnabled = setting( "metrics.enabled", BOOLEAN, FALSE ).build(); + public static Setting metricsEnabled = setting( "metrics.enabled", BOOLEAN, FALSE ); @Description( "The default enablement value for all Neo4j specific support metrics. Set this to `false` to turn " + "off all Neo4j specific metrics by default. The individual `metrics.neo4j.*` metrics can then be " + "turned on selectively." ) - public static Setting neoEnabled = setting( "metrics.neo4j.enabled", BOOLEAN ).inherits( metricsEnabled ).build(); + public static Setting neoEnabled = buildSetting( "metrics.neo4j.enabled", BOOLEAN ).inherits( metricsEnabled ).build(); @Description( "Enable reporting metrics about transactions; number of transactions started, committed, etc." ) - public static Setting neoTxEnabled = setting( "metrics.neo4j.tx.enabled", BOOLEAN ).inherits( neoEnabled ).build(); + public static Setting neoTxEnabled = buildSetting( "metrics.neo4j.tx.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about the Neo4j page cache; page faults, evictions, flushes, exceptions, " + "etc." ) - public static Setting neoPageCacheEnabled = setting( + public static Setting neoPageCacheEnabled = buildSetting( "metrics.neo4j.pagecache.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about approximately how many entities are in the database; nodes, " + "relationships, properties, etc." ) - public static Setting neoCountsEnabled = setting( + public static Setting neoCountsEnabled = buildSetting( "metrics.neo4j.counts.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about the network usage." ) - public static Setting neoNetworkEnabled = setting( + public static Setting neoNetworkEnabled = buildSetting( "metrics.neo4j.network.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about Causal Clustering mode." ) - public static Setting causalClusteringEnabled = setting( + public static Setting causalClusteringEnabled = buildSetting( "metrics.neo4j.causal_clustering.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about Neo4j check pointing; when it occurs and how much time it takes to " + "complete." ) - public static Setting neoCheckPointingEnabled = setting( + public static Setting neoCheckPointingEnabled = buildSetting( "metrics.neo4j.checkpointing.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about the Neo4j log rotation; when it occurs and how much time it takes to " + "complete." ) - public static Setting neoLogRotationEnabled = setting( + public static Setting neoLogRotationEnabled = buildSetting( "metrics.neo4j.logrotation.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about HA cluster info." ) - public static Setting neoClusterEnabled = setting( + public static Setting neoClusterEnabled = buildSetting( "metrics.neo4j.cluster.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about Server threading info." ) - public static Setting neoServerEnabled = setting( + public static Setting neoServerEnabled = buildSetting( "metrics.neo4j.server.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about the duration of garbage collections" ) public static Setting jvmGcEnabled = - setting( "metrics.jvm.gc.enabled", BOOLEAN ).inherits( neoEnabled ).build(); + buildSetting( "metrics.jvm.gc.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about the memory usage." ) - public static Setting jvmMemoryEnabled = setting( "metrics.jvm.memory.enabled", BOOLEAN ).inherits( neoEnabled ).build(); + public static Setting jvmMemoryEnabled = buildSetting( "metrics.jvm.memory.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about the buffer pools." ) - public static Setting jvmBuffersEnabled = setting( "metrics.jvm.buffers.enabled", BOOLEAN ).inherits( neoEnabled ).build(); + public static Setting jvmBuffersEnabled = buildSetting( "metrics.jvm.buffers.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about the current number of threads running." ) - public static Setting jvmThreadsEnabled = setting( "metrics.jvm.threads.enabled", BOOLEAN ).inherits( neoEnabled ).build(); + public static Setting jvmThreadsEnabled = buildSetting( "metrics.jvm.threads.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about number of occurred replanning events." ) public static Setting cypherPlanningEnabled = - setting( "metrics.cypher.replanning.enabled", BOOLEAN ).inherits( neoEnabled ).build(); + buildSetting( "metrics.cypher.replanning.enabled", BOOLEAN ).inherits( neoEnabled ).build(); @Description( "Enable reporting metrics about Bolt Protocol message processing." ) - public static Setting boltMessagesEnabled = setting( "metrics.bolt.messages.enabled", BOOLEAN ).inherits( neoEnabled ).build(); + public static Setting boltMessagesEnabled = buildSetting( "metrics.bolt.messages.enabled", BOOLEAN ).inherits( neoEnabled ).build(); // CSV settings @Description( "Set to `true` to enable exporting metrics to CSV files" ) - public static Setting csvEnabled = setting( "metrics.csv.enabled", BOOLEAN, FALSE ).build(); + public static Setting csvEnabled = setting( "metrics.csv.enabled", BOOLEAN, FALSE ); @Description( "The target location of the CSV files: a path to a directory wherein a CSV file per reported " + "field will be written." ) @@ -127,15 +128,15 @@ public class MetricsSettings implements LoadableConfig @Description( "The reporting interval for the CSV files. That is, how often new rows with numbers are appended to " + "the CSV files." ) - public static Setting csvInterval = setting( "metrics.csv.interval", DURATION, "3s" ).build(); + public static Setting csvInterval = setting( "metrics.csv.interval", DURATION, "3s" ); // Graphite settings @Description( "Set to `true` to enable exporting metrics to Graphite." ) - public static Setting graphiteEnabled = setting( "metrics.graphite.enabled", BOOLEAN, FALSE ).build(); + public static Setting graphiteEnabled = setting( "metrics.graphite.enabled", BOOLEAN, FALSE ); @Description( "The hostname or IP address of the Graphite server" ) - public static Setting graphiteServer = setting( "metrics.graphite.server", HOSTNAME_PORT, ":2003" ).build(); + public static Setting graphiteServer = setting( "metrics.graphite.server", HOSTNAME_PORT, ":2003" ); @Description( "The reporting interval for Graphite. That is, how often to send updated metrics to Graphite." ) - public static Setting graphiteInterval = setting( "metrics.graphite.interval", DURATION, "3s" ).build(); + public static Setting graphiteInterval = setting( "metrics.graphite.interval", DURATION, "3s" ); } diff --git a/enterprise/security/src/main/java/org/neo4j/server/security/enterprise/configuration/SecuritySettings.java b/enterprise/security/src/main/java/org/neo4j/server/security/enterprise/configuration/SecuritySettings.java index 25cf02c468eb6..18cd0c4f96ec5 100644 --- a/enterprise/security/src/main/java/org/neo4j/server/security/enterprise/configuration/SecuritySettings.java +++ b/enterprise/security/src/main/java/org/neo4j/server/security/enterprise/configuration/SecuritySettings.java @@ -40,6 +40,7 @@ import static org.neo4j.kernel.configuration.Settings.PATH; import static org.neo4j.kernel.configuration.Settings.STRING; import static org.neo4j.kernel.configuration.Settings.STRING_LIST; +import static org.neo4j.kernel.configuration.Settings.buildSetting; import static org.neo4j.kernel.configuration.Settings.derivedSetting; import static org.neo4j.kernel.configuration.Settings.min; import static org.neo4j.kernel.configuration.Settings.options; @@ -67,7 +68,7 @@ public class SecuritySettings implements LoadableConfig "or it can be an externally provided plugin, with a custom name prefixed by `" + PLUGIN_REALM_NAME_PREFIX + "`, i.e. `" + PLUGIN_REALM_NAME_PREFIX + "`." ) public static final Setting auth_provider = - setting( "dbms.security.auth_provider", STRING, NATIVE_REALM_NAME ).build(); + setting( "dbms.security.auth_provider", STRING, NATIVE_REALM_NAME ); @Description( "A list of security authentication and authorization providers containing the users and roles. " + "They will be queried in the given order when login is attempted." ) @@ -125,13 +126,13 @@ public class SecuritySettings implements LoadableConfig "NOTE: You may want to consider using STARTTLS (`dbms.security.ldap.use_starttls`) instead of LDAPS " + "for secure connections, in which case the correct protocol is `ldap`." ) public static final Setting ldap_server = - setting( "dbms.security.ldap.host", STRING, "localhost" ).build(); + setting( "dbms.security.ldap.host", STRING, "localhost" ); @Description( "Use secure communication with the LDAP server using opportunistic TLS. " + "First an initial insecure connection will be made with the LDAP server, and a STARTTLS command will be " + "issued to negotiate an upgrade of the connection to TLS before initiating authentication." ) public static final Setting ldap_use_starttls = - setting( "dbms.security.ldap.use_starttls", BOOLEAN, FALSE ).build(); + setting( "dbms.security.ldap.use_starttls", BOOLEAN, FALSE ); @Description( "The LDAP referral behavior when creating a connection. This is one of `follow`, `ignore` or `throw`.\n" + @@ -139,18 +140,18 @@ public class SecuritySettings implements LoadableConfig "* `ignore` ignores any referrals\n" + "* `throw` throws an exception, which will lead to authentication failure" ) public static final Setting ldap_referral = - setting( "dbms.security.ldap.referral", STRING, "follow" ).build(); + setting( "dbms.security.ldap.referral", STRING, "follow" ); @Description( "The timeout for establishing an LDAP connection. If a connection with the LDAP server cannot be " + "established within the given time the attempt is aborted. " + "A value of 0 means to use the network protocol's (i.e., TCP's) timeout value." ) public static Setting ldap_connection_timeout = - setting( "dbms.security.ldap.connection_timeout", DURATION, "30s" ).build(); + setting( "dbms.security.ldap.connection_timeout", DURATION, "30s" ); @Description( "The timeout for an LDAP read request (i.e. search). If the LDAP server does not respond within " + "the given time the request will be aborted. A value of 0 means wait for a response indefinitely." ) public static Setting ldap_read_timeout = - setting( "dbms.security.ldap.read_timeout", DURATION, "30s" ).build(); + setting( "dbms.security.ldap.read_timeout", DURATION, "30s" ); //----------------------------------------------------- // LDAP authentication settings @@ -161,7 +162,7 @@ public class SecuritySettings implements LoadableConfig " and password authentication and SASL is used for more advanced mechanisms. See RFC 2251 LDAPv3 " + "documentation for more details." ) public static final Setting ldap_authentication_mechanism = - setting( "dbms.security.ldap.authentication.mechanism", STRING, "simple" ).build(); + setting( "dbms.security.ldap.authentication.mechanism", STRING, "simple" ); @Description( "LDAP user DN template. An LDAP object is referenced by its distinguished name (DN), and a user DN is " + @@ -170,7 +171,7 @@ public class SecuritySettings implements LoadableConfig "authentication token when logging in. The special token {0} is a " + "placeholder where the user principal will be substituted into the DN string." ) public static final Setting ldap_authentication_user_dn_template = - setting( "dbms.security.ldap.authentication.user_dn_template", STRING, "uid={0},ou=users,dc=example,dc=com" ).build(); + setting( "dbms.security.ldap.authentication.user_dn_template", STRING, "uid={0},ou=users,dc=example,dc=com" ); @Description( "Determines if the result of authentication via the LDAP server should be cached or not. " + "Caching is used to limit the number of LDAP requests that have to be made over the network " + @@ -183,7 +184,7 @@ public class SecuritySettings implements LoadableConfig "Preferably a conscious decision should be made if this method is considered acceptable by " + "the security standards of the organization in which this Neo4j instance is deployed." ) public static final Setting ldap_authentication_cache_enabled = - setting( "dbms.security.ldap.authentication.cache_enabled", BOOLEAN, "true" ).build(); + setting( "dbms.security.ldap.authentication.cache_enabled", BOOLEAN, "true" ); @Description( "Perform authentication with sAMAccountName instead of DN.\n" + "Using this setting requires `dbms.security.ldap.authorization.system_username` and " + @@ -191,7 +192,7 @@ public class SecuritySettings implements LoadableConfig "through ldap directly with the sAMAccountName, instead the login name will be resolved to a DN " + "that will be used to log in with." ) public static final Setting ldap_authentication_use_samaccountname = - setting( "dbms.security.ldap.authentication.use_samaccountname", BOOLEAN, FALSE ).build(); + setting( "dbms.security.ldap.authentication.use_samaccountname", BOOLEAN, FALSE ); //----------------------------------------------------- // LDAP authorization settings @@ -213,7 +214,7 @@ public class SecuritySettings implements LoadableConfig "Note that this account only needs read access to the relevant parts of the LDAP directory " + "and does not need to have access rights to Neo4j, or any other systems." ) public static final Setting ldap_authorization_use_system_account = - setting( "dbms.security.ldap.authorization.use_system_account", BOOLEAN, FALSE ).build(); + setting( "dbms.security.ldap.authorization.use_system_account", BOOLEAN, FALSE ); @Description( "An LDAP system account username to use for authorization searches when " + @@ -221,30 +222,30 @@ public class SecuritySettings implements LoadableConfig "Note that the `dbms.security.ldap.authentication.user_dn_template` will not be applied to " + "this username, so you may have to specify a full DN." ) public static final Setting ldap_authorization_system_username = - setting( "dbms.security.ldap.authorization.system_username", STRING, NO_DEFAULT ).build(); + setting( "dbms.security.ldap.authorization.system_username", STRING, NO_DEFAULT ); @Description( "An LDAP system account password to use for authorization searches when " + "`dbms.security.ldap.authorization.use_system_account` is `true`." ) public static final Setting ldap_authorization_system_password = - setting( "dbms.security.ldap.authorization.system_password", STRING, NO_DEFAULT ).build(); + setting( "dbms.security.ldap.authorization.system_password", STRING, NO_DEFAULT ); @Description( "The name of the base object or named context to search for user objects when " + "LDAP authorization is enabled. A common case is that this matches the last part " + "of `dbms.security.ldap.authentication.user_dn_template`." ) public static final Setting ldap_authorization_user_search_base = - setting( "dbms.security.ldap.authorization.user_search_base", STRING, "ou=users,dc=example,dc=com" ).build(); + setting( "dbms.security.ldap.authorization.user_search_base", STRING, "ou=users,dc=example,dc=com" ); @Description( "The LDAP search filter to search for a user principal when LDAP authorization is " + "enabled. The filter should contain the placeholder token {0} which will be substituted for the " + "user principal." ) public static final Setting ldap_authorization_user_search_filter = - setting( "dbms.security.ldap.authorization.user_search_filter", STRING, "(&(objectClass=*)(uid={0}))" ).build(); + setting( "dbms.security.ldap.authorization.user_search_filter", STRING, "(&(objectClass=*)(uid={0}))" ); @Description( "A list of attribute names on a user object that contains groups to be used for mapping to roles " + "when LDAP authorization is enabled." ) public static final Setting> ldap_authorization_group_membership_attribute_names = - setting( "dbms.security.ldap.authorization.group_membership_attributes", STRING_LIST, "memberOf" ).build(); + setting( "dbms.security.ldap.authorization.group_membership_attributes", STRING_LIST, "memberOf" ); @Description( "An authorization mapping from LDAP group names to Neo4j role names. " + "The map should be formatted as a semicolon separated list of key-value pairs, where the " + @@ -257,7 +258,7 @@ public class SecuritySettings implements LoadableConfig " \"cn=Neo4j Schema Manager,cn=users,dc=example,dc=com\" = architect; \\\n" + " \"cn=Neo4j Administrator,cn=users,dc=example,dc=com\" = admin" ) public static final Setting ldap_authorization_group_to_role_mapping = - setting( "dbms.security.ldap.authorization.group_to_role_mapping", STRING, NO_DEFAULT ).build(); + setting( "dbms.security.ldap.authorization.group_to_role_mapping", STRING, NO_DEFAULT ); //========================================================================= // Cache settings @@ -268,11 +269,11 @@ public class SecuritySettings implements LoadableConfig "Disabling caching while using the LDAP auth provider requires the use of an LDAP system account " + "for resolving authorization information." ) public static final Setting auth_cache_ttl = - setting( "dbms.security.auth_cache_ttl", DURATION, "10m" ).build(); + setting( "dbms.security.auth_cache_ttl", DURATION, "10m" ); @Description( "The maximum capacity for authentication and authorization caches (respectively)." ) public static final Setting auth_cache_max_capacity = - setting( "dbms.security.auth_cache_max_capacity", INTEGER, "10000" ).build(); + setting( "dbms.security.auth_cache_max_capacity", INTEGER, "10000" ); //========================================================================= // Security log settings @@ -286,26 +287,26 @@ public class SecuritySettings implements LoadableConfig @Description( "Security log level threshold." ) public static final Setting security_log_level = setting( "dbms.logs.security.level", - options( Level.class ), "INFO" ).build(); + options( Level.class ), "INFO" ); @Description( "Set to log successful authentication events to the security log. " + "If this is set to `false` only failed authentication events will be logged, which " + "could be useful if you find that the successful events spam the logs too much, " + "and you do not require full auditing capability." ) public static final Setting security_log_successful_authentication = - setting( "dbms.security.log_successful_authentication", BOOLEAN, "true" ).build(); + setting( "dbms.security.log_successful_authentication", BOOLEAN, "true" ); @Description( "Threshold for rotation of the security log." ) public static final Setting store_security_log_rotation_threshold = - setting( "dbms.logs.security.rotation.size", BYTES, "20m" ).constraint( range( 0L, Long.MAX_VALUE ) ).build(); + buildSetting( "dbms.logs.security.rotation.size", BYTES, "20m" ).constraint( range( 0L, Long.MAX_VALUE ) ).build(); @Description( "Minimum time interval after last rotation of the security log before it may be rotated again." ) public static final Setting store_security_log_rotation_delay = - setting( "dbms.logs.security.rotation.delay", DURATION, "300s" ).build(); + setting( "dbms.logs.security.rotation.delay", DURATION, "300s" ); @Description( "Maximum number of history files for the security log." ) public static final Setting store_security_log_max_archives = - setting( "dbms.logs.security.rotation.keep_number", INTEGER, "7" ).constraint( min(1) ).build(); + buildSetting( "dbms.logs.security.rotation.keep_number", INTEGER, "7" ).constraint( min(1) ).build(); //========================================================================= // Procedure security settings @@ -315,7 +316,7 @@ public class SecuritySettings implements LoadableConfig "by the `" + PROC_ALLOWED_SETTING_ROLES + "` setting. If the `" + PROC_ALLOWED_SETTING_DEFAULT_NAME + "` setting is the empty string (default), procedures will be executed according to the same security " + "rules as normal Cypher statements." ) - public static final Setting default_allowed = setting( PROC_ALLOWED_SETTING_DEFAULT_NAME, STRING, "" ).build(); + public static final Setting default_allowed = setting( PROC_ALLOWED_SETTING_DEFAULT_NAME, STRING, "" ); @Description( "This provides a finer level of control over which roles can execute procedures than the " + "`" + PROC_ALLOWED_SETTING_DEFAULT_NAME + "` setting. For example: `dbms.security.procedures.roles=" + @@ -324,7 +325,7 @@ public class SecuritySettings implements LoadableConfig "all procedures in the `apoc.load` namespace that starts with `json` and the role `TriggerHappy` " + "to execute the specific procedure `apoc.trigger.add`. Procedures not matching any of these " + "patterns will be subject to the `" + PROC_ALLOWED_SETTING_DEFAULT_NAME + "` setting." ) - public static final Setting procedure_roles = setting( PROC_ALLOWED_SETTING_ROLES, STRING, "" ).build(); + public static final Setting procedure_roles = setting( PROC_ALLOWED_SETTING_ROLES, STRING, "" ); //========================================================================= // Misc settings @@ -334,5 +335,5 @@ public class SecuritySettings implements LoadableConfig @Description( "Set to true if connection pooling should be used for authorization searches using the " + "system account." ) public static final Setting ldap_authorization_connection_pooling = - setting( "unsupported.dbms.security.ldap.authorization.connection_pooling", BOOLEAN, "true" ).build(); + setting( "unsupported.dbms.security.ldap.authorization.connection_pooling", BOOLEAN, "true" ); } 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 3f4375a4e1e15..e969d215e88b5 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; @@ -38,15 +37,15 @@ public class EnterpriseServerSettings implements LoadableConfig @Description( "Configure the Neo4j Browser to time out logged in users after this idle period. " + "Setting this to 0 indicates no limit." ) public static final Setting browser_credentialTimeout = setting( "browser.credential_timeout", DURATION, - "0" ).build(); + "0" ); @SuppressWarnings( "unused" ) // accessed from the browser @Description( "Configure the Neo4j Browser to store or not store user credentials." ) public static final Setting browser_retainConnectionCredentials = - setting( "browser.retain_connection_credentials", BOOLEAN, TRUE ).build(); + setting( "browser.retain_connection_credentials", BOOLEAN, TRUE ); @SuppressWarnings( "unused" ) // accessed from the browser @Description( "Configure the policy for outgoing Neo4j Browser connections." ) public static final Setting browser_allowOutgoingBrowserConnections = - setting( "browser.allow_outgoing_connections", BOOLEAN, TRUE ).build(); + setting( "browser.allow_outgoing_connections", BOOLEAN, TRUE ); } diff --git a/integrationtests/src/test/java/org/neo4j/storeupgrade/StoreUpgradeIntegrationTest.java b/integrationtests/src/test/java/org/neo4j/storeupgrade/StoreUpgradeIntegrationTest.java index 523ed4d2d7895..6b80efc4eba07 100644 --- a/integrationtests/src/test/java/org/neo4j/storeupgrade/StoreUpgradeIntegrationTest.java +++ b/integrationtests/src/test/java/org/neo4j/storeupgrade/StoreUpgradeIntegrationTest.java @@ -171,7 +171,7 @@ public void serverDatabaseShouldStartOnOlderStoreWhenUpgradeIsEnabled() throws T store.prepareDirectory( storeDir ); - File configFile = new File( rootDir, "neo4j.conf" ); + File configFile = new File( rootDir, Config.DEFAULT_CONFIG_FILE_NAME ); Properties props = new Properties(); props.putAll( ServerTestUtils.getDefaultRelativeProperties() ); props.setProperty( DatabaseManagementSystemSettings.data_directory.name(), rootDir.getAbsolutePath() ); diff --git a/packaging/neo4j-desktop/src/main/java/org/neo4j/desktop/model/DesktopModel.java b/packaging/neo4j-desktop/src/main/java/org/neo4j/desktop/model/DesktopModel.java index 42ed8f66e70e8..354f10bd795fc 100644 --- a/packaging/neo4j-desktop/src/main/java/org/neo4j/desktop/model/DesktopModel.java +++ b/packaging/neo4j-desktop/src/main/java/org/neo4j/desktop/model/DesktopModel.java @@ -143,7 +143,7 @@ private static void verifyGraphDirectory( File dir ) throws UnsuitableDirectoryE for ( String fileName : fileNames ) { - if ( fileName.startsWith( "neostore" ) || fileName.equals( "neo4j.conf" ) ) + if ( fileName.startsWith( "neostore" ) || fileName.equals( Config.DEFAULT_CONFIG_FILE_NAME ) ) { return; }