Cannot SchemaAction.DROP_INDEX() Of JanusGraph-Index With SchemaStatus.DISCARDED

问题描述 投票:0回答:1

问题

为什么 JanusGraph 不删除废弃的索引?
我正在对满足我们需求的最新版本的图形数据库进行性能评估。
我需要停下来重新制作 JMH 测试的索引:速度、稳定性和规模。

package org.janusgraph.core.schema;
public enum SchemaAction {
    // ...
    DROP_INDEX(Collections.singleton(SchemaStatus.DISCARDED)),
    // ...
}

请注意,在此提出的这个问题的主题、答案以及对这个指定设置的进一步评论,总是值得赞赏的。

这用于 持久后端 JanusGraph 服务器;不是

'inmemory' gremlin server
.
因此,这些数据不会在事件、登录或重启之间被清除。
这个 Cassandra-Server 用于 持久托管服务。 这不是 Gremlin-Console 示例 中测试 POCPOC。 将对启用的索引应用进一步评估,因此没有清除、删除或
inmemory
的建议。

繁殖

期待

我原以为索引会消失,所以我可以重新创建索引

janusGraphManagement.buildIndex("_id", Vertex.class).addKey(propertyKey).buildCompositeIndex();

但实际发生的是

Exception in thread "main" java.lang.IllegalStateException: Vertex with id 521 was removed.

我试着看看这是否是 JanusGraph 有时具有的另一个隐式/自动过程。

buildIndex()
自动执行自己的
get()
/
call()
SchemaStatus.REGISTERED
SchemaStatus.ENABLED
。 但是当我注释掉
janusGraphManagement.commit()
时,JanusGraph 说它没有删除索引。

Exception in thread "main" java.lang.IllegalArgumentException: An index with name '_id' has already been defined

日志

janusGraphManagement.commit()

...
2023-05-16 11:00:01,455 [INFO] [Main.main] ::    _id:   DISCARDED
Exception in thread "main" java.lang.IllegalStateException: Vertex with id 521 was removed.
    at org.janusgraph.core.InvalidElementException.removedException(InvalidElementException.java:57)
    at org.janusgraph.graphdb.vertices.AbstractVertex.verifyAccess(AbstractVertex.java:93)
    at org.janusgraph.graphdb.vertices.AbstractVertex.query(AbstractVertex.java:140)
    at org.janusgraph.graphdb.types.vertices.JanusGraphSchemaVertex.getDefinition(JanusGraphSchemaVertex.java:97)
    at org.janusgraph.graphdb.transaction.StandardJanusGraphTx.expireSchemaElement(StandardJanusGraphTx.java:1632)
    at org.janusgraph.graphdb.database.management.ManagementSystem.commit(ManagementSystem.java:252)
    at Test18.main(Test18.java:54)
...

没有
janusGraphManagement.commit()

... 

2023-05-16 10:19:28,787 [INFO] [Main.main] ::    _id:   DISCARDED
2023-05-16 10:19:28,798 [INFO] [Main.main] ::    SchemaAction.DROP_INDEX index.getIndexStatus(propertyKey): DISCARDED
Exception in thread "main" java.lang.IllegalArgumentException: An index with name '_id' has already been defined
    at com.google.common.base.Preconditions.checkArgument(Preconditions.java:220)
    at org.janusgraph.graphdb.database.management.ManagementSystem.checkIndexName(ManagementSystem.java:661)
    at org.janusgraph.graphdb.database.management.ManagementSystem.createCompositeIndex(ManagementSystem.java:728)
    at org.janusgraph.graphdb.database.management.ManagementSystem.access$300(ManagementSystem.java:130)
    at org.janusgraph.graphdb.database.management.ManagementSystem$IndexBuilder.buildCompositeIndex(ManagementSystem.java:824)
    at Test18.main(Test18.java:35)

