Search in sources :

Example 46 with MutableLongSet

use of org.eclipse.collections.api.set.primitive.MutableLongSet in project neo4j by neo4j.

the class TxStateIndexChanges method indexUpdatesForRangeSeekByPrefix.

// PREFIX
static AddedAndRemoved indexUpdatesForRangeSeekByPrefix(ReadableTransactionState txState, IndexDescriptor descriptor, Value[] equalityPrefix, TextValue prefix, IndexOrder indexOrder) {
    NavigableMap<ValueTuple, ? extends LongDiffSets> sortedUpdates = txState.getSortedIndexUpdates(descriptor.schema());
    if (sortedUpdates == null) {
        return EMPTY_ADDED_AND_REMOVED;
    }
    int size = descriptor.schema().getPropertyIds().length;
    ValueTuple floor = getCompositeValueTuple(size, equalityPrefix, prefix, true);
    ValueTuple maxString = getCompositeValueTuple(size, equalityPrefix, Values.MAX_STRING, false);
    MutableLongList added = LongLists.mutable.empty();
    MutableLongSet removed = LongSets.mutable.empty();
    for (Map.Entry<ValueTuple, ? extends LongDiffSets> entry : sortedUpdates.subMap(floor, maxString).entrySet()) {
        Value key = entry.getKey().valueAt(equalityPrefix.length);
        // Needs to check type since the subMap might include non-TextValue for composite index
        if (key.valueGroup() == ValueGroup.TEXT && ((TextValue) key).startsWith(prefix)) {
            LongDiffSets diffSets = entry.getValue();
            added.addAll(diffSets.getAdded());
            removed.addAll(diffSets.getRemoved());
        } else {
            break;
        }
    }
    return new AddedAndRemoved(indexOrder == IndexOrder.DESCENDING ? added.asReversed() : added, removed);
}
Also used : MutableLongSet(org.eclipse.collections.api.set.primitive.MutableLongSet) MutableLongList(org.eclipse.collections.api.list.primitive.MutableLongList) ValueTuple(org.neo4j.values.storable.ValueTuple) Value(org.neo4j.values.storable.Value) TextValue(org.neo4j.values.storable.TextValue) NavigableMap(java.util.NavigableMap) Map(java.util.Map) UnmodifiableMap(org.eclipse.collections.impl.UnmodifiableMap) LongDiffSets(org.neo4j.storageengine.api.txstate.LongDiffSets)

Example 47 with MutableLongSet

use of org.eclipse.collections.api.set.primitive.MutableLongSet in project neo4j by neo4j.

the class PropertyDeleter method deletePropertyChain.

public void deletePropertyChain(PrimitiveRecord primitive, RecordAccess<PropertyRecord, PrimitiveRecord> propertyRecords) {
    long nextProp = primitive.getNextProp();
    MutableLongSet seenPropertyIds = null;
    int count = 0;
    try {
        while (nextProp != Record.NO_NEXT_PROPERTY.longValue()) {
            RecordProxy<PropertyRecord, PrimitiveRecord> propertyChange = propertyRecords.getOrLoad(nextProp, primitive, cursorContext);
            PropertyRecord propRecord = propertyChange.forChangingData();
            deletePropertyRecordIncludingValueRecords(propRecord);
            if (++count >= CYCLE_DETECTION_THRESHOLD) {
                if (seenPropertyIds == null) {
                    seenPropertyIds = LongSets.mutable.empty();
                }
                if (!seenPropertyIds.add(nextProp)) {
                    throw new InconsistentDataReadException("Cycle detected in property chain for %s", primitive);
                }
            }
            nextProp = propRecord.getNextProp();
            propRecord.setChanged(primitive);
        }
    } catch (InvalidRecordException e) {
        // This property chain, or a dynamic value record chain contains a record which is not in use, so it's somewhat broken.
        // Abort reading the chain, but don't fail the deletion of this property record chain.
        logInconsistentPropertyChain(primitive, "unused record", e);
    } catch (InconsistentDataReadException e) {
        // This property chain, or a dynamic value record chain contains a cycle.
        // Abort reading the chain, but don't fail the deletion of this property record chain.
        logInconsistentPropertyChain(primitive, "cycle", e);
    }
    primitive.setNextProp(Record.NO_NEXT_PROPERTY.intValue());
}
Also used : MutableLongSet(org.eclipse.collections.api.set.primitive.MutableLongSet) PropertyRecord(org.neo4j.kernel.impl.store.record.PropertyRecord) InvalidRecordException(org.neo4j.kernel.impl.store.InvalidRecordException) PrimitiveRecord(org.neo4j.kernel.impl.store.record.PrimitiveRecord)

