Bug #11466
ferméun trop grand nombre d'utilisateurs dans un groupe demandeurs fait planter Silverpeas !
100%
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
Mis à jour par David Lesimple il y a plus de 4 ans
- Statut changé de New à In progress...
- Assigné à mis à Nicolas Eysseric
Mis à jour par David Lesimple il y a plus de 4 ans
- Statut changé de In progress... à Assigned
- Assigné à changé de Nicolas Eysseric à Miguel Moquillon
Mis à jour par Nicolas Eysseric il y a plus de 4 ans
- Fichier bug-listUsersOfRole.png bug-listUsersOfRole.png ajouté
- Fichier nobug-listUsersOfHugeGroup.png nobug-listUsersOfHugeGroup.png ajouté
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 plus de 4 ans
- Statut changé de Assigned à In progress...
Mis à jour par Miguel Moquillon il y a plus de 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 plus de 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 plus de 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 plus de 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 plus de 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 plus de 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 plus de 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 plus de 4 ans
- Statut changé de Resolved à Integration in progress...
Mis à jour par Yohann Chastagnier il y a plus de 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