[INDEXATION] Boucle sur la phase d'indexation

cancel
Showing results for 
Search instead for 
Did you mean: 
silver666
Member II

[INDEXATION] Boucle sur la phase d'indexation

Bonjour,

Nous sommes en train de migrer notre plateforme d'une version 3.0 vers une version 3.2r2.
Il y a environ 80Go de documents.

La migration en elle même se déroule parfaitement.
On obtient par la suite un environnement en 3.2r2 tout à fait stable.

En revanche, lorsque l'on souhaite lancer un calcul complet des index (Paramètre en mode FULL) celui-ci arrive à 100% puis s’arrête.

Après avoir inspecter de plus prêt ce qui se passe, il s'avère que le système boucle indéfiniment.
Pour être plus précis, la fonction /org/alfresco/repo/node/index/FullIndexRecoveryComponent.performFullRecovery reste en attente de la fonction waitForAsynchronousReindexing dont le "while" ne se termine jamais.

J'ai trouvé un sujet similaire mais malheureusement sans indice supplémentaire.
http://forums.alfresco.com/en/viewtopic.php?f=8&t=36832

Je précise que l'indexation s'est très bien déroulée avant l'application des patchs de la migration.
C'est uniquement après que je rencontre ce problème.

Quelqu'un aurait une idée sur la cause du problème?
Une piste qui me permettrait de pousser plus loin mon investigation?


Merci
6 Replies
rguinot
Customer

Re: [INDEXATION] Boucle sur la phase d'indexation

Le pourcentage "100%" indique que toutes les transactions de la table alf_transaction ont été distribuées à des threads du thread pool d'indexation, pas que l'indexation complète est terminée.

Comme vous l'avez identifié, il reste de l'indexation en background a terminer.

Vous pouvez ajouter du debug sur:
   org.alfresco.repo.node.index.AbstractReindexComponent

pour avoir de l'informatiion sur la progression de ce travail, même après les 100%
silver666
Member II

Re: [INDEXATION] Boucle sur la phase d'indexation

Merci pour ces précisions.

Je vais voir ce que je peux obtenir comme log dans cette classe.

Sinon j'ai fait un petit tour dans la BDD pour vérifier l'unicité des noeuds.
Dans la table alf_node, j'ai trouvé 2 noeuds identiques avec la même valeur pour le champ node_deleted :

id, version, store_id, uuid, transaction_id, node_deleted, type_qname_id, acl_id, audit_creator, audit_created, audit_modifier, audit_modified, audit_accessed
7, 1, 1, 'GROUP_ALFRESCO_ADMINISTRATORS', 1, b'0', 13, 4, '', '', '', '', ''
2065552, 2, 6, 'GROUP_ALFRESCO_ADMINISTRATORS', 2256992, b'0', 300, 7602, '', '', '', '', ''
6, 1, 1, 'GROUP_EMAIL_CONTRIBUTORS', 1, b'0', 13, 4, '', '', '', '', ''
2065553, 2, 6, 'GROUP_EMAIL_CONTRIBUTORS', 2256992, b'0', 300, 7602, '', '', '', '', ''

Cela pourrait venir de là?
silver666
Member II

Re: [INDEXATION] Boucle sur la phase d'indexation

La dernière ligne que j'ai avant de rentrer dans la boucle :