Example 48 with MutableLongSet

use of org.eclipse.collections.api.set.primitive.MutableLongSet in project neo4j by neo4j.

the class RecordLoading method safeGetNodeLabels.

static long[] safeGetNodeLabels(CheckerContext context, long nodeId, long labelField, RecordReader<DynamicRecord> labelReader, CursorContext cursorContext) {
    if (!NodeLabelsField.fieldPointsToDynamicRecordOfLabels(labelField)) {
        return InlineNodeLabels.parseInlined(labelField);
    }
    // The idea here is that we don't pass in a lot of cursors and stuff because dynamic labels are so rare?
    List<DynamicRecord> records = new ArrayList<>();
    MutableLongSet seenRecordIds = new LongHashSet();
    ConsistencyReport.Reporter reporter = context.reporter;
    RecordLoading recordLoader = context.recordLoader;
    int nodeLabelBlockSize = context.neoStores.getNodeStore().getDynamicLabelStore().getRecordDataSize();
    if (safeLoadDynamicRecordChain(record -> records.add(record.copy()), labelReader, seenRecordIds, NodeLabelsField.firstDynamicLabelRecordId(labelField), nodeLabelBlockSize, (id, labelRecord) -> reporter.forNode(recordLoader.node(nodeId, cursorContext)).dynamicRecordChainCycle(labelRecord), (id, labelRecord) -> reporter.forNode(recordLoader.node(nodeId, cursorContext)).dynamicLabelRecordNotInUse(labelRecord), (id, labelRecord) -> reporter.forNode(recordLoader.node(nodeId, cursorContext)).dynamicLabelRecordNotInUse(labelRecord), (id, labelRecord) -> reporter.forDynamicBlock(RecordType.NODE_DYNAMIC_LABEL, labelRecord).emptyBlock(), labelRecord -> reporter.forDynamicBlock(RecordType.NODE_DYNAMIC_LABEL, labelRecord).recordNotFullReferencesNext(), labelRecord -> reporter.forDynamicBlock(RecordType.NODE_DYNAMIC_LABEL, labelRecord).invalidLength())) {
        return DynamicNodeLabels.getDynamicLabelsArray(records, labelReader.store(), cursorContext);
    }
    return null;
}
Also used : DynamicRecord(org.neo4j.kernel.impl.store.record.DynamicRecord) LongHashSet(org.eclipse.collections.impl.set.mutable.primitive.LongHashSet) MutableLongSet(org.eclipse.collections.api.set.primitive.MutableLongSet) ArrayList(java.util.ArrayList) ConsistencyReport(org.neo4j.consistency.report.ConsistencyReport)

Example 49 with MutableLongSet

use of org.eclipse.collections.api.set.primitive.MutableLongSet in project neo4j by neo4j.

the class RecordLoading method safeLoadTokens.

