| Summary: | [server] IOrionCredentialsService.getUser("email", email) performance problem | ||
|---|---|---|---|
| Product: | [ECD] Orion | Reporter: | Anthony Hunter <ahunter.eclipse> |
| Component: | Server | Assignee: | Anthony Hunter <ahunter.eclipse> |
| Status: | RESOLVED FIXED | QA Contact: | |
| Severity: | normal | ||
| Priority: | P3 | ||
| Version: | 5.0 | ||
| Target Milestone: | 5.0 M2 | ||
| Hardware: | PC | ||
| OS: | Linux | ||
| Whiteboard: | |||
| Bug Depends on: | |||
| Bug Blocks: | 426177 | ||
Commit http://git.eclipse.org/c/orion/org.eclipse.orion.server.git/commit/?id=4cf7531e0bd3ccd3d3c3e6ae6e4fcaaeb142c781 Adds the SimpleServerUserStressTest to the repo. Commit git.eclipse.org/c/orion/org.eclipse.orion.server.git/commit/?id=611eeb439811c3a9251ac5e0c0cc0099fed0df49 Adds a Map of email addresses to userids for an email cache. After adding the cache and updating SimpleUserCredentialsService, performance is restored: Created user 0 in 10ms, average time per user: 10ms Created user 1000 in 2ms, average time per user: 3ms Created user 2000 in 2ms, average time per user: 2ms Created user 3000 in 1ms, average time per user: 2ms Created user 4000 in 3ms, average time per user: 2ms Created user 5000 in 1ms, average time per user: 2ms Created user 6000 in 3ms, average time per user: 2ms Created user 7000 in 2ms, average time per user: 2ms Created user 8000 in 1ms, average time per user: 2ms Created user 9000 in 2ms, average time per user: 2ms Created user 10000 in 4ms, average time per user: 2ms This issue is also demonstrated in another use case:
Create an Orion server with 100,000 user accounts. Associate an google email address with an account starting with 'z', for example an account named zeus.
When you try to log into the the Orion server with your google account, your email is verified immediately, but then there is on average an over eight second delay until you are logged in. The Orion login screen sits with no progress indication.
The login delay is directly related to the alphabetical order of your userid because of a performance issue of the call:
IOrionCredentialsService.getUsersByProperty("openid", identifier, true, false);
Every user needs to be scanned to look for a matching openid.
The commit: http://git.eclipse.org/c/orion/org.eclipse.orion.server.git/commit/?id=611eeb439811c3a9251ac5e0c0cc0099fed0df49 Adds a Map of email addresses to userids for an email cache. Starting a this new server reduces the repsonse of the http://vottachubuntu.ottawa.ibm.com:8080/login/persona call from over 8 seconds to consistently around 500ms |
I created a test SimpleServerUserStressTest to measure how long it takes to create a user on an Orion server with an increasingly larger number of users. The create user code path verifies that the email address provided by the user is unique. The existing code path: Created user 0 in 13ms, average time per user: 13ms Created user 1000 in 52ms, average time per user: 31ms Created user 2000 in 99ms, average time per user: 57ms Created user 3000 in 147ms, average time per user: 83ms Created user 4000 in 213ms, average time per user: 107ms Created user 5000 in 248ms, average time per user: 131ms Created user 6000 in 312ms, average time per user: 155ms Created user 7000 in 335ms, average time per user: 180ms Created user 8000 in 411ms, average time per user: 204ms Created user 9000 in 427ms, average time per user: 228ms Created user 10000 in 479ms, average time per user: 256ms If I eliminate the call to IOrionCredentialsService.getUser("email", email) and allow duplicate email addresses: Created user 0 in 12ms, average time per user: 12ms Created user 1000 in 2ms, average time per user: 3ms Created user 2000 in 2ms, average time per user: 2ms Created user 3000 in 2ms, average time per user: 2ms Created user 4000 in 4ms, average time per user: 2ms Created user 5000 in 3ms, average time per user: 2ms Created user 6000 in 1ms, average time per user: 3ms Created user 7000 in 2ms, average time per user: 2ms Created user 8000 in 1ms, average time per user: 2ms Created user 9000 in 1ms, average time per user: 2ms Created user 10000 in 2ms, average time per user: 2ms We need to introduce a cache to improve the performance of IOrionCredentialsService.getUser() for a simple metadata storage.