Problème

La suppression ou le déplacement de certains dossiers ou ressources dans AEM via l’interface utilisateur /assets.html ou /damadmin s'effectue lentement ou échoue.

Si l'opération de suppression ou de déplacement échoue, ce [1] message d'avertissement s'affiche dans le fichier journal, « La requête a lu ou traversé plus de X nœuds. »

java.lang.UnsupportedOperationException: The query read or traversed more than 100000 nodes. To avoid affecting other tasks, processing was stopped.
at org.apache.jackrabbit.oak.query.FilterIterators.checkReadLimit(FilterIterators.java:66)
at org.apache.jackrabbit.oak.plugins.index.property.strategy.ContentMirrorStoreStrategy$PathIterator.fetchNextPossiblyDuplicate(ContentMirrorStoreStrategy.java:422)
at org.apache.jackrabbit.oak.plugins.index.property.strategy.ContentMirrorStoreStrategy$PathIterator.fetchNext(ContentMirrorStoreStrategy.java:365)
at org.apache.jackrabbit.oak.plugins.index.property.strategy.ContentMirrorStoreStrategy$PathIterator.next(ContentMirrorStoreStrategy.java:449)
at org.apache.jackrabbit.oak.plugins.index.property.strategy.ContentMirrorStoreStrategy$PathIterator.next(ContentMirrorStoreStrategy.java:303)
at com.google.common.collect.Iterators$7.computeNext(Iterators.java:646)
at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143)
at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138)
at org.apache.jackrabbit.oak.spi.query.Cursors$PathCursor.hasNext(Cursors.java:205)
at org.apache.jackrabbit.oak.query.ast.SelectorImpl.next(SelectorImpl.java:407)
at org.apache.jackrabbit.oak.query.QueryImpl$RowIterator.fetchNext(QueryImpl.java:773)
at org.apache.jackrabbit.oak.query.QueryImpl$RowIterator.hasNext(QueryImpl.java:798)
at com.google.common.collect.Iterators$5.hasNext(Iterators.java:542)
at org.apache.jackrabbit.oak.query.FilterIterators$DistinctIterator.fetchNext(FilterIterators.java:137)
at org.apache.jackrabbit.oak.query.FilterIterators$DistinctIterator.hasNext(FilterIterators.java:151)
at org.apache.jackrabbit.oak.jcr.query.QueryResultImpl$3.fetch(QueryResultImpl.java:181)
at org.apache.jackrabbit.oak.jcr.query.QueryResultImpl$3.<init>(QueryResultImpl.java:176)
at org.apache.jackrabbit.oak.jcr.query.QueryResultImpl.getNodes(QueryResultImpl.java:170)
at org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.findResources(JcrResourceProvider.java:346)
at org.apache.sling.resourceresolver.impl.tree.RootResourceProviderEntry$2.seek(RootResourceProviderEntry.java:148)
at org.apache.sling.resourceresolver.impl.tree.RootResourceProviderEntry$2.<init>(RootResourceProviderEntry.java:134)
at org.apache.sling.resourceresolver.impl.tree.RootResourceProviderEntry.findResources(RootResourceProviderEntry.java:132)
at org.apache.sling.resourceresolver.impl.ResourceResolverImpl.findResources(ResourceResolverImpl.java:694)
at com.day.cq.dam.core.impl.AssetReferenceResolverImpl.getReferences(AssetReferenceResolverImpl.java:524)
at com.day.cq.wcm.core.impl.commands.DeletePageCommand.performCommand(DeletePageCommand.java:142)
at com.day.cq.wcm.core.impl.commands.WCMCommandServlet$CommandHolder.performCommand(WCMCommandServlet.java:161)
at com.day.cq.wcm.core.impl.commands.WCMCommandServlet.performCommand(WCMCommandServlet.java:264)
at com.day.cq.commons.servlets.AbstractCommandServlet.doPost(AbstractCommandServlet.java:49)

Cause

Lors de certaines actions dans AEM Assets, le système exécute la recherche ci-dessous à partir de AssetReferenceResolverImpl.getReferences :

//element(*, nt:unstructured)[(jcr:like(@dam:resolvedPath, '/content/dam/geometrixx/services%') or jcr:like(@sling:resource , '/content/dam/geometrixx/services%'))]

Lorsque le système comporte un grand nombre de contenus, cela signifie que la recherche ne s'effectue pas toujours correctement et peut échouer suite à l'erreur ci-dessus.  

Résolution

Pour résoudre ce problème, nous pouvons ajouter quelques propriétés à l'index out-of-the-box /oak:index/ntBaseLucene.

  1. Accédez à http://aem-host:port/crx/de/index.jsp et connectez-vous en tant qu'admin.

  2. Naviguez jusqu'à /oak:index/ntBaseLucene/indexRules/nt:base/properties

  3. Ajoutez deux nt:unstructured nœuds slingResource et damResolvedPath sous /oak:index/ntBaseLucene/indexRules/nt:base/properties.

  4. Définissez les propriétés ci-dessous sur les nœuds (où les propriétés classées et propertyIndex sont de type booléen) :

    slingResource
      name="sling:resource"
      ordered=false
      propertyIndex= true
      type="String"
    damResolvedPath
      name="dam:resolvedPath"
      ordered=false
      propertyIndex=true
      type="String"

  5. Dans le nœud /oak:index/ntBaseLucene, définissez la propriété reindex=true.

  6. Cliquez sur Tout sauvegarder.

  7. Surveiller le journal des erreurs pour voir quand l’indexation est terminée :

    Reindexing completed for indexes: [/oak:index/ntBaseLucene]

    Vous pouvez également vérifier si l'indexation est terminée en actualisant le nœud /oak:index/ntBaseLucene dans CRXDe car la propriété de la réindexation redeviendra false.

  8. Une fois l’indexation terminée, revenir à CRXDe et définir la valeur de propriété « type » sur « disabled » pour ces deux index :

    • /oak:index/slingResource
    • /oak:index/damResolvedPath
  9. Cliquez sur « Tout enregistrer ».

    A présent, la suppression de fichiers et de contenus et les opérations de déplacement devraient être plus rapides et plus stables.

Ce produit est distribué sous licence Creative Commons Attribution - Pas d’utilisation commerciale - Partage à l’identique 3.0 non transposé  Les publications Twitter™ et Facebook ne sont pas couvertes par les dispositions Creative Commons.

Mentions légales   |   Politique de confidentialité en ligne