Удаление неиспользуемых узлов из версии JackRabbitStorage
У меня есть сценарий, в котором хранилище содержит несколько узлов версий, которые не ссылаются ни на какие mix:versionable
узлы. Это связано с тем, что эти версионные узлы были удалены из репозитория, но не их соответствующих версий.
Это приводит к тому, что сборщик мусора JackRabbit не может удалить некоторые файлы из хранилища данных, поскольку существуют версии, которые все еще ссылаются на них, и, следовательно, дисковое пространство не освобождается должным образом.
Я попытался вручную удалить эти версии с помощью следующего алгоритма:
- Получите версию по ее пути, скажем: /jcr:system/jcr:versionStorage/40/05/a9/4005a9b2-51d1-4ed1-8c30-934409e05f86/1.14/jcr:frozenNode
- Получить
jcr:frozenUuid
свойство из полученного узла - Получить узел по идентификатору, используя frozenUuid из шага 2
- Если такого узла не существует, удалите версию
Но на последнем шаге я получаю следующее исключение:
javax.jcr.nodetype.ConstraintViolationException: Unable to perform operation. Node is protected.
Итак, мой вопрос. Как я могу удалить узлы версий, которые не используются?
Я использую jackrabbit-2.2.13.
2 ответа
Вот как я удаляю свои версии...
String nodePath...
String versionName...
Session session...
VersionManager versionManager = session.getWorkspace().getVersionManager()
VersionHistory versionHistory = versionManager.getVersionHistory(nodePath);
versionHistory.removeVersion(versionName);
Я думаю, что это поможет вам пересмотреть все версии, чтобы вы могли удалить или восстановить.
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;
}
код ниже для обхода всех версий узла и удаления по versionName
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());
}
}