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.
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 );
}
}
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.