Search in sources :

Example 1 with TransactionLock

use of org.janusgraph.graphdb.transaction.lock.TransactionLock in project janusgraph by JanusGraph.

the class StandardJanusGraphTx method getLock.

private TransactionLock getLock(final LockTuple la) {
    if (config.isSingleThreaded())
        return FakeLock.INSTANCE;
    Map<LockTuple, TransactionLock> result = uniqueLocks;
    if (result == UNINITIALIZED_LOCKS) {
        Preconditions.checkArgument(!config.isSingleThreaded());
        synchronized (this) {
            result = uniqueLocks;
            if (result == UNINITIALIZED_LOCKS)
                uniqueLocks = result = new ConcurrentHashMap<>();
        }
    }
    // TODO: clean out no longer used locks from uniqueLocks when it grows to large (use ReadWriteLock to protect against race conditions)
    TransactionLock lock = new ReentrantTransactionLock();
    TransactionLock existingLock = result.putIfAbsent(la, lock);
    return (existingLock == null) ? lock : existingLock;
}
Also used : LockTuple(org.janusgraph.graphdb.transaction.lock.LockTuple) IndexLockTuple(org.janusgraph.graphdb.transaction.lock.IndexLockTuple) ReentrantTransactionLock(org.janusgraph.graphdb.transaction.lock.ReentrantTransactionLock) TransactionLock(org.janusgraph.graphdb.transaction.lock.TransactionLock) ReentrantTransactionLock(org.janusgraph.graphdb.transaction.lock.ReentrantTransactionLock)

Example 2 with TransactionLock

use of org.janusgraph.graphdb.transaction.lock.TransactionLock in project janusgraph by JanusGraph.

the class StandardJanusGraphTx method addEdge.

public JanusGraphEdge addEdge(Long id, JanusGraphVertex outVertex, JanusGraphVertex inVertex, EdgeLabel label) {
    verifyWriteAccess(outVertex, inVertex);
    outVertex = ((InternalVertex) outVertex).it();
    inVertex = ((InternalVertex) inVertex).it();
    Preconditions.checkNotNull(label);
    checkConnectionConstraintOrCreateConnectionConstraint(outVertex, inVertex, label);
    Multiplicity multiplicity = label.multiplicity();
    TransactionLock uniqueLock = getUniquenessLock(outVertex, (InternalRelationType) label, inVertex);
    uniqueLock.lock(LOCK_TIMEOUT);
    try {
        // Check uniqueness
        if (config.hasVerifyUniqueness()) {
            if (multiplicity == Multiplicity.SIMPLE) {
                if (!Iterables.isEmpty(query(outVertex).type(label).direction(Direction.OUT).adjacent(inVertex).edges()))
                    throw new SchemaViolationException("An edge with the given label already exists between the pair of vertices and the label [%s] is simple", label.name());
            }
            if (multiplicity.isUnique(Direction.OUT)) {
                if (!Iterables.isEmpty(query(outVertex).type(label).direction(Direction.OUT).edges()))
                    throw new SchemaViolationException("An edge with the given label already exists on the out-vertex and the label [%s] is out-unique", label.name());
            }
            if (multiplicity.isUnique(Direction.IN)) {
                if (!Iterables.isEmpty(query(inVertex).type(label).direction(Direction.IN).edges()))
                    throw new SchemaViolationException("An edge with the given label already exists on the in-vertex and the label [%s] is in-unique", label.name());
            }
        }
        long edgeId = id == null ? IDManager.getTemporaryRelationID(temporaryIds.nextID()) : id;
        StandardEdge edge = new StandardEdge(edgeId, label, (InternalVertex) outVertex, (InternalVertex) inVertex, ElementLifeCycle.New);
        if (config.hasAssignIDsImmediately() && id == null)
            graph.assignID(edge);
        connectRelation(edge);
        return edge;
    } finally {
        uniqueLock.unlock();
    }
}
Also used : Multiplicity(org.janusgraph.core.Multiplicity) SchemaViolationException(org.janusgraph.core.SchemaViolationException) StandardEdge(org.janusgraph.graphdb.relations.StandardEdge) TransactionLock(org.janusgraph.graphdb.transaction.lock.TransactionLock) ReentrantTransactionLock(org.janusgraph.graphdb.transaction.lock.ReentrantTransactionLock)

