keycloak
クラス | 公開メンバ関数 | 限定公開メンバ関数 | 限定公開変数類 | 非公開変数類 | 静的非公開変数類 | 全メンバ一覧
org.keycloak.models.sessions.infinispan.initializer.InfinispanCacheInitializer クラス
org.keycloak.models.sessions.infinispan.initializer.InfinispanCacheInitializer の継承関係図
Inheritance graph
org.keycloak.models.sessions.infinispan.initializer.InfinispanCacheInitializer 連携図
Collaboration graph

クラス

class  WorkerResult
 

公開メンバ関数

 InfinispanCacheInitializer (KeycloakSessionFactory sessionFactory, Cache< String, Serializable > workCache, SessionLoader sessionLoader, String stateKeySuffix, int sessionsPerSegment, int maxErrors)
 
void initCache ()
 
Cache< String, Serializable > getWorkCache ()
 
void loadSessions ()
 

限定公開メンバ関数

void startLoading ()
 
void startLoadingImpl (InitializerState state, SessionLoader.LoaderContext ctx)
 
boolean isFinished ()
 
boolean isCoordinator ()
 
InitializerState getStateFromCache ()
 
void saveStateToCache (final InitializerState state)
 

限定公開変数類

final KeycloakSessionFactory sessionFactory
 
final Cache< String, Serializable > workCache
 
final SessionLoader sessionLoader
 
final int sessionsPerSegment
 
final String stateKey
 

非公開変数類

final int maxErrors
 

静的非公開変数類

static final Logger log = Logger.getLogger(InfinispanCacheInitializer.class)
 

詳解

Startup initialization for reading persistent userSessions to be filled into infinispan/memory . In cluster, the initialization is distributed among all cluster nodes, so the startup time is even faster

Implementation is pretty generic and doesn't contain any "userSession" specific stuff. All logic related to how are sessions loaded is in the SessionLoader implementation

著者
Marek Posolda

構築子と解体子

◆ InfinispanCacheInitializer()

org.keycloak.models.sessions.infinispan.initializer.InfinispanCacheInitializer.InfinispanCacheInitializer ( KeycloakSessionFactory  sessionFactory,
Cache< String, Serializable >  workCache,
SessionLoader  sessionLoader,
String  stateKeySuffix,
int  sessionsPerSegment,
int  maxErrors 
)
inline
52  {
53  super(sessionFactory, workCache, sessionLoader, stateKeySuffix, sessionsPerSegment);
54  this.maxErrors = maxErrors;
55  }
final int maxErrors
Definition: InfinispanCacheInitializer.java:49
final KeycloakSessionFactory sessionFactory
Definition: BaseCacheInitializer.java:41
final Cache< String, Serializable > workCache
Definition: BaseCacheInitializer.java:42
final int sessionsPerSegment
Definition: BaseCacheInitializer.java:44
final SessionLoader sessionLoader
Definition: BaseCacheInitializer.java:43

関数詳解

◆ getStateFromCache()

InitializerState org.keycloak.models.sessions.infinispan.initializer.BaseCacheInitializer.getStateFromCache ( )
inlineprotectedinherited
76  {
77  // We ignore cacheStore for now, so that in Cross-DC scenario (with RemoteStore enabled) is the remoteStore ignored.
78  return (InitializerState) workCache.getAdvancedCache()
79  .withFlags(Flag.SKIP_CACHE_STORE, Flag.SKIP_CACHE_LOAD)
80  .get(stateKey);
81  }
final String stateKey
Definition: BaseCacheInitializer.java:45
final Cache< String, Serializable > workCache
Definition: BaseCacheInitializer.java:42

◆ getWorkCache()

Cache<String, Serializable> org.keycloak.models.sessions.infinispan.initializer.BaseCacheInitializer.getWorkCache ( )
inlineinherited
124  {
125  return workCache;
126  }
final Cache< String, Serializable > workCache
Definition: BaseCacheInitializer.java:42

◆ initCache()

void org.keycloak.models.sessions.infinispan.initializer.InfinispanCacheInitializer.initCache ( )
inline
58  {
59  this.workCache.getAdvancedCache().getComponentRegistry().registerComponent(sessionFactory, KeycloakSessionFactory.class);
60  }
final KeycloakSessionFactory sessionFactory
Definition: BaseCacheInitializer.java:41
final Cache< String, Serializable > workCache
Definition: BaseCacheInitializer.java:42

◆ isCoordinator()

boolean org.keycloak.models.sessions.infinispan.initializer.BaseCacheInitializer.isCoordinator ( )
inlineprotectedinherited
70  {
71  Transport transport = workCache.getCacheManager().getTransport();
72  return transport == null || transport.isCoordinator();
73  }
final Cache< String, Serializable > workCache
Definition: BaseCacheInitializer.java:42

