Allow Embedded Cache sizes to be configured via the CLI

Closes #31514

Signed-off-by: Ryan Emerson <remerson@redhat.com>
This commit is contained in:
Ryan Emerson 2024-09-13 15:06:52 +01:00 committed by Alexander Schwartz
parent 2d6140cb34
commit adb8d989f5
15 changed files with 415 additions and 67 deletions

View file

@ -159,6 +159,10 @@ The `proxy-trusted-addresses` can be used when the `proxy-headers` option is set
The `https-certificates-reload-period` option can be set to define the reloading period of key store, trust store, and certificate files referenced by https-* options. Use -1 to disable reloading. Defaults to 1h (one hour). The `https-certificates-reload-period` option can be set to define the reloading period of key store, trust store, and certificate files referenced by https-* options. Use -1 to disable reloading. Defaults to 1h (one hour).
= Options to configure cache max-count added
The `--cache-embedded-$\{CACHE_NAME}-max-count=` can be set to define an upper bound on the number of cache entries in the specified cache.
= Property `origin` in the `UserRepresentation` is deprecated = Property `origin` in the `UserRepresentation` is deprecated
The `origin` property in the `UserRepresentation` is deprecated and planned to be removed in future releases. The `origin` property in the `UserRepresentation` is deprecated and planned to be removed in future releases.

View file

@ -166,6 +166,14 @@ This cache is needed for the Brute Force Protection feature to work in a multi-n
Action tokens are used for scenarios when a user needs to confirm an action asynchronously, for example in the emails sent by the forgot password flow. Action tokens are used for scenarios when a user needs to confirm an action asynchronously, for example in the emails sent by the forgot password flow.
The `actionTokens` distributed cache is used to track metadata about action tokens. The `actionTokens` distributed cache is used to track metadata about action tokens.
=== Configuring cache maximum size
In order to reduce memory usage, it's possible to place an upper bound on the number of entries which are stored in a given
cache. To specify an upper bound of on a cache, you must provide the following command line argument
`--cache-embedded-$\{CACHE_NAME}-max-count=`, with `$\{CACHE_NAME}` replaced with the name of the cache you would like to
apply the upper bound to. For example, to apply an upper-bound of `1000` to the `offlineSessions` cache you would configure
`--cache-embedded-offline-sessions-max-count=1000`. An upper bound can not be defined on the following caches:
`actionToken`, `authenticationSessions`, `loginFailures`, `work`.
=== Configuring caches for availability === Configuring caches for availability
Distributed caches replicate cache entries on a subset of nodes in a cluster and assigns entries to fixed owner nodes. Distributed caches replicate cache entries on a subset of nodes in a cluster and assigns entries to fixed owner nodes.

View file

