Project

General

Profile

Actions

Bug #11466

closed

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

Added by David Lesimple over 1 year ago. Updated over 1 year ago.

Status:
Closed
Priority:
Normal
Category:
Administration
Start date:
04/01/2020
Due date:
% Done:

100%

Estimated time:
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


Files

bug-listUsersOfRole.png (34.7 KB) bug-listUsersOfRole.png Nicolas Eysseric, 04/01/2020 10:19 PM
nobug-listUsersOfHugeGroup.png (34.6 KB) nobug-listUsersOfHugeGroup.png Nicolas Eysseric, 04/01/2020 10:19 PM
Actions #2

Updated by David Lesimple over 1 year ago

  • Status changed from New to In progress...
  • Assignee set to Nicolas Eysseric
Actions #3

Updated by David Lesimple over 1 year ago

  • Status changed from In progress... to Assigned
  • Assignee changed from Nicolas Eysseric to Miguel Moquillon
Actions #4

Updated by Nicolas Eysseric over 1 year ago

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).

Actions #5

Updated by Miguel Moquillon over 1 year ago

  • Status changed from Assigned to In progress...
Actions #6

Updated by Miguel Moquillon over 1 year ago

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.

Actions #7

Updated by Miguel Moquillon over 1 year ago

  • Status changed from In progress... to 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.

Actions #8

Updated by Miguel Moquillon over 1 year ago

  • Status changed from Resolved to Closed

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

Actions #9

Updated by Nicolas Eysseric over 1 year ago

  • Project changed from FormsOnline to Silverpeas Core
  • Category set to Administration
  • % Done changed from 0 to 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).

Actions #10

Updated by Miguel Moquillon over 1 year ago

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.

Actions #11

Updated by Miguel Moquillon over 1 year ago

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

Actions #12

Updated by Yohann Chastagnier over 1 year ago

  • Status changed from Closed to Resolved
  • Priority changed from Urgent to Normal
  • Target version set to 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.

Actions #13

Updated by Yohann Chastagnier over 1 year ago

  • Status changed from Resolved to Integration in progress...
Actions #14

Updated by Yohann Chastagnier over 1 year ago

  • Status changed from Integration in progress... to 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

Also available in: Atom PDF