keycloak
クラス | 公開メンバ関数 | 静的公開変数類 | 関数 | 非公開メンバ関数 | 非公開変数類 | 全メンバ一覧
org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheInvoker クラス
org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheInvoker 連携図
Collaboration graph

クラス

interface  MaxIdleTimeLoader
 
class  RemoteCacheContext
 

公開メンバ関数

void addRemoteCache (String cacheName, RemoteCache remoteCache, MaxIdleTimeLoader maxIdleLoader)
 
Set< String > getRemoteCacheNames ()
 

静的公開変数類

static final Logger logger = Logger.getLogger(RemoteCacheInvoker.class)
 

関数

public< K, V extends SessionEntity > void runTask (KeycloakSession kcSession, RealmModel realm, String cacheName, K key, SessionUpdateTask< V > task, SessionEntityWrapper< V > sessionWrapper)
 
private< K, V extends SessionEntity > void runOnRemoteCache (TopologyInfo topology, RemoteCache< K, SessionEntityWrapper< V >> remoteCache, long maxIdleMs, K key, SessionUpdateTask< V > task, SessionEntityWrapper< V > sessionWrapper)
 
private< K, V extends SessionEntity > void replace (TopologyInfo topology, RemoteCache< K, SessionEntityWrapper< V >> remoteCache, long lifespanMs, long maxIdleMs, K key, SessionUpdateTask< V > task)
 

非公開メンバ関数

String logTopologyData (TopologyInfo topology, int iteration)
 

非公開変数類

final Map< String, RemoteCacheContextremoteCaches = new HashMap<>()
 

詳解

著者
Marek Posolda

関数詳解

◆ addRemoteCache()

void org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheInvoker.addRemoteCache ( String  cacheName,
RemoteCache  remoteCache,
MaxIdleTimeLoader  maxIdleLoader 
)
inline
50  {
51  RemoteCacheContext ctx = new RemoteCacheContext(remoteCache, maxIdleLoader);
52  remoteCaches.put(cacheName, ctx);
53  }
final Map< String, RemoteCacheContext > remoteCaches
Definition: RemoteCacheInvoker.java:47

◆ getRemoteCacheNames()

Set<String> org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheInvoker.getRemoteCacheNames ( )
inline
55  {
56  return Collections.unmodifiableSet(remoteCaches.keySet());
57  }
final Map< String, RemoteCacheContext > remoteCaches
Definition: RemoteCacheInvoker.java:47

◆ logTopologyData()

String org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheInvoker.logTopologyData ( TopologyInfo  topology,
int  iteration 
)
inlineprivate
177  {
178  return topology.toString() + ", replaceIteration: " + iteration;
179  }

◆ replace()

private<K, V extends SessionEntity> void org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheInvoker.replace ( TopologyInfo  topology,
RemoteCache< K, SessionEntityWrapper< V >>  remoteCache,
long  lifespanMs,
long  maxIdleMs,
key,
SessionUpdateTask< V >  task 
)
inlinepackage
137  {
138  boolean replaced = false;
139  int replaceIteration = 0;
140  while (!replaced && replaceIteration < InfinispanUtil.MAXIMUM_REPLACE_RETRIES) {
141  replaceIteration++;
142 
143  VersionedValue<SessionEntityWrapper<V>> versioned = remoteCache.getWithMetadata(key);
144  if (versioned == null) {
145  logger.warnf("Not found entity to replace for key '%s'", key);
146  return;
147  }
148 
149  SessionEntityWrapper<V> sessionWrapper = versioned.getValue();
150  final V session = sessionWrapper.getEntity();
151 
152  // Run task on the remote session
153  task.runUpdate(session);
154 
155  if (logger.isTraceEnabled()) {
156  logger.tracef("%s: Before replaceWithVersion. Entity to write version %d: %s", logTopologyData(topology, replaceIteration),
157  versioned.getVersion(), session);
158  }
159 
160  replaced = remoteCache.replaceWithVersion(key, SessionEntityWrapper.forTransport(session), versioned.getVersion(), lifespanMs, TimeUnit.MILLISECONDS, maxIdleMs, TimeUnit.MILLISECONDS);
161 
162  if (!replaced) {
163  logger.debugf("%s: Failed to replace entity '%s' version %d. Will retry again", logTopologyData(topology, replaceIteration), key, versioned.getVersion());
164  } else {
165  if (logger.isTraceEnabled()) {
166  logger.tracef("%s: Replaced entity version %d in remote cache: %s", logTopologyData(topology, replaceIteration), versioned.getVersion(), session);
167  }
168  }
169  }
170 
171  if (!replaced) {
172  logger.warnf("Failed to replace entity '%s' in remote cache '%s'", key, remoteCache.getName());
173  }
174  }
static final Logger logger
Definition: RemoteCacheInvoker.java:45
String logTopologyData(TopologyInfo topology, int iteration)
Definition: RemoteCacheInvoker.java:177

◆ runOnRemoteCache()