@ -1,15 +1,15 @@
package org.keycloak.config; package org.keycloak.config;
import java.io.File; import java.io.File;
import java.util.List;
import java.util.stream.Collectors; import com.google.common.base.CaseFormat;
import java.util.stream.Stream;
public class CachingOptions { public class CachingOptions {
public static final String CACHE_CONFIG_FILE_PROPERTY = "cache-config-file"; public static final String CACHE_CONFIG_FILE_PROPERTY = "cache-config-file";
private static final String CACHE_EMBEDDED_MTLS_PREFIX = "cache-embedded-mtls"; private static final String CACHE_EMBEDDED_PREFIX = "cache-embedded";
private static final String CACHE_EMBEDDED_MTLS_PREFIX = CACHE_EMBEDDED_PREFIX + "-mtls";
public static final String CACHE_EMBEDDED_MTLS_ENABLED_PROPERTY = CACHE_EMBEDDED_MTLS_PREFIX + "-enabled"; public static final String CACHE_EMBEDDED_MTLS_ENABLED_PROPERTY = CACHE_EMBEDDED_MTLS_PREFIX + "-enabled";
public static final String CACHE_EMBEDDED_MTLS_KEYSTORE_FILE_PROPERTY = CACHE_EMBEDDED_MTLS_PREFIX + "-key-store-file"; public static final String CACHE_EMBEDDED_MTLS_KEYSTORE_FILE_PROPERTY = CACHE_EMBEDDED_MTLS_PREFIX + "-key-store-file";
public static final String CACHE_EMBEDDED_MTLS_KEYSTORE_PASSWORD_PROPERTY = CACHE_EMBEDDED_MTLS_PREFIX + "-key-store-password"; public static final String CACHE_EMBEDDED_MTLS_KEYSTORE_PASSWORD_PROPERTY = CACHE_EMBEDDED_MTLS_PREFIX + "-key-store-password";
@ -26,6 +26,10 @@ public class CachingOptions {
private static final String CACHE_METRICS_PREFIX = "cache-metrics"; private static final String CACHE_METRICS_PREFIX = "cache-metrics";
public static final String CACHE_METRICS_HISTOGRAMS_ENABLED_PROPERTY = CACHE_METRICS_PREFIX + "-histograms-enabled"; public static final String CACHE_METRICS_HISTOGRAMS_ENABLED_PROPERTY = CACHE_METRICS_PREFIX + "-histograms-enabled";
public static final String[] LOCAL_MAX_COUNT_CACHES = new String[]{"authorization", "keys", "realms", "users", };
public static final String[] CLUSTERED_MAX_COUNT_CACHES = new String[]{"clientSessions", "offlineSessions", "offlineClientSessions", "sessions"};
public enum Mechanism { public enum Mechanism {
ispn, ispn,
local local
@ -131,4 +135,16 @@ public class CachingOptions {
.description("Enable TLS support to communicate with a secured remote Infinispan server. Recommended to be enabled in production.") .description("Enable TLS support to communicate with a secured remote Infinispan server. Recommended to be enabled in production.")
.defaultValue(Boolean.TRUE) .defaultValue(Boolean.TRUE)
.build(); .build();
public static Option<Integer> maxCountOption(String cache) {
return new OptionBuilder<>(cacheMaxCountProperty(cache), Integer.class)
.category(OptionCategory.CACHE)
.description(String.format("The maximum number of entries that can be stored in-memory by the %s cache.", cache))
.build();
}
public static String cacheMaxCountProperty(String cacheName) {
cacheName = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, cacheName);
return String.format("%s-%s-max-count", CACHE_EMBEDDED_PREFIX, cacheName);
}
} }

View file

@ -1,17 +1,25 @@
package org.keycloak.quarkus.runtime.configuration.mappers; package org.keycloak.quarkus.runtime.configuration.mappers;
import org.keycloak.config.CachingOptions;
import org.keycloak.quarkus.runtime.Environment;
import io.smallrye.config.ConfigSourceInterceptorContext;
import static java.util.Optional.of; import static java.util.Optional.of;
import static org.keycloak.quarkus.runtime.configuration.Configuration.getOptionalKcValue; import static org.keycloak.quarkus.runtime.configuration.Configuration.getOptionalKcValue;
import static org.keycloak.quarkus.runtime.configuration.mappers.PropertyMapper.fromOption; import static org.keycloak.quarkus.runtime.configuration.mappers.PropertyMapper.fromOption;
import java.io.File; import java.io.File;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.function.BooleanSupplier;
import java.util.stream.Stream;
import org.keycloak.config.CachingOptions;
import org.keycloak.config.OptionBuilder;
import org.keycloak.config.OptionCategory;
import org.keycloak.infinispan.util.InfinispanUtils;
import org.keycloak.quarkus.runtime.Environment;
import io.smallrye.config.ConfigSourceInterceptorContext;
final class CachingPropertyMappers { final class CachingPropertyMappers {
@ -21,61 +29,71 @@ final class CachingPropertyMappers {
} }
public static PropertyMapper<?>[] getClusteringPropertyMappers() { public static PropertyMapper<?>[] getClusteringPropertyMappers() {
return new PropertyMapper[] { List<PropertyMapper<?>> staticMappers = List.of(
fromOption(CachingOptions.CACHE) fromOption(CachingOptions.CACHE)
.paramLabel("type") .paramLabel("type")
.build(), .build(),
fromOption(CachingOptions.CACHE_STACK) fromOption(CachingOptions.CACHE_STACK)
.to("kc.spi-connections-infinispan-quarkus-stack") .to("kc.spi-connections-infinispan-quarkus-stack")
.paramLabel("stack") .paramLabel("stack")
.build(), .build(),
fromOption(CachingOptions.CACHE_CONFIG_FILE) fromOption(CachingOptions.CACHE_CONFIG_FILE)
.mapFrom("cache") .mapFrom("cache")
.to("kc.spi-connections-infinispan-quarkus-config-file") .to("kc.spi-connections-infinispan-quarkus-config-file")
.transformer(CachingPropertyMappers::resolveConfigFile) .transformer(CachingPropertyMappers::resolveConfigFile)
.paramLabel("file") .paramLabel("file")
.build(), .build(),
fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_ENABLED) fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_ENABLED)
.build(), .build(),
fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_KEYSTORE.withRuntimeSpecificDefault(getDefaultKeystorePathValue())) fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_KEYSTORE.withRuntimeSpecificDefault(getDefaultKeystorePathValue()))
.paramLabel("file") .paramLabel("file")
.build(), .build(),
fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_KEYSTORE_PASSWORD) fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_KEYSTORE_PASSWORD)
.paramLabel("password") .paramLabel("password")
.isMasked(true) .isMasked(true)
.build(), .build(),
fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_TRUSTSTORE.withRuntimeSpecificDefault(getDefaultTruststorePathValue())) fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_TRUSTSTORE.withRuntimeSpecificDefault(getDefaultTruststorePathValue()))
.paramLabel("file") .paramLabel("file")
.build(), .build(),
fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_TRUSTSTORE_PASSWORD) fromOption(CachingOptions.CACHE_EMBEDDED_MTLS_TRUSTSTORE_PASSWORD)
.paramLabel("password") .paramLabel("password")
.isMasked(true) .isMasked(true)
.build(), .build(),
fromOption(CachingOptions.CACHE_REMOTE_HOST) fromOption(CachingOptions.CACHE_REMOTE_HOST)
.paramLabel("hostname") .paramLabel("hostname")
.build(), .build(),
fromOption(CachingOptions.CACHE_REMOTE_PORT) fromOption(CachingOptions.CACHE_REMOTE_PORT)
.isEnabled(CachingPropertyMappers::remoteHostSet, CachingPropertyMappers.REMOTE_HOST_SET) .isEnabled(CachingPropertyMappers::remoteHostSet, CachingPropertyMappers.REMOTE_HOST_SET)
.paramLabel("port") .paramLabel("port")
.build(), .build(),
fromOption(CachingOptions.CACHE_REMOTE_TLS_ENABLED) fromOption(CachingOptions.CACHE_REMOTE_TLS_ENABLED)
.isEnabled(CachingPropertyMappers::remoteHostSet, CachingPropertyMappers.REMOTE_HOST_SET) .isEnabled(CachingPropertyMappers::remoteHostSet, CachingPropertyMappers.REMOTE_HOST_SET)
.build(), .build(),
fromOption(CachingOptions.CACHE_REMOTE_USERNAME) fromOption(CachingOptions.CACHE_REMOTE_USERNAME)
.isEnabled(CachingPropertyMappers::remoteHostSet, CachingPropertyMappers.REMOTE_HOST_SET) .isEnabled(CachingPropertyMappers::remoteHostSet, CachingPropertyMappers.REMOTE_HOST_SET)
.paramLabel("username") .paramLabel("username")
.build(), .build(),
fromOption(CachingOptions.CACHE_REMOTE_PASSWORD) fromOption(CachingOptions.CACHE_REMOTE_PASSWORD)
.isEnabled(CachingPropertyMappers::remoteHostSet, CachingPropertyMappers.REMOTE_HOST_SET) .isEnabled(CachingPropertyMappers::remoteHostSet, CachingPropertyMappers.REMOTE_HOST_SET)
.paramLabel("password") .paramLabel("password")
.isMasked(true) .isMasked(true)
.build(), .build(),
fromOption(CachingOptions.CACHE_METRICS_HISTOGRAMS_ENABLED)
.isEnabled(MetricsPropertyMappers::metricsEnabled, MetricsPropertyMappers.METRICS_ENABLED_MSG)
.build()
);
fromOption(CachingOptions.CACHE_METRICS_HISTOGRAMS_ENABLED) int numMappers = staticMappers.size() + CachingOptions.LOCAL_MAX_COUNT_CACHES.length + CachingOptions.CLUSTERED_MAX_COUNT_CACHES.length;
.isEnabled(MetricsPropertyMappers::metricsEnabled, MetricsPropertyMappers.METRICS_ENABLED_MSG) List<PropertyMapper<?>> mappers = new ArrayList<>(numMappers);
.build(), mappers.addAll(staticMappers);
}; for (String cache : CachingOptions.LOCAL_MAX_COUNT_CACHES)
mappers.add(maxCountOpt(cache, () -> true, ""));
for (String cache : CachingOptions.CLUSTERED_MAX_COUNT_CACHES)
mappers.add(maxCountOpt(cache, InfinispanUtils::isEmbeddedInfinispan, "embedded Infinispan clusters configured"));
return mappers.toArray(new PropertyMapper[0]);
} }
private static boolean remoteHostSet() { private static boolean remoteHostSet() {
@ -128,4 +146,11 @@ final class CachingPropertyMappers {
return null; return null;
} }
private static PropertyMapper<?> maxCountOpt(String cacheName, BooleanSupplier isEnabled, String enabledWhen) {
return fromOption(CachingOptions.maxCountOption(cacheName))
.isEnabled(isEnabled, enabledWhen)
.paramLabel("max-count")
.build();
}
} }

