Incapable de créer un indice composite, bloqué à L'installation

je suis incapable de créer un index. Mon Gremlin code est comme suit:

usernameProperty = mgmt.getPropertyKey('username')
usernameIndex = mgmt.buildIndex('byUsernameUnique', Vertex.class).addKey(usernameProperty).unique().buildCompositeIndex()
mgmt.setConsistency(usernameIndex, ConsistencyModifier.LOCK)
mgmt.commit()

peu de temps après avoir reçu deux erreurs:

18:04:57 erreur com.thinkaurelius.Titan.graphdb.la base de données.gestion.ManagementLogger-Evicted [1@0a00009d2537-ip-10-0-0-1572] à partir de cache mais en attendant trop longtemps pour que les transactions se ferment. Standardtitantx[0x6549ce71]] 18:04: 57 erreur com.thinkaurelius.Titan.graphdb.la base de données.gestion.ManagementLogger - Expulsé [1@0a00009d2537-ip-10-0-0-1572] à partir de cache mais en attendant trop longtemps pour que les transactions se ferment. Rassis transaction alerte sur: [standardtitantx[0x2a2815cc], standardtitantx[0x025dc2c0]]

l'état de l'index est bloqué à INSTALLED:

usernameIndex.getIndexStatus(usernameProperty)
==>INSTALLED

j'ai lu qu'une instance défaillante pourrait causer le problème, mais une vérification de l'exécution des instances n'en montre qu'une seule:

mgmt.getOpenInstances()
==>0a00009d3011-ip-10-0-0-1572(current)

j'ai aussi essayé d'émettre un REGISTER_INDEX action, qui est également expulsée de le cache de transaction avec un message d'erreur similaire:

mgmt.updateIndex(usernameIndex, SchemaAction.REGISTER_INDEX).get()
mgmt.commit()

j'ai aussi essayé de redémarrer le serveur plusieurs fois.

il semble que le processus d'enregistrement est simplement le chronométrage, provoquant une "expulsion" du cache de transaction. J'ai attendu 48 heures pour être sûr que ce n'était pas un processus lent. Normal lit, écrit, et les commits associés à Titan semblent fonctionner correctement, Je ne suis tout simplement pas en mesure de créer cet index. Je suis coincé, est-il autre chose que je peux essayez? Y a-t-il un moyen de prolonger la durée de cette transaction?

J'exécute Titan 1.0.0 en utilisant un backend DynamoDB (setup avec les AWS fournis modèle de formation de nuages).

modifier: Voici la commande complète que je vais coller dans Gremlin avec l'ajout de la awaitGraphStatus pas suggéré par @M-T-A:

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();

c'est Ce qui génère l'erreur suivante:

java.lang.NullPointerException à COM.thinkaurelius.Titan.graphdb.la base de données.gestion.GraphIndexStatusWatcher.appel (GraphIndexStatusWatcher.java: 52) au com.thinkaurelius.Titan.graphdb.la base de données.gestion.GraphIndexStatusWatcher.appel (GraphIndexStatusWatcher.java: 18) à java_util_concurrent_Callable $ call.appel(Source Inconnue) au org.codehaus.groovy.Runtime.callsite.CallSiteArray.defaultCall (CallSiteArray.java: 45) au org.codehaus.groovy.Runtime.callsite.AbstractCallSite.appel (AbstractCallSite.java: 110) au org.codehaus.groovy.Runtime.callsite.AbstractCallSite.appel (AbstractCallSite.java: 114) à groovysh_evaluate.exécuter(groovysh_evaluate:3) au org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod (IndyInterface.java: 215) au org.codehaus.groovy.outils.Shell.Interprète.évaluer(Interprète.groovy: 69) au org.codehaus.groovy.outils.Shell.Groovysh.exécuter (Groovysh.groovy: 185) au org.codehaus.groovy.outils.Shell.Shell.leftShift(Shell.groovy: 119) à org.codehaus.groovy.outils.Shell.ShellRunner.travail (ShellRunner.groovy: 94)

