The field of software engineering is ever evolving and ever changing. As a software engineer, it’s therefore our job to continue learning through all stages of our career. On this path of continued learning, we will face ourselves in many situations where we simply cannot solve the problem without help. Fortunately, we are not alone in this and the likelihood that others are struggling on a similar issue, or that there is an expert in the community on the topic, are fairly high. Asking the right questions is thus important for two reasons: a) to get a helpful answer when we’re stuck, and b) to help others that struggle with the same issues as they may come across our questions.
Eric Raymond provides guidelines to asking question the smart way in How To Ask Questions The Smart Way. The section Before you Ask really resonated with me as I’ve rarely ever had to ask a question in online forums. Most of the time, I can find other people’s questions and answers to help me solve my problems. Of course, this isn’t always the case. In the following, I’ll present a personal example as a use case.
For one project, we’ve had problems with the configuration of our Keycloak service in a Kubernetes deployment. We experienced non-zero downtime deployments and couldn’t find a solution within the expertise of our team, or elsewhere on the web. I thus opened this GitHub issue. The following analyzes the different parts of the ticket as a valuable reflection on my own question in an online forum.
As mentioned in the recommendations, one should choose the platform with care. I chose to post my question in the form of a GitHub issue to ask the maintainers of the Helm chart for support. I originally considered this a good forum for the problem as I expected that the authors of the chart would be most familiar with the subject matter. Given that the authors however haven’t replied so far, I think a repost in Stack Overflow could be helpful. Nonetheless, despite the slow movement on the issue, the in-depth answers show that it was an appropriate choice after all.
My ticket used the title Non-Zero Keycloak Downtime During Rolling Update in HA Cluster. This is a specifc title that describes the problems we were having with Keycloak in the High Availability configuration and that we had problems with downtime during updates.
My ticket starts as follows:
Thank you for maintaining this chart! We’re using this in HA with 3-5 replicas and it’s been working great in operation.
As shown, the introduction to my problem starts with a courtious Thank you to the authors of the chart for providing the software to the community. This follows the principle Courtesy never hurts, and sometimes helps.
After the introductory sentence, the ticket continues with the problem:
We’re noticing downtime issues however during rolling updates and are wondering if you’re familiar with this issue or know what we’re doing wrong here. The problem is that during a rolling update, some refresh tokens cannot be renewed and Internal Server Errors are returned instead.
This first introduction is followed by the actual problems, e.g. log messages. Following the log messages, I wrapped up my description of the problem with
It appears that the keycloak service is temporarily unavailable for some clients if the node that corresponds to the clients’ cache owners is currently being restarted. Although the session info is is not lost during this incident—refresh tokens work again a little while later—our Keycloak service becomes unavailable during the rolling update to some clients and we’d like to mitigate this.
The wording here suggests that I’m digressing from the recommended principles of smart questions as I’m describing my guess/understanding of the problem. This is something to improve to not bias the reader.
Lastly, the issue description contained specifics on the chart version, keycloak version, protocol used, and actual chart with the proper formatting.
Chart Version: 11.0.1 (also occurred in 9.9.5 und 7.20)
Keycloak Version: 11.0.3
Discovery Protocol: KUBE PING (also occurred with JDBC PING)
Values: (omited by choice here) ```
To demonstrate the problem, I chose one log message of the incident and described it with the exact timestamp and node on which it occured. I then added some preceeding log messages for better understanding, which matches the recommendation of describing issues in chronological order. The log messages used proper markdown formatting (one-line formatting) to not distract the reader with long vertical log blocks.
The following error was reported at 04:30:53 after node stage-keycloak-0 had left the cluster:
{"timestamp":"2021-07-14T04:30:53.981Z","sequence":393,"loggerClassName":"io.undertow.UndertowLogger_$logger","loggerName":"io.undertow.request","level":"ERROR","message":"UT005023: Exception handling request to /auth/realms/vag/protocol/openid-connect/token","threadName":"default task-3","threadId":204,"mdc":{},"ndc":"","hostName":"stage-keycloak-3","processName":"jboss-modules.jar","processId":749,"stackTrace":": org.infinispan.util.concurrent.TimeoutException: ISPN000476: Timed out waiting for responses for request 343 from stage-keycloak-0\n\tat org.infinispan@10.1.8.Final//org.infinispan.interceptors.impl.AsyncInterceptorChainImpl.invoke(AsyncInterceptorChainImpl.java:255)\n\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.CacheImpl.executeCommandAndCommitIfNeeded(CacheImpl.java:1829)\n\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.CacheImpl.replace(CacheImpl.java:1463)\n\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.DecoratedCache.replace(DecoratedCache.java:690)\n\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.DecoratedCache.replace(DecoratedCache.java:600)\n\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.AbstractDelegatingCache.replace(AbstractDelegatingCache.java:360)\n\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.EncoderCache.replace(EncoderCache.java:620)\n\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.AbstractDelegatingCache.replace(AbstractDelegatingCache.java:360)\n\tat org.keycloak.keycloak-model-infinispan@11.0.3//org.keycloak.models.sessions.infinispan.changes.InfinispanChangelogBasedTransaction.replace(InfinispanChangelogBasedTransaction.java:218)\n\tat org.keycloak.keycloak-model-infinispan@11.0.3//org.keycloak.models.sessions.infinispan.changes.InfinispanChangelogBasedTransaction.runOperationInCluster(InfinispanChangelogBasedTransaction.java:198)\n\tat org.keycloak.keycloak-model-infinispan@11.0.3//org.keycloak.models.sessions.infinispan.changes.InfinispanChangelogBasedTransaction.commitImpl(InfinispanChangelogBasedTransaction.java:158)\n\tat org.keycloak.keycloak-server-spi@11.0.3//org.keycloak.models.AbstractKeycloakTransaction.commit(AbstractKeycloakTransaction.java:48)\n\tat org.keycloak.keycloak-services@11.0.3//org.keycloak.services.DefaultKeycloakTransactionManager.commit(DefaultKeycloakTransactionManager.java:146)\n\tat org.keycloak.keycloak-services@11.0.3//org.keycloak.services.filters.AbstractRequestFilter.close(AbstractRequestFilter.java:60)\n\tat org.keycloak.keycloak-services@11.0.3//org.keycloak.services.filters.AbstractRequestFilter.filter(AbstractRequestFilter.java:49)\n\tat org.keycloak.keycloak-wildfly-extensions@11.0.3//org.keycloak.provider.wildfly.WildFlyRequestFilter.doFilter(WildFlyRequestFilter.java:39)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\n\tat org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)\n\tat io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\n\tat io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\tat io.undertow.core@2.1.3.Final//io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\n\tat io.undertow.core@2.1.3.Final//io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\n\tat io.undertow.core@2.1.3.Final//io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)\n\tat io.undertow.core@2.1.3.Final//io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\n\tat io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\tat org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)\n\tat io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\tat org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)\n\tat io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:269)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:78)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:133)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:130)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)\n\tat org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)\n\tat org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)\n\tat org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)\n\tat org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)\n\tat org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1530)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:249)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:78)\n\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:99)\n\tat io.undertow.core@2.1.3.Final//io.undertow.server.Connectors.executeRootHandler(Connectors.java:370)\n\tat io.undertow.core@2.1.3.Final//io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)\n\tat org.jboss.threads@2.3.3.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\n\tat org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)\n\tat org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)\n\tat org.jboss.threads@2.3.3.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)\n\tat java.base/java.lang.Thread.run(Thread.java:834)\nCaused by: org.infinispan.util.concurrent.TimeoutException: ISPN000476: Timed out waiting for responses for request 343 from stage-keycloak-0\n\tat org.infinispan@10.1.8.Final//org.infinispan.remoting.transport.impl.SingleTargetRequest.onTimeout(SingleTargetRequest.java:81)\n\tat org.infinispan@10.1.8.Final//org.infinispan.remoting.transport.AbstractRequest.call(AbstractRequest.java:87)\n\tat org.infinispan@10.1.8.Final//org.infinispan.remoting.transport.AbstractRequest.call(AbstractRequest.java:22)\n\tat java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)\n\tat java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n\tat java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n\t... 1 more\n\tSuppressed: org.infinispan.util.logging.TraceException\n\t\tat org.infinispan@10.1.8.Final//org.infinispan.interceptors.impl.SimpleAsyncInvocationStage.get(SimpleAsyncInvocationStage.java:39)\n\t\tat org.infinispan@10.1.8.Final//org.infinispan.interceptors.impl.AsyncInterceptorChainImpl.invoke(AsyncInterceptorChainImpl.java:246)\n\t\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.CacheImpl.executeCommandAndCommitIfNeeded(CacheImpl.java:1829)\n\t\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.CacheImpl.replace(CacheImpl.java:1463)\n\t\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.DecoratedCache.replace(DecoratedCache.java:690)\n\t\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.DecoratedCache.replace(DecoratedCache.java:600)\n\t\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.AbstractDelegatingCache.replace(AbstractDelegatingCache.java:360)\n\t\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.EncoderCache.replace(EncoderCache.java:620)\n\t\tat org.infinispan@10.1.8.Final//org.infinispan.cache.impl.AbstractDelegatingCache.replace(AbstractDelegatingCache.java:360)\n\t\tat org.keycloak.keycloak-model-infinispan@11.0.3//org.keycloak.models.sessions.infinispan.changes.InfinispanChangelogBasedTransaction.replace(InfinispanChangelogBasedTransaction.java:218)\n\t\tat org.keycloak.keycloak-model-infinispan@11.0.3//org.keycloak.models.sessions.infinispan.changes.InfinispanChangelogBasedTransaction.runOperationInCluster(InfinispanChangelogBasedTransaction.java:198)\n\t\tat org.keycloak.keycloak-model-infinispan@11.0.3//org.keycloak.models.sessions.infinispan.changes.InfinispanChangelogBasedTransaction.commitImpl(InfinispanChangelogBasedTransaction.java:158)\n\t\tat org.keycloak.keycloak-server-spi@11.0.3//org.keycloak.models.AbstractKeycloakTransaction.commit(AbstractKeycloakTransaction.java:48)\n\t\tat org.keycloak.keycloak-services@11.0.3//org.keycloak.services.DefaultKeycloakTransactionManager.commit(DefaultKeycloakTransactionManager.java:146)\n\t\tat org.keycloak.keycloak-services@11.0.3//org.keycloak.services.filters.AbstractRequestFilter.close(AbstractRequestFilter.java:60)\n\t\tat org.keycloak.keycloak-services@11.0.3//org.keycloak.services.filters.AbstractRequestFilter.filter(AbstractRequestFilter.java:49)\n\t\tat org.keycloak.keycloak-wildfly-extensions@11.0.3//org.keycloak.provider.wildfly.WildFlyRequestFilter.doFilter(WildFlyRequestFilter.java:39)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)\n\t\tat org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)\n\t\tat io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)\n\t\tat io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\t\tat io.undertow.core@2.1.3.Final//io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)\n\t\tat io.undertow.core@2.1.3.Final//io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)\n\t\tat io.undertow.core@2.1.3.Final//io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)\n\t\tat io.undertow.core@2.1.3.Final//io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)\n\t\tat io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\t\tat org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)\n\t\tat io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\t\tat org.wildfly.extension.undertow@20.0.1.Final//org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)\n\t\tat io.undertow.core@2.1.3.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:269)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:78)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:133)\n\t\tat io.undertow.servlet@2.1.3.Final//io.undertow.servlet.handlers.ServletInitialHan
Following the error message of the problem, I showed three log messages the preceeded the error. I described these as
Last successful refresh token on stage-keycloak-0 at 04:30:33:
{"timestamp":"2021-07-14T04:30:33.052Z","sequence":1301,"loggerClassName":"org.jboss.logging.Logger","loggerName":"XXXXXXXXXX.keycloak.adapters.customer.eventlisteners.auditing.ExternalClientAuditingServiceClientImpl","level":"INFO","message":"Creating client auditing event \"{\"time\":1626237033050,\"eventtype\":\"REFRESH_TOKEN\",\"realm\":\"vag\",\"clientid\":\"android\",\"userid\":\"813a100c-b2a2-46b9-9cf7-1aaf4159d17b\"}\" under url \"http://XXXXXXXXXX.svc.cluster.local/api/crm/userdb/ssoauditing/log/v1\"","threadName":"default task-2","threadId":205,"mdc":{},"ndc":"","hostName":"stage-keycloak-0","processName":"jboss-modules.jar","processId":749,"label":"value"}`
stage-keycloak-0 leaving the cluster (04:30:35):
{"timestamp":"2021-07-14T04:30:35.983Z","sequence":1313,"loggerClassName":"org.jboss.logging.DelegatingBasicLogger","loggerName":"org.infinispan.manager.DefaultCacheManager","level":"INFO","message":"Stopping cache manager null on stage-keycloak-0","threadName":"MSC service thread 1-2","threadId":15,"mdc":{},"ndc":"","hostName":"stage-keycloak-0","processName":"jboss-modules.jar","processId":749,"label":"value"}
updating cache members list at 04:30:36:
{"timestamp":"2021-07-14T04:30:36.014Z","sequence":1330,"loggerClassName":"org.jboss.logging.Logger","loggerName":"org.infinispan.CLUSTER","level":"INFO","message":"[Context=offlineClientSessions] ISPN100008: Updating cache members list [stage-keycloak-4, stage-keycloak-3, stage-keycloak-2, stage-keycloak-1], topology id 602","threadName":"ServerService Thread Pool -- 75","threadId":349,"mdc":{},"ndc":"","hostName":"stage-keycloak-0","processName":"jboss-modules.jar","processId":749,"label":"value"}
The question asked in the ticket is: Do you have recommendations for zero-downtime rolling updates? According to the recommended principles of Eric Raymond, this could possibly be rephrased to something like Do you have recommendations or pointers for zero-downtime rolling updates? Nonetheless, it’s a specific enough question to encourage comments.
It took some time before the first response on the aforementioned issues but eventually one community member responded to report on similar problems. The member provided very detailed and technical feedback, which was a positive experience. Another team member of our organization continued conversations on the ticket to learn more and keep the ticket open. As we haven’t resolved the issue so far despite the community help, a repost of this issue on Stack Overflow could be helpful.
This example shows a question on Stack Overflow that merely received two comments for clarification, but no answer, over the past year.
There are multiple problems with this post when evaluated against the principles of Eric Raymond. In this issues titled Ajv not defined in Jest test, the author is trying to get help with understanding why tests aren’t running and why he’s receiving a ReferenceError
. The biggest problem with the issue is that it doesn’t provide a proper context of what the author is trying to achieve, and what his goals are. The described premise and process are as follows:
I want to test my class with jest. This class is importing ajv.js 6.12.2 and the test fails on that. So what i basicly did is:
Add export default Ajv statement to the end of the ajv.js
Import ajv.js with import Ajv from ‘./lib/ajv.js’
Add “transform”: {“^.+\.jsx?$”: “babel-jest”} to package.json
Created babel.json and insert { “presets”: [“@babel/preset-env”], “plugins”: [“@babel/plugin-proposal-class-properties”] }
Personally, I don’t actually understand the author’s objectives and background enough to think about what the problem could be. One user did show interest and asked two follow-up questions to understand what the author is trying to achieve. This is another indication the the problem isn’t described well enough, that the goal isn’t made clear, and that the question is not explicit enough.