View file

@ -312,9 +312,10 @@ public class CacheManagerFactory {
configureTransportStack(builder); configureTransportStack(builder);
configureRemoteStores(builder); configureRemoteStores(builder);
} }
configureCacheMaxCount(builder, CachingOptions.CLUSTERED_MAX_COUNT_CACHES);
configureSessionsCaches(builder); configureSessionsCaches(builder);
} }
configureCacheMaxCount(builder, CachingOptions.LOCAL_MAX_COUNT_CACHES);
checkForRemoteStores(builder); checkForRemoteStores(builder);
var start = isStartEagerly(); var start = isStartEagerly();
@ -500,6 +501,19 @@ public class CacheManagerFactory {
}); });
} }
private static void configureCacheMaxCount(ConfigurationBuilderHolder holder, String[] caches) {
for (String cache : caches) {
String propKey = CachingOptions.cacheMaxCountProperty(cache);
Configuration.getOptionalKcValue(propKey)
.map(Integer::parseInt)
.ifPresent(maxCount -> holder.getNamedConfigurationBuilders()
.get(cache)
.memory()
.maxCount(maxCount)
);
}
}
private static String requiredStringProperty(String propertyName) { private static String requiredStringProperty(String propertyName) {
return Configuration.getOptionalKcValue(propertyName).orElseThrow(() -> new RuntimeException("Property " + propertyName + " required but not specified")); return Configuration.getOptionalKcValue(propertyName).orElseThrow(() -> new RuntimeException("Property " + propertyName + " required but not specified"));
} }

