Skip to content

Commit

Permalink
A config option for using enterprise record format in exceptional cases.
Browse files Browse the repository at this point in the history
  • Loading branch information
Max Sumrall committed Feb 26, 2016
1 parent 5f1448c commit 6b1e8e6
Show file tree
Hide file tree
Showing 22 changed files with 128 additions and 101 deletions.
Expand Up @@ -560,7 +560,7 @@ private StorageEngine buildStorageEngine(
labelTokens, relationshipTypeTokens, schemaStateChangeCallback, constraintSemantics, scheduler,
tokenNameLookup, lockService, schemaIndexProvider, indexingServiceMonitor, databaseHealth,
labelScanStore, legacyIndexProviderLookup, indexConfigStore, legacyIndexTransactionOrdering,
InternalRecordFormatSelector.select() ) );
InternalRecordFormatSelector.select(config, logService) ) );
}

private TransactionLogModule buildTransactionLogs(
Expand Down
Expand Up @@ -90,6 +90,7 @@ public static class Configuration

// Kept here to have it not be publicly documented.
public static final Setting<String> lock_manager = setting( "lock_manager", Settings.STRING, "" );
public static final Setting<String> record_format = setting( "record_format", Settings.STRING, "" );
public static final Setting<String> tracer =
setting( "dbms.tracer", Settings.STRING, (String) null ); // 'null' default.

Expand Down
Expand Up @@ -23,7 +23,7 @@

import org.neo4j.io.pagecache.PageCache;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.store.format.RecordFormat;
import org.neo4j.kernel.impl.store.format.RecordFormats;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.kernel.impl.store.id.IdType;
import org.neo4j.kernel.impl.store.record.LabelTokenRecord;
Expand All @@ -44,11 +44,11 @@ public LabelTokenStore(
PageCache pageCache,
LogProvider logProvider,
DynamicStringStore nameStore,
RecordFormat<LabelTokenRecord> recordFormat,
String storeVersion )
RecordFormats recordFormats)
{
super( file, config, IdType.LABEL_TOKEN, idGeneratorFactory, pageCache,
logProvider, nameStore, TYPE_DESCRIPTOR, new Token.Factory(), recordFormat, storeVersion );
logProvider, nameStore, TYPE_DESCRIPTOR, new Token.Factory(), recordFormats.labelToken(),
recordFormats.storeVersion() );
}

@Override
Expand Down
Expand Up @@ -471,8 +471,7 @@ CommonAbstractStore createNodeStore( String storeName )
{
File storeFile = getStoreFile( storeName );
return initialize( new NodeStore( storeFile, config, idGeneratorFactory, pageCache, logProvider,
(DynamicArrayStore) getOrCreateStore( StoreType.NODE_LABEL ), recordFormats.node(),
recordFormats.storeVersion() ) );
(DynamicArrayStore) getOrCreateStore( StoreType.NODE_LABEL ), recordFormats ) );
}

CommonAbstractStore createPropertyKeyTokenStore( String storeName )
Expand All @@ -489,15 +488,14 @@ CommonAbstractStore createPropertyStore( String storeName )
return initialize( new PropertyStore( storeFile, config, idGeneratorFactory, pageCache, logProvider,
(DynamicStringStore) getOrCreateStore( StoreType.PROPERTY_STRING ),
(PropertyKeyTokenStore) getOrCreateStore( StoreType.PROPERTY_KEY_TOKEN ),
(DynamicArrayStore) getOrCreateStore( StoreType.PROPERTY_ARRAY ), recordFormats.property(),
recordFormats.storeVersion() ) );
(DynamicArrayStore) getOrCreateStore( StoreType.PROPERTY_ARRAY ), recordFormats ) );
}

CommonAbstractStore createRelationshipStore( String storeName )
{
File file = getStoreFile( storeName );
return initialize( new RelationshipStore( file, config, idGeneratorFactory, pageCache, logProvider,
recordFormats.relationship(), recordFormats.storeVersion() ) );
recordFormats ) );
}

CommonAbstractStore createDynamicStringStore( String storeName, IdType idType,
Expand All @@ -518,16 +516,14 @@ CommonAbstractStore createRelationshipTypeTokenStore( String storeName )
File storeFile = getStoreFile( storeName );
return initialize( new RelationshipTypeTokenStore( storeFile, config, idGeneratorFactory,
pageCache, logProvider,
(DynamicStringStore) getOrCreateStore( StoreType.RELATIONSHIP_TYPE_TOKEN_NAME ),
recordFormats.relationshipTypeToken(), recordFormats.storeVersion() ) );
(DynamicStringStore) getOrCreateStore( StoreType.RELATIONSHIP_TYPE_TOKEN_NAME ), recordFormats ) );
}

