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

公開メンバ関数

 RemoteCacheSessionsLoader (String cacheName, int sessionsPerSegment)
 
void init (KeycloakSession session)
 
RemoteCacheSessionsLoaderContext computeLoaderContext (KeycloakSession session)
 
boolean loadSessions (KeycloakSession session, RemoteCacheSessionsLoaderContext context, int segment)
 
boolean isFinished (BaseCacheInitializer initializer)
 
void afterAllSessionsLoaded (BaseCacheInitializer initializer)
 
String toString ()
 
boolean loadSessions (KeycloakSession session, LOADER_CONTEXT loaderContext, int segment)
 

限定公開メンバ関数

int getIspnSegmentsCount (RemoteCache remoteCache)
 
Set< Integer > getMyIspnSegments (int segment, RemoteCacheSessionsLoaderContext ctx)
 
Cache getCache (KeycloakSession session)
 
RemoteCache getRemoteCache (KeycloakSession session)
 

非公開変数類

final String cacheName
 
final int sessionsPerSegment
 

静的非公開変数類

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

詳解

著者
Marek Posolda

構築子と解体子

◆ RemoteCacheSessionsLoader()

org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.RemoteCacheSessionsLoader ( String  cacheName,
int  sessionsPerSegment 
)
inline
57  {
58  this.cacheName = cacheName;
60  }
final int sessionsPerSegment
Definition: RemoteCacheSessionsLoader.java:55
final String cacheName
Definition: RemoteCacheSessionsLoader.java:54

関数詳解

◆ afterAllSessionsLoaded()

void org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.afterAllSessionsLoaded ( BaseCacheInitializer  initializer)
inline

◆ computeLoaderContext()

RemoteCacheSessionsLoaderContext org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.computeLoaderContext ( KeycloakSession  session)
inline

org.keycloak.models.sessions.infinispan.initializer.SessionLoader< LOADER_CONTEXT extends SessionLoader.LoaderContext >を実装しています。

69  {
70  RemoteCache remoteCache = getRemoteCache(session);
71  int sessionsTotal = remoteCache.size();
72  int ispnSegments = getIspnSegmentsCount(remoteCache);
73 
74  return new RemoteCacheSessionsLoaderContext(ispnSegments, sessionsPerSegment, sessionsTotal);
75 
76  }
RemoteCache getRemoteCache(KeycloakSession session)
Definition: RemoteCacheSessionsLoader.java:189
final int sessionsPerSegment
Definition: RemoteCacheSessionsLoader.java:55
int getIspnSegmentsCount(RemoteCache remoteCache)
Definition: RemoteCacheSessionsLoader.java:79

◆ getCache()

Cache org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.getCache ( KeycloakSession  session)
inlineprotected
182  {
183  InfinispanConnectionProvider ispn = session.getProvider(InfinispanConnectionProvider.class);
184  return ispn.getCache(cacheName);
185  }
final String cacheName
Definition: RemoteCacheSessionsLoader.java:54

◆ getIspnSegmentsCount()

int org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.getIspnSegmentsCount ( RemoteCache  remoteCache)
inlineprotected
79  {
80  OperationsFactory operationsFactory = ((RemoteCacheImpl) remoteCache).getOperationsFactory();
81 
82  // Same like RemoteCloseableIterator.startInternal
83  IterationStartOperation iterationStartOperation = operationsFactory.newIterationStartOperation(null, null, null, sessionsPerSegment, false);
84  IterationStartResponse startResponse = await(iterationStartOperation.execute());
85 
86  try {
87  // Could happen for non-clustered caches
88  if (startResponse.getSegmentConsistentHash() == null) {
89  return -1;
90  } else {
91  return startResponse.getSegmentConsistentHash().getNumSegments();
92  }
93  } finally {
94  startResponse.getChannel().close();
95  }
96  }
final int sessionsPerSegment
Definition: RemoteCacheSessionsLoader.java:55

◆ getMyIspnSegments()

Set<Integer> org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.getMyIspnSegments ( int  segment,
RemoteCacheSessionsLoaderContext  ctx 
)
inlineprotected
134  {
135  // Remote cache is non-clustered
136  if (ctx.getIspnSegmentsCount() < 0) {
137  return null;
138  }
139 
140  if (ctx.getIspnSegmentsCount() % ctx.getSegmentsCount() > 0) {
141  throw new IllegalStateException("Illegal state. IspnSegmentsCount: " + ctx.getIspnSegmentsCount() + ", segmentsCount: " + ctx.getSegmentsCount());
142  }
143 
144  int countPerSegment = ctx.getIspnSegmentsCount() / ctx.getSegmentsCount();
145  int first = segment * countPerSegment;
146  int last = first + countPerSegment - 1;
147 
148  Set<Integer> myIspnSegments = new HashSet<>();
149  for (int i=first ; i<=last ; i++) {
150  myIspnSegments.add(i);
151  }
152  return myIspnSegments;
153 
154  }

◆ getRemoteCache()

