Don't remove an element from the cache that was queued to be created during the current request
This avoids a remove Infinispan call in multi-node and cross-DC setups. Closes #20404
This commit is contained in:
parent
fc0e47caa4
commit
5cd0d51fa6
1 changed files with 30 additions and 2 deletions
|
@ -95,6 +95,11 @@ public class InfinispanKeycloakTransaction implements KeycloakTransaction {
|
|||
public String toString() {
|
||||
return String.format("CacheTaskWithValue: Operation 'put' for key %s", key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Operation getOperation() {
|
||||
return Operation.PUT;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -116,6 +121,11 @@ public class InfinispanKeycloakTransaction implements KeycloakTransaction {
|
|||
public String toString() {
|
||||
return String.format("CacheTaskWithValue: Operation 'put' for key %s, lifespan %d TimeUnit %s", key, lifespan, lifespanUnit);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Operation getOperation() {
|
||||
return Operation.PUT;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -140,6 +150,11 @@ public class InfinispanKeycloakTransaction implements KeycloakTransaction {
|
|||
public String toString() {
|
||||
return String.format("CacheTaskWithValue: Operation 'putIfAbsent' for key %s", key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Operation getOperation() {
|
||||
return Operation.PUT;
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -186,7 +201,14 @@ public class InfinispanKeycloakTransaction implements KeycloakTransaction {
|
|||
|
||||
Object taskKey = getTaskKey(cache, key);
|
||||
|
||||
// TODO:performance Eventual performance optimization could be to skip "cache.remove" if item was added in this transaction (EG. authenticationSession valid for single request due to automatic SSO login)
|
||||
CacheTask current = tasks.get(taskKey);
|
||||
if (current != null) {
|
||||
if (current instanceof CacheTaskWithValue && ((CacheTaskWithValue<?>) current).getOperation() == Operation.PUT) {
|
||||
tasks.remove(taskKey);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
tasks.put(taskKey, new CacheTask() {
|
||||
|
||||
@Override
|
||||
|
@ -230,7 +252,9 @@ public class InfinispanKeycloakTransaction implements KeycloakTransaction {
|
|||
void execute();
|
||||
}
|
||||
|
||||
public abstract class CacheTaskWithValue<V> implements CacheTask {
|
||||
public enum Operation { PUT, OTHER }
|
||||
|
||||
public static abstract class CacheTaskWithValue<V> implements CacheTask {
|
||||
protected V value;
|
||||
|
||||
public CacheTaskWithValue(V value) {
|
||||
|
@ -244,6 +268,10 @@ public class InfinispanKeycloakTransaction implements KeycloakTransaction {
|
|||
public void setValue(V value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public Operation getOperation() {
|
||||
return Operation.OTHER;
|
||||
}
|
||||
}
|
||||
|
||||
// Ignore return values. Should have better performance within cluster / cross-dc env
|
||||
|
|
Loading…
Reference in a new issue