{"record":{"id":"f3e58681a86f3677","repo":"apache/druid","slug":"invalid-value-provided-for-druid-cache-clientmode","errorCode":null,"errorMessage":"Invalid value provided for `druid.cache.clientMode`. Value must be 'static' or 'dynamic'.","messagePattern":"Invalid value provided for `druid\\.cache\\.clientMode`\\. Value must be 'static' or 'dynamic'\\.","errorType":"validation","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"server/src/main/java/org/apache/druid/client/cache/MemcachedCache.java","lineNumber":427,"sourceCode":"            .setOpQueueFactory(opQueueFactory)\n            .setMetricCollector(metricCollector)\n            .setEnableMetrics(MetricType.DEBUG); // Not as scary as it sounds\n    if (config.enableTls()) {\n      // Build SSLContext\n      TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());\n      tmf.init((KeyStore) null);\n      SSLContext sslContext = SSLContext.getInstance(\"TLSv1.2\");\n      sslContext.init(null, tmf.getTrustManagers(), null);\n      // Create the client in TLS mode\n      connectionFactoryBuilder.setSSLContext(sslContext);\n    }\n    if (\"dynamic\".equals(config.getClientMode())) {\n      connectionFactoryBuilder.setClientMode(ClientMode.Dynamic);\n      connectionFactoryBuilder.setHostnameForTlsVerification(config.getHosts().split(\",\")[0]);\n    } else if (\"static\".equals(config.getClientMode())) {\n      connectionFactoryBuilder.setClientMode(ClientMode.Static);\n    } else {\n      throw new RuntimeException(\"Invalid value provided for `druid.cache.clientMode`. Value must be 'static' or 'dynamic'.\");\n    }\n    connectionFactoryBuilder.setSkipTlsHostnameVerification(config.skipTlsHostnameVerification());\n    return connectionFactoryBuilder.build();\n  }\n\n  private final int timeout;\n  private final int expiration;\n  private final String memcachedPrefix;\n\n  private final Supplier<ResourceHolder<MemcachedClientIF>> client;\n\n  private final AtomicLong hitCount = new AtomicLong(0);\n  private final AtomicLong missCount = new AtomicLong(0);\n  private final AtomicLong timeoutCount = new AtomicLong(0);\n  private final AtomicLong errorCount = new AtomicLong(0);\n  private final AbstractMonitor monitor;\n\n","sourceCodeStart":409,"sourceCodeEnd":445,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/server/src/main/java/org/apache/druid/client/cache/MemcachedCache.java#L409-L445","documentation":"MemcachedCache validates the `druid.cache.clientMode` config when building the spyMemcached connection factory. Only 'static' (fixed host list) and 'dynamic' (host discovery) are supported by the underlying spymemcached ClientMode enum; anything else is rejected at cache initialization.","triggerScenarios":"Setting druid.cache.type=memcached with druid.cache.clientMode set to any value other than exactly 'static' or 'dynamic' (typo, capitalized like 'Static', or leftover from another config).","commonSituations":"Copy-pasting cache config from another product, using camelCase or capitalized values, editing runtime.properties by hand and mistyping the enum.","solutions":["Set druid.cache.clientMode=static or druid.cache.clientMode=dynamic (exact lowercase strings)","Remove the property to rely on the config default","Check spelling/case against the accepted values in MemcachedCacheConfig"],"exampleFix":"// before\ndruid.cache.clientMode=Static\n// after\ndruid.cache.clientMode=static","handlingStrategy":"validation","validationCode":"final String mode = config.getClientMode();\nif (!\"static\".equals(mode) && !\"dynamic\".equals(mode)) {\n  throw new IllegalArgumentException(\"druid.cache.clientMode must be 'static' or 'dynamic', got: \" + mode);\n}","typeGuard":"static boolean isValidClientMode(final String mode) {\n  return \"static\".equals(mode) || \"dynamic\".equals(mode);\n}","tryCatchPattern":null,"preventionTips":["Use only lowercase 'static' or 'dynamic' in cache config","Re-validate runtime.properties after upgrades or copy-paste edits","Take config values from official Druid memcached extension docs"],"tags":["config","cache","memcached","validation"],"backgroundTag":"invalid-config-value","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}