Projet

Général

Profil

Actions

Bug #11466

fermé

un trop grand nombre d'utilisateurs dans un groupe demandeurs fait planter Silverpeas !

Ajouté par David Lesimple il y a environ 4 ans. Mis à jour il y a presque 4 ans.

Statut:
Closed
Priorité:
Normal
Assigné à:
Catégorie:
Administration
Début:
01/04/2020
Echéance:
% réalisé:

100%

Temps estimé:
Navigateur:
Tous
Votre version de Silverpeas:
6.1-x
Système d'exploitation:
Votre base de données:
Toutes
Livraison en TEST:
Livraison en PROD:

Description

Si un groupe comportant par exemple 38000 utilisateurs est pris comme potientels de demandeurs,
il y a nons seulement une erreur lorsqu'on sélectionne ce groupe dans la liste des demandeurs (coté applicatif) mais
en plus cela peut engendrer un plantage de Silverpeas, faute de connexions BD.

2020-04-01 14:59:51,297 SEVERE [silverpeas.exception.unexpected] (default task-18) From request [https://intranet-recette.chu-lyon.fr/silverpeas/services/profile/users/application/formsOnline681]
...
Caused by: java.lang.NullPointerException
        at org.silverpeas.core.webapi.profile.UserProfileEntity.fromUsers(UserProfileEntity.java:129)
        at org.silverpeas.core.webapi.profile.UserProfileResource.asWebEntity(UserProfileResource.java:395)
        at org.silverpeas.core.webapi.profile.UserProfileResource.getApplicationUsers(UserProfileResource.java:302)
        at org.silverpeas.core.webapi.profile.UserProfileResource$Proxy$_$$_WeldSubclass.getApplicationUsers$$super(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.weld.interceptor.proxy.TerminalAroundInvokeInvocationContext.proceedInternal(TerminalAroundInvokeInvocationContext.java:51)
        at org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:78)
        at org.silverpeas.core.webapi.base.aspect.WebEntityValidationAspect.processAuthorization(WebEntityValidationAspect.java:75)
        at sun.reflect.GeneratedMethodAccessor130.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:73)
        at org.jboss.weld.interceptor.proxy.NonTerminalAroundInvokeInvocationContext.proceedInternal(NonTerminalAroundInvokeInvocationContext.java:66)
        at org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:78)
        at org.silverpeas.core.webapi.base.aspect.ComponentExistenceAspect.processAuthorization(ComponentExistenceAspect.java:72)
        at sun.reflect.GeneratedMethodAccessor129.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:73)
        at org.jboss.weld.interceptor.proxy.NonTerminalAroundInvokeInvocationContext.proceedInternal(NonTerminalAroundInvokeInvocationContext.java:66)
        at org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:78)
        at org.silverpeas.core.webapi.base.annotation.processing.AuthenticatedAnnotationProcessor.processAuthentication(AuthenticatedAnnotationProcessor.java:56)
...
2020-04-01 14:59:51,398 SEVERE [silverpeas.core.admin.service] (default task-4) Fail to get users matching some criteria : org.silverpeas.core.admin.service.AdminException: Fail to get users matching some criteria
        at org.silverpeas.core.admin.user.UserManager.getUsersMatchingCriteria(UserManager.java:199)
        at org.silverpeas.core.admin.user.UserManager$Proxy$_$$_WeldSubclass.getUsersMatchingCriteria$$super(Unknown Source)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.weld.interceptor.proxy.TerminalAroundInvokeInvocationContext.proceedInternal(TerminalAroundInvokeInvocationContext.java:51)
        at org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:78)
        at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.invokeInCallerTx(TransactionalInterceptorBase.java:186)
        at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorMandatory.doIntercept(TransactionalInterceptorMandatory.java:59)
        at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.intercept(TransactionalInterceptorBase.java:88)
        at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorMandatory.intercept(TransactionalInterceptorMandatory.java:51)
        at sun.reflect.GeneratedMethodAccessor56.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:73)
        at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:84)
        at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:72)
        at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:56)
        at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79)
        at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68)
        at org.silverpeas.core.admin.user.UserManager$Proxy$_$$_WeldSubclass.getUsersMatchingCriteria(Unknown Source)
        at org.silverpeas.core.admin.service.Admin.searchUsers(Admin.java:5197)
        at org.silverpeas.core.admin.service.Admin$Proxy$_$$_WeldSubclass.searchUsers$$super(Unknown Source)