Example 3 with TransactionLock

use of org.janusgraph.graphdb.transaction.lock.TransactionLock in project janusgraph by JanusGraph.

the class StandardJanusGraphTx method addProperty.

public JanusGraphVertexProperty addProperty(VertexProperty.Cardinality cardinality, JanusGraphVertex vertex, PropertyKey key, Object value, Long id) {
    if (key.cardinality().convert() != cardinality && cardinality != VertexProperty.Cardinality.single)
        throw new SchemaViolationException("Key is defined for %s cardinality which conflicts with specified: %s", key.cardinality(), cardinality);
    verifyWriteAccess(vertex);
    Preconditions.checkArgument(!(key instanceof ImplicitKey), "Cannot create a property of implicit type: %s", key.name());
    vertex = ((InternalVertex) vertex).it();
    Preconditions.checkNotNull(key);
    checkPropertyConstraintForVertexOrCreatePropertyConstraint(vertex, key);
    final Object normalizedValue = verifyAttribute(key, value);
    Cardinality keyCardinality = key.cardinality();
    // Determine unique indexes
    final List<IndexLockTuple> uniqueIndexTuples = new ArrayList<>();
    for (CompositeIndexType index : TypeUtil.getUniqueIndexes(key)) {
        IndexSerializer.IndexRecords matches = IndexSerializer.indexMatches(vertex, index, key, normalizedValue);
        for (Object[] match : matches.getRecordValues()) uniqueIndexTuples.add(new IndexLockTuple(index, match));
    }
    TransactionLock uniqueLock = getUniquenessLock(vertex, (InternalRelationType) key, normalizedValue);
    // Add locks for unique indexes
    for (IndexLockTuple lockTuple : uniqueIndexTuples) uniqueLock = new CombinerLock(uniqueLock, getLock(lockTuple), times);
    uniqueLock.lock(LOCK_TIMEOUT);
    try {
        // //Check vertex-centric uniqueness -> this doesn't really make sense to check
        // if (config.hasVerifyUniqueness()) {
        // if (cardinality == Cardinality.SINGLE) {
        // if (!Iterables.isEmpty(query(vertex).type(key).properties()))
        // throw new SchemaViolationException("A property with the given key [%s] already exists on the vertex [%s] and the property key is defined as single-valued", key.name(), vertex);
        // }
        // if (cardinality == Cardinality.SET) {
        // if (!Iterables.isEmpty(Iterables.filter(query(vertex).type(key).properties(), new Predicate<JanusGraphVertexProperty>() {
        // @Override
        // public boolean apply(@Nullable JanusGraphVertexProperty janusgraphProperty) {
        // return normalizedValue.equals(janusgraphProperty.value());
        // }
        // })))
        // throw new SchemaViolationException("A property with the given key [%s] and value [%s] already exists on the vertex and the property key is defined as set-valued", key.name(), normalizedValue);
        // }
        // }
        long propId = id == null ? IDManager.getTemporaryRelationID(temporaryIds.nextID()) : id;
        StandardVertexProperty prop = new StandardVertexProperty(propId, key, (InternalVertex) vertex, normalizedValue, ElementLifeCycle.New);
        if (config.hasAssignIDsImmediately() && id == null)
            graph.assignID(prop);
        // Delete properties if the cardinality is restricted
        if (cardinality == VertexProperty.Cardinality.single || cardinality == VertexProperty.Cardinality.set) {
            Consumer<JanusGraphVertexProperty> propertyRemover = JanusGraphVertexProperty.getRemover(cardinality, normalizedValue);
            if ((!config.hasVerifyUniqueness() || ((InternalRelationType) key).getConsistencyModifier() != ConsistencyModifier.LOCK) && !TypeUtil.hasAnyIndex(key) && cardinality == keyCardinality.convert()) {
                // Only delete in-memory so as to not trigger a read from the database which isn't necessary because we will overwrite blindly
                // We need to label the new property as "upsert", so that in case property deletion happens, we not only delete this new
                // in-memory property, but also read from database to delete the old value (if exists)
                ((InternalVertex) vertex).getAddedRelations(p -> p.getType().equals(key)).forEach(p -> propertyRemover.accept((JanusGraphVertexProperty) p));
                prop.setUpsert(true);
            } else {
                ((InternalVertex) vertex).query().types(key).properties().forEach(propertyRemover);
            }
        }
        // Check index uniqueness
        if (config.hasVerifyUniqueness()) {
            // Check all unique indexes
            for (IndexLockTuple lockTuple : uniqueIndexTuples) {
                if (!Iterables.isEmpty(IndexHelper.getQueryResults(lockTuple.getIndex(), lockTuple.getAll(), this)))
                    throw new SchemaViolationException("Adding this property for key [%s] and value [%s] violates a uniqueness constraint [%s]", key.name(), normalizedValue, lockTuple.getIndex());
            }
        }
        connectRelation(prop);
        return prop;
    } finally {
        uniqueLock.unlock();
    }
}
Also used : InternalVertex(org.janusgraph.graphdb.internal.InternalVertex) PredicateCondition(org.janusgraph.graphdb.query.condition.PredicateCondition) CacheVertex(org.janusgraph.graphdb.vertices.CacheVertex) JanusGraphVertex(org.janusgraph.core.JanusGraphVertex) EdgeLabelVertex(org.janusgraph.graphdb.types.vertices.EdgeLabelVertex) StringUtils(org.apache.commons.lang3.StringUtils) AddedRelationsContainer(org.janusgraph.graphdb.transaction.addedrelations.AddedRelationsContainer) CombinerLock(org.janusgraph.graphdb.transaction.lock.CombinerLock) MixedIndexCountQuery(org.janusgraph.core.MixedIndexCountQuery) SystemTypeManager(org.janusgraph.graphdb.types.system.SystemTypeManager) Cardinality(org.janusgraph.core.Cardinality) TypeDefinitionCategory(org.janusgraph.graphdb.types.TypeDefinitionCategory) StandardVertex(org.janusgraph.graphdb.vertices.StandardVertex) InternalRelation(org.janusgraph.graphdb.internal.InternalRelation) Duration(java.time.Duration) Map(java.util.Map) IndexType(org.janusgraph.graphdb.types.IndexType) ConcurrentIndexCache(org.janusgraph.graphdb.transaction.indexcache.ConcurrentIndexCache) TransactionLock(org.janusgraph.graphdb.transaction.lock.TransactionLock) And(org.janusgraph.graphdb.query.condition.And) StandardVertexProperty(org.janusgraph.graphdb.relations.StandardVertexProperty) PropertyKey(org.janusgraph.core.PropertyKey) TimestampProvider(org.janusgraph.diskstorage.util.time.TimestampProvider) StandardJanusGraph(org.janusgraph.graphdb.database.StandardJanusGraph) BaseLabel(org.janusgraph.graphdb.types.system.BaseLabel) Set(java.util.Set) EdgeSerializer(org.janusgraph.graphdb.database.EdgeSerializer) EdgeLabel(org.janusgraph.core.EdgeLabel) JanusGraphVertexProperty(org.janusgraph.core.JanusGraphVertexProperty) EdgeLabelMaker(org.janusgraph.core.schema.EdgeLabelMaker) IndexCache(org.janusgraph.graphdb.transaction.indexcache.IndexCache) ProfiledIterator(org.janusgraph.graphdb.util.ProfiledIterator) IndexQueryBuilder(org.janusgraph.graphdb.query.graph.IndexQueryBuilder) JanusGraphRelation(org.janusgraph.core.JanusGraphRelation) FakeLock(org.janusgraph.graphdb.transaction.lock.FakeLock) LongArrayList(com.carrotsearch.hppc.LongArrayList) Iterables(com.google.common.collect.Iterables) IndexSerializer(org.janusgraph.graphdb.database.IndexSerializer) Supplier(java.util.function.Supplier) ArrayList(java.util.ArrayList) JanusGraphIndexQuery(org.janusgraph.core.JanusGraphIndexQuery) NonBlockingHashMap(org.jctools.maps.NonBlockingHashMap) SchemaInspector(org.janusgraph.core.schema.SchemaInspector) VertexCentricQueryBuilder(org.janusgraph.graphdb.query.vertex.VertexCentricQueryBuilder) Cmp(org.janusgraph.core.attribute.Cmp) ConsistencyModifier(org.janusgraph.core.schema.ConsistencyModifier) EntryList(org.janusgraph.diskstorage.EntryList) JanusGraphException(org.janusgraph.core.JanusGraphException) StandardEdgeLabelMaker(org.janusgraph.graphdb.types.StandardEdgeLabelMaker) EmptySubqueryCache(org.janusgraph.graphdb.transaction.subquerycache.EmptySubqueryCache) Nullable(javax.annotation.Nullable) JanusGraphElement(org.janusgraph.core.JanusGraphElement) IDPool(org.janusgraph.graphdb.database.idassigner.IDPool) QueryUtil(org.janusgraph.graphdb.query.QueryUtil) PropertyKeyVertex(org.janusgraph.graphdb.types.vertices.PropertyKeyVertex) JanusGraphMultiVertexQuery(org.janusgraph.core.JanusGraphMultiVertexQuery) SimpleAddedRelations(org.janusgraph.graphdb.transaction.addedrelations.SimpleAddedRelations) RelationIdentifierUtils(org.janusgraph.graphdb.relations.RelationIdentifierUtils) CompositeIndexType(org.janusgraph.graphdb.types.CompositeIndexType) JanusGraphSchemaCategory(org.janusgraph.graphdb.internal.JanusGraphSchemaCategory) RelationComparator(org.janusgraph.graphdb.relations.RelationComparator) TypeDefinitionDescription(org.janusgraph.graphdb.types.TypeDefinitionDescription) EmptyAddedRelations(org.janusgraph.graphdb.transaction.addedrelations.EmptyAddedRelations) SimpleIndexCache(org.janusgraph.graphdb.transaction.indexcache.SimpleIndexCache) AtomicLong(java.util.concurrent.atomic.AtomicLong) Direction(org.apache.tinkerpop.gremlin.structure.Direction) Retriever(org.janusgraph.util.datastructures.Retriever) InternalVertexLabel(org.janusgraph.graphdb.internal.InternalVertexLabel) ConcurrentAddedRelations(org.janusgraph.graphdb.transaction.addedrelations.ConcurrentAddedRelations) SubqueryIterator(org.janusgraph.graphdb.util.SubqueryIterator) LockTuple(org.janusgraph.graphdb.transaction.lock.LockTuple) Preconditions(com.google.common.base.Preconditions) VertexLabel(org.janusgraph.core.VertexLabel) GraphCentricQuery(org.janusgraph.graphdb.query.graph.GraphCentricQuery) VertexCentricQuery(org.janusgraph.graphdb.query.vertex.VertexCentricQuery) BaseKey(org.janusgraph.graphdb.types.system.BaseKey) TypeDefinitionMap(org.janusgraph.graphdb.types.TypeDefinitionMap) LoggerFactory(org.slf4j.LoggerFactory) VertexLabelMaker(org.janusgraph.core.schema.VertexLabelMaker) QueryExecutor(org.janusgraph.graphdb.query.QueryExecutor) MetricManager(org.janusgraph.util.stats.MetricManager) JanusGraphEdge(org.janusgraph.core.JanusGraphEdge) MixedIndexCountQueryBuilder(org.janusgraph.graphdb.query.graph.MixedIndexCountQueryBuilder) SystemRelationType(org.janusgraph.graphdb.types.system.SystemRelationType) JanusGraphSchemaElement(org.janusgraph.core.schema.JanusGraphSchemaElement) MetricsQueryExecutor(org.janusgraph.graphdb.query.MetricsQueryExecutor) ReentrantTransactionLock(org.janusgraph.graphdb.transaction.lock.ReentrantTransactionLock) AttributeHandler(org.janusgraph.graphdb.database.serialize.AttributeHandler) TypeInspector(org.janusgraph.graphdb.types.TypeInspector) Multiplicity(org.janusgraph.core.Multiplicity) RelationType(org.janusgraph.core.RelationType) Property(org.apache.tinkerpop.gremlin.structure.Property) ElementLifeCycle(org.janusgraph.graphdb.internal.ElementLifeCycle) SchemaViolationException(org.janusgraph.core.SchemaViolationException) VertexCache(org.janusgraph.graphdb.transaction.vertexcache.VertexCache) ImmutableMap(com.google.common.collect.ImmutableMap) PropertyKeyMaker(org.janusgraph.core.schema.PropertyKeyMaker) Collection(java.util.Collection) SliceQuery(org.janusgraph.diskstorage.keycolumnvalue.SliceQuery) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) Connection(org.janusgraph.core.Connection) JanusGraphSchemaVertex(org.janusgraph.graphdb.types.vertices.JanusGraphSchemaVertex) StandardPropertyKeyMaker(org.janusgraph.graphdb.types.StandardPropertyKeyMaker) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) List(java.util.List) RelationIdentifier(org.janusgraph.graphdb.relations.RelationIdentifier) ImplicitKey(org.janusgraph.graphdb.types.system.ImplicitKey) GraphCentricQueryBuilder(org.janusgraph.graphdb.query.graph.GraphCentricQueryBuilder) InternalRelationType(org.janusgraph.graphdb.internal.InternalRelationType) IndexHelper(org.janusgraph.graphdb.util.IndexHelper) ConditionUtil(org.janusgraph.graphdb.query.condition.ConditionUtil) JointIndexQuery(org.janusgraph.graphdb.query.graph.JointIndexQuery) Condition(org.janusgraph.graphdb.query.condition.Condition) VertexCentricEdgeIterable(org.janusgraph.graphdb.util.VertexCentricEdgeIterable) IndexTransaction(org.janusgraph.diskstorage.indexing.IndexTransaction) BackendTransaction(org.janusgraph.diskstorage.BackendTransaction) IDManager(org.janusgraph.graphdb.idmanagement.IDManager) VertexLabelVertex(org.janusgraph.graphdb.types.VertexLabelVertex) PreloadedVertex(org.janusgraph.graphdb.vertices.PreloadedVertex) HashMap(java.util.HashMap) Function(java.util.function.Function) StandardEdge(org.janusgraph.graphdb.relations.StandardEdge) ConcurrentMap(java.util.concurrent.ConcurrentMap) VertexProperty(org.apache.tinkerpop.gremlin.structure.VertexProperty) StandardVertexLabelMaker(org.janusgraph.graphdb.types.StandardVertexLabelMaker) IndexLockTuple(org.janusgraph.graphdb.transaction.lock.IndexLockTuple) MultiVertexCentricQueryBuilder(org.janusgraph.graphdb.query.vertex.MultiVertexCentricQueryBuilder) RelationCategory(org.janusgraph.graphdb.internal.RelationCategory) IndexSelectionStrategy(org.janusgraph.graphdb.query.index.IndexSelectionStrategy) NoSuchElementException(java.util.NoSuchElementException) JanusGraphBlueprintsTransaction(org.janusgraph.graphdb.tinkerpop.JanusGraphBlueprintsTransaction) BackendException(org.janusgraph.diskstorage.BackendException) TypeUtil(org.janusgraph.graphdb.types.TypeUtil) EmptyVertexCache(org.janusgraph.graphdb.transaction.vertexcache.EmptyVertexCache) QueryProfiler(org.janusgraph.graphdb.query.profile.QueryProfiler) Logger(org.slf4j.Logger) Iterator(java.util.Iterator) Query(org.janusgraph.graphdb.query.Query) BaseVertexLabel(org.janusgraph.graphdb.types.system.BaseVertexLabel) SubqueryCache(org.janusgraph.graphdb.transaction.subquerycache.SubqueryCache) ElementCategory(org.janusgraph.graphdb.internal.ElementCategory) Consumer(java.util.function.Consumer) EmptyIndexCache(org.janusgraph.graphdb.transaction.indexcache.EmptyIndexCache) GuavaVertexCache(org.janusgraph.graphdb.transaction.vertexcache.GuavaVertexCache) Collections(java.util.Collections) GuavaSubqueryCache(org.janusgraph.graphdb.transaction.subquerycache.GuavaSubqueryCache) ReadOnlyTransactionException(org.janusgraph.core.ReadOnlyTransactionException) Cardinality(org.janusgraph.core.Cardinality) IndexSerializer(org.janusgraph.graphdb.database.IndexSerializer) LongArrayList(com.carrotsearch.hppc.LongArrayList) ArrayList(java.util.ArrayList) StandardVertexProperty(org.janusgraph.graphdb.relations.StandardVertexProperty) IndexLockTuple(org.janusgraph.graphdb.transaction.lock.IndexLockTuple) JanusGraphVertexProperty(org.janusgraph.core.JanusGraphVertexProperty) CombinerLock(org.janusgraph.graphdb.transaction.lock.CombinerLock) CompositeIndexType(org.janusgraph.graphdb.types.CompositeIndexType) SchemaViolationException(org.janusgraph.core.SchemaViolationException) ImplicitKey(org.janusgraph.graphdb.types.system.ImplicitKey) TransactionLock(org.janusgraph.graphdb.transaction.lock.TransactionLock) ReentrantTransactionLock(org.janusgraph.graphdb.transaction.lock.ReentrantTransactionLock)