je vais aussi noter que la routine pour désactiver et supprimer un index est également défaillante.

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 erreur com.thinkaurelius.Titan.graphdb.la base de données.gestion.ManagementLogger-Evicted [1@ac1f3fa810472-ip-172-31-63-1681] à partir de cache mais en attendant trop longtemps pour que les transactions se ferment. Standardtitantx[0x2314cd97]], standardtitantx[0x39f8adc0], standardtitantx[0x09de1b85]]

EDIT 2: Tenter de créer une nouvelle clé de propriété et un nouvel index dans la même transaction fonctionne! Mais est-ce que cela signifie que je ne peux pas créer des index sur les clés de propriété existantes??

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();

Après une pause, il en résulte:

Ce système de gestion de l'instance a été fermé

essayer de récupérer les nouveaux résultats de l'index dans:

mgmt = graph.openManagement();
index = mgmt.getGraphIndex('byUsernameTest2');
propkey = mgmt.getPropertyKey('testPropertyName2');
index.getIndexStatus(propkey);

==>activé

15
demandé sur Fook 2016-02-26 19:11:33

2 réponses

si vous utilisez plusieurs instances Titan, vous devez savoir qu'elles doivent être coordonnées avant que l'index ne soit disponible.

en outre, il y a diverses subtilités autour de la gestion des transactions et dans quelles circonstances les transactions seront laissées ouvertes; je crois que Titan 1.0.0 n'a pas les dernières nouvelles de TinkerPop à cet égard. Avez-vous essayé de créer l'indice immédiatement après le démarrage?

Enfin, le processus de création d'index est différent selon que les clés de propriétés indexées ont déjà été utilisées ou non. Etes-vous en train d'indexer de nouvelles clés ou existants?

4
répondu Benjamin Anderson 2016-03-02 20:02:09

vous devez attendre le Titan et le DynamoDB pour enregistrer l'index. Vous pouvez le faire par:

ManagementSystem.awaitGraphIndexStatus(graph, propertyKeyIndexName)
                    .status(SchemaStatus.REGISTERED)
                    .timeout(10, java.time.temporal.ChronoUnit.MINUTES) // set timeout to 10 min
                    .call();

le délai par défaut n'est généralement pas assez long, donc vous pouvez l'augmenter à 10 minutes, il fait généralement le tour avec Dynamo backened.

seulement lorsque l'index est dans L'état enregistré, vous pouvez effectuer un reindex. Une fois le reindex terminé, vous devez attendre qu'il soit activé. en réutilisant l'exemple de code ci-dessus et modification de l'état de PERMETTRE.

pour plus d'information, voir le docs.

Modifier

Permettez-moi de partager le code qui fonctionne avec moi sur Berkeley et Dynamo DB backends tout le temps.

    graph.tx().rollback(); //Never create new indexes while a transaction is active
    TitanManagement mgmt=graph.openManagement();
    PropertyKey propertyKey=getOrCreatePropertyKeyIfNotExist(mgmt, propertyKeyName);
    String indexName = makePropertyKeyIndexName(propertyKey);

    if (mgmt.getGraphIndex(indexName)==null) { 
        mgmt.buildIndex(indexName, Vertex.class).addKey(propertyKey).buildCompositeIndex();
        mgmt.commit(); // you MUST commit mgmt
        graph.tx().commit(); // and commit the transaction too
        ManagementSystem.awaitGraphIndexStatus(graph, indexName).status(SchemaStatus.REGISTERED).call();
    }else { // already defined.
        mgmt.rollback();
        graph.tx().rollback();
    }

private static PropertyKey getOrCreatePropertyKeyIfNotExist(TitanManagement mgmt, String s) {
    PropertyKey key = mgmt.getPropertyKey(s);
    if (key != null)
        return key;
    else
        return mgmt.makePropertyKey(s).dataType(String.class).make();
}

private static String makePropertyKeyIndexName(PropertyKey pk) {
    return pk.name() + Tokens.INDEX_SUFFIX;
}

D'après L'erreur que J'ai vu, il semble que Titan n'a pas pu obtenir l'index ce qui signifie que vous attendez l'index qui n'est même pas défini. Regardez la ligne qui cause l'erreur ici.

assurez-vous que vous passez le bon index nom de l' awaitGraphIndexStatus.

3
répondu M-T-A 2016-03-05 10:44:48