Skip to content

Commit

Permalink
More efficient getRecordSize()
Browse files Browse the repository at this point in the history
which allows getting record size to be inlined in CommonAbstractStore.
  • Loading branch information
tinwelint committed Mar 3, 2016
1 parent 8d59596 commit afc4a49
Show file tree
Hide file tree
Showing 10 changed files with 154 additions and 312 deletions.
Expand Up @@ -75,6 +75,7 @@ public abstract class CommonAbstractStore<RECORD extends AbstractBaseRecord>
private boolean storeOk = true; private boolean storeOk = true;
private Throwable causeOfStoreNotOk; private Throwable causeOfStoreNotOk;
private final String typeDescriptor; private final String typeDescriptor;
protected int recordSize;


/** /**
* Opens and validates the store contained in <CODE>fileName</CODE> * Opens and validates the store contained in <CODE>fileName</CODE>
Expand Down Expand Up @@ -204,11 +205,15 @@ protected void initialiseNewStoreFile( PagedFile file ) throws IOException
} }
} }


// Determine record size right after writing the header since some stores
// use it when initializing their stores to write some records.
recordSize = determineRecordSize();

File idFileName = new File( storageFileName.getPath() + ".id" ); File idFileName = new File( storageFileName.getPath() + ".id" );
idGeneratorFactory.create( idFileName, getNumberOfReservedLowIds(), true ); idGeneratorFactory.create( idFileName, getNumberOfReservedLowIds(), true );
} }


protected void createHeaderRecord( PageCursor cursor ) protected void createHeaderRecord( PageCursor cursor ) throws IOException
{ {
assert getNumberOfReservedLowIds() == 0; assert getNumberOfReservedLowIds() == 0;
} }
Expand All @@ -231,7 +236,7 @@ protected void loadStorage()
} }
catch ( IOException e ) catch ( IOException e )
{ {
// TODO: Just throw IOException, add proper handling further up // Just throw IOException, add proper handling further up
throw new UnderlyingStorageException( e ); throw new UnderlyingStorageException( e );
} }
loadIdGenerator(); loadIdGenerator();
Expand Down Expand Up @@ -261,34 +266,35 @@ private void extractHeaderRecord() throws IOException
{ {
readHeaderAndInitializeRecordFormat( null ); readHeaderAndInitializeRecordFormat( null );
} }
recordSize = determineRecordSize();
} }


protected long pageIdForRecord( long id ) protected long pageIdForRecord( long id )
{ {
return RecordPageLocationCalculator.pageIdForRecord( id, storeFile.pageSize(), getRecordSize() ); return RecordPageLocationCalculator.pageIdForRecord( id, storeFile.pageSize(), recordSize );
} }


protected int offsetForId( long id ) protected int offsetForId( long id )
{ {
return RecordPageLocationCalculator.offsetForId( id, storeFile.pageSize(), getRecordSize() ); return RecordPageLocationCalculator.offsetForId( id, storeFile.pageSize(), recordSize );
} }


@Override @Override
public int getRecordsPerPage() public int getRecordsPerPage()
{ {
return storeFile.pageSize() / getRecordSize(); return storeFile.pageSize() / recordSize;
} }


public byte[] getRawRecordData( long id ) throws IOException public byte[] getRawRecordData( long id ) throws IOException
{ {
byte[] data = new byte[getRecordSize()]; byte[] data = new byte[recordSize];
try ( PageCursor pageCursor = storeFile.io( id / getRecordsPerPage(), PagedFile.PF_SHARED_READ_LOCK ) ) try ( PageCursor pageCursor = storeFile.io( id / getRecordsPerPage(), PagedFile.PF_SHARED_READ_LOCK ) )
{ {
if ( pageCursor.next() ) if ( pageCursor.next() )
{ {
do do
{ {
pageCursor.setOffset( (int) (id % getRecordsPerPage() * getRecordSize()) ); pageCursor.setOffset( (int) (id % getRecordsPerPage() * recordSize) );
pageCursor.getBytes( data ); pageCursor.getBytes( data );
} }
while ( pageCursor.shouldRetry() ); while ( pageCursor.shouldRetry() );
Expand Down Expand Up @@ -726,8 +732,13 @@ private boolean isJustLegacyStoreTrailer( PageCursor cursor, int offset, byte[]
} }
} }


protected abstract int determineRecordSize();

@Override @Override
public abstract int getRecordSize(); public final int getRecordSize()
{
return recordSize;
}


@Override @Override
public int getRecordDataSize() public int getRecordDataSize()
Expand Down
Expand Up @@ -38,7 +38,6 @@ public class ComposableRecordStore<RECORD extends AbstractBaseRecord, HEADER ext
protected final RecordFormat<RECORD> recordFormat; protected final RecordFormat<RECORD> recordFormat;
protected final StoreHeaderFormat<HEADER> storeHeaderFormat; protected final StoreHeaderFormat<HEADER> storeHeaderFormat;
protected HEADER storeHeader; protected HEADER storeHeader;
private int recordSize;


public ComposableRecordStore( File fileName, Config configuration, IdType idType, public ComposableRecordStore( File fileName, Config configuration, IdType idType,
IdGeneratorFactory idGeneratorFactory, PageCache pageCache, LogProvider logProvider, String typeDescriptor, IdGeneratorFactory idGeneratorFactory, PageCache pageCache, LogProvider logProvider, String typeDescriptor,
Expand All @@ -58,9 +57,9 @@ public RECORD newRecord()
} }


@Override @Override
public int getRecordSize() protected int determineRecordSize()
{ {
return recordSize; return recordFormat.getRecordSize( storeHeader );
} }


@Override @Override
Expand Down Expand Up @@ -97,9 +96,12 @@ public long getNextRecordReference( RECORD record )
} }


@Override @Override
protected void createHeaderRecord( PageCursor cursor ) protected void createHeaderRecord( PageCursor cursor ) throws IOException
{ {
int offset = cursor.getOffset();
storeHeaderFormat.writeHeader( cursor ); storeHeaderFormat.writeHeader( cursor );
cursor.setOffset( offset );
readHeaderAndInitializeRecordFormat( cursor );
} }


@Override @Override
Expand All @@ -112,7 +114,6 @@ public int getNumberOfReservedLowIds()
protected void readHeaderAndInitializeRecordFormat( PageCursor cursor ) throws IOException protected void readHeaderAndInitializeRecordFormat( PageCursor cursor ) throws IOException
{ {
storeHeader = storeHeaderFormat.readHeader( cursor ); storeHeader = storeHeaderFormat.readHeader( cursor );
recordSize = recordFormat.getRecordSize( storeHeader );
} }


@Override @Override
Expand Down
Expand Up @@ -97,8 +97,6 @@ public String description()
} }
} }


public static final int META_DATA_RECORD_COUNT = Position.values().length;

// Fields the neostore keeps cached and must be initialized on startup // Fields the neostore keeps cached and must be initialized on startup
private volatile long creationTimeField = FIELD_NOT_INITIALIZED; private volatile long creationTimeField = FIELD_NOT_INITIALIZED;
private volatile long randomNumberField = FIELD_NOT_INITIALIZED; private volatile long randomNumberField = FIELD_NOT_INITIALIZED;
Expand Down Expand Up @@ -173,18 +171,6 @@ protected void initialiseNewStoreFile( PagedFile file ) throws IOException
storeFile = null; storeFile = null;
} }


@Override
protected void createHeaderRecord( PageCursor cursor )
{
// We aren't creating a header, but we have said that we have reserved low ids.
}

@Override
public int getNumberOfReservedLowIds()
{
return META_DATA_RECORD_COUNT;
}

// Only for initialization and recovery, so we don't need to lock the records // Only for initialization and recovery, so we don't need to lock the records
@Override @Override
public void setLastCommittedAndClosedTransactionId( public void setLastCommittedAndClosedTransactionId(
Expand All @@ -202,7 +188,7 @@ public void setLastCommittedAndClosedTransactionId(
} }


@Override @Override
public int getRecordSize() protected int determineRecordSize()
{ {
return RECORD_SIZE; return RECORD_SIZE;
} }
Expand Down

This file was deleted.

Expand Up @@ -52,7 +52,7 @@ public RecordFormat<NodeRecord> node()
public RecordFormat<RelationshipRecord> relationship() public RecordFormat<RelationshipRecord> relationship()
{ {
// Yes, uses the same relationship record format as 1.9 // Yes, uses the same relationship record format as 1.9
return new RelationshipRecordFormatV1_9(); return new RelationshipRecordFormatV2_0();
} }


@Override @Override
Expand Down

This file was deleted.

0 comments on commit afc4a49

Please sign in to comment.