为什么 JanusGraph 不删除废弃的索引?
我正在对满足我们需求的最新版本的图形数据库进行性能评估。
我需要停下来重新制作 JMH 测试的索引:速度、稳定性和规模。
package org.janusgraph.core.schema;
public enum SchemaAction {
// ...
DROP_INDEX(Collections.singleton(SchemaStatus.DISCARDED)),
// ...
}
请注意,在此提出的这个问题的主题、答案以及对这个指定设置的进一步评论,总是值得赞赏的。
这用于 持久后端 JanusGraph 服务器;不是
'inmemory' gremlin server
.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));
}
// ...
结束
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);
// ...