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

公開メンバ関数

 OfflinePersistentUserSessionLoader (int sessionsPerSegment)
 
void init (KeycloakSession session)
 
OfflinePersistentUserSessionLoaderContext computeLoaderContext (KeycloakSession session)
 
boolean loadSessions (KeycloakSession session, OfflinePersistentUserSessionLoaderContext ctx, int segment)
 
boolean isFinished (BaseCacheInitializer initializer)
 
void afterAllSessionsLoaded (BaseCacheInitializer initializer)
 
String toString ()
 
boolean loadSessions (KeycloakSession session, LOADER_CONTEXT loaderContext, int segment)
 

静的公開変数類

static final String PERSISTENT_SESSIONS_LOADED = "PERSISTENT_SESSIONS_LOADED"
 
static final String PERSISTENT_SESSIONS_LOADED_IN_CURRENT_DC = "PERSISTENT_SESSIONS_LOADED_IN_CURRENT_DC"
 

非公開変数類

final int sessionsPerSegment
 

静的非公開変数類

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

詳解

著者
Marek Posolda

構築子と解体子

◆ OfflinePersistentUserSessionLoader()

org.keycloak.models.sessions.infinispan.initializer.OfflinePersistentUserSessionLoader.OfflinePersistentUserSessionLoader ( int  sessionsPerSegment)
inline
49  {
51  }
final int sessionsPerSegment
Definition: OfflinePersistentUserSessionLoader.java:47

関数詳解

◆ afterAllSessionsLoaded()

void org.keycloak.models.sessions.infinispan.initializer.OfflinePersistentUserSessionLoader.afterAllSessionsLoaded ( BaseCacheInitializer  initializer)
inline
115  {
116  Cache<String, Serializable> workCache = initializer.getWorkCache();
117 
118  // Will retry few times for the case when backup site not available in cross-dc environment.
119  // The site might be taken offline automatically if "take-offline" properly configured
120  Retry.executeWithBackoff((int iteration) -> {
121 
122  try {
123  // Cross-DC aware flag
124  workCache
125  .getAdvancedCache().withFlags(Flag.SKIP_REMOTE_LOOKUP)
126  .put(PERSISTENT_SESSIONS_LOADED, true);
127 
128  } catch (HotRodClientException re) {
129  log.warnf(re, "Failed to write flag PERSISTENT_SESSIONS_LOADED in iteration '%d' . Retrying", iteration);
130 
131  // Rethrow the exception. Retry will take care of handle the exception and eventually retry the operation.
132  throw re;
133  }
134 
135  }, 10, 10);
136 
137  // Just local-DC aware flag
138  workCache
139  .getAdvancedCache().withFlags(Flag.SKIP_REMOTE_LOOKUP, Flag.SKIP_CACHE_LOAD, Flag.SKIP_CACHE_STORE)
141 
142 
143  log.debugf("Persistent sessions loaded successfully!");
144  }
static final String PERSISTENT_SESSIONS_LOADED_IN_CURRENT_DC
Definition: OfflinePersistentUserSessionLoader.java:44
static final Logger log
Definition: OfflinePersistentUserSessionLoader.java:38
static final String PERSISTENT_SESSIONS_LOADED
Definition: OfflinePersistentUserSessionLoader.java:41

◆ computeLoaderContext()

OfflinePersistentUserSessionLoaderContext org.keycloak.models.sessions.infinispan.initializer.OfflinePersistentUserSessionLoader.computeLoaderContext ( KeycloakSession  session)
inline
69  {
70  UserSessionPersisterProvider persister = session.getProvider(UserSessionPersisterProvider.class);
71  int sessionsCount = persister.getUserSessionsCount(true);
72 
73  return new OfflinePersistentUserSessionLoaderContext(sessionsCount, sessionsPerSegment);
74  }
final int sessionsPerSegment
Definition: OfflinePersistentUserSessionLoader.java:47

◆ init()