代码

        // ...

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        JanusGraph janusGraph = JanusGraphFactory.build().set("storage.backend", "cql").set("storage.hostname", "localhost:9042").open();
        GraphTraversalSource g = janusGraph.traversal();
        g.V().drop().iterate();
        janusGraph.tx().commit();
        JanusGraphManagement janusGraphManagement = janusGraph.openManagement();
        PropertyKey propertyKey = janusGraphManagement.getOrCreatePropertyKey("_id");
        logger.info(janusGraphManagement.getGraphIndex("_id") + ":\t" + janusGraphManagement.getGraphIndex("_id").getIndexStatus(propertyKey).toString());

        // ...

        if (SchemaStatus.DISCARDED.equals(janusGraphManagement.getGraphIndex("_id").getIndexStatus(propertyKey))){
            JanusGraphIndex janusGraphIndex = janusGraphManagement.getGraphIndex("_id");
            janusGraphManagement = janusGraph.openManagement();
            janusGraphManagement.updateIndex(janusGraphIndex, SchemaAction.DROP_INDEX).get();
            janusGraphManagement.commit();
            logger.info("SchemaAction.DROP_INDEX index.getIndexStatus(propertyKey):\t" + janusGraphIndex.getIndexStatus(propertyKey));
        }
        if (!janusGraphManagement.containsGraphIndex("_id")) {
            janusGraphManagement = janusGraph.openManagement();
            janusGraphManagement.buildIndex("_id", Vertex.class).addKey(propertyKey).buildCompositeIndex();
            janusGraphManagement.commit();
            JanusGraphIndex janusGraphIndex = janusGraphManagement.getGraphIndex("_id");
            logger.info("index.getIndexStatus(propertyKey):\t" + janusGraphIndex.getIndexStatus(propertyKey));
        }

        // ...

资源

  1. Maven 3.8.1
  2. Java 11.0.19 (corretto-11)
  3. JanusGraph 1.0.0-20230504-014643.988c094
  4. Windows 10
  5. 码头工人
  6. Cassandra:latest [容器]
  7. ICIJ 离岸数据泄露
full-text-search cassandra-3.0 docker-container janusgraph java-17
1个回答
0
投票

结束

JanusGraphManagement
如何处理
updateIndex()
.

JanusGraphIndex
将在使用
SchemaStatus
询问时被“视为”新的
getIndexStatus
。 等待
awaitGraphIndexStatus().status()
.
时,这不会是真的
ManagementSystem
只看到与
janusGraphManagement.commit()
之后相同。
然后,必须制作一个新的
janusGraphManagement = janusGraph.openManagement()
来比较他们说的
janusGraphIndex
与他们两个说的相同。

但是,当执行

SchemaAction.DROP_INDEX
时,这将不是真的。
janusGraphIndex
将保持其状态为
DISCARDED
直到
janusGraphManagement.commit()
发生。这是与其余
SchemaAction
处理不同的行为。 这可以通过下面的示例进行验证。

日志

2023-05-16 12:32:33,880 [INFO] [Main.main] ::    buildCompositeIndex 
janusGraphIndex.getIndexStatus(propertyKey):    ENABLED
2023-05-16 12:32:34,013 [INFO] [Main.main] ::    index.getIndexStatus(propertyKey): ENABLED
2023-05-16 12:32:34,020 [INFO] [Main.main] ::    SchemaAction.DISABLE_INDEX 
janusGraphIndex.getIndexStatus(propertyKey):    DISABLED
2023-05-16 12:32:34,177 [INFO] [o.j.g.o.j.IndexRemoveJob.Thread-19] ::   Index _id metrics: success-tx: 5 doc-updates: 0 succeeded: 0
...
2023-05-16 12:32:34,288 [INFO] [o.j.g.o.j.IndexRemoveJob.Thread-1] ::    Index _id metrics: success-tx: 21 doc-updates: 0 succeeded: 0
2023-05-16 12:32:34,401 [INFO] [o.j.g.d.m.ManagementSystem.Thread-1] ::  Index update job successful for [_id]
2023-05-16 12:32:34,409 [INFO] [o.j.g.d.m.GraphIndexStatusWatcher.main] ::   All 1 key(s) on index _id have status(es) [DISCARDED]
2023-05-16 12:32:34,411 [INFO] [Main.main] ::    SchemaAction.DISCARD_INDEX 
janusGraphIndex.getIndexStatus(propertyKey):    DISCARDED
2023-05-16 12:32:34,415 [INFO] [Main.main] ::    SchemaAction.DROP_INDEX 
janusGraphIndex.getIndexStatus(propertyKey):    DISCARDED
2023-05-16 12:32:34,521 [INFO] [Main.main] ::    SchemaAction.DROP_INDEX 
janusGraphIndex:    null

