Skip to content

Commit

Permalink
LabelScanStoreHaIT can replace label index extension
Browse files Browse the repository at this point in the history
And does so by only removing all currently loaded label index extensions
before adding the specific extension it wants.
  • Loading branch information
tinwelint committed Jan 31, 2017
1 parent 7d8b9af commit 45ade8a
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 6 deletions.
Expand Up @@ -21,8 +21,10 @@


import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.function.Predicate;


import org.neo4j.graphdb.security.URLAccessRule; import org.neo4j.graphdb.security.URLAccessRule;
import org.neo4j.helpers.Service; import org.neo4j.helpers.Service;
Expand All @@ -39,13 +41,14 @@ public class GraphDatabaseFactoryState
private final List<KernelExtensionFactory<?>> kernelExtensions; private final List<KernelExtensionFactory<?>> kernelExtensions;
private Monitors monitors; private Monitors monitors;
private LogProvider userLogProvider; private LogProvider userLogProvider;
private Map<String,URLAccessRule> urlAccessRules; private final Map<String,URLAccessRule> urlAccessRules;


public GraphDatabaseFactoryState() { public GraphDatabaseFactoryState()
{
settingsClasses = new ArrayList<>(); settingsClasses = new ArrayList<>();
settingsClasses.add( GraphDatabaseSettings.class ); settingsClasses.add( GraphDatabaseSettings.class );
kernelExtensions = new ArrayList<>(); kernelExtensions = new ArrayList<>();
for ( KernelExtensionFactory factory : Service.load( KernelExtensionFactory.class ) ) for ( KernelExtensionFactory<?> factory : Service.load( KernelExtensionFactory.class ) )
{ {
kernelExtensions.add( factory ); kernelExtensions.add( factory );
} }
Expand All @@ -67,6 +70,19 @@ public Iterable<KernelExtensionFactory<?>> getKernelExtension()
return kernelExtensions; return kernelExtensions;
} }


public void removeKernelExtensions( Predicate<KernelExtensionFactory<?>> toRemove )
{
Iterator<KernelExtensionFactory<?>> iterator = kernelExtensions.iterator();
while ( iterator.hasNext() )
{
KernelExtensionFactory<?> extension = iterator.next();
if ( toRemove.test( extension ) )
{
iterator.remove();
}
}
}

public void setKernelExtensions( Iterable<KernelExtensionFactory<?>> newKernelExtensions ) public void setKernelExtensions( Iterable<KernelExtensionFactory<?>> newKernelExtensions )
{ {
kernelExtensions.clear(); kernelExtensions.clear();
Expand Down
Expand Up @@ -20,6 +20,7 @@
package org.neo4j.graphdb.factory; package org.neo4j.graphdb.factory;


import java.util.Collections; import java.util.Collections;
import java.util.function.Predicate;


import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.extension.KernelExtensionFactory;
import org.neo4j.kernel.impl.ha.ClusterManager; import org.neo4j.kernel.impl.ha.ClusterManager;
Expand Down Expand Up @@ -50,4 +51,10 @@ public TestHighlyAvailableGraphDatabaseFactory setKernelExtensions( Iterable<Ker
getCurrentState().setKernelExtensions( newKernelExtensions ); getCurrentState().setKernelExtensions( newKernelExtensions );
return this; return this;
} }

public TestHighlyAvailableGraphDatabaseFactory removeKernelExtensions( Predicate<KernelExtensionFactory<?>> toRemove )
{
getCurrentState().removeKernelExtensions( toRemove );
return this;
}
} }
Expand Up @@ -24,11 +24,10 @@
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;


import java.util.Collections;

import org.neo4j.graphdb.GraphDatabaseService; import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Label; import org.neo4j.graphdb.Label;
import org.neo4j.graphdb.Transaction; import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.graphdb.factory.TestHighlyAvailableGraphDatabaseFactory; import org.neo4j.graphdb.factory.TestHighlyAvailableGraphDatabaseFactory;
import org.neo4j.kernel.api.labelscan.LabelScanStore; import org.neo4j.kernel.api.labelscan.LabelScanStore;
import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.extension.KernelExtensionFactory;
Expand All @@ -40,6 +39,7 @@


import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;

