Индекс TitanDB не меняет состояние

Я хотел удалить существующий индекс и до сих пор следовал инструкциям в документации. На данный момент у меня нет отдельного бэкэнда индексации. Однако, когда я дохожу до шага, на котором вам нужно дождаться изменения статуса индекса с помощью m.awaitGraphIndexStatus, он ждет изменения навсегда и истекает со следующей ошибкой:

GraphIndexStatusReport[success=false, indexName='usernameComposite', targetStatus=DISABLED, notConverged={username=INSTALLED}, converged={}, elapsed=PT1M0.092S]

То же самое происходит, когда я пытаюсь создать новый. Любые идеи, что может вызвать это?

Я создаю indizes, используя следующий фрагмент кода:

graph.tx().rollback()
mgmt = graph.openManagement()
name = mgmt.getPropertyKey('username')
mgmt.buildIndex('username-composite', Vertex.class).addKey(name).unique().buildCompositeIndex()
mgmt.commit()
mgmt.awaitGraphIndexStatus(graph, 'username-composite').call()

person Tim Specht    schedule 06.01.2016    source источник
comment
Не могли бы вы опубликовать шаги/код, которые вы используете для изменения индекса?   -  person Filipe Teixeira    schedule 08.01.2016
comment
Я отредактировал свой пост выше.   -  person Tim Specht    schedule 08.01.2016


Ответы (2)


Как Дэн описывает в этом сообщении о пользователях-гремлинах, вы нужно убедиться, что против графика нет открытых сделок. Имейте в виду, что это включает в себя транзакции из других подключений, если у вас есть несколько клиентов или потоков, открытых для графа.

Вы можете проверить наличие открытых транзакций с помощью graph.getOpenTransactions(), определенного в StandardTitanGraph, который возвращает null, если их нет. Если есть открытые транзакции, вам потребуется либо commit(), либо rollback() их все.

Вот фрагмент, который я успешно использовал в консоли Gremlin.

// Disable the index. Once the able is DISABLED, it cannot be re-enabled again!
// Instead, you could build a new index with the same properties.
future = null
if (graph.getOpenTransactions()) graph.tx().rollback()
mgmt = graph.openManagement()
name = mgmt.getPropertyKey('name')
nameIndex = mgmt.getGraphIndex('nameIndex')
nameIndexStatus = nameIndex.getIndexStatus(name) // must be ENABLED, INSTALLED, or REGISTERED
if (nameIndexStatus == SchemaStatus.INSTALLED || nameIndexStatus == SchemaStatus.ENABLED) future = mgmt.updateIndex(nameIndex, SchemaAction.DISABLE_INDEX)
nameIndexStatus = nameIndex.getIndexStatus(name) // should be INSTALLED here
mgmt.commit()

// Block until disabling index is complete (ENABLED -> INSTALLED -> DISABLED), no metrics are reported (null)
if (graph.getOpenTransactions()) graph.tx().rollback()
t = System.currentTimeMillis(); metrics = future.get(); 'disabled in '+(System.currentTimeMillis()-t)+' ms'
if (nameIndexStatus == SchemaStatus.ENABLED) mgmt.awaitGraphIndexStatus(graph, 'nameIndex').status(SchemaStatus.INSTALLED).call()
if (nameIndexStatus == SchemaStatus.INSTALLED) mgmt.awaitGraphIndexStatus(graph, 'nameIndex').status(SchemaStatus.DISABLED).call()
person Jason Plurad    schedule 10.01.2016
comment
Другими словами, если я запускаю несколько серверов Gremlin для поддержки множества одновременных транзакций, мне нужно отключить их все вместе, прежде чем приступать к обслуживанию каких-либо индиков, верно? - person Tim Specht; 10.01.2016
comment
Еще один дополнительный вопрос: нужно ли мне также останавливать все машины, если я буду создавать свойство в той же транзакции управления, которую я использую для создания индекса? - person Tim Specht; 18.01.2016
comment
Если вы создаете новый ключ свойства и индекс для него в одной и той же транзакции управления, я думаю, что индекс должен быть включен сразу после фиксации. - person Jason Plurad; 18.01.2016

Это также происходит, когда я пытаюсь создать новый. Я использую скрипт для создания нового индекса под свойством с некоторыми данными. Скрипт взят из Документ Titan 1.0.0

graph.tx().rollback() //Never create new indexes while a transaction is active
mgmt = graph.openManagement()
name = mgmt.getPropertyKey('name')
age = mgmt.getPropertyKey('age')
mgmt.buildIndex('byNameComposite', Vertex.class).addKey(name).buildCompositeIndex()
mgmt.buildIndex('byNameAndAgeComposite', Vertex.class).addKey(name).addKey(age).buildCompositeIndex()
mgmt.commit()
//Wait for the index to become available
mgmt.awaitGraphIndexStatus(graph, 'byNameComposite').call()
mgmt.awaitGraphIndexStatus(graph, 'byNameAndAgeComposite').call()
//Reindex the existing data
mgmt = graph.openManagement()
mgmt.updateIndex(mgmt.getGraphIndex("byNameComposite"), SchemaAction.REINDEX).get()
mgmt.updateIndex(mgmt.getGraphIndex("byNameAndAgeComposite"), SchemaAction.REINDEX).get()
mgmt.commit()

После нескольких экспериментов я обнаружил, что он graph.tx().rollback() не работает должным образом.

gremlin> :> graph.getOpenTransactions()
==>standardtitantx[0x1e14c346]
==>standardtitantx[0x7a0067f2]
==>standardtitantx[0x0de3ee40]
==>standardtitantx[0x47e19812]
==>standardtitantx[0x27b20549]
==>standardtitantx[0x0ee46d99]
gremlin> :> graph.tx().rollback()
==>null
gremlin> :> graph.getOpenTransactions()
==>standardtitantx[0x1e14c346]
==>standardtitantx[0x7a0067f2]
==>standardtitantx[0x0de3ee40]
==>standardtitantx[0x47e19812]
==>standardtitantx[0x093ac20f]
==>standardtitantx[0x27b20549]
==>standardtitantx[0x0ee46d99]

Вот почему я не могу создать новый индекс. Поэтому я заменяю graph.tx().rollback() на

// rollback all exist transactions
int size = graph.getOpenTransactions().size();
for(i=0;i<size;i++) {graph.getOpenTransactions().getAt(0).rollback()}

Теперь он работает нормально. Если вы используете кластер, то вам нужно убедиться, что выживут только экземпляры. Или вы должны убедиться, что все транзакции экземпляров в кластере откатываются или фиксируются. Я надеюсь, что это полезно для других.

person xiaoheike    schedule 09.09.2016