Le moyen le plus efficace pour créer un chemin d'accès dans zookeeper où les éléments racine du chemin d'accès peut ou peut ne pas exister?

Imaginer un chemin "/root/enfant1/enfant2/enfant3"

Imaginer dans zookeeper que peut-être une partie de ce qui existe, dire "/root/enfant1"

Il n'y a pas d'équivalent de "mkdir -p" dans zookeeper; Aussi, la Gardienne.multi() échoue si un échec de l'opération, de sorte qu'un "faire le chemin" ne pouvait pas vraiment être cuit au four dans un multi appel. En outre, vous pourriez avoir un autre client en essayant de faire le même chemin...

C'est ce que j'ai trouvé pour créer un chemin. Je me demande si c'est même la peine de vérifier pour voir si une partie existe ou pas, pour enregistrer le trajet aller-retour de la exists() de l'appel.

//String[] pathParts new String[] { "root", "child1", "child2", "child3" };

public void savePath(String[] pathParts) {
    if (zooKeeper.exists(pathString, false) != null) return;
    StringBuilder path = new StringBuilder();
    for (String pathElement : pathParts) {
        path.append(UNIX_FILE_SEPARATOR).append(pathElement);
        String pathString = path.toString();
        try {
            //bother with the exists call or not?
            if (zooKeeper.exists(pathString, false) == null) {
                zooKeeper.create(pathString, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            }
        } catch (KeeperException e) {
            if (e.code() != KeeperException.Code.NODEEXISTS)
                throw e;
        }
    }
}

Quel serait le moyen le plus efficace pour ce faire? En supposant que a) vous ne savez pas à l'avance combien le chemin d'accès existe déjà et b) un autre client pourrait être en train d'essayer d'écrire le même chemin (et nous voulons éviter de verrouillage).

  • Pouvez-vous donner un exemple de ce que la variable d'instance de la voie et ce qui est passé à la pathParts paramètre? Un peu confus sur le code comme sa ajoutant chemin à lui-même.
  • désolé - eu quelques erreurs dans ce. fixe maintenant, plus ou moins.
InformationsquelleAutor marathon | 2012-03-27