Skip to content

Commit

Permalink
remove abstraction leak of stores
Browse files Browse the repository at this point in the history
  • Loading branch information
fickludd committed Nov 17, 2017
1 parent d75bc1a commit ac17817
Show file tree
Hide file tree
Showing 10 changed files with 351 additions and 153 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
package org.neo4j.kernel.impl.newapi;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.function.Supplier;

import org.neo4j.function.Suppliers;
Expand All @@ -38,14 +37,8 @@
import org.neo4j.kernel.api.schema.index.IndexDescriptorFactory;
import org.neo4j.kernel.api.txstate.ExplicitIndexTransactionState;
import org.neo4j.kernel.impl.api.store.PropertyUtil;
import org.neo4j.kernel.impl.store.AbstractDynamicStore;
import org.neo4j.kernel.impl.store.NodeStore;
import org.neo4j.kernel.impl.store.PropertyStore;
import org.neo4j.kernel.impl.store.RecordCursor;
import org.neo4j.kernel.impl.store.RecordStore;
import org.neo4j.kernel.impl.store.RelationshipGroupStore;
import org.neo4j.kernel.impl.store.RelationshipStore;
import org.neo4j.kernel.impl.store.StoreHolder;
import org.neo4j.kernel.impl.store.record.AbstractBaseRecord;
import org.neo4j.kernel.impl.store.record.DynamicRecord;
import org.neo4j.kernel.impl.store.record.NodeRecord;
Expand All @@ -63,15 +56,14 @@
import org.neo4j.values.storable.TextValue;
import org.neo4j.values.storable.Values;

import static org.neo4j.kernel.impl.store.record.AbstractBaseRecord.NO_ID;
import static org.neo4j.kernel.impl.store.record.RecordLoad.NORMAL;

class AllStoreHolder extends Read implements Token
{
private final RelationshipGroupStore groupStore;
private final PropertyStore propertyStore;
private final NodeStore nodeStore;
private final RelationshipStore relationshipStore;
private final StorageStatement.Nodes nodes;
private final StorageStatement.Groups groups;
private final StorageStatement.Properties properties;
private final StorageStatement.Relationships relationships;
private final StorageStatement statement;
private final StoreReadLayer read;
private final Lazy<ExplicitIndexTransactionState> explicitIndexes;
Expand All @@ -84,11 +76,10 @@ class AllStoreHolder extends Read implements Token
this.statement = statement; // use provided statement, to assert no leakage
this.explicitIndexes = Suppliers.lazySingleton( explicitIndexes );

StoreHolder stores = engine.stores();
this.nodeStore = stores.getNodeStore();
this.relationshipStore = stores.getRelationshipStore();
this.groupStore = stores.getRelationshipGroupStore();
this.propertyStore = stores.getPropertyStore();
this.nodes = statement.nodes();
this.relationships = statement.relationships();
this.groups = statement.groups();
this.properties = statement.properties();
}

@Override
Expand Down Expand Up @@ -224,43 +215,44 @@ public int propertyKey( String name )
@Override
PageCursor nodePage( long reference )
{
return nodeStore.openPageCursorForReading( reference );
// return read.nodes().openPageCursor( reference );
return nodes.openPageCursor( reference );
}

@Override
PageCursor relationshipPage( long reference )
{
return relationshipStore.openPageCursorForReading( reference );
return relationships.openPageCursor( reference );
}

@Override
PageCursor groupPage( long reference )
{
return groupStore.openPageCursorForReading( reference );
return groups.openPageCursor( reference );
}

@Override
PageCursor propertyPage( long reference )
{
return propertyStore.openPageCursorForReading( reference );
return properties.openPageCursor( reference );
}

@Override
PageCursor stringPage( long reference )
{
return propertyStore.getStringStore().openPageCursorForReading( reference );
return properties.openStringPageCursor( reference );
}

@Override
PageCursor arrayPage( long reference )
{
return propertyStore.getArrayStore().openPageCursorForReading( reference );
return properties.openArrayPageCursor( reference );
}

@Override
RecordCursor<DynamicRecord> labelCursor()
{
return newCursor( nodeStore.getDynamicLabelStore() );
return nodes.newLabelCursor();
}