CommonAbstractStore createLabelTokenStore( String storeName )
{
File fileName = getStoreFile( storeName );
return initialize( new LabelTokenStore( fileName, config, idGeneratorFactory, pageCache,
logProvider, (DynamicStringStore) getOrCreateStore( StoreType.LABEL_TOKEN_NAME ),
recordFormats.labelToken(), recordFormats.storeVersion() ) );
logProvider, (DynamicStringStore) getOrCreateStore( StoreType.LABEL_TOKEN_NAME ), recordFormats ) );
}

CommonAbstractStore createSchemaStore( String storeName )
Expand Down
Expand Up @@ -24,7 +24,7 @@

import org.neo4j.io.pagecache.PageCache;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.store.format.RecordFormat;
import org.neo4j.kernel.impl.store.format.RecordFormats;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.kernel.impl.store.id.IdType;
import org.neo4j.kernel.impl.store.record.DynamicRecord;
Expand Down Expand Up @@ -71,11 +71,10 @@ public NodeStore(
PageCache pageCache,
LogProvider logProvider,
DynamicArrayStore dynamicLabelStore,
RecordFormat<NodeRecord> recordFormat,
String storeVersion )
RecordFormats recordFormats)
{
super( fileName, config, IdType.NODE, idGeneratorFactory, pageCache, logProvider, TYPE_DESCRIPTOR,
recordFormat, storeVersion, NO_STORE_HEADER_FORMAT );
recordFormats.node(), recordFormats.storeVersion(), NO_STORE_HEADER_FORMAT );
this.dynamicLabelStore = dynamicLabelStore;
}

Expand Down
Expand Up @@ -32,7 +32,7 @@
import org.neo4j.helpers.collection.Pair;
import org.neo4j.io.pagecache.PageCache;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.store.format.RecordFormat;
import org.neo4j.kernel.impl.store.format.RecordFormats;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.kernel.impl.store.id.IdType;
import org.neo4j.kernel.impl.store.record.DynamicRecord;
Expand Down Expand Up @@ -72,11 +72,10 @@ public PropertyStore(
DynamicStringStore stringPropertyStore,
PropertyKeyTokenStore propertyKeyTokenStore,
DynamicArrayStore arrayPropertyStore,
RecordFormat<PropertyRecord> recordFormat,
String storeVersion )
RecordFormats recordFormats)
{
super( fileName, configuration, IdType.PROPERTY, idGeneratorFactory, pageCache, logProvider, TYPE_DESCRIPTOR,
recordFormat, storeVersion, NO_STORE_HEADER_FORMAT );
recordFormats.property(), recordFormats.storeVersion(), NO_STORE_HEADER_FORMAT );
this.stringStore = stringPropertyStore;
this.propertyKeyTokenStore = propertyKeyTokenStore;
this.arrayStore = arrayPropertyStore;
Expand Down
Expand Up @@ -20,9 +20,10 @@
package org.neo4j.kernel.impl.store;

import java.io.File;

import org.neo4j.io.pagecache.PageCache;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.store.format.RecordFormat;
import org.neo4j.kernel.impl.store.format.RecordFormats;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.kernel.impl.store.id.IdType;
import org.neo4j.kernel.impl.store.record.RelationshipRecord;
Expand All @@ -43,11 +44,11 @@ public RelationshipStore(
IdGeneratorFactory idGeneratorFactory,
PageCache pageCache,
LogProvider logProvider,
RecordFormat<RelationshipRecord> recordFormat,
String storeVersion )
RecordFormats recordFormats)
{
super( fileName, configuration, IdType.RELATIONSHIP, idGeneratorFactory,
pageCache, logProvider, TYPE_DESCRIPTOR, recordFormat, storeVersion, NO_STORE_HEADER_FORMAT );
pageCache, logProvider, TYPE_DESCRIPTOR, recordFormats.relationship(), recordFormats.storeVersion(),
NO_STORE_HEADER_FORMAT );
}

@Override
Expand Down
Expand Up @@ -23,11 +23,11 @@

import org.neo4j.io.pagecache.PageCache;
import org.neo4j.io.pagecache.PageCursor;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.kernel.impl.store.id.IdType;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.core.RelationshipTypeToken;
import org.neo4j.kernel.impl.store.format.RecordFormat;
import org.neo4j.kernel.impl.store.format.RecordFormats;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.kernel.impl.store.id.IdType;
import org.neo4j.kernel.impl.store.record.Record;
import org.neo4j.kernel.impl.store.record.RelationshipTypeTokenRecord;
import org.neo4j.logging.LogProvider;
Expand All @@ -47,12 +47,11 @@ public RelationshipTypeTokenStore(
PageCache pageCache,
LogProvider logProvider,
DynamicStringStore nameStore,
RecordFormat<RelationshipTypeTokenRecord> recordFormat,
String storeVersion )
RecordFormats recordFormats)
{
super( fileName, config, IdType.RELATIONSHIP_TYPE_TOKEN, idGeneratorFactory, pageCache,
logProvider, nameStore, TYPE_DESCRIPTOR, new RelationshipTypeToken.Factory(), recordFormat,
storeVersion );
super( fileName, config, IdType.RELATIONSHIP_TYPE_TOKEN, idGeneratorFactory, pageCache, logProvider, nameStore,
TYPE_DESCRIPTOR, new RelationshipTypeToken.Factory(), recordFormats.relationshipTypeToken(),
recordFormats.storeVersion() );
}

