collective / collective/pas.plugins.sqlalchemy

Excessive calls to enumerateUsers() in the Plone Control Panel

Aperta
#1 1 commento 0 reazioni 1 assegnatario Rivendicata da @auspex Vedi su GitHub
Lingua principale
Python
Stelle
7
Fork
7
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

Re: http://stackoverflow.com/questions/6047618/using-plone-4-and-pas-plugins-sqlalchemy-with-many-users

When using pas.plugins.sqlalchemy and Plone 4, with many users, user enumeration takes a very long amount of time (O(n)), performing a query and a match for each user present in the database. If the system has thousands of users, searching for a user, changing roles and permissions, are all impossible activities.

The first thing that jumps out is that it gets the Session() before checking the cache, which is sure to create some overhead.

@zedr provided a patch which prevents the problem, but removes new functionality added to PAS in Plone 4.
By applying these changes to /plone/app/controlpanel/usergroups.py the problem is solved:

```
166c166,169
< inheritance_enabled_users = searchView.merge(chain(*[searchView.searchUsers(**{field: searchString}) for field in ['login', 'fullname', 'email']]), 'userid')

---
> import logging; logging.warn('PASSED!!!')
> import pdb; pdb.set_trace()
> #inheritance_enabled_users = searchView.merge(chain(*[searchView.searchUsers(**{field: searchString}) for field in ['login', 'fullname', 'email']]), 'userid')
> inheritance_enabled_users = searchView.merge(chain(*[searchView.searchUsers(**{field: searchString}) for field in ['login']]), 'userid')
184c187,188
< explicit_users = searchView.merge(chain(*[searchView.searchUsers(**{field: searchString}) for field in ['login', 'fullname', 'email']]), 'userid')

---
> #explicit_users = searchView.merge(chain(*[searchView.searchUsers(**{field: searchString}) for field in ['login', 'fullname', 'email']]), 'userid')
> explicit_users = searchView.merge(chain(*[searchView.searchUsers(**{field: searchString}) for field in ['login']]), 'userid')
```

@zedr also provided a tool to generate users for testing http://pastie.org/1931291

e.g, to create 1000 random users on a MySQL database, run:

```
./mass_user_add.py mysql://root:secret@localhost/mydb -n 1000
```

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.