◆ isFinished()

boolean org.keycloak.models.sessions.infinispan.initializer.BaseCacheInitializer.isFinished ( )
inlineprotectedinherited
57  {
58  // Check if we should skipLoadingSessions. This can happen if someone else already did the task (For example in cross-dc environment, it was done by different DC)
59  boolean isFinishedAlready = this.sessionLoader.isFinished(this);
60  if (isFinishedAlready) {
61  return true;
62  }
63 
64  InitializerState state = getStateFromCache();
65  return state != null && state.isFinished();
66  }
InitializerState getStateFromCache()
Definition: BaseCacheInitializer.java:76
final SessionLoader sessionLoader
Definition: BaseCacheInitializer.java:43
boolean isFinished(BaseCacheInitializer initializer)

◆ loadSessions()

void org.keycloak.models.sessions.infinispan.initializer.CacheInitializer.loadSessions ( )
inlineinherited
32  {
33  while (!isFinished()) {
34  if (!isCoordinator()) {
35  try {
36  Thread.sleep(1000);
37  } catch (InterruptedException ie) {
38  log.error("Interrupted", ie);
39  }
40  } else {
41  startLoading();
42  }
43  }
44  }
static final Logger log
Definition: CacheInitializer.java:27

◆ saveStateToCache()

void org.keycloak.models.sessions.infinispan.initializer.BaseCacheInitializer.saveStateToCache ( final InitializerState  state)
inlineprotectedinherited
84  {
85 
86  // 3 attempts to send the message (it may fail if some node fails in the meantime)
87  retry(3, new Runnable() {
88 
89  @Override
90  public void run() {
91 
92  // Save this synchronously to ensure all nodes read correct state
93  // We ignore cacheStore for now, so that in Cross-DC scenario (with RemoteStore enabled) is the remoteStore ignored.
94  BaseCacheInitializer.this.workCache.getAdvancedCache().
95  withFlags(Flag.IGNORE_RETURN_VALUES, Flag.FORCE_SYNCHRONOUS, Flag.SKIP_CACHE_STORE, Flag.SKIP_CACHE_LOAD)
96  .put(stateKey, state);
97  }
98 
99  });
100  }
BaseCacheInitializer(KeycloakSessionFactory sessionFactory, Cache< String, Serializable > workCache, SessionLoader sessionLoader, String stateKeySuffix, int sessionsPerSegment)
Definition: BaseCacheInitializer.java:47
void retry(int retry, Runnable runnable)
Definition: BaseCacheInitializer.java:103
final String stateKey
Definition: BaseCacheInitializer.java:45

◆ startLoading()

void org.keycloak.models.sessions.infinispan.initializer.InfinispanCacheInitializer.startLoading ( )
inlineprotected
65  {
66  InitializerState state = getStateFromCache();
67  SessionLoader.LoaderContext[] ctx = new SessionLoader.LoaderContext[1];
68  if (state == null) {
69  // Rather use separate transactions for update and counting
70  KeycloakModelUtils.runJobInTransaction(sessionFactory, new KeycloakSessionTask() {
71  @Override
72  public void run(KeycloakSession session) {
73  sessionLoader.init(session);
74  }
75 
76  });
77 
78  KeycloakModelUtils.runJobInTransaction(sessionFactory, new KeycloakSessionTask() {
79  @Override
80  public void run(KeycloakSession session) {
81  ctx[0] = sessionLoader.computeLoaderContext(session);
82  }
83 
84  });
85 
86  state = new InitializerState(ctx[0].getSegmentsCount());
87  saveStateToCache(state);
88  } else {
89  KeycloakModelUtils.runJobInTransaction(sessionFactory, new KeycloakSessionTask() {
90  @Override
91  public void run(KeycloakSession session) {
92  ctx[0] = sessionLoader.computeLoaderContext(session);
93  }
94 
95  });
96  }
97 
98  log.debugf("Start loading with loader: '%s', ctx: '%s' , state: %s",
99  sessionLoader.toString(), ctx[0].toString(), state.toString());
100 
101  startLoadingImpl(state, ctx[0]);
102  }
void startLoadingImpl(InitializerState state, SessionLoader.LoaderContext ctx)
Definition: InfinispanCacheInitializer.java:105
void saveStateToCache(final InitializerState state)
Definition: BaseCacheInitializer.java:84
static final Logger log
Definition: InfinispanCacheInitializer.java:47
LOADER_CONTEXT computeLoaderContext(KeycloakSession session)
final KeycloakSessionFactory sessionFactory
Definition: BaseCacheInitializer.java:41
InitializerState getStateFromCache()
Definition: BaseCacheInitializer.java:76
final SessionLoader sessionLoader
Definition: BaseCacheInitializer.java:43