View file

@ -24,8 +24,12 @@ import static org.keycloak.quarkus.runtime.Environment.isWindows;
import static org.keycloak.quarkus.runtime.configuration.ConfigArgsConfigSource.CLI_ARGS; import static org.keycloak.quarkus.runtime.configuration.ConfigArgsConfigSource.CLI_ARGS;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import io.smallrye.config.SmallRyeConfig; import io.smallrye.config.SmallRyeConfig;
import org.hibernate.dialect.H2Dialect; import org.hibernate.dialect.H2Dialect;
@ -38,6 +42,7 @@ import org.hibernate.dialect.MariaDBDialect;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.keycloak.Config; import org.keycloak.Config;
import org.keycloak.config.CachingOptions;
import org.keycloak.quarkus.runtime.configuration.ConfigArgsConfigSource; import org.keycloak.quarkus.runtime.configuration.ConfigArgsConfigSource;
import org.keycloak.quarkus.runtime.Environment; import org.keycloak.quarkus.runtime.Environment;
@ -486,4 +491,25 @@ public class ConfigurationTest extends AbstractConfigurationTest {
ConfigArgsConfigSource.setCliArgs("--https-certificates-reload-period=2h"); ConfigArgsConfigSource.setCliArgs("--https-certificates-reload-period=2h");
assertEquals("2h", createConfig().getConfigValue("quarkus.http.ssl.certificate.reload-period").getValue()); assertEquals("2h", createConfig().getConfigValue("quarkus.http.ssl.certificate.reload-period").getValue());
} }
@Test
public void testCacheMaxCount() {
int maxCount = 500;
Set<String> maxCountCaches = Stream.of(CachingOptions.LOCAL_MAX_COUNT_CACHES, CachingOptions.CLUSTERED_MAX_COUNT_CACHES)
.flatMap(Arrays::stream)
.collect(Collectors.toSet());
StringBuilder sb = new StringBuilder();
for (String cache : maxCountCaches)
sb.append(" --").append(CachingOptions.cacheMaxCountProperty(cache)).append("=").append(maxCount);
String args = sb.toString();
ConfigArgsConfigSource.setCliArgs(args.split(" "));
SmallRyeConfig config = createConfig();
for (String cache : maxCountCaches) {
String prop = "kc." + CachingOptions.cacheMaxCountProperty(cache);
assertEquals(Integer.toString(maxCount), config.getConfigValue(prop).getValue());
}
}
} }