private<K, V extends SessionEntity> void org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheInvoker.runOnRemoteCache ( TopologyInfo  topology,
RemoteCache< K, SessionEntityWrapper< V >>  remoteCache,
long  maxIdleMs,
key,
SessionUpdateTask< V >  task,
SessionEntityWrapper< V >  sessionWrapper 
)
inlinepackage
107  {
108  final V session = sessionWrapper.getEntity();
109  SessionUpdateTask.CacheOperation operation = task.getOperation(session);
110 
111  switch (operation) {
112  case REMOVE:
113  remoteCache.remove(key);
114  break;
115  case ADD:
116  remoteCache.put(key, sessionWrapper.forTransport(), task.getLifespanMs(), TimeUnit.MILLISECONDS, maxIdleMs, TimeUnit.MILLISECONDS);
117  break;
118  case ADD_IF_ABSENT:
119  SessionEntityWrapper<V> existing = remoteCache
120  .withFlags(Flag.FORCE_RETURN_VALUE)
121  .putIfAbsent(key, sessionWrapper.forTransport(), -1, TimeUnit.MILLISECONDS, maxIdleMs, TimeUnit.MILLISECONDS);
122  if (existing != null) {
123  logger.debugf("Existing entity in remote cache for key: %s . Will update it", key);
124 
125  replace(topology, remoteCache, task.getLifespanMs(), maxIdleMs, key, task);
126  }
127  break;
128  case REPLACE:
129  replace(topology, remoteCache, task.getLifespanMs(), maxIdleMs, key, task);
130  break;
131  default:
132  throw new IllegalStateException("Unsupported state " + operation);
133  }
134  }
static final Logger logger
Definition: RemoteCacheInvoker.java:45
private< K, V extends SessionEntity > void replace(TopologyInfo topology, RemoteCache< K, SessionEntityWrapper< V >> remoteCache, long lifespanMs, long maxIdleMs, K key, SessionUpdateTask< V > task)
Definition: RemoteCacheInvoker.java:137

◆ runTask()

public<K, V extends SessionEntity> void org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheInvoker.runTask ( KeycloakSession  kcSession,
RealmModel  realm,
String  cacheName,
key,
SessionUpdateTask< V >  task,
SessionEntityWrapper< V >  sessionWrapper 
)
inlinepackage
60  {
61  RemoteCacheContext context = remoteCaches.get(cacheName);
62  if (context == null) {
63  return;
64  }
65 
66  V session = sessionWrapper.getEntity();
67 
68  SessionUpdateTask.CacheOperation operation = task.getOperation(session);
69  SessionUpdateTask.CrossDCMessageStatus status = task.getCrossDCMessageStatus(sessionWrapper);
70 
71  if (status == SessionUpdateTask.CrossDCMessageStatus.NOT_NEEDED) {
72  if (logger.isTraceEnabled()) {
73  logger.tracef("Skip writing to remoteCache for entity '%s' of cache '%s' and operation '%s'", key, cacheName, operation);
74  }
75  return;
76  }
77 
78  long loadedMaxIdleTimeMs = context.maxIdleTimeLoader.getMaxIdleTimeMs(realm);
79 
80  // Increase the timeout to ensure that entry won't expire on remoteCache in case that write of some entities to remoteCache is postponed (eg. userSession.lastSessionRefresh)
81  final long maxIdleTimeMs = loadedMaxIdleTimeMs + 1800000;
82 
83  if (logger.isTraceEnabled()) {
84  logger.tracef("Running task '%s' on remote cache '%s' . Key is '%s'", operation, cacheName, key);
85  }
86 
87  TopologyInfo topology = InfinispanUtil.getTopologyInfo(kcSession);
88 
89  Retry.executeWithBackoff((int iteration) -> {
90 
91  try {
92  runOnRemoteCache(topology, context.remoteCache, maxIdleTimeMs, key, task, sessionWrapper);
93  } catch (HotRodClientException re) {
94  if (logger.isDebugEnabled()) {
95  logger.debugf(re, "Failed running task '%s' on remote cache '%s' . Key: '%s', iteration '%s'. Will try to retry the task",
96  operation, cacheName, key, iteration);
97  }
98 
99  // Rethrow the exception. Retry will take care of handle the exception and eventually retry the operation.
100  throw re;
101  }
102 
103  }, 10, 10);
104  }
static final Logger logger
Definition: RemoteCacheInvoker.java:45
private< K, V extends SessionEntity > void runOnRemoteCache(TopologyInfo topology, RemoteCache< K, SessionEntityWrapper< V >> remoteCache, long maxIdleMs, K key, SessionUpdateTask< V > task, SessionEntityWrapper< V > sessionWrapper)
Definition: RemoteCacheInvoker.java:107
final Map< String, RemoteCacheContext > remoteCaches
Definition: RemoteCacheInvoker.java:47

メンバ詳解

◆ logger

final Logger org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheInvoker.logger = Logger.getLogger(RemoteCacheInvoker.class)
static

◆ remoteCaches

final Map<String, RemoteCacheContext> org.keycloak.models.sessions.infinispan.remotestore.RemoteCacheInvoker.remoteCaches = new HashMap<>()
private

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