public void loadPersistentSessions() { if (isFinished()) { return; } while (!isFinished()) { if (!isCoordinator()) { try { latch.await(500, TimeUnit.MILLISECONDS); } catch (InterruptedException ie) { log.error("Interrupted", ie); } } else { startLoading(); } } }
private void saveStateToCache(final InitializerState state) { // 3 attempts to send the message (it may fail if some node fails in the meantime) retry(3, new Runnable() { @Override public void run() { // Save this synchronously to ensure all nodes read correct state InfinispanUserSessionInitializer.this.cache.getAdvancedCache(). withFlags(Flag.IGNORE_RETURN_VALUES, Flag.FORCE_SYNCHRONOUS) .put(stateKey, state); } }); }
@Override public void run(KeycloakSession session) { InfinispanConnectionProvider connections = session.getProvider(InfinispanConnectionProvider.class); Cache<String, SessionEntity> cache = connections.getCache(InfinispanConnectionProvider.OFFLINE_SESSION_CACHE_NAME); InfinispanUserSessionInitializer initializer = new InfinispanUserSessionInitializer(sessionFactory, cache, new OfflineUserSessionLoader(), maxErrors, sessionsPerSegment, "offlineUserSessions"); initializer.initCache(); initializer.loadPersistentSessions(); }
private void startLoading() { InitializerState state = getOrCreateInitializerState(); saveStateToCache(state);
private InitializerState getOrCreateInitializerState() { InitializerState state = (InitializerState) cache.get(stateKey); if (state == null) { final int[] count = new int[1]; // Rather use separate transactions for update and counting KeycloakModelUtils.runJobInTransaction(sessionFactory, new KeycloakSessionTask() { @Override public void run(KeycloakSession session) { sessionLoader.init(session); } }); KeycloakModelUtils.runJobInTransaction(sessionFactory, new KeycloakSessionTask() { @Override public void run(KeycloakSession session) { count[0] = sessionLoader.getSessionsCount(session); } }); state = new InitializerState(); state.init(count[0], sessionsPerSegment); saveStateToCache(state); } return state; }