View file

@ -17,13 +17,21 @@
package org.keycloak.it.resource.realm; package org.keycloak.it.resource.realm;
import org.infinispan.Cache;
import org.infinispan.commons.configuration.io.ConfigurationWriter;
import org.infinispan.commons.io.StringBuilderWriter;
import org.infinispan.configuration.parsing.ParserRegistry;
import org.jboss.logging.Logger;
import org.keycloak.connections.infinispan.InfinispanConnectionProvider;
import org.keycloak.models.KeycloakSession;
import org.keycloak.services.resource.RealmResourceProvider;
import jakarta.ws.rs.GET; import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path; import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces; import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response; import jakarta.ws.rs.core.Response;
import org.jboss.logging.Logger;
import org.keycloak.services.resource.RealmResourceProvider;
/** /**
* @author Vaclav Muzikar <vmuzikar@redhat.com> * @author Vaclav Muzikar <vmuzikar@redhat.com>
@ -31,6 +39,12 @@ import org.keycloak.services.resource.RealmResourceProvider;
public class TestRealmResource implements RealmResourceProvider { public class TestRealmResource implements RealmResourceProvider {
protected static final Logger logger = Logger.getLogger(TestRealmResource.class); protected static final Logger logger = Logger.getLogger(TestRealmResource.class);
final InfinispanConnectionProvider infinispanConnectionProvider;
public TestRealmResource(KeycloakSession session) {
this.infinispanConnectionProvider = session.getProvider(InfinispanConnectionProvider.class);
}
@Override @Override
public Object getResource() { public Object getResource() {
return this; return this;
@ -47,6 +61,24 @@ public class TestRealmResource implements RealmResourceProvider {
return Response.noContent().build(); return Response.noContent().build();
} }
@Path("cache/{cache}/config")
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response cacheConfig(@PathParam("cache") String cacheName) {
Cache<?, ?> cache = infinispanConnectionProvider.getCache(cacheName, false);
if (cache == null)
return Response.status(Response.Status.NOT_FOUND).build();
StringBuilderWriter out = new StringBuilderWriter();
try (ConfigurationWriter writer = ConfigurationWriter.to(out)
.withType(org.infinispan.commons.dataconversion.MediaType.APPLICATION_JSON)
.prettyPrint(true)
.build()) {
new ParserRegistry().serialize(writer, cacheName, cache.getCacheConfiguration());
}
return Response.ok(out.toString(), MediaType.APPLICATION_JSON).build();
}
@Override @Override
public void close() { public void close() {

View file

@ -31,7 +31,7 @@ public class TestRealmResourceFactory implements RealmResourceProviderFactory {
@Override @Override
public RealmResourceProvider create(KeycloakSession session) { public RealmResourceProvider create(KeycloakSession session) {
return new TestRealmResource(); return new TestRealmResource(session);
} }
@Override @Override

View file

@ -0,0 +1,79 @@
/*
* Copyright 2023 Red Hat, Inc. and/or its affiliates
* and other contributors as indicated by the @author tags.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.keycloak.it.cli.dist;
import static io.restassured.RestAssured.when;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.infinispan.commons.dataconversion.MediaType;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.parsing.ConfigurationBuilderHolder;
import org.infinispan.configuration.parsing.ParserRegistry;
import org.junit.jupiter.api.Test;
import org.keycloak.config.CachingOptions;
import org.keycloak.it.junit5.extension.DistributionTest;
import org.keycloak.it.junit5.extension.RawDistOnly;
import org.keycloak.it.junit5.extension.TestProvider;
import org.keycloak.it.resource.realm.TestRealmResourceTestProvider;
import org.keycloak.it.utils.KeycloakDistribution;
import com.google.common.base.CaseFormat;
/**
* @author Ryan Emerson <remerson@redhat.com>
*/
@DistributionTest(keepAlive = true, enableTls = true)
@RawDistOnly(reason = "Containers are immutable")
public class ClusterConfigKeepAliveDistTest {
@Test
@TestProvider(TestRealmResourceTestProvider.class)
void testMaxCountApplied(KeycloakDistribution dist) {
int maxCount = 100;
Set<String> maxCountCaches = Stream.of(CachingOptions.LOCAL_MAX_COUNT_CACHES, CachingOptions.CLUSTERED_MAX_COUNT_CACHES)
.flatMap(Arrays::stream)
.collect(Collectors.toSet());
StringBuilder sb = new StringBuilder("start-dev --cache=ispn");
for (String cache : maxCountCaches)
sb.append(" --").append(CachingOptions.cacheMaxCountProperty(cache)).append("=").append(maxCount);
String args = sb.toString();
dist.run(args.split(" "));
ParserRegistry parserRegistry = new ParserRegistry();
for (String cache : maxCountCaches) {
String configJson = when()
.get("/realms/master/test-resources/cache/" + cache + "/config")
.thenReturn()
.getBody()
.jsonPath()
.prettyPrint();
ConfigurationBuilderHolder configHolder = parserRegistry.parse(configJson, MediaType.APPLICATION_JSON);
// Workaround for ISPN-16595
String cacheName = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_HYPHEN, cache);
Configuration config = configHolder.getNamedConfigurationBuilders().get(cacheName).build();
assertEquals(maxCount, config.memory().maxCount());
}
}
}

