stress testing

This commit is contained in:
Bill Burke 2016-02-12 00:30:36 -05:00
parent bddf214bc0
commit 860a104828
18 changed files with 222 additions and 147 deletions

View file

@ -120,7 +120,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
protected void runInvalidations() {
for (String id : realmInvalidations) {
cache.invalidateCachedRealmById(id);
cache.invalidateRealmById(id);
}
for (String id : roleInvalidations) {
cache.invalidateRoleById(id);
@ -129,10 +129,10 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
cache.invalidateGroupById(id);
}
for (String id : appInvalidations) {
cache.invalidateCachedApplicationById(id);
cache.invalidateClientById(id);
}
for (String id : clientTemplateInvalidations) {
cache.invalidateCachedClientTemplateById(id);
cache.invalidateClientTemplateById(id);
}
}
@ -193,13 +193,13 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
@Override
public RealmModel getRealm(String id) {
CachedRealm cached = cache.getCachedRealm(id);
CachedRealm cached = cache.getRealm(id);
if (cached == null) {
RealmModel model = getDelegate().getRealm(id);
if (model == null) return null;
if (realmInvalidations.contains(id)) return model;
cached = new CachedRealm(cache, this, model);
cache.addCachedRealm(cached);
cache.addRealm(cached);
} else if (realmInvalidations.contains(id)) {
return getDelegate().getRealm(id);
} else if (managedRealms.containsKey(id)) {
@ -212,13 +212,13 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
@Override
public RealmModel getRealmByName(String name) {
CachedRealm cached = cache.getCachedRealmByName(name);
CachedRealm cached = cache.getRealmByName(name);
if (cached == null) {
RealmModel model = getDelegate().getRealmByName(name);
if (model == null) return null;
if (realmInvalidations.contains(model.getId())) return model;
cached = new CachedRealm(cache, this, model);
cache.addCachedRealm(cached);
cache.addRealm(cached);
} else if (realmInvalidations.contains(cached.getId())) {
return getDelegate().getRealmByName(name);
} else if (managedRealms.containsKey(cached.getId())) {
@ -245,7 +245,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
@Override
public boolean removeRealm(String id) {
cache.invalidateCachedRealmById(id);
cache.invalidateRealmById(id);
RealmModel realm = getDelegate().getRealm(id);
Set<RoleModel> realmRoles = null;
@ -287,7 +287,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
} else {
cached = new CachedRealmRole(model, realm);
}
cache.addCachedRole(cached);
cache.addRole(cached);
} else if (roleInvalidations.contains(id)) {
return getDelegate().getRoleById(id, realm);
@ -311,7 +311,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
if (model == null) return null;
if (groupInvalidations.contains(id)) return model;
cached = new CachedGroup(realm, model);
cache.addCachedGroup(cached);
cache.addGroup(cached);
} else if (groupInvalidations.contains(id)) {
return getDelegate().getGroupById(id, realm);
@ -325,7 +325,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
@Override
public ClientModel getClientById(String id, RealmModel realm) {
CachedClient cached = cache.getApplication(id);
CachedClient cached = cache.getClient(id);
if (cached != null && !cached.getRealm().equals(realm.getId())) {
cached = null;
}
@ -335,7 +335,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
if (model == null) return null;
if (appInvalidations.contains(id)) return model;
cached = new CachedClient(cache, getDelegate(), realm, model);
cache.addCachedClient(cached);
cache.addClient(cached);
} else if (appInvalidations.contains(id)) {
return getDelegate().getClientById(id, realm);
} else if (managedApplications.containsKey(id)) {
@ -345,6 +345,12 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
managedApplications.put(id, adapter);
return adapter;
}
@Override
public ClientModel getClientByClientId(String clientId, RealmModel realm) {
return getDelegate().getClientByClientId(clientId, realm);
}
@Override
public ClientTemplateModel getClientTemplateById(String id, RealmModel realm) {
CachedClientTemplate cached = cache.getClientTemplate(id);
@ -357,7 +363,7 @@ public class DefaultCacheRealmProvider implements CacheRealmProvider {
if (model == null) return null;
if (clientTemplateInvalidations.contains(id)) return model;
cached = new CachedClientTemplate(cache, getDelegate(), realm, model);
cache.addCachedClientTemplate(cached);
cache.addClientTemplate(cached);
} else if (clientTemplateInvalidations.contains(id)) {
return getDelegate().getClientTemplateById(id, realm);
} else if (managedClientTemplates.containsKey(id)) {

View file

@ -138,11 +138,11 @@ public class InfinispanCacheRealmProviderFactory implements CacheRealmProviderFa
realmLookup.remove(realm.getName());
for (String r : realm.getRealmRoles().values()) {
realmCache.evictCachedRoleById(r);
realmCache.evictRoleById(r);
}
for (String c : realm.getClients().values()) {
realmCache.evictCachedApplicationById(c);
realmCache.evictClientById(c);
}
log.tracev("Realm removed realm={0}", realm.getName());
@ -150,7 +150,7 @@ public class InfinispanCacheRealmProviderFactory implements CacheRealmProviderFa
CachedClient client = (CachedClient) object;
for (String r : client.getRoles().values()) {
realmCache.evictCachedRoleById(r);
realmCache.evictRoleById(r);
}
log.tracev("Client removed client={0}", client.getId());

View file

@ -53,61 +53,61 @@ public class InfinispanRealmCache implements RealmCache {
}
@Override
public CachedRealm getCachedRealm(String id) {
public CachedRealm getRealm(String id) {
return get(id, CachedRealm.class);
}
@Override
public void invalidateCachedRealm(CachedRealm realm) {
public void invalidateRealm(CachedRealm realm) {
logger.tracev("Invalidating realm {0}", realm.getId());
cache.remove(realm.getId());
realmLookup.remove(realm.getName());
}
@Override
public void invalidateCachedRealmById(String id) {
public void invalidateRealmById(String id) {
CachedRealm cached = (CachedRealm) cache.remove(id);
if (cached != null) realmLookup.remove(cached.getName());
}
@Override
public void addCachedRealm(CachedRealm realm) {
public void addRealm(CachedRealm realm) {
logger.tracev("Adding realm {0}", realm.getId());
cache.putForExternalRead(realm.getId(), realm);
realmLookup.put(realm.getName(), realm.getId());
}
@Override
public CachedRealm getCachedRealmByName(String name) {
public CachedRealm getRealmByName(String name) {
String id = realmLookup.get(name);
return id != null ? getCachedRealm(id) : null;
return id != null ? getRealm(id) : null;
}
@Override
public CachedClient getApplication(String id) {
public CachedClient getClient(String id) {
return get(id, CachedClient.class);
}
@Override
public void invalidateApplication(CachedClient app) {
public void invalidateClient(CachedClient app) {
logger.tracev("Removing application {0}", app.getId());
cache.remove(app.getId());
}
@Override
public void addCachedClient(CachedClient app) {
public void addClient(CachedClient app) {
logger.tracev("Adding application {0}", app.getId());
cache.putForExternalRead(app.getId(), app);
}
@Override
public void invalidateCachedApplicationById(String id) {
public void invalidateClientById(String id) {
logger.tracev("Removing application {0}", id);
cache.remove(id);
}
@Override
public void evictCachedApplicationById(String id) {
public void evictClientById(String id) {
logger.tracev("Evicting application {0}", id);
cache.evict(id);
}
@ -124,18 +124,11 @@ public class InfinispanRealmCache implements RealmCache {
}
@Override
public void addCachedGroup(CachedGroup role) {
public void addGroup(CachedGroup role) {
logger.tracev("Adding group {0}", role.getId());
cache.putForExternalRead(role.getId(), role);
}
@Override
public void invalidateCachedGroupById(String id) {
logger.tracev("Removing group {0}", id);
cache.remove(id);
}
@Override
public void invalidateGroupById(String id) {
logger.tracev("Removing group {0}", id);
@ -160,23 +153,17 @@ public class InfinispanRealmCache implements RealmCache {
}
@Override
public void evictCachedRoleById(String id) {
public void evictRoleById(String id) {
logger.tracev("Evicting role {0}", id);
cache.evict(id);
}
@Override
public void addCachedRole(CachedRole role) {
public void addRole(CachedRole role) {
logger.tracev("Adding role {0}", role.getId());
cache.putForExternalRead(role.getId(), role);
}
@Override
public void invalidateCachedRoleById(String id) {
logger.tracev("Removing role {0}", id);
cache.remove(id);
}
private <T> T get(String id, Class<T> type) {
Object o = cache.get(id);
return o != null && type.isInstance(o) ? type.cast(o) : null;
@ -194,19 +181,19 @@ public class InfinispanRealmCache implements RealmCache {
}
@Override
public void addCachedClientTemplate(CachedClientTemplate app) {
public void addClientTemplate(CachedClientTemplate app) {
logger.tracev("Adding client template {0}", app.getId());
cache.putForExternalRead(app.getId(), app);
}
@Override
public void invalidateCachedClientTemplateById(String id) {
public void invalidateClientTemplateById(String id) {
logger.tracev("Removing client template {0}", id);
cache.remove(id);
}
@Override
public void evictCachedClientTemplateById(String id) {
public void evictClientTemplateById(String id) {
logger.tracev("Evicting client template {0}", id);
cache.evict(id);
}

View file

@ -415,6 +415,9 @@ public class RealmAdapter implements RealmModel {
@Override
public PublicKey getPublicKey() {
if (updated != null) return updated.getPublicKey();
if (publicKey != null) return publicKey;
publicKey = cached.getPublicKey();
if (publicKey != null) return publicKey;
publicKey = KeycloakModelUtils.getPublicKey(getPublicKeyPem());
return publicKey;
@ -429,6 +432,9 @@ public class RealmAdapter implements RealmModel {
@Override
public X509Certificate getCertificate() {
if (updated != null) return updated.getCertificate();
if (certificate != null) return certificate;
certificate = cached.getCertificate();
if (certificate != null) return certificate;
certificate = KeycloakModelUtils.getCertificate(getCertificatePem());
return certificate;
@ -456,7 +462,14 @@ public class RealmAdapter implements RealmModel {
@Override
public PrivateKey getPrivateKey() {
if (privateKey != null) return privateKey;
if (updated != null) return updated.getPrivateKey();
if (privateKey != null) {
return privateKey;
}
privateKey = cached.getPrivateKey();
if (privateKey != null) {
return privateKey;
}
privateKey = KeycloakModelUtils.getPrivateKey(getPrivateKeyPem());
return privateKey;
}
@ -635,10 +648,7 @@ public class RealmAdapter implements RealmModel {
@Override
public ClientModel getClientByClientId(String clientId) {
if (updated != null) return updated.getClientByClientId(clientId);
String id = cached.getClients().get(clientId);
if (id == null) return null;
return getClientById(id);
return cacheSession.getClientByClientId(clientId, this);
}
@Override

View file

@ -132,7 +132,7 @@ public class LockingCacheRealmProvider implements CacheRealmProvider {
protected void runInvalidations() {
for (String id : realmInvalidations) {
cache.invalidateCachedRealmById(id);
cache.invalidateRealmById(id);
}
for (String id : roleInvalidations) {
cache.invalidateRoleById(id);
@ -141,10 +141,10 @@ public class LockingCacheRealmProvider implements CacheRealmProvider {
cache.invalidateGroupById(id);
}
for (String id : appInvalidations) {
cache.invalidateCachedApplicationById(id);
cache.invalidateClientById(id);
}
for (String id : clientTemplateInvalidations) {
cache.invalidateCachedClientTemplateById(id);
cache.invalidateClientTemplateById(id);
}
}
@ -271,7 +271,7 @@ public class LockingCacheRealmProvider implements CacheRealmProvider {
@Override
public RealmModel getRealm(String id) {
CachedRealm cached = cache.getCachedRealm(id);
CachedRealm cached = cache.getRealm(id);
if (cached != null) {
logger.tracev("by id cache hit: {0}", cached.getName());
}
@ -282,7 +282,7 @@ public class LockingCacheRealmProvider implements CacheRealmProvider {
if (model == null) return null;
if (realmInvalidations.contains(id)) return model;
cached = new RevisionedCachedRealm(loaded, cache, this, model);
cache.addCachedRealm(cached);
cache.addRealm(cached);
} else if (realmInvalidations.contains(id)) {
return getDelegate().getRealm(id);
} else if (managedRealms.containsKey(id)) {
@ -295,7 +295,7 @@ public class LockingCacheRealmProvider implements CacheRealmProvider {
@Override
public RealmModel getRealmByName(String name) {
CachedRealm cached = cache.getCachedRealmByName(name);
CachedRealm cached = cache.getRealmByName(name);
if (cached != null) {
logger.tracev("by name cache hit: {0}", cached.getName());
}
@ -305,7 +305,7 @@ public class LockingCacheRealmProvider implements CacheRealmProvider {
if (model == null) return null;
if (realmInvalidations.contains(model.getId())) return model;
cached = new RevisionedCachedRealm(loaded, cache, this, model);
cache.addCachedRealm(cached);
cache.addRealm(cached);
} else if (realmInvalidations.contains(cached.getId())) {
return getDelegate().getRealmByName(name);
} else if (managedRealms.containsKey(cached.getId())) {
@ -332,7 +332,7 @@ public class LockingCacheRealmProvider implements CacheRealmProvider {
@Override
public boolean removeRealm(String id) {
cache.invalidateCachedRealmById(id);
cache.invalidateRealmById(id);
RealmModel realm = getDelegate().getRealm(id);
Set<RoleModel> realmRoles = null;
@ -376,7 +376,7 @@ public class LockingCacheRealmProvider implements CacheRealmProvider {
} else {
cached = new RevisionedCachedRealmRole(loaded, model, realm);
}
cache.addCachedRole(cached);
cache.addRole(cached);
} else if (roleInvalidations.contains(id)) {
return getDelegate().getRoleById(id, realm);
@ -402,7 +402,7 @@ public class LockingCacheRealmProvider implements CacheRealmProvider {
if (model == null) return null;
if (groupInvalidations.contains(id)) return model;
cached = new RevisionedCachedGroup(loaded, realm, model);
cache.addCachedGroup(cached);
cache.addGroup(cached);
} else if (groupInvalidations.contains(id)) {
return getDelegate().getGroupById(id, realm);
@ -416,11 +416,11 @@ public class LockingCacheRealmProvider implements CacheRealmProvider {
@Override
public ClientModel getClientById(String id, RealmModel realm) {
CachedClient cached = cache.getApplication(id);
CachedClient cached = cache.getClient(id);
if (cached != null && !cached.getRealm().equals(realm.getId())) {
cached = null;
}
if (cached != null && cached.getClientId().equals("client")) {
if (cached != null) {
logger.tracev("client by id cache hit: {0}", cached.getClientId());
}
@ -431,7 +431,8 @@ public class LockingCacheRealmProvider implements CacheRealmProvider {
if (model == null) return null;
if (appInvalidations.contains(id)) return model;
cached = new RevisionedCachedClient(loaded, cache, getDelegate(), realm, model);
cache.addCachedClient(cached);
logger.tracev("adding client by id cache miss: {0}", cached.getClientId());
cache.addClient(cached);
} else if (appInvalidations.contains(id)) {
return getDelegate().getClientById(id, realm);
} else if (managedApplications.containsKey(id)) {
@ -441,6 +442,36 @@ public class LockingCacheRealmProvider implements CacheRealmProvider {
managedApplications.put(id, adapter);
return adapter;
}
@Override
public ClientModel getClientByClientId(String clientId, RealmModel realm) {
CachedClient cached = cache.getClientByClientId(clientId);
if (cached != null && !cached.getRealm().equals(realm.getId())) {
cached = null;
}
if (cached != null) {
logger.tracev("client by name cache hit: {0}", cached.getClientId());
}
if (cached == null) {
Long loaded = UpdateCounter.current();
if (loaded == null) loaded = UpdateCounter.current();
ClientModel model = getDelegate().getClientByClientId(clientId, realm);
if (model == null) return null;
if (appInvalidations.contains(model.getId())) return model;
cached = new RevisionedCachedClient(loaded, cache, getDelegate(), realm, model);
logger.tracev("adding client by name cache miss: {0}", cached.getClientId());
cache.addClient(cached);
} else if (appInvalidations.contains(cached.getId())) {
return getDelegate().getClientById(cached.getId(), realm);
} else if (managedApplications.containsKey(cached.getId())) {
return managedApplications.get(cached.getId());
}
ClientAdapter adapter = new ClientAdapter(realm, cached, this, cache);
managedApplications.put(cached.getId(), adapter);
return adapter;
}
@Override
public ClientTemplateModel getClientTemplateById(String id, RealmModel realm) {
CachedClientTemplate cached = cache.getClientTemplate(id);
@ -455,7 +486,7 @@ public class LockingCacheRealmProvider implements CacheRealmProvider {
if (model == null) return null;
if (clientTemplateInvalidations.contains(id)) return model;
cached = new RevisionedCachedClientTemplate(loaded, cache, getDelegate(), realm, model);
cache.addCachedClientTemplate(cached);
cache.addClientTemplate(cached);
} else if (clientTemplateInvalidations.contains(id)) {
return getDelegate().getClientTemplateById(id, realm);
} else if (managedClientTemplates.containsKey(id)) {

View file

@ -37,8 +37,6 @@ import org.keycloak.models.cache.CacheRealmProviderFactory;
import org.keycloak.models.cache.entities.CachedClient;
import org.keycloak.models.cache.entities.CachedRealm;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@ -49,8 +47,6 @@ public class LockingCacheRealmProviderFactory implements CacheRealmProviderFacto
protected volatile LockingRealmCache realmCache;
protected final ConcurrentHashMap<String, String> realmLookup = new ConcurrentHashMap<>();
@Override
public CacheRealmProvider create(KeycloakSession session) {
lazyInit(session);
@ -64,7 +60,7 @@ public class LockingCacheRealmProviderFactory implements CacheRealmProviderFacto
Cache<String, Object> cache = session.getProvider(InfinispanConnectionProvider.class).getCache(InfinispanConnectionProvider.REALM_CACHE_NAME);
Cache<String, Long> counterCache = session.getProvider(InfinispanConnectionProvider.class).getCache(LockingConnectionProviderFactory.VERSION_CACHE_NAME);
cache.addListener(new CacheListener());
realmCache = new LockingRealmCache(cache, counterCache, realmLookup);
realmCache = new LockingRealmCache(cache, counterCache);
}
}
}
@ -98,7 +94,7 @@ public class LockingCacheRealmProviderFactory implements CacheRealmProviderFacto
if (object != null) {
if (object instanceof CachedRealm) {
CachedRealm realm = (CachedRealm) object;
realmLookup.put(realm.getName(), realm.getId());
realmCache.getRealmLookup().put(realm.getName(), realm.getId());
log.tracev("Realm added realm={0}", realm.getName());
}
}
@ -136,14 +132,14 @@ public class LockingCacheRealmProviderFactory implements CacheRealmProviderFacto
if (object instanceof CachedRealm) {
CachedRealm realm = (CachedRealm) object;
realmLookup.remove(realm.getName());
realmCache.getRealmLookup().remove(realm.getName());
for (String r : realm.getRealmRoles().values()) {
realmCache.evictCachedRoleById(r);
realmCache.evictRoleById(r);
}
for (String c : realm.getClients().values()) {
realmCache.evictCachedApplicationById(c);
realmCache.evictClientById(c);
}
log.tracev("Realm removed realm={0}", realm.getName());
@ -151,7 +147,7 @@ public class LockingCacheRealmProviderFactory implements CacheRealmProviderFacto
CachedClient client = (CachedClient) object;
for (String r : client.getRoles().values()) {
realmCache.evictCachedRoleById(r);
realmCache.evictRoleById(r);
}
log.tracev("Client removed client={0}", client.getId());

View file

@ -27,7 +27,6 @@ import org.keycloak.models.cache.entities.CachedRealm;
import org.keycloak.models.cache.entities.CachedRole;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
/**
* @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@ -39,11 +38,11 @@ public class LockingRealmCache implements RealmCache {
protected final Cache<String, Long> revisions;
protected final Cache<String, Object> cache;
protected final ConcurrentHashMap<String, String> realmLookup;
protected final ConcurrentHashMap<String, String> realmLookup = new ConcurrentHashMap<>();
protected final ConcurrentHashMap<String, String> clientLookup = new ConcurrentHashMap<>();
public LockingRealmCache(Cache<String, Object> cache, Cache<String, Long> revisions, ConcurrentHashMap<String, String> realmLookup) {
public LockingRealmCache(Cache<String, Object> cache, Cache<String, Long> revisions) {
this.cache = cache;
this.realmLookup = realmLookup;
this.revisions = revisions;
}
@ -55,6 +54,14 @@ public class LockingRealmCache implements RealmCache {
return revisions;
}
public ConcurrentHashMap<String, String> getRealmLookup() {
return realmLookup;
}
public ConcurrentHashMap<String, String> getClientLookup() {
return clientLookup;
}
public Long getCurrentRevision(String id) {
return revisions.get(id);
}
@ -133,25 +140,25 @@ public class LockingRealmCache implements RealmCache {
}
@Override
public CachedRealm getCachedRealm(String id) {
public CachedRealm getRealm(String id) {
return get(id, CachedRealm.class);
}
@Override
public void invalidateCachedRealm(CachedRealm realm) {
public void invalidateRealm(CachedRealm realm) {
logger.tracev("Invalidating realm {0}", realm.getId());
invalidateObject(realm.getId());
realmLookup.remove(realm.getName());
}
@Override
public void invalidateCachedRealmById(String id) {
public void invalidateRealmById(String id) {
CachedRealm cached = (CachedRealm) invalidateObject(id);
if (cached != null) realmLookup.remove(cached.getName());
}
@Override
public void addCachedRealm(CachedRealm realm) {
public void addRealm(CachedRealm realm) {
logger.tracev("Adding realm {0}", realm.getId());
addRevisioned(realm.getId(), (Revisioned) realm);
realmLookup.put(realm.getName(), realm.getId());
@ -159,36 +166,46 @@ public class LockingRealmCache implements RealmCache {
@Override
public CachedRealm getCachedRealmByName(String name) {
public CachedRealm getRealmByName(String name) {
String id = realmLookup.get(name);
return id != null ? getCachedRealm(id) : null;
return id != null ? getRealm(id) : null;
}
@Override
public CachedClient getApplication(String id) {
public CachedClient getClient(String id) {
return get(id, CachedClient.class);
}
public CachedClient getClientByClientId(String clientId) {
String id = clientLookup.get(clientId);
return id != null ? getClient(id) : null;
}
@Override
public void invalidateApplication(CachedClient app) {
public void invalidateClient(CachedClient app) {
logger.tracev("Removing application {0}", app.getId());
invalidateObject(app.getId());
clientLookup.remove(app.getClientId());
}
@Override
public void addCachedClient(CachedClient app) {
public void addClient(CachedClient app) {
logger.tracev("Adding application {0}", app.getId());
addRevisioned(app.getId(), (Revisioned) app);
clientLookup.put(app.getClientId(), app.getId());
}
@Override
public void invalidateCachedApplicationById(String id) {
public void invalidateClientById(String id) {
CachedClient client = (CachedClient)invalidateObject(id);
if (client != null) logger.tracev("Removing application {0}", client.getClientId());
if (client != null) {
logger.tracev("Removing application {0}", client.getClientId());
clientLookup.remove(client.getClientId());
}
}
@Override
public void evictCachedApplicationById(String id) {
public void evictClientById(String id) {
logger.tracev("Evicting application {0}", id);
cache.evict(id);
}
@ -205,18 +222,11 @@ public class LockingRealmCache implements RealmCache {
}
@Override
public void addCachedGroup(CachedGroup role) {
public void addGroup(CachedGroup role) {
logger.tracev("Adding group {0}", role.getId());
addRevisioned(role.getId(), (Revisioned) role);
}
@Override
public void invalidateCachedGroupById(String id) {
logger.tracev("Removing group {0}", id);
invalidateObject(id);
}
@Override
public void invalidateGroupById(String id) {
logger.tracev("Removing group {0}", id);
@ -241,23 +251,17 @@ public class LockingRealmCache implements RealmCache {
}
@Override
public void evictCachedRoleById(String id) {
public void evictRoleById(String id) {
logger.tracev("Evicting role {0}", id);
cache.evict(id);
}
@Override
public void addCachedRole(CachedRole role) {
public void addRole(CachedRole role) {
logger.tracev("Adding role {0}", role.getId());
addRevisioned(role.getId(), (Revisioned) role);
}
@Override
public void invalidateCachedRoleById(String id) {
logger.tracev("Removing role {0}", id);
invalidateObject(id);
}
@Override
public CachedClientTemplate getClientTemplate(String id) {
return get(id, CachedClientTemplate.class);
@ -270,19 +274,19 @@ public class LockingRealmCache implements RealmCache {
}
@Override
public void addCachedClientTemplate(CachedClientTemplate app) {
public void addClientTemplate(CachedClientTemplate app) {
logger.tracev("Adding client template {0}", app.getId());
addRevisioned(app.getId(), (Revisioned) app);
}
@Override
public void invalidateCachedClientTemplateById(String id) {
public void invalidateClientTemplateById(String id) {
logger.tracev("Removing client template {0}", id);
invalidateObject(id);
}
@Override
public void evictCachedClientTemplateById(String id) {
public void evictClientTemplateById(String id) {
logger.tracev("Evicting client template {0}", id);
cache.evict(id);
}

View file

@ -176,6 +176,17 @@ public class JpaRealmProvider implements RealmProvider {
return new ClientAdapter(realm, em, session, app);
}
@Override
public ClientModel getClientByClientId(String clientId, RealmModel realm) {
TypedQuery<ClientEntity> query = em.createNamedQuery("findClientByClientId", ClientEntity.class);
query.setParameter("clientId", clientId);
query.setParameter("realm", realm.getId());
List<ClientEntity> results = query.getResultList();
if (results.isEmpty()) return null;
ClientEntity entity = results.get(0);
return new ClientAdapter(realm, em, session, entity);
}
@Override
public ClientTemplateModel getClientTemplateById(String id, RealmModel realm) {
ClientTemplateEntity app = em.find(ClientTemplateEntity.class, id);

View file

@ -811,7 +811,7 @@ public class RealmAdapter implements RealmModel {
@Override
public ClientModel getClientByClientId(String clientId) {
return getClientNameMap().get(clientId);
return session.realms().getClientByClientId(clientId, this);
}
private static final String BROWSER_HEADER_PREFIX = "_browser_header.";

View file

@ -50,6 +50,8 @@ import java.util.Set;
@Table(name="CLIENT", uniqueConstraints = {@UniqueConstraint(columnNames = {"REALM_ID", "CLIENT_ID"})})
@NamedQueries({
@NamedQuery(name="getClientsByRealm", query="select client from ClientEntity client where client.realm = :realm"),
@NamedQuery(name="findClientIdByClientId", query="select client.id from ClientEntity client where client.clientId = :clientId and client.realm.id = :realm"),
@NamedQuery(name="findClientByClientId", query="select client from ClientEntity client where client.clientId = :clientId and client.realm.id = :realm"),
})
public class ClientEntity {

View file

@ -162,6 +162,17 @@ public class MongoRealmProvider implements RealmProvider {
return new ClientAdapter(session, realm, appData, invocationContext);
}
@Override
public ClientModel getClientByClientId(String clientId, RealmModel realm) {
DBObject query = new QueryBuilder()
.and("realmId").is(realm.getId())
.and("clientId").is(clientId)
.get();
MongoClientEntity appEntity = getMongoStore().loadSingleEntity(MongoClientEntity.class, query, invocationContext);
return appEntity == null ? null : new ClientAdapter(session, realm, appEntity, invocationContext);
}
@Override
public ClientTemplateModel getClientTemplateById(String id, RealmModel realm) {
MongoClientTemplateEntity appData = getMongoStore().loadEntity(MongoClientTemplateEntity.class, id, invocationContext);

View file

@ -807,12 +807,7 @@ public class RealmAdapter extends AbstractMongoAdapter<MongoRealmEntity> impleme
@Override
public ClientModel getClientByClientId(String clientId) {
DBObject query = new QueryBuilder()
.and("realmId").is(getId())
.and("clientId").is(clientId)
.get();
MongoClientEntity appEntity = getMongoStore().loadSingleEntity(MongoClientEntity.class, query, invocationContext);
return appEntity == null ? null : new ClientAdapter(session, this, appEntity, invocationContext);
return session.realms().getClientByClientId(clientId, this);
}
@Override

View file

@ -35,8 +35,11 @@ public interface RealmProvider extends Provider {
RealmModel getRealm(String id);
RealmModel getRealmByName(String name);
RoleModel getRoleById(String id, RealmModel realm);
ClientModel getClientById(String id, RealmModel realm);
ClientModel getClientByClientId(String clientId, RealmModel realm);
RoleModel getRoleById(String id, RealmModel realm);
ClientTemplateModel getClientTemplateById(String id, RealmModel realm);
GroupModel getGroupById(String id, RealmModel realm);

View file

@ -30,35 +30,33 @@ import org.keycloak.models.cache.entities.CachedRole;
public interface RealmCache {
void clear();
CachedRealm getCachedRealm(String id);
CachedRealm getRealm(String id);
void invalidateCachedRealm(CachedRealm realm);
void invalidateRealm(CachedRealm realm);
void addCachedRealm(CachedRealm realm);
void addRealm(CachedRealm realm);
CachedRealm getCachedRealmByName(String name);
CachedRealm getRealmByName(String name);
void invalidateCachedRealmById(String id);
void invalidateRealmById(String id);
CachedClient getApplication(String id);
CachedClient getClient(String id);
void invalidateApplication(CachedClient app);
void invalidateClient(CachedClient app);
void evictCachedApplicationById(String id);
void evictClientById(String id);
void addCachedClient(CachedClient app);
void addClient(CachedClient app);
void invalidateCachedApplicationById(String id);
void invalidateClientById(String id);
CachedRole getRole(String id);
void invalidateRole(CachedRole role);
void evictCachedRoleById(String id);
void evictRoleById(String id);
void addCachedRole(CachedRole role);
void invalidateCachedRoleById(String id);
void addRole(CachedRole role);
void invalidateRoleById(String id);
@ -66,9 +64,7 @@ public interface RealmCache {
void invalidateGroup(CachedGroup role);
void addCachedGroup(CachedGroup role);
void invalidateCachedGroupById(String id);
void addGroup(CachedGroup role);
void invalidateGroupById(String id);
@ -76,10 +72,10 @@ public interface RealmCache {
void invalidateClientTemplate(CachedClientTemplate app);
void evictCachedClientTemplateById(String id);
void evictClientTemplateById(String id);
void addCachedClientTemplate(CachedClientTemplate app);
void addClientTemplate(CachedClientTemplate app);
void invalidateCachedClientTemplateById(String id);
void invalidateClientTemplateById(String id);
}

View file

@ -127,7 +127,7 @@ public class CachedClient implements Serializable {
protected void cacheRoles(RealmCache cache, RealmModel realm, ClientModel model) {
for (RoleModel role : model.getRoles()) {
roles.put(role.getName(), role.getId());
cache.addCachedRole(new CachedClientRole(id, role, realm));
cache.addRole(new CachedClientRole(id, role, realm));
}
}

View file

@ -39,6 +39,10 @@ import org.keycloak.models.cache.RealmCache;
import org.keycloak.common.util.MultivaluedHashMap;
import java.io.Serializable;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@ -89,8 +93,11 @@ public class CachedRealm implements Serializable {
protected PasswordPolicy passwordPolicy;
protected OTPPolicy otpPolicy;
protected transient PublicKey publicKey;
protected String publicKeyPem;
protected transient PrivateKey privateKey;
protected String privateKeyPem;
protected transient X509Certificate certificate;
protected String certificatePem;
protected String codeSecret;
@ -179,8 +186,11 @@ public class CachedRealm implements Serializable {
otpPolicy = model.getOTPPolicy();
publicKeyPem = model.getPublicKeyPem();
publicKey = model.getPublicKey();
privateKeyPem = model.getPrivateKeyPem();
privateKey = model.getPrivateKey();
certificatePem = model.getCertificatePem();
certificate = model.getCertificate();
codeSecret = model.getCodeSecret();
loginTheme = model.getLoginTheme();
@ -265,7 +275,7 @@ public class CachedRealm implements Serializable {
for (ClientTemplateModel template : model.getClientTemplates()) {
clientTemplates.add(template.getId());
CachedClientTemplate cachedClient = new CachedClientTemplate(cache, delegate, model, template);
cache.addCachedClientTemplate(cachedClient);
cache.addClientTemplate(cachedClient);
}
}
@ -273,7 +283,7 @@ public class CachedRealm implements Serializable {
for (ClientModel client : model.getClients()) {
clients.put(client.getClientId(), client.getId());
CachedClient cachedClient = new CachedClient(cache, delegate, model, client);
cache.addCachedClient(cachedClient);
cache.addClient(cachedClient);
}
}
@ -281,7 +291,7 @@ public class CachedRealm implements Serializable {
for (RoleModel role : model.getRoles()) {
realmRoles.put(role.getName(), role.getId());
CachedRole cachedRole = new CachedRealmRole(role, model);
cache.addCachedRole(cachedRole);
cache.addRole(cachedRole);
}
}
@ -584,4 +594,16 @@ public class CachedRealm implements Serializable {
public List<String> getClientTemplates() {
return clientTemplates;
}
public PublicKey getPublicKey() {
return publicKey;
}
public PrivateKey getPrivateKey() {
return privateKey;
}
public X509Certificate getCertificate() {
return certificate;
}
}

View file

@ -88,9 +88,9 @@ public class MaxRateExecutor {
StressTest stressTest = future.get();
if (i < jobs - threads - 5) completionService.submit(stressTest);
}
long end = System.currentTimeMillis() - start;
executor.shutdown();
executor.awaitTermination(10, TimeUnit.SECONDS);
long end = System.currentTimeMillis() - start;
RateResult rate = new RateResult(result, threads, end);
return rate;
}
@ -116,10 +116,10 @@ public class MaxRateExecutor {
public void printResult(RateResult result) {
System.out.println("Threads: " + result.getThreads());
System.out.println("Total Time: " + result.getTime());
System.out.println("Rate: " + ((double)result.getResult().getIterations()) / ((double)result.getTime()));
System.out.println("Successes: " + result.getResult().getSuccess());
System.out.println("Iterations: " + result.getResult().getIterations());
System.out.println("Average time: " + result.getResult().getAverageTime());
System.out.println("Rate: " + result.getResult().getRate());
System.out.println("Average time per iteration: " + result.getResult().getAverageTime());
}
@ -127,7 +127,7 @@ public class MaxRateExecutor {
for (RateResult result : allResults) {
System.out.println("*******************");
printSummary();
printSummary(result);
}
}
public void printSummary(RateResult result) {

View file

@ -88,8 +88,9 @@ Rate: 0.030480835174883793
}
};
MaxRateExecutor executor = new MaxRateExecutor();
executor.best(factory, 4);
executor.best(factory, 10);
executor.printResults();
executor.printSummary();
}
}