private static <R extends AbstractBaseRecord> RecordCursor<R> newCursor( RecordStore<R> store )
Expand All @@ -271,94 +263,52 @@ private static <R extends AbstractBaseRecord> RecordCursor<R> newCursor( RecordS
@Override
void node( NodeRecord record, long reference, PageCursor pageCursor )
{
nodeStore.getRecordByCursor( reference, record, RecordLoad.CHECK, pageCursor );
nodes.loadRecordByCursor( reference, record, RecordLoad.CHECK, pageCursor );
}

@Override
void relationship( RelationshipRecord record, long reference, PageCursor pageCursor )
{
relationshipStore.getRecordByCursor( reference, record, RecordLoad.CHECK, pageCursor );
relationships.loadRecordByCursor( reference, record, RecordLoad.CHECK, pageCursor );
}

@Override
void property( PropertyRecord record, long reference, PageCursor pageCursor )
{
propertyStore.getRecordByCursor( reference, record, RecordLoad.NORMAL, pageCursor );
properties.loadRecordByCursor( reference, record, RecordLoad.NORMAL, pageCursor );
}

@Override
void group( RelationshipGroupRecord record, long reference, PageCursor page )
{
groupStore.getRecordByCursor( reference, record, RecordLoad.NORMAL, page );
groups.loadRecordByCursor( reference, record, RecordLoad.NORMAL, page );
}

@Override
long nodeHighMark()
{
return nodeStore.getHighestPossibleIdInUse();
return nodes.getHighestPossibleIdInUse();
}

@Override
long relationshipHighMark()
{
return relationshipStore.getHighestPossibleIdInUse();
return relationships.getHighestPossibleIdInUse();
}

@Override
TextValue string( PropertyCursor cursor, long reference, PageCursor page )
{
ByteBuffer buffer =
cursor.buffer = readDynamic( propertyStore.getStringStore(), reference, cursor.buffer, page );
ByteBuffer buffer = cursor.buffer = properties.loadString( reference, cursor.buffer, page );
buffer.flip();
return Values.stringValue( UTF8.decode( buffer.array(), 0, buffer.limit() ) );
}

@Override
ArrayValue array( PropertyCursor cursor, long reference, PageCursor page )
{
ByteBuffer buffer =
cursor.buffer = readDynamic( propertyStore.getArrayStore(), reference, cursor.buffer, page );
ByteBuffer buffer = cursor.buffer = properties.loadArray( reference, cursor.buffer, page );
buffer.flip();
return PropertyUtil.readArrayFromBuffer( buffer );
}

private static ByteBuffer readDynamic(
AbstractDynamicStore store, long reference, ByteBuffer buffer,
PageCursor page )
{
if ( buffer == null )
{
buffer = ByteBuffer.allocate( 512 );
}
else
{
buffer.clear();
}
DynamicRecord record = store.newRecord();
do
{
store.getRecordByCursor( reference, record, RecordLoad.CHECK, page );
reference = record.getNextBlock();
byte[] data = record.getData();
if ( buffer.remaining() < data.length )
{
buffer = grow( buffer, data.length );
}
buffer.put( data, 0, data.length );
}
while ( reference != NO_ID );
return buffer;
}

private static ByteBuffer grow( ByteBuffer buffer, int required )
{
buffer.flip();
int capacity = buffer.capacity();
do
{
capacity *= 2;
}
while ( capacity - buffer.limit() < required );
return ByteBuffer.allocate( capacity ).order( ByteOrder.LITTLE_ENDIAN ).put( buffer );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,6 @@
import org.neo4j.kernel.impl.store.RecordStore;
import org.neo4j.kernel.impl.store.SchemaStorage;
import org.neo4j.kernel.impl.store.StoreFactory;
import org.neo4j.kernel.impl.store.StoreHolder;
import org.neo4j.kernel.impl.store.StoreType;
import org.neo4j.kernel.impl.store.format.RecordFormat;
import org.neo4j.kernel.impl.store.id.IdGeneratorFactory;
Expand Down Expand Up @@ -399,12 +398,6 @@ public void satisfyDependencies( DependencySatisfier satisfier )
satisfier.satisfyDependency( indexStoreView );
}

@Override
public StoreHolder stores()
{
return neoStores;
}

@Override
public void init() throws Throwable
{
Expand Down

0 comments on commit ac17817

Please sign in to comment.