Example 4 with TransactionLock

use of org.janusgraph.graphdb.transaction.lock.TransactionLock in project janusgraph by JanusGraph.

the class StandardJanusGraphTx method getUniquenessLock.

private TransactionLock getUniquenessLock(final JanusGraphVertex out, final InternalRelationType type, final Object in) {
    Multiplicity multiplicity = type.multiplicity();
    TransactionLock uniqueLock = FakeLock.INSTANCE;
    if (config.hasVerifyUniqueness() && multiplicity.isConstrained()) {
        uniqueLock = null;
        if (multiplicity == Multiplicity.SIMPLE) {
            uniqueLock = getLock(out, type, in);
        } else {
            for (Direction dir : Direction.proper) {
                if (multiplicity.isUnique(dir)) {
                    TransactionLock lock = getLock(dir == Direction.OUT ? out : in, type, dir);
                    if (uniqueLock == null)
                        uniqueLock = lock;
                    else
                        uniqueLock = new CombinerLock(uniqueLock, lock, times);
                }
            }
        }
    }
    assert uniqueLock != null;
    return uniqueLock;
}
Also used : CombinerLock(org.janusgraph.graphdb.transaction.lock.CombinerLock) Multiplicity(org.janusgraph.core.Multiplicity) Direction(org.apache.tinkerpop.gremlin.structure.Direction) TransactionLock(org.janusgraph.graphdb.transaction.lock.TransactionLock) ReentrantTransactionLock(org.janusgraph.graphdb.transaction.lock.ReentrantTransactionLock)

Aggregations

ReentrantTransactionLock (org.janusgraph.graphdb.transaction.lock.ReentrantTransactionLock)4 TransactionLock (org.janusgraph.graphdb.transaction.lock.TransactionLock)4 Multiplicity (org.janusgraph.core.Multiplicity)3 Direction (org.apache.tinkerpop.gremlin.structure.Direction)2 SchemaViolationException (org.janusgraph.core.SchemaViolationException)2 StandardEdge (org.janusgraph.graphdb.relations.StandardEdge)2 IndexLockTuple (org.janusgraph.graphdb.transaction.lock.IndexLockTuple)2 LockTuple (org.janusgraph.graphdb.transaction.lock.LockTuple)2 LongArrayList (com.carrotsearch.hppc.LongArrayList)1 Preconditions (com.google.common.base.Preconditions)1 ImmutableMap (com.google.common.collect.ImmutableMap)1 Iterables (com.google.common.collect.Iterables)1 Sets (com.google.common.collect.Sets)1 Duration (java.time.Duration)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 Collections (java.util.Collections)1 HashMap (java.util.HashMap)1 Iterator (java.util.Iterator)1 List (java.util.List)1