Add Infinispan numOwners SPI option to compatibility metadata

Closes #47366

Signed-off-by: Pedro Ruivo <1492066+pruivo@users.noreply.github.com>
Co-authored-by: Pedro Ruivo <1492066+pruivo@users.noreply.github.com>
This commit is contained in:
Pedro Ruivo 2026-03-23 22:12:16 +00:00 committed by GitHub
parent ed66ac6b0c
commit ba7f7cee24
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 33 additions and 5 deletions

View file

@ -4,20 +4,28 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import org.keycloak.Config;
import org.keycloak.common.Profile;
import org.keycloak.compatibility.AbstractCompatibilityMetadataProvider;
import org.keycloak.crypto.JavaAlgorithm;
import org.keycloak.infinispan.util.InfinispanUtils;
import org.keycloak.jose.jws.crypto.HashUtils;
import org.keycloak.spi.infinispan.impl.embedded.CacheConfigurator;
import org.infinispan.commons.util.Version;
import org.infinispan.configuration.cache.HashConfiguration;
import static org.keycloak.connections.infinispan.InfinispanConnectionProvider.CLUSTERED_CACHE_NUM_OWNERS;
import static org.keycloak.connections.infinispan.InfinispanConnectionProvider.USER_AND_CLIENT_SESSION_CACHES;
import static org.keycloak.spi.infinispan.CacheEmbeddedConfigProviderSpi.SPI_NAME;
import static org.keycloak.spi.infinispan.impl.embedded.DefaultCacheEmbeddedConfigProviderFactory.CONFIG;
import static org.keycloak.spi.infinispan.impl.embedded.DefaultCacheEmbeddedConfigProviderFactory.PROVIDER_ID;
@ -38,17 +46,34 @@ public class CachingEmbeddedMetadataProvider extends AbstractCompatibilityMetada
@Override
public Map<String, String> customMeta() {
return Map.of(
"version", majorMinorOf(Version.getVersion()),
"jgroupsVersion", majorMinorOf(org.jgroups.Version.printVersion()),
CONFIG, sha256Of(Paths.get(config.get(CONFIG)))
);
var meta = new HashMap<String, String>(8);
var defaultNumOwners = HashConfiguration.NUM_OWNERS.getDefaultValue();
Arrays.stream(CLUSTERED_CACHE_NUM_OWNERS)
.map(CacheConfigurator::numOwnerConfigKey)
.forEach(configKey -> addInt(meta, configKey, defaultNumOwners));
if (Profile.isFeatureEnabled(Profile.Feature.PERSISTENT_USER_SESSIONS)) {
// persistent user sessions always force num_owners=1.
// the spi option is ignored
Arrays.stream(USER_AND_CLIENT_SESSION_CACHES)
.map(CacheConfigurator::numOwnerConfigKey)
.forEach(meta::remove);
}
meta.put("version", majorMinorOf(Version.getVersion()));
meta.put("jgroupsVersion", majorMinorOf(org.jgroups.Version.printVersion()));
meta.put(CONFIG, sha256Of(Paths.get(config.get(CONFIG))));
return meta;
}
@Override
public Stream<String> configKeys() {
return Stream.of(STACK);
}
private void addInt(Map<String, String> meta, String configKey, int defaultValue) {
Optional.ofNullable(config.getInt(configKey, defaultValue))
.map(String::valueOf)
.ifPresent(value -> meta.put(configKey, value));
}
public static String sha256Of(Path filePath) {
try {
var hash = HashUtils.hash(JavaAlgorithm.SHA256, Files.readAllBytes(filePath));

View file

@ -338,6 +338,9 @@ public class UpdateCommandDistTest {
m.put("version", majorMinorOf(org.infinispan.commons.util.Version.getVersion()));
m.put("jgroupsVersion", majorMinorOf(org.jgroups.Version.printVersion()));
m.put(CONFIG, CONFIG_FILE_NOT_FOUND);
m.put("actionTokensOwners", "2");
m.put("loginFailuresOwners", "2");
m.put("authenticationSessionsOwners", "2");
return m;
}
}