{"record":{"id":"f58d6b95ed84b645","repo":"apache/cassandra","slug":"invalid-row-row-in-table-countsmetric","errorCode":null,"errorMessage":"Invalid row \" + row + \" in table: \" + countsMetricsTableName","messagePattern":"Invalid row \" \\+ row \\+ \" in table: \" \\+ countsMetricsTableName","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/virtual/CIDRFilteringMetricsTable.java","lineNumber":219,"sourceCode":"    }\n\n    public Map<String, Long> getCountsMetricsFromVtable()\n    {\n        String countsMetricsTableName = SchemaConstants.VIRTUAL_VIEWS + '.' +\n                                        CIDRFilteringMetricsTable.CIDRFilteringMetricsCountsTable.TABLE_NAME;\n\n        SelectStatement getCountsMetricsStatement =\n            (SelectStatement) QueryProcessor.getStatement(String.format(\"SELECT * FROM %s\", countsMetricsTableName),\n                                                          ClientState.forInternalCalls());\n\n        Map<String, Long> metrics = new HashMap<>();\n\n        UntypedResultSet result = retrieveRows(getCountsMetricsStatement);\n        for (UntypedResultSet.Row row : result)\n        {\n            if (!row.has(CIDRFilteringMetricsTable.CIDRFilteringMetricsCountsTable.NAME_COL) ||\n                !row.has(CIDRFilteringMetricsTable.CIDRFilteringMetricsCountsTable.VALUE_COL))\n                throw new RuntimeException(\"Invalid row \" + row + \" in table: \" + countsMetricsTableName);\n\n            metrics.put(row.getString(CIDRFilteringMetricsTable.CIDRFilteringMetricsCountsTable.NAME_COL),\n                        row.getLong(CIDRFilteringMetricsTable.CIDRFilteringMetricsCountsTable.VALUE_COL));\n        }\n\n        return metrics;\n    }\n\n    public Map<String, List<Double>> getLatenciesMetricsFromVtable()\n    {\n        String latenciesMetricsTableName = SchemaConstants.VIRTUAL_VIEWS + '.' +\n                                           CIDRFilteringMetricsTable.CIDRFilteringMetricsLatenciesTable.TABLE_NAME;\n\n        SelectStatement getLatenciesMetricsStatement =\n            (SelectStatement) QueryProcessor.getStatement(String.format(\"SELECT * FROM %s\", latenciesMetricsTableName),\n                                                          ClientState.forInternalCalls());\n\n        Map<String, List<Double>> metrics = new HashMap<>();","sourceCodeStart":201,"sourceCodeEnd":237,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/virtual/CIDRFilteringMetricsTable.java#L201-L237","documentation":"getCountsMetricsFromVtable reads rows from the CIDRFilteringMetrics counts virtual table using a prepared SELECT. Each row is expected to carry the name and value columns defined by CIDRFilteringMetricsCountsTable; if either is absent the row cannot be interpreted, so a RuntimeException identifies the malformed row and table.","triggerScenarios":"Iterating rows returned by retrieveRows(getCountsMetricsStatement) where a row lacks the NAME_COL or VALUE_COL column — e.g. the underlying virtual table schema changed, an incomplete row was materialized into the result set, or a mixed-version cluster returns rows from an older table definition.","commonSituations":"Upgrading Cassandra where the virtual table definition changed between nodes; custom tooling that writes to or shadows the virtual table; internal schema drift making UntypedResultSet rows missing expected columns.","solutions":["Verify all nodes run the same Cassandra version so the CIDRFilteringMetrics virtual table schema matches the code expectations.","Re-run the query; transient row materialization issues may resolve.","Inspect the row's columns (print row.columns()) to see which expected column is missing and adjust the SELECT statement to include it.","If this persists, file/consult a Cassandra JIRA; a missing column in a system-managed virtual table indicates an internal bug, not user error."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"for (UntypedResultSet.Row row : result)\n    if (!row.has(\"name\") || !row.has(\"value\"))\n        throw new IllegalStateException(\"CIDR counts table schema mismatch; check node versions\");\n","typeGuard":null,"tryCatchPattern":"try {\n    metrics = getCountsMetricsFromVtable();\n} catch (RuntimeException e) {\n    if (e.getMessage().startsWith(\"Invalid row\")) {\n        logger.warn(\"CIDR counts metrics unavailable: {}\", e.getMessage());\n        metrics = Collections.emptyMap(); // fallback\n    } else throw e;\n}\n","preventionTips":["Keep all cluster nodes on the same Cassandra version (no mixed versions while reading virtual tables).","Pin monitoring code to the exact table column names (NAME_COL/VALUE_COL).","Re-check the SELECT statement includes both required columns.","Alert on this RuntimeException as a schema-drift signal, not transient failure."],"tags":["cassandra","virtual-table","metrics","cidr"],"backgroundTag":"unexpected-response-shape","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}