static <RECORD extends TokenRecord> List<NamedToken> safeLoadTokens(TokenStore<RECORD> tokenStore, CursorContext cursorContext) {
    long highId = tokenStore.getHighId();
    List<NamedToken> tokens = new ArrayList<>();
    DynamicStringStore nameStore = tokenStore.getNameStore();
    List<DynamicRecord> nameRecords = new ArrayList<>();
    MutableLongSet seenRecordIds = new LongHashSet();
    int nameBlockSize = nameStore.getRecordDataSize();
    try (RecordReader<RECORD> tokenReader = new RecordReader<>(tokenStore, true, cursorContext);
        RecordReader<DynamicRecord> nameReader = new RecordReader<>(nameStore, false, cursorContext)) {
        for (long id = 0; id < highId; id++) {
            RECORD record = tokenReader.read(id);
            nameRecords.clear();
            if (record.inUse()) {
                String name;
                if (!NULL_REFERENCE.is(record.getNameId()) && safeLoadDynamicRecordChain(r -> nameRecords.add(r.copy()), nameReader, seenRecordIds, record.getNameId(), nameBlockSize)) {
                    record.addNameRecords(nameRecords);
                    name = tokenStore.getStringFor(record, cursorContext);
                } else {
                    name = format("<name not loaded due to token(%d) referencing unused name record>", id);
                }
                tokens.add(new NamedToken(name, toIntExact(id), record.isInternal()));
            }
        }
    }
    return tokens;
}
Also used : DynamicRecord(org.neo4j.kernel.impl.store.record.DynamicRecord) ThrowingIntFunction(org.neo4j.function.ThrowingIntFunction) CursorContext(org.neo4j.io.pagecache.context.CursorContext) Value(org.neo4j.values.storable.Value) ArrayList(java.util.ArrayList) IntObjectMap(org.eclipse.collections.api.map.primitive.IntObjectMap) InlineNodeLabels(org.neo4j.kernel.impl.store.InlineNodeLabels) NodeLabelsField(org.neo4j.kernel.impl.store.NodeLabelsField) TokenHolder(org.neo4j.token.api.TokenHolder) MutableLongCollection(org.eclipse.collections.api.collection.primitive.MutableLongCollection) NeoStores(org.neo4j.kernel.impl.store.NeoStores) LongHashSet(org.eclipse.collections.impl.set.mutable.primitive.LongHashSet) BiConsumer(java.util.function.BiConsumer) AbstractBaseRecord(org.neo4j.kernel.impl.store.record.AbstractBaseRecord) ConsistencyReport(org.neo4j.consistency.report.ConsistencyReport) TokenRecord(org.neo4j.kernel.impl.store.record.TokenRecord) Math.toIntExact(java.lang.Math.toIntExact) NO_VALUE(org.neo4j.values.storable.Values.NO_VALUE) MutableIntCollection(org.eclipse.collections.api.collection.primitive.MutableIntCollection) MutablePrimitiveObjectMap(org.eclipse.collections.api.map.primitive.MutablePrimitiveObjectMap) NULL_REFERENCE(org.neo4j.kernel.impl.store.record.Record.NULL_REFERENCE) PropertyRecord(org.neo4j.kernel.impl.store.record.PropertyRecord) RecordType(org.neo4j.consistency.RecordType) TokenStore(org.neo4j.kernel.impl.store.TokenStore) String.format(java.lang.String.format) DynamicRecord(org.neo4j.kernel.impl.store.record.DynamicRecord) MutableLongSet(org.eclipse.collections.api.set.primitive.MutableLongSet) Consumer(java.util.function.Consumer) DynamicNodeLabels(org.neo4j.kernel.impl.store.DynamicNodeLabels) RecordStore(org.neo4j.kernel.impl.store.RecordStore) List(java.util.List) PrimitiveRecord(org.neo4j.kernel.impl.store.record.PrimitiveRecord) RelationshipGroupRecord(org.neo4j.kernel.impl.store.record.RelationshipGroupRecord) TokenNotFoundException(org.neo4j.token.api.TokenNotFoundException) SchemaDescriptor(org.neo4j.internal.schema.SchemaDescriptor) NamedToken(org.neo4j.token.api.NamedToken) DynamicStringStore(org.neo4j.kernel.impl.store.DynamicStringStore) NodeRecord(org.neo4j.kernel.impl.store.record.NodeRecord) PropertySchemaType(org.neo4j.internal.schema.PropertySchemaType) RecordLoad(org.neo4j.kernel.impl.store.record.RecordLoad) RelationshipRecord(org.neo4j.kernel.impl.store.record.RelationshipRecord) DynamicStringStore(org.neo4j.kernel.impl.store.DynamicStringStore) ArrayList(java.util.ArrayList) LongHashSet(org.eclipse.collections.impl.set.mutable.primitive.LongHashSet) MutableLongSet(org.eclipse.collections.api.set.primitive.MutableLongSet) NamedToken(org.neo4j.token.api.NamedToken)