◆ startLoadingImpl()

void org.keycloak.models.sessions.infinispan.initializer.InfinispanCacheInitializer.startLoadingImpl ( InitializerState  state,
SessionLoader.LoaderContext  ctx 
)
inlineprotected
105  {
106  // Assume each worker has same processor's count
107  int processors = Runtime.getRuntime().availableProcessors();
108 
109  ExecutorService localExecutor = Executors.newCachedThreadPool();
110  Transport transport = workCache.getCacheManager().getTransport();
111  boolean distributed = transport != null;
112  ExecutorService executorService = distributed ? new DefaultExecutorService(workCache, localExecutor) : localExecutor;
113 
114  int errors = 0;
115 
116  try {
117  while (!state.isFinished()) {
118  int nodesCount = transport==null ? 1 : transport.getMembers().size();
119  int distributedWorkersCount = processors * nodesCount;
120 
121  log.debugf("Starting next iteration with %d workers", distributedWorkersCount);
122 
123  List<Integer> segments = state.getUnfinishedSegments(distributedWorkersCount);
124 
125  if (log.isTraceEnabled()) {
126  log.trace("unfinished segments for this iteration: " + segments);
127  }
128 
129  List<Future<WorkerResult>> futures = new LinkedList<>();
130  for (Integer segment : segments) {
131  SessionInitializerWorker worker = new SessionInitializerWorker();
132  worker.setWorkerEnvironment(segment, ctx, sessionLoader);
133  if (!distributed) {
134  worker.setEnvironment(workCache, null);
135  }
136 
137  Future<WorkerResult> future = executorService.submit(worker);
138  futures.add(future);
139  }
140 
141  for (Future<WorkerResult> future : futures) {
142  try {
143  WorkerResult result = future.get();
144 
145  if (result.getSuccess()) {
146  int computedSegment = result.getSegment();
147  state.markSegmentFinished(computedSegment);
148  } else {
149  if (log.isTraceEnabled()) {
150  log.tracef("Segment %d failed to compute", result.getSegment());
151  }
152  }
153  } catch (InterruptedException ie) {
154  errors++;
155  log.error("Interruped exception when computed future. Errors: " + errors, ie);
156  } catch (ExecutionException ee) {
157  errors++;
158  log.error("ExecutionException when computed future. Errors: " + errors, ee);
159  }
160  }
161 
162  if (errors >= maxErrors) {
163  throw new RuntimeException("Maximum count of worker errors occured. Limit was " + maxErrors + ". See server.log for details");
164  }
165 
166  saveStateToCache(state);
167 
168  log.debugf("New initializer state pushed. The state is: %s", state);
169  }
170 
171  // Loader callback after the task is finished
173 
174  } finally {
175  if (distributed) {
176  executorService.shutdown();
177  }
178  localExecutor.shutdown();
179  }
180  }
void saveStateToCache(final InitializerState state)
Definition: BaseCacheInitializer.java:84
static final Logger log
Definition: InfinispanCacheInitializer.java:47
final int maxErrors
Definition: InfinispanCacheInitializer.java:49
final Cache< String, Serializable > workCache
Definition: BaseCacheInitializer.java:42
void afterAllSessionsLoaded(BaseCacheInitializer initializer)
final SessionLoader sessionLoader
Definition: BaseCacheInitializer.java:43

メンバ詳解

◆ log

final Logger org.keycloak.models.sessions.infinispan.initializer.InfinispanCacheInitializer.log = Logger.getLogger(InfinispanCacheInitializer.class)
staticprivate

◆ maxErrors

final int org.keycloak.models.sessions.infinispan.initializer.InfinispanCacheInitializer.maxErrors
private

◆ sessionFactory

final KeycloakSessionFactory org.keycloak.models.sessions.infinispan.initializer.BaseCacheInitializer.sessionFactory
protectedinherited

◆ sessionLoader

final SessionLoader org.keycloak.models.sessions.infinispan.initializer.BaseCacheInitializer.sessionLoader
protectedinherited

◆ sessionsPerSegment

final int org.keycloak.models.sessions.infinispan.initializer.BaseCacheInitializer.sessionsPerSegment
protectedinherited

◆ stateKey

final String org.keycloak.models.sessions.infinispan.initializer.BaseCacheInitializer.stateKey
protectedinherited

◆ workCache

final Cache<String, Serializable> org.keycloak.models.sessions.infinispan.initializer.BaseCacheInitializer.workCache
protectedinherited

このクラス詳解は次のファイルから抽出されました: