{"record":{"id":"30fd2bdb8212f6fd","repo":"apache/iceberg","slug":"invalid-value-for-negative-falling-back","errorCode":null,"errorMessage":"Invalid value for {} (negative): {}, falling back to {}","messagePattern":"Invalid value for (.+?) \\(negative\\): (.+?), falling back to (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"core/src/main/java/org/apache/iceberg/MetricsConfig.java","lineNumber":342,"sourceCode":"   * @param defaultMode default mode\n   * @return mode to use\n   */\n  private static MetricsMode sortedColumnDefaultMode(MetricsMode defaultMode) {\n    if (defaultMode == MetricsModes.None.get() || defaultMode == MetricsModes.Counts.get()) {\n      return MetricsModes.Truncate.withLength(16);\n    } else {\n      return defaultMode;\n    }\n  }\n\n  private static int maxInferredColumnDefaults(Map<String, String> properties) {\n    int maxInferredDefaultColumns =\n        PropertyUtil.propertyAsInt(\n            properties,\n            METRICS_MAX_INFERRED_COLUMN_DEFAULTS,\n            METRICS_MAX_INFERRED_COLUMN_DEFAULTS_DEFAULT);\n    if (maxInferredDefaultColumns < 0) {\n      LOG.warn(\n          \"Invalid value for {} (negative): {}, falling back to {}\",\n          METRICS_MAX_INFERRED_COLUMN_DEFAULTS,\n          maxInferredDefaultColumns,\n          METRICS_MAX_INFERRED_COLUMN_DEFAULTS_DEFAULT);\n      return METRICS_MAX_INFERRED_COLUMN_DEFAULTS_DEFAULT;\n    } else {\n      return maxInferredDefaultColumns;\n    }\n  }\n\n  private static MetricsMode parseMode(String modeString, MetricsMode fallback, String context) {\n    try {\n      return MetricsModes.fromString(modeString);\n    } catch (IllegalArgumentException err) {\n      // User override was invalid, log the error and use the default\n      LOG.warn(\"Ignoring invalid metrics mode ({}): {}\", context, modeString, err);\n      return fallback;\n    }","sourceCodeStart":324,"sourceCodeEnd":360,"githubUrl":"https://github.com/apache/iceberg/blob/86d9c8fc543e7c56c9f624eb725f76c9baff9570/core/src/main/java/org/apache/iceberg/MetricsConfig.java#L324-L360","documentation":"MetricsConfig validates the table property write.metrics.max-inferred-column-defaults. If the configured value is a negative integer, the config is rejected with this warning and the default value is used instead of failing the write.","triggerScenarios":"Setting table property 'write.metrics.max-inferred-column-defaults' to a negative number (e.g. -1) via ALTER TABLE TBLPROPERTIES or catalog configuration, then performing a write that builds MetricsConfig.","commonSituations":"Copy-pasted config from another property where negative means unlimited, typos in tuning attempts, or migrating configs where -1 was accepted elsewhere.","solutions":["Set write.metrics.max-inferred-column-defaults to a non-negative integer (0 disables, larger values increase inference).","Remove the property to fall back to the built-in default.","Audit table and catalog-level properties for negative values before tuning."],"exampleFix":"// before\nALTER TABLE t SET TBLPROPERTIES ('write.metrics.max-inferred-column-defaults'='-1');\n// after\nALTER TABLE t SET TBLPROPERTIES ('write.metrics.max-inferred-column-defaults'='100');","handlingStrategy":"validation","validationCode":"int v = Integer.parseInt(props.getProperty(\"write.metrics.max-inferred-column-defaults\"));\nif (v < 0) throw new IllegalArgumentException(\"must be >= 0: \" + v);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate table properties before setting them","Use 0 to disable instead of negative values","Centralize metric tuning constants in one reviewed config"],"tags":["configuration","metrics","invalid-value"],"backgroundTag":"invalid-config-value","analyzedSha":"86d9c8fc543e7c56c9f624eb725f76c9baff9570","analyzedAt":"2026-09-12T00:46:39.097Z","contentChangedAt":"2026-09-12T00:46:39.097Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}