import static org.neo4j.helpers.collection.Iterators.count; import static org.neo4j.helpers.collection.Iterators.count;
import static org.neo4j.kernel.impl.ha.ClusterManager.allAvailabilityGuardsReleased; import static org.neo4j.kernel.impl.ha.ClusterManager.allAvailabilityGuardsReleased;
import static org.neo4j.kernel.impl.ha.ClusterManager.allSeesAllAsAvailable; import static org.neo4j.kernel.impl.ha.ClusterManager.allSeesAllAsAvailable;
Expand Down Expand Up @@ -111,15 +111,18 @@ public void setUp()
{ {
KernelExtensionFactory<?> testExtension = labelScanStoreExtension( monitor ); KernelExtensionFactory<?> testExtension = labelScanStoreExtension( monitor );
TestHighlyAvailableGraphDatabaseFactory factory = new TestHighlyAvailableGraphDatabaseFactory(); TestHighlyAvailableGraphDatabaseFactory factory = new TestHighlyAvailableGraphDatabaseFactory();
factory.addKernelExtensions( Collections.singletonList( testExtension ) ); factory.removeKernelExtensions( extension -> extension.getClass().getName().contains( "LabelScan" ) );
factory.addKernelExtension( testExtension );
ClusterManager clusterManager = new ClusterManager.Builder( testDirectory.directory( "root" ) ) ClusterManager clusterManager = new ClusterManager.Builder( testDirectory.directory( "root" ) )
.withDbFactory( factory ) .withDbFactory( factory )
.withSharedSetting( GraphDatabaseSettings.label_index, labelIndexSettingName() )
.withStoreDirInitializer( ( serverId, storeDir ) -> { .withStoreDirInitializer( ( serverId, storeDir ) -> {
if ( serverId == 1 ) if ( serverId == 1 )
{ {
GraphDatabaseService db = new TestGraphDatabaseFactory() GraphDatabaseService db = new TestGraphDatabaseFactory()
.addKernelExtension( testExtension ) .addKernelExtension( testExtension )
.newEmbeddedDatabaseBuilder( storeDir.getAbsoluteFile() ) .newEmbeddedDatabaseBuilder( storeDir.getAbsoluteFile() )
.setConfig( GraphDatabaseSettings.label_index, labelIndexSettingName() )
.newGraphDatabase(); .newGraphDatabase();
try try
{ {
Expand All @@ -141,6 +144,8 @@ public void setUp()
cluster.await( allAvailabilityGuardsReleased() ); cluster.await( allAvailabilityGuardsReleased() );
} }


protected abstract String labelIndexSettingName();

protected abstract KernelExtensionFactory<?> labelScanStoreExtension( LabelScanStore.Monitor monitor ); protected abstract KernelExtensionFactory<?> labelScanStoreExtension( LabelScanStore.Monitor monitor );


@After @After
Expand Down
Expand Up @@ -19,6 +19,7 @@
*/ */
package org.neo4j.kernel.api.impl.labelscan; package org.neo4j.kernel.api.impl.labelscan;


import org.neo4j.graphdb.factory.GraphDatabaseSettings.LabelIndex;
import org.neo4j.kernel.api.labelscan.LabelScanStore; import org.neo4j.kernel.api.labelscan.LabelScanStore;
import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.extension.KernelExtensionFactory;


Expand All @@ -29,4 +30,10 @@ protected KernelExtensionFactory<?> labelScanStoreExtension( LabelScanStore.Moni
{ {
return new LuceneLabelScanStoreExtension( 100, monitor ); return new LuceneLabelScanStoreExtension( 100, monitor );
} }

@Override
protected String labelIndexSettingName()
{
return LabelIndex.LUCENE.name();
}
} }
Expand Up @@ -19,6 +19,7 @@
*/ */
package org.neo4j.kernel.api.impl.labelscan; package org.neo4j.kernel.api.impl.labelscan;


import org.neo4j.graphdb.factory.GraphDatabaseSettings.LabelIndex;
import org.neo4j.kernel.api.labelscan.LabelScanStore; import org.neo4j.kernel.api.labelscan.LabelScanStore;
import org.neo4j.kernel.extension.KernelExtensionFactory; import org.neo4j.kernel.extension.KernelExtensionFactory;
import org.neo4j.kernel.impl.api.scan.NativeLabelScanStoreExtension; import org.neo4j.kernel.impl.api.scan.NativeLabelScanStoreExtension;
Expand All @@ -30,4 +31,10 @@ protected KernelExtensionFactory<?> labelScanStoreExtension( LabelScanStore.Moni
{ {
return new NativeLabelScanStoreExtension( 100, monitor ); return new NativeLabelScanStoreExtension( 100, monitor );
} }

@Override
protected String labelIndexSettingName()
{
return LabelIndex.NATIVE.name();
}
} }

0 comments on commit 45ade8a

Please sign in to comment.