【发布时间】:2016-06-09 22:51:56
【问题描述】:
我无法创建索引。我的 Gremlin 代码如下:
usernameProperty = mgmt.getPropertyKey('username')
usernameIndex = mgmt.buildIndex('byUsernameUnique', Vertex.class).addKey(usernameProperty).unique().buildCompositeIndex()
mgmt.setConsistency(usernameIndex, ConsistencyModifier.LOCK)
mgmt.commit()
在我收到两个错误后不久:
18:04:57 错误 com.thinkaurelius.titan.graphdb.database.management.ManagementLogger - 从缓存中逐出 [1@0a00009d2537-ip-10-0-0-1572] 但等待交易关闭的时间过长。过时交易警报:[standardtitantx[0x6549ce71]] 18:04:57 错误 com.thinkaurelius.titan.graphdb.database.management.ManagementLogger - 从缓存中驱逐 [1@0a00009d2537-ip-10-0-0-1572] 但等待交易关闭的时间过长。过时交易警报:[standardtitantx[0x2a2815cc],standardtitantx[0x025dc2c0]]
索引状态卡在INSTALLED:
usernameIndex.getIndexStatus(usernameProperty)
==>INSTALLED
我读到失败的实例可能会导致问题,但检查正在运行的实例只显示一个:
mgmt.getOpenInstances()
==>0a00009d3011-ip-10-0-0-1572(current)
我还尝试发出REGISTER_INDEX 操作,该操作也会从事务缓存中被逐出并显示类似的错误消息:
mgmt.updateIndex(usernameIndex, SchemaAction.REGISTER_INDEX).get()
mgmt.commit()
我也试过多次重启服务器。
注册过程似乎只是超时,导致从事务缓存中“驱逐”。我已经等了 48 小时,以确保这不是一个缓慢的过程。对 Titan 的正常读取、写入和相关提交似乎工作正常,我只是无法创建此索引。我被卡住了,还有什么我可以尝试的吗?有没有办法延长该事务的超时时间?
我正在使用 DynamoDB 后端运行 Titan 1.0.0(使用 AWS 提供的设置 CloudFormation template)。
编辑:
这是我粘贴到 Gremlin 中的完整命令,并添加了 @M-T-A 建议的 awaitGraphStatus 步骤:
mgmt = graph.openManagement();
usernameIndex = mgmt.getPropertyKey('usernameIndex');
mgmt.buildIndex('byUsername',Vertex.class).addKey(usernameIndex).unique().buildCompositeIndex();
// I have tried with and without a commit here: mgmt.commit();
mgmt.awaitGraphIndexStatus(graph, 'byUsername').status(SchemaStatus.REGISTERED).timeout(10, java.time.temporal.ChronoUnit.MINUTES).call();
这会导致以下错误:
java.lang.NullPointerException 在 com.thinkaurelius.titan.graphdb.database.management.GraphIndexStatusWatcher.call(GraphIndexStatusWatcher.java:52) 在 com.thinkaurelius.titan.graphdb.database.management.GraphIndexStatusWatcher.call(GraphIndexStatusWatcher.java:18) 在 java_util_concurrent_Callable$call.call(未知来源) 在 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:110) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:114) 在 groovysh_evaluate.run(groovysh_evaluate:3) 在 org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:215) 在 org.codehaus.groovy.tools.shell.Interpreter.evaluate(Interpreter.groovy:69) 在 org.codehaus.groovy.tools.shell.Groovysh.execute(Groovysh.groovy:185) 在 org.codehaus.groovy.tools.shell.Shell.leftShift(Shell.groovy:119) 在 org.codehaus.groovy.tools.shell.ShellRunner.work(ShellRunner.groovy:94)
我还会注意到禁用和删除索引的例程也失败了。
mgmt = graph.openManagement()
theIndex = mgmt.getGraphIndex('byUsername')
mgmt.updateIndex(theIndex, SchemaAction.DISABLE_INDEX).get()
mgmt.commit()
mgmt.awaitGraphIndexStatus(graph, 'byUsername').status(SchemaStatus.DISABLED).timeout(10, java.time.temporal.ChronoUnit.MINUTES).call();
m = graph.openManagement()
i = m.getGraphIndex('byUsername')
m.updateIndex(i, SchemaAction.REMOVE_INDEX).get()
m.commit()
19:26:26 错误 com.thinkaurelius.titan.graphdb.database.management.ManagementLogger - 从缓存中逐出 [1@ac1f3fa810472-ip-172-31-63-1681] 但等待交易关闭的时间过长。过时交易警报:[standardtitantx[0x2314cd97]、standardtitantx[0x39f8adc0]、standardtitantx[0x09de1b85]]
编辑 2: 尝试在同一事务中创建新的属性键和索引确实有效!但这是否意味着我不能在现有的属性键上创建索引??
graph.tx().rollback();
mgmt = graph.openManagement();
indexName = 'byUsernameTest2';
propertyKeyName = 'testPropertyName2';
propertyKey = mgmt.makePropertyKey(propertyKeyName).dataType(String.class).cardinality(Cardinality.SINGLE).make();
mgmt.buildIndex(indexName,Vertex.class).addKey(propertyKey).buildCompositeIndex();
mgmt.commit();
graph.tx().commit();
mgmt.awaitGraphIndexStatus(graph, indexName).status(SchemaStatus.REGISTERED).timeout(10, java.time.temporal.ChronoUnit.MINUTES).call();
mgmt.commit();
暂停后,结果是:
此管理系统实例已关闭
尝试获取新索引会导致:
mgmt = graph.openManagement();
index = mgmt.getGraphIndex('byUsernameTest2');
propkey = mgmt.getPropertyKey('testPropertyName2');
index.getIndexStatus(propkey);
==>已启用
【问题讨论】:
-
更多调试日志,添加到 ./conf/log4j-console.properties log4j.logger.com.thinkaurelius.titan.graphdb.database.management=DEBUG
-
您是否存储了一个大数据集?您是否在几乎空的数据库上尝试过?
标签: amazon-dynamodb titan gremlin