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.graphdb.factory.GraphDatabaseSettings;
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.StubResourceManager;
import org.neo4j.kernel.impl.api.integrationtest.KernelIntegrationTest;
Expand All @@ -36,10 +36,12 @@
import static org.hamcrest.Matchers.hasItem;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
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.security.SecurityContext.AUTH_DISABLED;

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

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

// Then
List<Object[]> config = asList( stream );
List<Object[]> config = callListConfig( GraphDatabaseSettings.strict_config_validation.name() );

assertEquals( 1, config.size() );
assertArrayEquals( new Object[]{ "dbms.config.strict_validation",
"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.",
"false" }, config.get( 0 ) );
"false", false }, config.get( 0 ) );
}

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

// Then
List<Object[]> config = asList( stream );
List<Object[]> config = callListConfig( GraphDatabaseSettings.transaction_timeout.name() );

assertEquals( 1, config.size() );
assertArrayEquals( new Object[]{ "dbms.transaction.timeout",
"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.contains;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.startsWith;
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.fail;
Expand Down Expand Up @@ -130,7 +129,7 @@ public void listProcedures() throws Throwable
// Then
//noinspection unchecked
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" ),
proc( "db.constraints", "() :: (description :: STRING?)", "List all constraints in the database.", "READ" ),
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 )
{
Config config = graph.getDependencyResolver().resolveDependency( Config.class );
String lowerCasedSearchString = searchString.toLowerCase();
return config.getConfigValues().values().stream()
.filter( c -> !c.internal() )
.filter( c -> c.name().toLowerCase().contains( lowerCasedSearchString ) )
.map( ConfigResult::new )
.filter( c -> c.name.toLowerCase().contains( searchString.toLowerCase() ) )
.sorted( Comparator.comparing( c -> c.name ) );
}

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

import org.neo4j.configuration.ConfigValue;

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

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

public ConfigResult( ConfigValue configValue )
ConfigResult( ConfigValue configValue )
{
this.name = configValue.name();
this.description = configValue.description().orElse( "" );
this.value = configValue.valueAsString().orElse( "" );
this.description = configValue.description().orElse( EMPTY );
this.value = configValue.valueAsString().orElse( EMPTY );
this.dynamic = configValue.dynamic();
}
}
Expand Up @@ -262,9 +262,7 @@ public void shouldListCorrectBuiltinProcedures() throws Throwable
// When/Then
assertThat( call( "dbms.procedures" ), containsInAnyOrder(
record( "dbms.listConfig",
"dbms.listConfig(searchString = :: STRING?) :: (name :: STRING?, description :: STRING?, " +
"value" +
" :: STRING?)",
"dbms.listConfig(searchString = :: STRING?) :: (name :: STRING?, description :: STRING?, value :: STRING?, dynamic :: BOOLEAN?)",
"List the currently active config of Neo4j.", "DBMS" ),
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" ),
Expand Down

0 comments on commit 325a25b

Please sign in to comment.