Process finished with exit code 0

代码

        // ... 
        JanusGraphManagement janusGraphManagement = janusGraph.openManagement();
        PropertyKey propertyKey = janusGraphManagement.getOrCreatePropertyKey("_id");
        JanusGraphIndex janusGraphIndex;

        if (!janusGraphManagement.containsGraphIndex("_id")) {
            janusGraphManagement.buildIndex("_id", Vertex.class).addKey(propertyKey).buildCompositeIndex();
            janusGraphIndex = janusGraphManagement.getGraphIndex("_id");
            logger.info("buildCompositeIndex \njanusGraphIndex.getIndexStatus(propertyKey):\t" + janusGraphIndex.getIndexStatus(propertyKey));
            janusGraphManagement.commit();
        }
        janusGraphManagement = janusGraph.openManagement();
        janusGraphIndex = janusGraphManagement.getGraphIndex("_id");
        if (SchemaStatus.ENABLED.equals(janusGraphIndex.getIndexStatus(propertyKey))) {
            logger.info("index.getIndexStatus(propertyKey):\t" + janusGraphIndex.getIndexStatus(propertyKey));
            janusGraphManagement.updateIndex(janusGraphIndex, SchemaAction.DISABLE_INDEX).get();
            logger.info("SchemaAction.DISABLE_INDEX \njanusGraphIndex.getIndexStatus(propertyKey):\t" + janusGraphIndex.getIndexStatus(propertyKey));
            janusGraphManagement.commit();
        }
        if (SchemaStatus.DISABLED.equals((janusGraphIndex.getIndexStatus(propertyKey)))) {
            janusGraphManagement = janusGraph.openManagement();
            janusGraphIndex = janusGraphManagement.getGraphIndex("_id");
            janusGraphManagement.updateIndex(janusGraphIndex, SchemaAction.DISCARD_INDEX).get();
            ManagementSystem.awaitGraphIndexStatus(janusGraph, "_id").status(SchemaStatus.DISCARDED).call();
            logger.info("SchemaAction.DISCARD_INDEX \njanusGraphIndex.getIndexStatus(propertyKey):\t" + janusGraphIndex.getIndexStatus(propertyKey));
            janusGraphManagement.commit();
        }
        if (SchemaStatus.DISCARDED.equals((janusGraphIndex.getIndexStatus(propertyKey)))) {
            janusGraphManagement = janusGraph.openManagement();
            janusGraphIndex = janusGraphManagement.getGraphIndex("_id");
            janusGraphManagement.updateIndex(janusGraphIndex, SchemaAction.DROP_INDEX).get();
            for (int i=0; i<15; i++)
                if (!janusGraphManagement.containsGraphIndex("_id"))
                    break;
            logger.info("SchemaAction.DROP_INDEX \njanusGraphIndex.getIndexStatus(propertyKey):\t" + janusGraphIndex.getIndexStatus(propertyKey));
            janusGraphManagement.commit();
        }
        janusGraphManagement = janusGraph.openManagement();
        janusGraphIndex = janusGraphManagement.getGraphIndex("_id");
        logger.info("SchemaAction.DROP_INDEX \njanusGraphIndex:\t" + janusGraphIndex);
        // ... 
© www.soinside.com 2019 - 2024. All rights reserved.