14:18:07,936  INFO  [impl.lucene.ADMLuceneIndexerImpl] Not indexed: No transformation:
   source: ContentAccessor[ contentUrl=store://2009/8/19/17/30/9617adfd-7fc8-45ef-b4e1-b8db200bc8b5.bin, mimetype=application/octet-stream, size=0, encoding=UTF-8, locale=fr_FR]
   target: text/plain at /{http://www.alfresco.org/model/system/1.0}system/{http://www.alfresco.org/model/system/1.0}people/{ht...

Il s'agit visiblement de notre compte administrateur.
Un lieu peut-être avec la duplication des noeuds exposée au dessus?
silver666
Member II

Re: [INDEXATION] Boucle sur la phase d'indexation

L'histoire des noeuds n'avait rien à voir (j'ai supprimé ces 2 groupes et j'ai toujours le même résultat)

J'ai rajouté un petit bout de code pour sortir de la boucle lorsque elle part en boucle infini.
==> J'arrive à démarrer mon instance.

Documents et utilisateurs sont bien indexés et bien accessible via la recherche.

En revanche, l'indexation des sites n'est pas faite et il n'est pas possible d'y accéder via la recherche.
De plus, dans le log, j'ai ça toutes les 1 secondes :

15:56:26,018  INFO  [node.index.IndexTransactionTracker] reindexImpl started: org.alfresco.repo.node.index.IndexTransactionTracker@32c599ac

Je pense qu'il y a donc toujours un problème au niveau de l'indexation, mais où….
Je suis preneur de toutes les idées  :wink:
rguinot
Customer

Re: [INDEXATION] Boucle sur la phase d'indexation

J'ai rajouté un petit bout de code pour sortir de la boucle lorsque elle part en boucle infini.
==> J'arrive à démarrer mon instance.

la pratique est un peu hasardeuse …
Qu'avez vous changé comme code ?

De plus, dans le log, j'ai ça toutes les 1 secondes :


15:56:26,018  INFO  [node.index.IndexTransactionTracker] reindexImpl started: org.alfresco.repo.node.index.IndexTransactionTracker@32c599ac

Il s'agit de l'index transaction tracker, utilisé le + souvent lorsque vous avez positionné un alfresco.cluster.name. Etes vous en cluster ?

Vous avez également changé index.tracking.cronExpression si vous voyez ce message toutes les secondes. L'activer toutes les secondes n'est pas recommandé, sa valeur par défaut est toutes les 5 secondes.
silver666
Member II

Re: [INDEXATION] Boucle sur la phase d'indexation

Oui nous sommes effectivement en cluster.
Je vais donc repasser ce paramètre sur 5 secondes.

Voici le code modifié :
(j'ai simplement ajouté un timer pour passer à la suite si la boucle dure plus de 10sec)
org/alfresco/repo/node/index/AbstractReindexComponent.waitForAsynchronousReindexing

 protected synchronized void waitForAsynchronousReindexing()
    {
        ReindexWorkerRunnable lastRunnable = null;
        long lastTimestamp = Long.MAX_VALUE;
       long startTime = Calendar.getInstance().getTimeInMillis();
       
       
        ReindexWorkerRunnable currentRunnable = peekHeadReindexWorker();
        while (currentRunnable != null && !isShuttingDown())
        {
           long nowTime = Calendar.getInstance().getTimeInMillis();
            // Notify the runnable that it is at the head of the queue
            currentRunnable.setAtHeadOfQueue();
            // Give the thread chance to commit
            synchronized(this)
            {
                try { wait(100); } catch (InterruptedException e) {}
            }
           
            long currentTimestamp = currentRunnable.getLastIndexedTimestamp();
            // The head of the queue holds proceedings, so it can't be allowed to continue forever
            // Allow 60s of inactivity.  We don't anticipate more than a few milliseconds between
            // timestamp advances for the reindex threads so this checking is just for emergencies
            // to prevent the queue from getting locked up.
            if (lastRunnable == currentRunnable)
            {
               //logger.error("Equal");
                if ((currentTimestamp - lastTimestamp > 60E9) || (nowTime-startTime>10000)){
                   
                    try
                    {
                        reindexThreadLock.writeLock().lock();
                        // Double check
                        ReindexWorkerRunnable checkCurrentRunnable = reindexThreadQueue.peek();
                        if ((lastRunnable != checkCurrentRunnable) && !(nowTime-startTime>10000))
                        {
                            // It's moved on - just in time
                        }
                        else
                        {
                            loggerOnThread.info("Terminating reindex thread for inactivity: " + currentRunnable);
                            reindexThreadQueue.remove(currentRunnable);
                            currentRunnable.kill();
                        }
                        // Reset
                        lastRunnable = null;
                        lastTimestamp = Long.MAX_VALUE;
                        // Peek at the queue and check again
                        currentRunnable  = reindexThreadQueue.peek();
                    }
                    finally
                    {
                        reindexThreadLock.writeLock().unlock();
                    }
                    continue;
                }
                // Swap timestamps
                lastRunnable = currentRunnable;
                lastTimestamp = currentTimestamp;
            }
            else
            {
               
                // Swap timestamps
                lastRunnable = currentRunnable;
                lastTimestamp = currentTimestamp;
            }
           
            currentRunnable = peekHeadReindexWorker();
        }
    }