@Override
Expand Down
Expand Up @@ -26,11 +26,12 @@
import org.neo4j.graphdb.factory.GraphDatabaseSettings;
import org.neo4j.io.fs.FileSystemAbstraction;
import org.neo4j.io.pagecache.PageCache;
import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.logging.NullLogService;
import org.neo4j.kernel.impl.store.format.InternalRecordFormatSelector;
import org.neo4j.kernel.impl.store.format.RecordFormats;
import org.neo4j.kernel.impl.store.id.DefaultIdGeneratorFactory;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.logging.LogProvider;

/**
Expand Down Expand Up @@ -84,7 +85,7 @@ public StoreFactory( File storeDir, Config config,
FileSystemAbstraction fileSystemAbstraction, LogProvider logProvider )
{
this( storeDir, config, idGeneratorFactory, pageCache, fileSystemAbstraction, logProvider,
InternalRecordFormatSelector.select() );
InternalRecordFormatSelector.select( config, NullLogService.getInstance() ));
}

public StoreFactory( File storeDir, Config config,
Expand Down
Expand Up @@ -19,6 +19,12 @@
*/
package org.neo4j.kernel.impl.store.format;

import org.neo4j.helpers.Service;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.factory.CommunityFacadeFactory;
import org.neo4j.kernel.impl.factory.GraphDatabaseFacadeFactory;
import org.neo4j.kernel.impl.locking.community.CommunityLockManger;
import org.neo4j.kernel.impl.logging.LogService;
import org.neo4j.kernel.impl.store.format.lowlimit.LowLimit;

/**
Expand All @@ -28,13 +34,34 @@
*/
public class InternalRecordFormatSelector
{
public static RecordFormats select()
public static RecordFormats select( Config config, LogService logging )
{
//todo: uncomment this loop once high-limits store migration is done.
// for ( RecordFormats.Factory candidate : Service.load( RecordFormats.Factory.class ) )
// {
// return candidate.newInstance();
// }
return LowLimit.RECORD_FORMATS;
String key = config.get( GraphDatabaseFacadeFactory.Configuration.record_format );
for ( RecordFormats.Factory candidate : Service.load( RecordFormats.Factory.class ) )
{
String candidateId = candidate.getKeys().iterator().next();
if ( candidateId.equals( key ) )
{
return candidate.newInstance();
}
else if ( key.equals( "" ) )
{
logging.getInternalLog( CommunityFacadeFactory.class )
.info( "No locking implementation specified, defaulting to '" + candidateId + "'" );
}
}

if ( key.equals( "community" ) )
{
return LowLimit.RECORD_FORMATS;
}
else if ( key.equals( "" ) )
{
logging.getInternalLog( CommunityFacadeFactory.class )
.info( "No record format specified, defaulting to 'community'" );
return LowLimit.RECORD_FORMATS;
}

throw new IllegalArgumentException( "No record format found with the name '" + key + "'." );
}
}
Expand Up @@ -52,8 +52,6 @@
import org.neo4j.io.fs.FileUtils;
import org.neo4j.io.pagecache.PageCache;
import org.neo4j.io.pagecache.tracing.PageCacheTracer;
import org.neo4j.kernel.internal.EmbeddedGraphDatabase;
import org.neo4j.kernel.internal.StoreLocker;
import org.neo4j.kernel.api.constraints.NodePropertyExistenceConstraint;
import org.neo4j.kernel.api.constraints.RelationshipPropertyExistenceConstraint;
import org.neo4j.kernel.api.constraints.UniquenessConstraint;
Expand Down Expand Up @@ -144,6 +142,8 @@
import org.neo4j.kernel.impl.transaction.state.RelationshipGroupGetter;
import org.neo4j.kernel.impl.util.Dependencies;
import org.neo4j.kernel.impl.util.Listener;
import org.neo4j.kernel.internal.EmbeddedGraphDatabase;
import org.neo4j.kernel.internal.StoreLocker;
import org.neo4j.kernel.lifecycle.LifeSupport;
import org.neo4j.logging.Log;
import org.neo4j.logging.NullLog;
Expand Down Expand Up @@ -272,7 +272,7 @@ public Label apply( long from )
this.idGeneratorFactory = new DefaultIdGeneratorFactory( fileSystem );

