forked from keycloak/keycloak
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Publish information about Infinispan availability in lb-check if MULT…
…I_SITE is enabled Closes keycloak#25077 Signed-off-by: Michal Hajas <mhajas@redhat.com> Signed-off-by: Alexander Schwartz <aschwart@redhat.com> Co-authored-by: Pedro Ruivo <pruivo@redhat.com> Co-authored-by: Alexander Schwartz <aschwart@redhat.com>
- Loading branch information
1 parent
29aec9c
commit 2b2207a
Showing
25 changed files
with
457 additions
and
65 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
81 changes: 81 additions & 0 deletions
81
...ava/org/keycloak/connections/infinispan/InfinispanMultiSiteLoadBalancerCheckProvider.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,81 @@ | ||
/* | ||
* 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.connections.infinispan; | ||
|
||
import org.infinispan.Cache; | ||
import org.infinispan.persistence.manager.PersistenceManager; | ||
import org.jboss.logging.Logger; | ||
import org.keycloak.health.LoadBalancerCheckProvider; | ||
|
||
import java.util.Objects; | ||
|
||
import static org.keycloak.connections.infinispan.InfinispanConnectionProvider.ALL_CACHES_NAME; | ||
|
||
public class InfinispanMultiSiteLoadBalancerCheckProvider implements LoadBalancerCheckProvider { | ||
private static final Logger LOG = Logger.getLogger(InfinispanMultiSiteLoadBalancerCheckProvider.class); | ||
private final InfinispanConnectionProvider connectionProvider; | ||
|
||
public InfinispanMultiSiteLoadBalancerCheckProvider(InfinispanConnectionProvider connectionProvider) { | ||
Objects.requireNonNull(connectionProvider, "connectionProvider"); | ||
this.connectionProvider = connectionProvider; | ||
} | ||
|
||
/** | ||
* Non-blocking check if all caches and their persistence are available. | ||
* <p /> | ||
* In a situation where any cache's remote cache is unreachable, this will report the "down" to the caller. | ||
* When the remote cache is down, it assumes that it is down for all Keycloak nodes in this site, all incoming | ||
* requests are likely to fail and that a loadbalancer should send traffic to the other site that might be healthy. | ||
* <p /> | ||
* This code is non-blocking as the embedded Infinispan checks the connection to the remote store periodically | ||
* in the background (default: every second). | ||
* See {@link LoadBalancerCheckProvider#isDown()} to read more why this needs to be non-blocking. | ||
* | ||
* @return true if the component is down/unhealthy, false otherwise | ||
*/ | ||
@Override | ||
public boolean isDown() { | ||
for (String cacheName : ALL_CACHES_NAME) { | ||
// do not block in cache creation, as this method is required to be non-blocking | ||
Cache<?,?> cache = connectionProvider.getCache(cacheName, false); | ||
|
||
// check if cache is started | ||
if (cache == null || !cache.getStatus().allowInvocations()) { | ||
LOG.debugf("Cache '%s' is not started yet.", cacheName); | ||
return true; // no need to check other caches | ||
} | ||
|
||
PersistenceManager persistenceManager = cache.getAdvancedCache() | ||
.getComponentRegistry() | ||
.getComponent(PersistenceManager.class); | ||
|
||
if (persistenceManager != null && !persistenceManager.isAvailable()) { | ||
LOG.debugf("PersistenceManager for cache '%s' is down.", cacheName); | ||
return true; // no need to check other caches | ||
} | ||
LOG.debugf("Cache '%s' is up.", cacheName); | ||
} | ||
|
||
return false; | ||
} | ||
|
||
@Override | ||
public void close() { | ||
|
||
} | ||
} |
78 changes: 78 additions & 0 deletions
78
.../keycloak/connections/infinispan/InfinispanMultiSiteLoadBalancerCheckProviderFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
/* | ||
* 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.connections.infinispan; | ||
|
||
import org.jboss.logging.Logger; | ||
import org.keycloak.Config; | ||
import org.keycloak.common.Profile; | ||
import org.keycloak.health.LoadBalancerCheckProvider; | ||
import org.keycloak.health.LoadBalancerCheckProviderFactory; | ||
import org.keycloak.models.KeycloakSession; | ||
import org.keycloak.models.KeycloakSessionFactory; | ||
import org.keycloak.provider.EnvironmentDependentProviderFactory; | ||
|
||
|
||
|
||
public class InfinispanMultiSiteLoadBalancerCheckProviderFactory implements LoadBalancerCheckProviderFactory, EnvironmentDependentProviderFactory { | ||
|
||
private LoadBalancerCheckProvider loadBalancerCheckProvider; | ||
private static final LoadBalancerCheckProvider ALWAYS_HEALTHY = new LoadBalancerCheckProvider() { | ||
@Override public boolean isDown() { return false; } | ||
@Override public void close() {} | ||
}; | ||
private static final Logger LOG = Logger.getLogger(InfinispanMultiSiteLoadBalancerCheckProviderFactory.class); | ||
|
||
@Override | ||
public LoadBalancerCheckProvider create(KeycloakSession session) { | ||
if (loadBalancerCheckProvider == null) { | ||
InfinispanConnectionProvider infinispanConnectionProvider = session.getProvider(InfinispanConnectionProvider.class); | ||
if (infinispanConnectionProvider == null) { | ||
LOG.warn("InfinispanConnectionProvider is not available. Load balancer check will be always healthy for Infinispan."); | ||
loadBalancerCheckProvider = ALWAYS_HEALTHY; | ||
} else { | ||
loadBalancerCheckProvider = new InfinispanMultiSiteLoadBalancerCheckProvider(infinispanConnectionProvider); | ||
} | ||
} | ||
return loadBalancerCheckProvider; | ||
} | ||
|
||
@Override | ||
public void init(Config.Scope config) { | ||
|
||
} | ||
|
||
@Override | ||
public void postInit(KeycloakSessionFactory factory) { | ||
|
||
} | ||
|
||
@Override | ||
public void close() { | ||
|
||
} | ||
|
||
@Override | ||
public String getId() { | ||
return "infinispan-multisite"; | ||
} | ||
|
||
@Override | ||
public boolean isSupported() { | ||
return Profile.isFeatureEnabled(Profile.Feature.MULTI_SITE); | ||
} | ||
} |
1 change: 1 addition & 0 deletions
1
...src/main/resources/META-INF/services/org.keycloak.health.LoadBalancerCheckProviderFactory
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
org.keycloak.connections.infinispan.InfinispanMultiSiteLoadBalancerCheckProviderFactory |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.