Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.

Bug 426179

Summary: [server] IOrionCredentialsService.getUser("email", email) performance problem
Product: [ECD] Orion Reporter: Anthony Hunter <ahunter.eclipse>
Component: ServerAssignee: 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    

Description Anthony Hunter CLA 2014-01-20 14:16:57 EST
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.
Comment 1 Anthony Hunter CLA 2014-01-21 17:28:56 EST
Commit 
http://git.eclipse.org/c/orion/org.eclipse.orion.server.git/commit/?id=4cf7531e0bd3ccd3d3c3e6ae6e4fcaaeb142c781
Adds the SimpleServerUserStressTest to the repo.
Comment 2 Anthony Hunter CLA 2014-01-21 17:31:00 EST
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
Comment 3 Anthony Hunter CLA 2014-01-29 12:02:26 EST
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.
Comment 4 Anthony Hunter CLA 2014-01-29 12:05:48 EST
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