Skip to content

Commit

Permalink
Update dbms.listConfig procedure to include info if setting is dynamic
Browse files Browse the repository at this point in the history
Add new column into a dbms.listConfig result that includes information
if particular setting is dynamic or not.
  • Loading branch information
MishaDemianenko committed Oct 10, 2018
1 parent f23efb5 commit 325a25b
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 33 deletions.
Expand Up @@ -27,7 +27,7 @@
import org.neo4j.collection.RawIterator; import org.neo4j.collection.RawIterator;
import org.neo4j.graphdb.factory.GraphDatabaseSettings; import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.internal.kernel.api.exceptions.ProcedureException; import org.neo4j.internal.kernel.api.exceptions.ProcedureException;
import org.neo4j.internal.kernel.api.security.SecurityContext; import org.neo4j.internal.kernel.api.procs.QualifiedName;
import org.neo4j.kernel.api.ResourceTracker; import org.neo4j.kernel.api.ResourceTracker;
import org.neo4j.kernel.api.StubResourceManager; import org.neo4j.kernel.api.StubResourceManager;
import org.neo4j.kernel.impl.api.integrationtest.KernelIntegrationTest; import org.neo4j.kernel.impl.api.integrationtest.KernelIntegrationTest;
Expand All @@ -36,10 +36,12 @@
import static org.hamcrest.Matchers.hasItem; import static org.hamcrest.Matchers.hasItem;
import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.neo4j.helpers.collection.Iterators.asList; import static org.neo4j.helpers.collection.Iterators.asList;
import static org.neo4j.internal.kernel.api.procs.ProcedureSignature.procedureName; import static org.neo4j.internal.kernel.api.procs.ProcedureSignature.procedureName;
import static org.neo4j.internal.kernel.api.security.SecurityContext.AUTH_DISABLED;