RemoteCache org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.getRemoteCache ( KeycloakSession  session)
inlineprotected
189  {
190  InfinispanConnectionProvider ispn = session.getProvider(InfinispanConnectionProvider.class);
191  return ispn.getRemoteCache(cacheName);
192  }
final String cacheName
Definition: RemoteCacheSessionsLoader.java:54

◆ init()

void org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.init ( KeycloakSession  session)
inline

◆ isFinished()

boolean org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.isFinished ( BaseCacheInitializer  initializer)
inline

org.keycloak.models.sessions.infinispan.initializer.SessionLoader< LOADER_CONTEXT extends SessionLoader.LoaderContext >を実装しています。

158  {
159  Cache<String, Serializable> workCache = initializer.getWorkCache();
160 
161  // Check if persistent sessions were already loaded in this DC. This is possible just for offline sessions ATM
162  Boolean sessionsLoaded = (Boolean) workCache
163  .getAdvancedCache().withFlags(Flag.SKIP_CACHE_LOAD, Flag.SKIP_CACHE_STORE)
164  .get(OfflinePersistentUserSessionLoader.PERSISTENT_SESSIONS_LOADED_IN_CURRENT_DC);
165 
166  if ((cacheName.equals(InfinispanConnectionProvider.OFFLINE_USER_SESSION_CACHE_NAME) || (cacheName.equals(InfinispanConnectionProvider.OFFLINE_CLIENT_SESSION_CACHE_NAME)))
167  && sessionsLoaded != null && sessionsLoaded) {
168  log.debugf("Sessions already loaded in current DC. Skip sessions loading from remote cache '%s'", cacheName);
169  return true;
170  } else {
171  log.debugf("Sessions maybe not yet loaded in current DC. Will load them from remote cache '%s'", cacheName);
172  return false;
173  }
174  }
static final Logger log
Definition: RemoteCacheSessionsLoader.java:52
final String cacheName
Definition: RemoteCacheSessionsLoader.java:54

◆ loadSessions() [1/2]

boolean org.keycloak.models.sessions.infinispan.initializer.SessionLoader< LOADER_CONTEXT extends SessionLoader.LoaderContext >.loadSessions ( KeycloakSession  session,
LOADER_CONTEXT  loaderContext,
int  segment 
)
inherited

Will be called on all cluster nodes to load the specified page.

引数
session
loaderContextloaderContext object, which was already computed before
segmentto be computed
戻り値

◆ loadSessions() [2/2]

boolean org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.loadSessions ( KeycloakSession  session,
RemoteCacheSessionsLoaderContext  context,
int  segment 
)
inline
100  {
101  Cache cache = getCache(session);
102  Cache decoratedCache = cache.getAdvancedCache().withFlags(Flag.SKIP_CACHE_LOAD, Flag.SKIP_CACHE_STORE, Flag.IGNORE_RETURN_VALUES);
103  RemoteCache remoteCache = getRemoteCache(session);
104 
105  Set<Integer> myIspnSegments = getMyIspnSegments(segment, context);
106 
107  log.debugf("Will do bulk load of sessions from remote cache '%s' . Segment: %d", cache.getName(), segment);
108 
109  CloseableIterator<Map.Entry> iterator = null;
110  int countLoaded = 0;
111  try {
112  iterator = remoteCache.retrieveEntries(null, myIspnSegments, context.getSessionsPerSegment());
113  while (iterator.hasNext()) {
114  countLoaded++;
115  Map.Entry entry = iterator.next();
116  decoratedCache.putAsync(entry.getKey(), entry.getValue());
117  }
118  } catch (RuntimeException e) {
119  log.warnf(e, "Error loading sessions from remote cache '%s' for segment '%d'", remoteCache.getName(), segment);
120  throw e;
121  } finally {
122  if (iterator != null) {
123  iterator.close();
124  }
125  }
126 
127  log.debugf("Successfully finished loading sessions from cache '%s' . Segment: %d, Count of sessions loaded: %d", cache.getName(), segment, countLoaded);
128 
129  return true;
130  }
RemoteCache getRemoteCache(KeycloakSession session)
Definition: RemoteCacheSessionsLoader.java:189
static final Logger log
Definition: RemoteCacheSessionsLoader.java:52
Set< Integer > getMyIspnSegments(int segment, RemoteCacheSessionsLoaderContext ctx)
Definition: RemoteCacheSessionsLoader.java:134
Cache getCache(KeycloakSession session)
Definition: RemoteCacheSessionsLoader.java:182

◆ toString()

String org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.toString ( )
inline
196  {
197  return new StringBuilder("RemoteCacheSessionsLoader [ ")
198  .append("cacheName: ").append(cacheName)
199  .append(", sessionsPerSegment: ").append(sessionsPerSegment)
200  .append(" ]")
201  .toString();
202  }
final int sessionsPerSegment
Definition: RemoteCacheSessionsLoader.java:55
final String cacheName
Definition: RemoteCacheSessionsLoader.java:54

メンバ詳解

◆ cacheName

final String org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.cacheName
private

◆ log

final Logger org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.log = Logger.getLogger(RemoteCacheSessionsLoader.class)
staticprivate

◆ sessionsPerSegment

final int org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheSessionsLoader.sessionsPerSegment
private

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