Example 50 with MutableLongSet

use of org.eclipse.collections.api.set.primitive.MutableLongSet in project neo4j by neo4j.

the class BlockStorageTest method shouldNoticeCancelRequest.

@Test
void shouldNoticeCancelRequest() throws IOException, ExecutionException, InterruptedException {
    // given
    Barrier.Control barrier = new Barrier.Control();
    TrackingMonitor monitor = new TrackingMonitor() {

        @Override
        public void mergedBlocks(long resultingBlockSize, long resultingEntryCount, long numberOfBlocks) {
            super.mergedBlocks(resultingBlockSize, resultingEntryCount, numberOfBlocks);
            barrier.reached();
        }
    };
    int blocks = 10;
    int mergeFactor = 2;
    MutableLongSet uniqueKeys = new LongHashSet();
    AtomicBoolean cancelled = new AtomicBoolean();
    try (BlockStorage<MutableLong, MutableLong> storage = new BlockStorage<>(layout, heapBufferFactory(100), fileSystem, file, monitor, INSTANCE);
        OtherThreadExecutor t2 = new OtherThreadExecutor("T2")) {
        while (monitor.blockFlushedCallCount < blocks) {
            storage.add(uniqueKey(uniqueKeys), new MutableLong());
        }
        storage.doneAdding();
        // when starting to merge
        Future<Object> merge = t2.executeDontWait(command(() -> storage.merge(mergeFactor, cancelled::get)));
        barrier.awaitUninterruptibly();
        // one merge iteration have now been done, set the cancellation flag
        cancelled.set(true);
        barrier.release();
        merge.get();
    }
    // then there should not be any more merge iterations done, i.e. merge was cancelled
    assertEquals(1, monitor.mergeIterationCallCount);
}
Also used : Barrier(org.neo4j.test.Barrier) LongHashSet(org.eclipse.collections.impl.set.mutable.primitive.LongHashSet) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) MutableLongSet(org.eclipse.collections.api.set.primitive.MutableLongSet) MutableLong(org.apache.commons.lang3.mutable.MutableLong) OtherThreadExecutor(org.neo4j.test.OtherThreadExecutor) Test(org.junit.jupiter.api.Test)

Aggregations

MutableLongSet (org.eclipse.collections.api.set.primitive.MutableLongSet)153 LongHashSet (org.eclipse.collections.impl.set.mutable.primitive.LongHashSet)57 Test (org.junit.jupiter.api.Test)54 Test (org.junit.Test)49 IndexReadSession (org.neo4j.internal.kernel.api.IndexReadSession)17 KernelTransaction (org.neo4j.kernel.api.KernelTransaction)17 ParameterizedTest (org.junit.jupiter.params.ParameterizedTest)14 ArrayList (java.util.ArrayList)13 IndexValueCapability (org.neo4j.internal.schema.IndexValueCapability)12 LongIterator (org.eclipse.collections.api.iterator.LongIterator)10 LongSet (org.eclipse.collections.api.set.primitive.LongSet)9 Value (org.neo4j.values.storable.Value)8 Map (java.util.Map)7 MutableLongList (org.eclipse.collections.api.list.primitive.MutableLongList)7 Transaction (org.neo4j.graphdb.Transaction)7 Write (org.neo4j.internal.kernel.api.Write)7 NavigableMap (java.util.NavigableMap)6 UnmodifiableMap (org.eclipse.collections.impl.UnmodifiableMap)6 LongArrayList (org.eclipse.collections.impl.list.mutable.primitive.LongArrayList)6 IndexQueryConstraints (org.neo4j.internal.kernel.api.IndexQueryConstraints)6