public class BuiltInDbmsProceduresIT extends KernelIntegrationTest public class BuiltInDbmsProceduresIT extends KernelIntegrationTest
{ {
Expand All @@ -49,13 +51,7 @@ public class BuiltInDbmsProceduresIT extends KernelIntegrationTest
public void listConfig() throws Exception public void listConfig() throws Exception
{ {
// When // When
RawIterator<Object[],ProcedureException> stream = List<Object[]> config = callListConfig( "" );
dbmsOperations().procedureCallDbms( procedureName( "dbms", "listConfig" ),
toArray( "" ), dependencyResolver, SecurityContext.AUTH_DISABLED,
resourceTracker );

// Then
List<Object[]> config = asList( stream );
List<String> names = config.stream() List<String> names = config.stream()
.map( o -> o[0].toString() ) .map( o -> o[0].toString() )
.collect( Collectors.toList() ); .collect( Collectors.toList() );
Expand All @@ -75,37 +71,51 @@ public void listConfig() throws Exception
public void listConfigWithASpecificConfigName() throws Exception public void listConfigWithASpecificConfigName() throws Exception
{ {
// When // When
RawIterator<Object[],ProcedureException> stream = List<Object[]> config = callListConfig( GraphDatabaseSettings.strict_config_validation.name() );
dbmsOperations().procedureCallDbms( procedureName( "dbms", "listConfig" ),
toArray( GraphDatabaseSettings.strict_config_validation.name() ), dependencyResolver,
SecurityContext.AUTH_DISABLED, resourceTracker );

// Then
List<Object[]> config = asList( stream );


assertEquals( 1, config.size() ); assertEquals( 1, config.size() );
assertArrayEquals( new Object[]{ "dbms.config.strict_validation", assertArrayEquals( new Object[]{ "dbms.config.strict_validation",
"A strict configuration validation will prevent the database from starting up if unknown " + "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., " + "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.", "cypher., etc). This is currently false by default but will be true by default in 4.0.",
"false" }, config.get( 0 ) ); "false", false }, config.get( 0 ) );
} }


@Test @Test
public void durationAlwaysListedWithUnit() throws Exception public void durationAlwaysListedWithUnit() throws Exception
{ {
// When // When
RawIterator<Object[],ProcedureException> stream = List<Object[]> config = callListConfig( GraphDatabaseSettings.transaction_timeout.name() );
dbmsOperations().procedureCallDbms( procedureName( "dbms", "listConfig" ),
toArray( GraphDatabaseSettings.transaction_timeout.name() ), dependencyResolver,
SecurityContext.AUTH_DISABLED, resourceTracker );

// Then
List<Object[]> config = asList( stream );


assertEquals( 1, config.size() ); assertEquals( 1, config.size() );
assertArrayEquals( new Object[]{ "dbms.transaction.timeout", assertArrayEquals( new Object[]{ "dbms.transaction.timeout",
"The maximum time interval of a transaction within which it should be completed.", "The maximum time interval of a transaction within which it should be completed.",
"0ms" }, config.get( 0 ) ); "0ms", true }, config.get( 0 ) );
}

@Test
public void listDynamicSetting() throws ProcedureException
{
List<Object[]> config = callListConfig( GraphDatabaseSettings.check_point_iops_limit.name() );

assertEquals( 1, config.size() );
assertTrue( (Boolean) config.get(0)[3] );
}

@Test
public void listNotDynamicSetting() throws ProcedureException
{
List<Object[]> config = callListConfig( GraphDatabaseSettings.data_directory.name() );

assertEquals( 1, config.size() );
assertFalse( (Boolean) config.get(0)[3] );
}

private List<Object[]> callListConfig( String seatchString ) throws ProcedureException
{
QualifiedName procedureName = procedureName( "dbms", "listConfig" );
RawIterator<Object[],ProcedureException> callResult =
dbmsOperations().procedureCallDbms( procedureName, toArray( seatchString ), dependencyResolver, AUTH_DISABLED, resourceTracker );
return asList( callResult );
} }
} }
Expand Up @@ -51,7 +51,6 @@
import static org.hamcrest.Matchers.arrayContaining; import static org.hamcrest.Matchers.arrayContaining;
import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.startsWith; import static org.hamcrest.Matchers.startsWith;
import static org.hamcrest.core.IsEqual.equalTo; import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.fail; import static org.junit.Assert.fail;
Expand Down Expand Up @@ -130,7 +129,7 @@ public void listProcedures() throws Throwable
// Then // Then
//noinspection unchecked //noinspection unchecked
assertThat( asList( stream ), containsInAnyOrder( assertThat( asList( stream ), containsInAnyOrder(
proc( "dbms.listConfig", "(searchString = :: STRING?) :: (name :: STRING?, description :: STRING?, " + "value :: STRING?)", proc( "dbms.listConfig", "(searchString = :: STRING?) :: (name :: STRING?, description :: STRING?, value :: STRING?, dynamic :: BOOLEAN?)",
"List the currently active config of Neo4j.", "DBMS" ), "List the currently active config of Neo4j.", "DBMS" ),
proc( "db.constraints", "() :: (description :: STRING?)", "List all constraints in the database.", "READ" ), proc( "db.constraints", "() :: (description :: STRING?)", "List all constraints in the database.", "READ" ),
proc( "db.indexes", "() :: (description :: STRING?, indexName :: STRING?, tokenNames :: LIST? OF STRING?, properties :: " + proc( "db.indexes", "() :: (description :: STRING?, indexName :: STRING?, tokenNames :: LIST? OF STRING?, properties :: " +
Expand Down
Expand Up @@ -56,10 +56,11 @@ public class BuiltInDbmsProcedures
public Stream<ConfigResult> listConfig( @Name( value = "searchString", defaultValue = "" ) String searchString ) public Stream<ConfigResult> listConfig( @Name( value = "searchString", defaultValue = "" ) String searchString )
{ {
Config config = graph.getDependencyResolver().resolveDependency( Config.class ); Config config = graph.getDependencyResolver().resolveDependency( Config.class );
String lowerCasedSearchString = searchString.toLowerCase();
return config.getConfigValues().values().stream() return config.getConfigValues().values().stream()
.filter( c -> !c.internal() ) .filter( c -> !c.internal() )
.filter( c -> c.name().toLowerCase().contains( lowerCasedSearchString ) )
.map( ConfigResult::new ) .map( ConfigResult::new )
.filter( c -> c.name.toLowerCase().contains( searchString.toLowerCase() ) )
.sorted( Comparator.comparing( c -> c.name ) ); .sorted( Comparator.comparing( c -> c.name ) );
} }


Expand Down
Expand Up @@ -21,16 +21,20 @@


import org.neo4j.configuration.ConfigValue; import org.neo4j.configuration.ConfigValue;


import static org.apache.commons.lang3.StringUtils.EMPTY;

public class ConfigResult public class ConfigResult
{ {
public final String name; public final String name;
public final String description; public final String description;
public final String value; public final String value;
public final boolean dynamic;


public ConfigResult( ConfigValue configValue ) ConfigResult( ConfigValue configValue )
{ {
this.name = configValue.name(); this.name = configValue.name();
this.description = configValue.description().orElse( "" ); this.description = configValue.description().orElse( EMPTY );
this.value = configValue.valueAsString().orElse( "" ); this.value = configValue.valueAsString().orElse( EMPTY );
this.dynamic = configValue.dynamic();
} }
} }
Expand Up @@ -262,9 +262,7 @@ public void shouldListCorrectBuiltinProcedures() throws Throwable
// When/Then // When/Then
assertThat( call( "dbms.procedures" ), containsInAnyOrder( assertThat( call( "dbms.procedures" ), containsInAnyOrder(
record( "dbms.listConfig", record( "dbms.listConfig",
"dbms.listConfig(searchString = :: STRING?) :: (name :: STRING?, description :: STRING?, " + "dbms.listConfig(searchString = :: STRING?) :: (name :: STRING?, description :: STRING?, value :: STRING?, dynamic :: BOOLEAN?)",
"value" +
" :: STRING?)",
"List the currently active config of Neo4j.", "DBMS" ), "List the currently active config of Neo4j.", "DBMS" ),
record( "db.awaitIndex", "db.awaitIndex(index :: STRING?, timeOutSeconds = 300 :: INTEGER?) :: VOID", record( "db.awaitIndex", "db.awaitIndex(index :: STRING?, timeOutSeconds = 300 :: INTEGER?) :: VOID",
"Wait for an index to come online (for example: CALL db.awaitIndex(\":Person(name)\")).", "READ" ), "Wait for an index to come online (for example: CALL db.awaitIndex(\":Person(name)\")).", "READ" ),
Expand Down

0 comments on commit 325a25b

Please sign in to comment.