Удаление неиспользуемых узлов из JackRabbit versionStorage

У меня есть сценарий, в котором репозиторий содержит несколько узлов версий, которые не ссылаются ни на какие узлы mix:versionable. Это связано с тем, что эти версионные узлы были удалены из репозитория, но не их соответствующие версии.

Это приводит к тому, что сборщик мусора JackRabbit не может удалить некоторые файлы из хранилища данных, поскольку существуют версии, которые все еще ссылаются на них, и, следовательно, дисковое пространство не освобождается должным образом.

Я попытался вручную удалить эти версии по следующему алгоритму:

  1. Получите версию по ее пути, скажем:
  2. Получить свойство jcr:frozenUuid из полученного узла
  3. Получить узел по идентификатору, используя замороженный Uuid из шага 2.
  4. Если такого узла не существует, удалите версию

Но на последнем шаге я получаю следующее исключение:

javax.jcr.nodetype.ConstraintViolationException: Unable to perform operation. Node is protected.

Итак, мой вопрос. Как удалить неиспользуемые узлы версии?

Я использую jackrabbit-2.2.13.


person rodrigoj_el    schedule 11.07.2014    source источник


Ответы (2)


Вот как я удаляю свои версии...

String nodePath...
String versionName...
Session session...

VersionManager versionManager = session.getWorkspace().getVersionManager()
VersionHistory versionHistory = versionManager.getVersionHistory(nodePath);
versionHistory.removeVersion(versionName);
person TedTrippin    schedule 15.09.2014
comment
Спасибо за ответ Тед Триппин. Мой оригинальный узел больше не существует, он был удален. Таким образом, строка versionManager.getVersionHistory(nodePath) вызовет исключение. Мой вопрос заключается в том, как манипулировать версиями, если у вас нет исходного узла, который изначально сгенерировал версию. - person rodrigoj_el; 16.09.2014

Я думаю, это поможет вам просмотреть все версии, чтобы вы могли удалить или восстановить.

        Node vs = session.getRootNode().getNode("jcr:system").getNode("jcr:versionStorage");
        Version v = traverseVersionStorage(vs, 0);

        private static Version traverseVersionStorage(Node n, int level)
                throws Exception {
            Version v = null;
            for (NodeIterator it = n.getNodes(); it.hasNext();) {
                Node n2 = it.nextNode();
                if (n2 instanceof Version && !n2.getName().startsWith("jcr:")) {
                    v = (Version) n2;
                    System.out.println("version " + n2.getName() + " of node "+ n2.getParent().getName() + ":");
                    Node n3 = n2.getNode("jcr:frozenNode");
                    VersionManager vman=session.getWorkspace().getVersionManager();
                        Node parent=n3.getParent();     
                        System.out.println(parent.getName());
                        vman.restore("/any/path/where/to/restore", v, true);
                        session.save();
                    }
                Version v2 = traverseVersionStorage(n2, level + 1);
                v = v == null ? v2 : v;
            }
            return v;
        }

ниже код должен пройти все версии узла и удалить по версии.

           VersionManager versionManager=jcrsession.getWorkspace().getVersionManager();
           VersionHistory vHistory=versionManager.getVersionHistory("/absolute/path/of/node/which/versions/to/be/removed");

                for (VersionIterator pt = vHistory.getAllVersions(); pt.hasNext();) 
                    {
                       Version p = pt.nextVersion();
                       if(p.getName()!="jcr:rootVersion")
                        {
                         vHistory.removeVersion(p.getName());
                        }
                    }
person Rohit Tiwari    schedule 15.09.2015
comment
Вы имеете в виду, что я должен восстановить версию, а затем удалить ее? Мой вопрос был не столько об обходе узлов версии, сколько о том, как их удалить. - person rodrigoj_el; 16.09.2015
comment
Из этого кода вы можете найти все версии узлов, теперь вы можете либо удалить, либо восстановить в соответствии с требованиями. Спасибо. - person Rohit Tiwari; 17.09.2015
comment
Я предполагаю, что строка vman.restore(... вызовет исключение, так как в моем сценарии нет текущей версии узла, потому что узел был удален. - person rodrigoj_el; 17.09.2015
comment
Если узел удален и перед удалением было выполнено управление версиями этого узла. Тогда даже после удаления версии будут существовать в папке jcr:system-›jcr:versionStorage. Таким образом, вы можете перейти от этого кода и удалить его. Исключение будет выдано в случае восстановления или удаления baseVersion. Спасибо - person Rohit Tiwari; 18.09.2015
comment
Я понимаю. Не могли бы вы добавить пример удаления версии после процесса восстановления? Еще одна потенциальная проблема, которую я вижу, заключается в том, что в вашем примере восстановление заменит текущую версию более старой и будет делать то же самое в каждой итерации цикла. - person rodrigoj_el; 22.09.2015
comment
Я отредактировал ответ, как вы меня просили. Надеюсь, это поможет в том, что вы хотите. - person Rohit Tiwari; 23.10.2015