void org.keycloak.models.sessions.infinispan.initializer.OfflinePersistentUserSessionLoader.init ( KeycloakSession  session)
inline
55  {
56  UserSessionPersisterProvider persister = session.getProvider(UserSessionPersisterProvider.class);
57 
58  // TODO: check if update of timestamps in persister can be skipped entirely
59  int clusterStartupTime = session.getProvider(ClusterProvider.class).getClusterStartupTime();
60 
61  log.debugf("Clearing detached sessions from persistent storage and updating timestamps to %d", clusterStartupTime);
62 
63  persister.clearDetachedUserSessions();
64  persister.updateAllTimestamps(clusterStartupTime);
65  }
static final Logger log
Definition: OfflinePersistentUserSessionLoader.java:38

◆ isFinished()

boolean org.keycloak.models.sessions.infinispan.initializer.OfflinePersistentUserSessionLoader.isFinished ( BaseCacheInitializer  initializer)
inline
100  {
101  Cache<String, Serializable> workCache = initializer.getWorkCache();
102  Boolean sessionsLoaded = (Boolean) workCache.get(PERSISTENT_SESSIONS_LOADED);
103 
104  if (sessionsLoaded != null && sessionsLoaded) {
105  log.debugf("Persistent sessions loaded already.");
106  return true;
107  } else {
108  log.debugf("Persistent sessions not yet loaded.");
109  return false;
110  }
111  }
static final Logger log
Definition: OfflinePersistentUserSessionLoader.java:38
static final String PERSISTENT_SESSIONS_LOADED
Definition: OfflinePersistentUserSessionLoader.java:41

◆ 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.initializer.OfflinePersistentUserSessionLoader.loadSessions ( KeycloakSession  session,
OfflinePersistentUserSessionLoaderContext  ctx,
int  segment 
)
inline
78  {
79  int first = ctx.getSessionsPerSegment() * segment;
80  int max = sessionsPerSegment;
81 
82  if (log.isTraceEnabled()) {
83  log.tracef("Loading sessions - first: %d, max: %d", first, max);
84  }
85 
86  UserSessionPersisterProvider persister = session.getProvider(UserSessionPersisterProvider.class);
87  List<UserSessionModel> sessions = persister.loadUserSessions(first, max, true);
88 
89  for (UserSessionModel persistentSession : sessions) {
90 
91  // Save to memory/infinispan
92  UserSessionModel offlineUserSession = session.sessions().importUserSession(persistentSession, true, true);
93  }
94 
95  return true;
96  }
static final Logger log
Definition: OfflinePersistentUserSessionLoader.java:38
final int sessionsPerSegment
Definition: OfflinePersistentUserSessionLoader.java:47

◆ toString()

String org.keycloak.models.sessions.infinispan.initializer.OfflinePersistentUserSessionLoader.toString ( )
inline
148  {
149  return new StringBuilder("OfflinePersistentUserSessionLoader [ ")
150  .append("sessionsPerSegment: ").append(sessionsPerSegment)
151  .append(" ]")
152  .toString();
153  }
final int sessionsPerSegment
Definition: OfflinePersistentUserSessionLoader.java:47

メンバ詳解

◆ log

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

◆ PERSISTENT_SESSIONS_LOADED

final String org.keycloak.models.sessions.infinispan.initializer.OfflinePersistentUserSessionLoader.PERSISTENT_SESSIONS_LOADED = "PERSISTENT_SESSIONS_LOADED"
static

◆ PERSISTENT_SESSIONS_LOADED_IN_CURRENT_DC

final String org.keycloak.models.sessions.infinispan.initializer.OfflinePersistentUserSessionLoader.PERSISTENT_SESSIONS_LOADED_IN_CURRENT_DC = "PERSISTENT_SESSIONS_LOADED_IN_CURRENT_DC"
static

◆ sessionsPerSegment

final int org.keycloak.models.sessions.infinispan.initializer.OfflinePersistentUserSessionLoader.sessionsPerSegment
private

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