{"record":{"id":"9ad5ccbed3ff6006","repo":"lancedb/lancedb","slug":"get-lsm-write-spec-response-has-no-sharding-mode","errorCode":null,"errorMessage":"get_lsm_write_spec response has no sharding mode","messagePattern":"get_lsm_write_spec response has no sharding mode","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"java/lancedb-core/src/main/java/com/lancedb/LsmWriteSpec.java","lineNumber":219,"sourceCode":"\n    Map<String, Object> body = new LinkedHashMap<String, Object>();\n    body.put(\"sharding\", shardingBody);\n    // Null is meaningful: it asks the server to resolve every maintainable index.\n    body.put(\"maintained_indexes\", maintainedIndexes);\n    body.put(\"writer_config_defaults\", writerConfigDefaults);\n    return body;\n  }\n\n  /**\n   * Rebuild a spec from a {@code get_lsm_write_spec} response body.\n   *\n   * <p>The server always reports a concrete maintained-index list, so a null selection never\n   * round-trips.\n   */\n  static LsmWriteSpec fromJson(JsonNode node) {\n    JsonNode shardingNode = node.get(\"sharding\");\n    if (shardingNode == null || shardingNode.get(\"mode\") == null) {\n      throw new IllegalStateException(\"get_lsm_write_spec response has no sharding mode\");\n    }\n    Sharding sharding = Sharding.fromWireName(shardingNode.get(\"mode\").asText());\n\n    String column = shardingNode.hasNonNull(\"column\") ? shardingNode.get(\"column\").asText() : null;\n    Integer numBuckets =\n        shardingNode.hasNonNull(\"num_buckets\") ? shardingNode.get(\"num_buckets\").asInt() : null;\n\n    List<String> maintainedIndexes = new ArrayList<String>();\n    JsonNode indexesNode = node.get(\"maintained_indexes\");\n    if (indexesNode != null && indexesNode.isArray()) {\n      for (JsonNode index : indexesNode) {\n        maintainedIndexes.add(index.asText());\n      }\n    }\n\n    Map<String, String> defaults = new HashMap<String, String>();\n    JsonNode defaultsNode = node.get(\"writer_config_defaults\");\n    if (defaultsNode != null && defaultsNode.isObject()) {","sourceCodeStart":201,"sourceCodeEnd":237,"githubUrl":"https://github.com/lancedb/lancedb/blob/c7b051aff7039333a3f61b79217246c27676806a/java/lancedb-core/src/main/java/com/lancedb/LsmWriteSpec.java#L201-L237","documentation":"LsmWriteSpec.fromJson parses the server's get_lsm_write_spec response. The JSON must contain a \"sharding\" object with a \"mode\" field; if either is missing, an IllegalStateException is thrown because a valid server response always reports a sharding mode.","triggerScenarios":"Deserializing a get_lsm_write_spec response that lacks \"sharding\" or \"sharding.mode\" — e.g. from an incompatible/old server, a proxy stripping fields, or malformed response bodies.","commonSituations":"Client newer than server (server predates write-spec support); intermediary caches/gateways returning truncated JSON; unit tests feeding hand-written JSON without the sharding field.","solutions":["Upgrade the server so get_lsm_write_spec returns the full sharding object","Align client and server versions so the response format matches","Inspect the raw response JSON to confirm which field is missing and fix the serving layer"],"exampleFix":"// before\n{\"maintained_indexes\": [\"scalar_idx\"]} // no \"sharding\"\n// after\n{\"sharding\": {\"mode\": \"bucket\", \"column\": \"id\", \"num_buckets\": 16}, \"maintained_indexes\": [\"scalar_idx\"]}","handlingStrategy":"try-catch","validationCode":"boolean hasSharding = node != null\n    && node.has(\"sharding\")\n    && node.get(\"sharding\").has(\"mode\");\nif (!hasSharding) throw new IllegalArgumentException(\"response missing sharding.mode\");","typeGuard":null,"tryCatchPattern":"try {\n  LsmWriteSpec spec = LsmWriteSpec.fromJson(node);\n} catch (IllegalStateException e) {\n  if (e.getMessage().contains(\"no sharding mode\")) {\n    // server too old or response malformed; upgrade server or inspect raw payload\n  } else throw e;\n}","preventionTips":["Pin compatible client/server versions","Add contract tests asserting the response includes sharding.mode","Log raw responses when deserialization fails"],"tags":["java","json","deserialization","lsm"],"backgroundTag":"unexpected-response-shape","analyzedSha":"c7b051aff7039333a3f61b79217246c27676806a","analyzedAt":"2026-09-08T23:42:37.579Z","contentChangedAt":"2026-09-08T23:42:37.579Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}