logo Alfresco
Version Enterprise 3.4.2I. Problème

Lors de l’indexation d’Alfresco des messages d’erreur indiquent qu’il manque l’aspect root sur certains nœuds.
19:17:37,310 ERROR [org.alfresco.repo.node.index.AbstractReindexComponent.threads] Reindexer 344 failed with error: Node without parents does not have root aspect: workspace://SpacesStore/cafe1535-75ed-463c-8275-f53846958822.
19:17:37,311 WARN [org.alfresco.repo.node.index.AbstractReindexComponent.threads] java.lang.RuntimeException: Node without parents does not have root aspect: workspace://SpacesStore/cafe1535-75ed-463c-8275-f53846958822
19:20:16,099 ERROR [org.alfresco.repo.node.index.AbstractReindexComponent.threads] Reindexer 495 failed with error: Node without parents does not have root aspect: workspace://SpacesStore/5c710a50-2db7-4968-a1d9-31187742e810.
19:20:16,101 WARN [org.alfresco.repo.node.index.AbstractReindexComponent.threads] java.lang.RuntimeException: Node without parents does not have root aspect: workspace://SpacesStore/5c710a50-2db7-4968-a1d9-31187742e810

Il s’agit typiquement de nœuds orphelins, ces nœuds sont normalement nettoyés par le système mais il arrive que dans certains cas ce système les ignore (arrive souvent dans les environnements de type cluster). Il faut alors réaliser la suppression manuellement.

Solution

Identifier les nœuds orphelins

SELECT n.id FROM alf_node n
LEFT OUTER JOIN alf_child_assoc ca ON (ca.child_node_id = n.id)
WHERE ca.id IS null
AND n.node_deleted = 0
AND n.id NOT IN(
 SELECT na.node_id
 FROM alf_node_aspects na
 JOIN alf_qname q ON (q.id = na.qname_id)
 JOIN alf_namespace ns ON (q.ns_id = ns.id)
 WHERE ns.uri = 'http://www.alfresco.org/model/system/1.0'
 AND q.local_name = 'aspect_root'
)
AND n.id NOT IN(
 SELECT root_node_id FROM alf_store
)
;

Vérifier à quoi correspondent ces nœuds en remplaçant YOURVALUESHERE par la liste des id retournés par la première requête
SELECT * FROM alf_node_assoc WHERE source_node_id IN (YOURVALUESHERE);
SELECT * FROM alf_node_assoc WHERE target_node_id IN (YOURVALUESHERE);
SELECT * FROM alf_usage_delta WHERE node_id IN (YOURVALUESHERE);
SELECT * FROM alf_node_aspects WHERE node_id IN (YOURVALUESHERE);
SELECT * FROM alf_node_properties WHERE node_id IN (YOURVALUESHERE);
SELECT * FROM alf_child_assoc WHERE child_node_id IN (YOURVALUESHERE);
SELECT * FROM alf_child_assoc WHERE parent_node_id IN (YOURVALUESHERE);
SELECT * FROM alf_node WHERE id IN (YOURVALUESHERE);

Vérifier tout particulièrement l’avant dernière requête qui indique si le nœud à lui même les nœuds enfants.
La dernière requête permet de voir l’utilisateur à l’origine du nœud (audit_creator) ainsi que le type du nœud (type_qname_id).

S’il s’agit de documents il est possible de retrouver leur chemin sur disque afin de les récupérer.
(Dans le cas où les nœuds ne sont pas des documents la requête ne retournera rien.)

SELECT Acu.content_url from alf_content_url Acu, alf_content_data Acd, alf_node_properties Anp, alf_qname Aqn
WHERE Anp.qname_id=Aqn.id
AND Anp.long_value=Acd.id
AND Acd.content_url_id=Acu.id
AND Aqn.local_name='content'
AND Anp.node_id IN (YOURVALUESHERE);

Supprimer les nœuds orphelins

Avant de supprimer les nœuds il est important d’avoir un backup de votre base (au cas où).
Exécuter ces requêtes de DELETE en remplaçant YOURVALUESHERE par la liste des id retournés par la première requête

DELETE FROM alf_node_assoc WHERE source_node_id IN (YOURVALUESHERE);
DELETE FROM alf_node_assoc WHERE target_node_id IN (YOURVALUESHERE);
DELETE FROM alf_usage_delta WHERE node_id IN (YOURVALUESHERE);
DELETE FROM alf_node_aspects WHERE node_id IN (YOURVALUESHERE);
DELETE FROM alf_node_properties WHERE node_id IN (YOURVALUESHERE);
DELETE FROM alf_child_assoc WHERE child_node_id IN (YOURVALUESHERE);
DELETE FROM alf_child_assoc WHERE parent_node_id IN (YOURVALUESHERE);
DELETE FROM alf_node WHERE alf_node.id IN (YOURVALUESHERE);

Il est possible de rejouer la première requête afin de vérifier qu’il y a plus de nœuds orphelins.

A vous de jouer !

Publicités