View file

@ -25,6 +25,15 @@ Cache:
--cache-config-file <file> --cache-config-file <file>
Defines the file from which cache configuration should be loaded from. The Defines the file from which cache configuration should be loaded from. The
configuration file is relative to the 'conf/' directory. configuration file is relative to the 'conf/' directory.
--cache-embedded-authorization-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
authorization cache.
--cache-embedded-client-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
clientSessions cache. Available only when embedded Infinispan clusters
configured.
--cache-embedded-keys-max-count <max-count>
The maximum number of entries that can be stored in-memory by the keys cache.
--cache-embedded-mtls-enabled <true|false> --cache-embedded-mtls-enabled <true|false>
Encrypts the network communication between Keycloak servers. Default: false. Encrypts the network communication between Keycloak servers. Default: false.
--cache-embedded-mtls-key-store-file <file> --cache-embedded-mtls-key-store-file <file>
@ -39,6 +48,21 @@ Cache:
'cache-mtls-truststore.p12' under conf/ directory. 'cache-mtls-truststore.p12' under conf/ directory.
--cache-embedded-mtls-trust-store-password <password> --cache-embedded-mtls-trust-store-password <password>
The password to access the Truststore. The password to access the Truststore.
--cache-embedded-offline-client-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
offlineClientSessions cache. Available only when embedded Infinispan
clusters configured.
--cache-embedded-offline-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
offlineSessions cache. Available only when embedded Infinispan clusters
configured.
--cache-embedded-realms-max-count <max-count>
The maximum number of entries that can be stored in-memory by the realms cache.
--cache-embedded-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the sessions
cache. Available only when embedded Infinispan clusters configured.
--cache-embedded-users-max-count <max-count>
The maximum number of entries that can be stored in-memory by the users cache.
--cache-remote-host <hostname> --cache-remote-host <hostname>
The hostname of the remote server for the remote store configuration. It The hostname of the remote server for the remote store configuration. It
replaces the 'host' attribute of 'remote-server' tag of the configuration replaces the 'host' attribute of 'remote-server' tag of the configuration

View file

@ -25,6 +25,15 @@ Cache:
--cache-config-file <file> --cache-config-file <file>
Defines the file from which cache configuration should be loaded from. The Defines the file from which cache configuration should be loaded from. The
configuration file is relative to the 'conf/' directory. configuration file is relative to the 'conf/' directory.
--cache-embedded-authorization-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
authorization cache.
--cache-embedded-client-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
clientSessions cache. Available only when embedded Infinispan clusters
configured.
--cache-embedded-keys-max-count <max-count>
The maximum number of entries that can be stored in-memory by the keys cache.
--cache-embedded-mtls-enabled <true|false> --cache-embedded-mtls-enabled <true|false>
Encrypts the network communication between Keycloak servers. Default: false. Encrypts the network communication between Keycloak servers. Default: false.
--cache-embedded-mtls-key-store-file <file> --cache-embedded-mtls-key-store-file <file>
@ -39,6 +48,21 @@ Cache:
'cache-mtls-truststore.p12' under conf/ directory. 'cache-mtls-truststore.p12' under conf/ directory.
--cache-embedded-mtls-trust-store-password <password> --cache-embedded-mtls-trust-store-password <password>
The password to access the Truststore. The password to access the Truststore.
--cache-embedded-offline-client-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
offlineClientSessions cache. Available only when embedded Infinispan
clusters configured.
--cache-embedded-offline-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
offlineSessions cache. Available only when embedded Infinispan clusters
configured.
--cache-embedded-realms-max-count <max-count>
The maximum number of entries that can be stored in-memory by the realms cache.
--cache-embedded-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the sessions
cache. Available only when embedded Infinispan clusters configured.
--cache-embedded-users-max-count <max-count>
The maximum number of entries that can be stored in-memory by the users cache.
--cache-metrics-histograms-enabled <true|false> --cache-metrics-histograms-enabled <true|false>
Enable histograms for metrics for the embedded caches. Default: false. Enable histograms for metrics for the embedded caches. Default: false.
Available only when metrics are enabled. Available only when metrics are enabled.