StoreFactory sf = new StoreFactory( this.storeDir, config, idGeneratorFactory, pageCache, fileSystem,
logService.getInternalLogProvider(), InternalRecordFormatSelector.select() );
logService.getInternalLogProvider(), InternalRecordFormatSelector.select(config, logService) );

if ( dump )
{
Expand Down
Expand Up @@ -24,9 +24,6 @@
import org.neo4j.helpers.collection.Iterables;
import org.neo4j.io.fs.FileSystemAbstraction;
import org.neo4j.io.pagecache.PageCache;
import org.neo4j.kernel.impl.store.format.InternalRecordFormatSelector;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.kernel.internal.KernelEventHandlers;
import org.neo4j.kernel.api.TokenNameLookup;
import org.neo4j.kernel.api.index.SchemaIndexProvider;
import org.neo4j.kernel.api.labelscan.LabelScanStore;
Expand All @@ -42,10 +39,13 @@
import org.neo4j.kernel.impl.core.RelationshipTypeTokenHolder;
import org.neo4j.kernel.impl.index.IndexConfigStore;
import org.neo4j.kernel.impl.locking.ReentrantLockService;
import org.neo4j.kernel.impl.logging.NullLogService;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.kernel.impl.util.JobScheduler;
import org.neo4j.kernel.impl.util.Neo4jJobScheduler;
import org.neo4j.kernel.impl.util.SynchronizedArrayIdOrderingQueue;
import org.neo4j.kernel.internal.DatabaseHealth;
import org.neo4j.kernel.internal.KernelEventHandlers;
import org.neo4j.kernel.lifecycle.LifeSupport;
import org.neo4j.logging.NullLog;
import org.neo4j.logging.NullLogProvider;
Expand All @@ -55,6 +55,7 @@

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.neo4j.kernel.impl.store.format.InternalRecordFormatSelector.select;

/**
* Conveniently manages a {@link RecordStorageEngine} in a test. Needs {@link FileSystemAbstraction} and
Expand Down Expand Up @@ -94,14 +95,14 @@ private RecordStorageEngine get( FileSystemAbstraction fs, PageCache pageCache,
when( legacyIndexProviderLookup.all() ).thenReturn( Iterables.empty() );
IndexConfigStore indexConfigStore = new IndexConfigStore( storeDirectory, fs );
JobScheduler scheduler = life.add( new Neo4jJobScheduler() );

return life.add( new RecordStorageEngine( storeDirectory, new Config(), idGeneratorFactory, pageCache, fs,
Config config = new Config();
return life.add( new RecordStorageEngine( storeDirectory, config, idGeneratorFactory, pageCache, fs,
NullLogProvider.getInstance(), mock( PropertyKeyTokenHolder.class ), mock( LabelTokenHolder.class ),
mock( RelationshipTypeTokenHolder.class ), () -> {}, new StandardConstraintSemantics(),
scheduler, mock( TokenNameLookup.class ), new ReentrantLockService(),
schemaIndexProvider, IndexingService.NO_MONITOR, databaseHealth,
labelScanStoreProvider, legacyIndexProviderLookup, indexConfigStore,
new SynchronizedArrayIdOrderingQueue( 20 ), InternalRecordFormatSelector.select() ) );
new SynchronizedArrayIdOrderingQueue( 20 ), select( config, NullLogService.getInstance() ) ) );
}

@Override
Expand Down
Expand Up @@ -27,8 +27,9 @@
import org.neo4j.io.pagecache.PageCache;
import org.neo4j.io.pagecache.PageCursor;
import org.neo4j.io.pagecache.PagedFile;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.kernel.configuration.Config;
import org.neo4j.kernel.impl.logging.NullLogService;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
import org.neo4j.kernel.impl.store.record.LabelTokenRecord;
import org.neo4j.kernel.impl.store.record.Record;
import org.neo4j.logging.LogProvider;
Expand All @@ -37,7 +38,6 @@
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import static org.neo4j.kernel.impl.store.format.InternalRecordFormatSelector.select;
import static org.neo4j.kernel.impl.store.record.RecordLoad.FORCE;
import static org.neo4j.kernel.impl.store.record.RecordLoad.NORMAL;
Expand Down Expand Up @@ -74,7 +74,7 @@ class UnusedLabelTokenStore extends LabelTokenStore
public UnusedLabelTokenStore() throws IOException
{
super( file, config, generatorFactory, cache, logProvider, dynamicStringStore,
select().labelToken(), select().storeVersion() );
select( config, NullLogService.getInstance() ) );
storeFile = mock( PagedFile.class );

when( storeFile.io( any( Long.class ), any( Integer.class ) ) ).thenReturn( pageCursor );
Expand Down

0 comments on commit 6b1e8e6

Please sign in to comment.