..
Caused by: org.postgresql.util.PSQLException: Une erreur d'entrée/sortie a eu lieu lors d'envoi vers le serveur.
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:327)
        at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428)
        at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354)
        at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:169)
        at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:117)
        at org.jboss.jca.adapters.jdbc.WrappedPreparedStatement.executeQuery(WrappedPreparedStatement.java:504)
        at org.silverpeas.core.persistence.jdbc.sql.DefaultJdbcSqlExecutor.select(DefaultJdbcSqlExecutor.java:124)
        at org.silverpeas.core.persistence.jdbc.sql.DefaultJdbcSqlExecutor$Proxy$_$$_WeldSubclass.select$$super(Unknown Source)
        at sun.reflect.GeneratedMethodAccessor71.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.weld.interceptor.proxy.TerminalAroundInvokeInvocationContext.proceedInternal(TerminalAroundInvokeInvocationContext.java:51)
        at org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:78)
        at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.invokeInCallerTx(TransactionalInterceptorBase.java:186)
        at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorSupports.doIntercept(TransactionalInterceptorSupports.java:55)
        at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.intercept(TransactionalInterceptorBase.java:88)
        at com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorSupports.intercept(TransactionalInterceptorSupports.java:47)
        at sun.reflect.GeneratedMethodAccessor70.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:73)
        at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:84)
        at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:72)
        at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:56)
        at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79)
        at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68)
        at org.silverpeas.core.persistence.jdbc.sql.DefaultJdbcSqlExecutor$Proxy$_$$_WeldSubclass.select(Unknown Source)
        at org.silverpeas.core.persistence.jdbc.sql.JdbcSqlQuery.executeWith(JdbcSqlQuery.java:730)
        at org.silverpeas.core.admin.user.dao.UserDAO.getUsersByCriteria(UserDAO.java:330)
        at org.silverpeas.core.admin.user.UserManager.getUsersMatchingCriteria(UserManager.java:197)
        ... 181 more
Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 38026
        at org.postgresql.core.PGStream.sendInteger2(PGStream.java:219)
        at org.postgresql.core.v3.QueryExecutorImpl.sendParse(QueryExecutorImpl.java:1467)
        at org.postgresql.core.v3.QueryExecutorImpl.sendOneQuery(QueryExecutorImpl.java:1778)
        at org.postgresql.core.v3.QueryExecutorImpl.sendQuery(QueryExecutorImpl.java:1354)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:292)
        ... 210 more

build 6.1-200330


Fichiers

bug-listUsersOfRole.png (34,7 ko) bug-listUsersOfRole.png Nicolas Eysseric, 01/04/2020 22:19
nobug-listUsersOfHugeGroup.png (34,6 ko) nobug-listUsersOfHugeGroup.png Nicolas Eysseric, 01/04/2020 22:19

Mis à jour par David Lesimple il y a environ 4 ans

  • Statut changé de New à In progress...
  • Assigné à mis à Nicolas Eysseric

Mis à jour par David Lesimple il y a environ 4 ans

  • Statut changé de In progress... à Assigned
  • Assigné à changé de Nicolas Eysseric à Miguel Moquillon

Mis à jour par Nicolas Eysseric il y a environ 4 ans

Le problème ne vient pas de l'application Formulaires en ligne elle-même.
Il vient de l'administration même de Silverpeas dans le cas où l'on souhaite sélectionner certains utilisateurs parmi tous les utilisateurs d'une application.
Dans ce cas, même si des groupes sont utilisés, la recherche des utilisateurs se fait sur une liste explicite (qui est trop grande ici) et non pas par leur appartenance à un rôle et/ou à un groupe.
La méthode incriminée semble être searchUsers(final UserDetailsSearchCriteria searchCriteria) de Admin.java (ligne 5182).

Mis à jour par Miguel Moquillon il y a environ 4 ans

  • Statut changé de Assigned à In progress...

Mis à jour par Miguel Moquillon il y a environ 4 ans

J'ai cerné le vrai problème : l'implémentation de PreparedStatement dans le driver PostgreSQL limite le nombre de variables à 32767. La taille des clauses IN ne sont donc limités que par cette limitation technique. Une simple requête SQL, sans variables (donc en pure chaîne de caractères), et qui comprend plus de 32767 conditions, fonctionne sans problèmes.

Mis à jour par Miguel Moquillon il y a environ 4 ans

  • Statut changé de In progress... à Resolved

Nicolas a proposé une solution plus simple et plus rapide pour résoudre le problème de performance en découpant la requête en plusieurs lorsqu'il y a un très grand nombre d'utilisateurs à récupérer (plus de 10000) et en tablant que ce problème n'est propre qu'aux HCL.

Mis à jour par Miguel Moquillon il y a environ 4 ans

  • Statut changé de Resolved à Closed

La correction a été intégrée et le build auto a été lancé avec la correction

Mis à jour par Nicolas Eysseric il y a environ 4 ans

  • Projet changé de FormsOnline à Silverpeas Core
  • Catégorie mis à Administration
  • % réalisé changé de 0 à 100

Le problème n'était pas spécifique à l'application Formulaires en ligne .
La solution, qui se résume à découper la grosse requête sur les utilisateurs, a été proposée par Yohann.
Pour ma part, je l'ai enrichi avec une limitation sur les groupes (lorsque ceux-ci sont définis).

Mis à jour par Miguel Moquillon il y a environ 4 ans

A savoir qu'une version plus perenne est désormais disponible sur SilverTeamWork, correspondant au PR #1072
Ce dernier sera intégré dans la 6.2.

Mis à jour par Miguel Moquillon il y a presque 4 ans

J'ai supprimé par erreur la branche derrière le PR et j'ai du donc restauré le tout. Désormais, la solution est apportée par le PR #1092

Mis à jour par Yohann Chastagnier il y a presque 4 ans

  • Statut changé de Closed à Resolved
  • Priorité changé de Urgent à Normal
  • Version cible mis à Version 6.2

La correction réalisée par Miguel va être intégrée en version 6.2, comme indiqué dans une note précédente.

Mis à jour par Yohann Chastagnier il y a presque 4 ans

  • Statut changé de Resolved à Integration in progress...

Mis à jour par Yohann Chastagnier il y a presque 4 ans

  • Statut changé de Integration in progress... à Closed

Pfiou.
Je suis finalement venu à bout de cette intégration : validé et intégré pour la version 6.2

Les modifications réalisées pour ce REDMINE portant sur une partie très sensible, plusieurs tests d'intégrations ont été réalisés (plus de 150 cas de test) lors de l'intégration.
Ces deniers ont également été reportés dans la branche 6.1.x

Actions

Formats disponibles : Atom PDF