View file

@ -26,6 +26,15 @@ Cache:
--cache-config-file <file> --cache-config-file <file>
Defines the file from which cache configuration should be loaded from. The Defines the file from which cache configuration should be loaded from. The
configuration file is relative to the 'conf/' directory. configuration file is relative to the 'conf/' directory.
--cache-embedded-authorization-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
authorization cache.
--cache-embedded-client-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
clientSessions cache. Available only when embedded Infinispan clusters
configured.
--cache-embedded-keys-max-count <max-count>
The maximum number of entries that can be stored in-memory by the keys cache.
--cache-embedded-mtls-enabled <true|false> --cache-embedded-mtls-enabled <true|false>
Encrypts the network communication between Keycloak servers. Default: false. Encrypts the network communication between Keycloak servers. Default: false.
--cache-embedded-mtls-key-store-file <file> --cache-embedded-mtls-key-store-file <file>
@ -40,6 +49,21 @@ Cache:
'cache-mtls-truststore.p12' under conf/ directory. 'cache-mtls-truststore.p12' under conf/ directory.
--cache-embedded-mtls-trust-store-password <password> --cache-embedded-mtls-trust-store-password <password>
The password to access the Truststore. The password to access the Truststore.
--cache-embedded-offline-client-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
offlineClientSessions cache. Available only when embedded Infinispan
clusters configured.
--cache-embedded-offline-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
offlineSessions cache. Available only when embedded Infinispan clusters
configured.
--cache-embedded-realms-max-count <max-count>
The maximum number of entries that can be stored in-memory by the realms cache.
--cache-embedded-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the sessions
cache. Available only when embedded Infinispan clusters configured.
--cache-embedded-users-max-count <max-count>
The maximum number of entries that can be stored in-memory by the users cache.
--cache-remote-host <hostname> --cache-remote-host <hostname>
The hostname of the remote server for the remote store configuration. It The hostname of the remote server for the remote store configuration. It
replaces the 'host' attribute of 'remote-server' tag of the configuration replaces the 'host' attribute of 'remote-server' tag of the configuration

View file

@ -26,6 +26,15 @@ Cache:
--cache-config-file <file> --cache-config-file <file>
Defines the file from which cache configuration should be loaded from. The Defines the file from which cache configuration should be loaded from. The
configuration file is relative to the 'conf/' directory. configuration file is relative to the 'conf/' directory.
--cache-embedded-authorization-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
authorization cache.
--cache-embedded-client-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
clientSessions cache. Available only when embedded Infinispan clusters
configured.
--cache-embedded-keys-max-count <max-count>
The maximum number of entries that can be stored in-memory by the keys cache.
--cache-embedded-mtls-enabled <true|false> --cache-embedded-mtls-enabled <true|false>
Encrypts the network communication between Keycloak servers. Default: false. Encrypts the network communication between Keycloak servers. Default: false.
--cache-embedded-mtls-key-store-file <file> --cache-embedded-mtls-key-store-file <file>
@ -40,6 +49,21 @@ Cache:
'cache-mtls-truststore.p12' under conf/ directory. 'cache-mtls-truststore.p12' under conf/ directory.
--cache-embedded-mtls-trust-store-password <password> --cache-embedded-mtls-trust-store-password <password>
The password to access the Truststore. The password to access the Truststore.
--cache-embedded-offline-client-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
offlineClientSessions cache. Available only when embedded Infinispan
clusters configured.
--cache-embedded-offline-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
offlineSessions cache. Available only when embedded Infinispan clusters
configured.
--cache-embedded-realms-max-count <max-count>
The maximum number of entries that can be stored in-memory by the realms cache.
--cache-embedded-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the sessions
cache. Available only when embedded Infinispan clusters configured.
--cache-embedded-users-max-count <max-count>
The maximum number of entries that can be stored in-memory by the users cache.
--cache-metrics-histograms-enabled <true|false> --cache-metrics-histograms-enabled <true|false>
Enable histograms for metrics for the embedded caches. Default: false. Enable histograms for metrics for the embedded caches. Default: false.
Available only when metrics are enabled. Available only when metrics are enabled.

View file

@ -26,6 +26,15 @@ Cache:
--cache-config-file <file> --cache-config-file <file>
Defines the file from which cache configuration should be loaded from. The Defines the file from which cache configuration should be loaded from. The
configuration file is relative to the 'conf/' directory. configuration file is relative to the 'conf/' directory.
--cache-embedded-authorization-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
authorization cache.
--cache-embedded-client-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
clientSessions cache. Available only when embedded Infinispan clusters
configured.
--cache-embedded-keys-max-count <max-count>
The maximum number of entries that can be stored in-memory by the keys cache.
--cache-embedded-mtls-enabled <true|false> --cache-embedded-mtls-enabled <true|false>
Encrypts the network communication between Keycloak servers. Default: false. Encrypts the network communication between Keycloak servers. Default: false.
--cache-embedded-mtls-key-store-file <file> --cache-embedded-mtls-key-store-file <file>
@ -40,6 +49,21 @@ Cache:
'cache-mtls-truststore.p12' under conf/ directory. 'cache-mtls-truststore.p12' under conf/ directory.
--cache-embedded-mtls-trust-store-password <password> --cache-embedded-mtls-trust-store-password <password>
The password to access the Truststore. The password to access the Truststore.
--cache-embedded-offline-client-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
offlineClientSessions cache. Available only when embedded Infinispan
clusters configured.
--cache-embedded-offline-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
offlineSessions cache. Available only when embedded Infinispan clusters
configured.
--cache-embedded-realms-max-count <max-count>
The maximum number of entries that can be stored in-memory by the realms cache.
--cache-embedded-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the sessions
cache. Available only when embedded Infinispan clusters configured.
--cache-embedded-users-max-count <max-count>
The maximum number of entries that can be stored in-memory by the users cache.
--cache-remote-host <hostname> --cache-remote-host <hostname>
The hostname of the remote server for the remote store configuration. It The hostname of the remote server for the remote store configuration. It
replaces the 'host' attribute of 'remote-server' tag of the configuration replaces the 'host' attribute of 'remote-server' tag of the configuration

View file

@ -26,6 +26,15 @@ Cache:
--cache-config-file <file> --cache-config-file <file>
Defines the file from which cache configuration should be loaded from. The Defines the file from which cache configuration should be loaded from. The
configuration file is relative to the 'conf/' directory. configuration file is relative to the 'conf/' directory.
--cache-embedded-authorization-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
authorization cache.
--cache-embedded-client-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
clientSessions cache. Available only when embedded Infinispan clusters
configured.
--cache-embedded-keys-max-count <max-count>
The maximum number of entries that can be stored in-memory by the keys cache.
--cache-embedded-mtls-enabled <true|false> --cache-embedded-mtls-enabled <true|false>
Encrypts the network communication between Keycloak servers. Default: false. Encrypts the network communication between Keycloak servers. Default: false.
--cache-embedded-mtls-key-store-file <file> --cache-embedded-mtls-key-store-file <file>
@ -40,6 +49,21 @@ Cache:
'cache-mtls-truststore.p12' under conf/ directory. 'cache-mtls-truststore.p12' under conf/ directory.
--cache-embedded-mtls-trust-store-password <password> --cache-embedded-mtls-trust-store-password <password>
The password to access the Truststore. The password to access the Truststore.
--cache-embedded-offline-client-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
offlineClientSessions cache. Available only when embedded Infinispan
clusters configured.
--cache-embedded-offline-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the
offlineSessions cache. Available only when embedded Infinispan clusters
configured.
--cache-embedded-realms-max-count <max-count>
The maximum number of entries that can be stored in-memory by the realms cache.
--cache-embedded-sessions-max-count <max-count>
The maximum number of entries that can be stored in-memory by the sessions
cache. Available only when embedded Infinispan clusters configured.
--cache-embedded-users-max-count <max-count>
The maximum number of entries that can be stored in-memory by the users cache.
--cache-metrics-histograms-enabled <true|false> --cache-metrics-histograms-enabled <true|false>
Enable histograms for metrics for the embedded caches. Default: false. Enable histograms for metrics for the embedded caches. Default: false.
Available only when metrics are enabled. Available only when metrics are enabled.