{"record":{"id":"7520118139077cb5","repo":"apache/cassandra","slug":"invalid-row-row-in-table-latenciesmet","errorCode":null,"errorMessage":"Invalid row \" + row + \" in table: \" + latenciesMetricsTableName","messagePattern":"Invalid row \" \\+ row \\+ \" in table: \" \\+ latenciesMetricsTableName","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/db/virtual/CIDRFilteringMetricsTable.java","lineNumber":244,"sourceCode":"    }\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<>();\n\n        UntypedResultSet result = retrieveRows(getLatenciesMetricsStatement);\n        for (UntypedResultSet.Row row : result)\n        {\n            if (!row.has(CIDRFilteringMetricsLatenciesTable.NAME_COL) ||\n                !row.has(CIDRFilteringMetricsLatenciesTable.P50_COL))\n                throw new RuntimeException(\"Invalid row \" + row + \" in table: \" + latenciesMetricsTableName);\n\n            metrics.put(row.getString(CIDRFilteringMetricsTable.CIDRFilteringMetricsLatenciesTable.NAME_COL),\n                        Arrays.asList(row.getDouble(CIDRFilteringMetricsLatenciesTable.P50_COL),\n                                      row.getDouble(CIDRFilteringMetricsLatenciesTable.P95_COL),\n                                      row.getDouble(CIDRFilteringMetricsLatenciesTable.P99_COL),\n                                      row.getDouble(CIDRFilteringMetricsLatenciesTable.P999_COL),\n                                      row.getDouble(CIDRFilteringMetricsLatenciesTable.MAX_COL)));\n        }\n\n        return metrics;\n    }\n}\n","sourceCodeStart":226,"sourceCodeEnd":257,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/db/virtual/CIDRFilteringMetricsTable.java#L226-L257","documentation":"getLatenciesMetricsFromVtable reads percentile latency rows from the CIDRFilteringMetrics latencies virtual table. Every row must contain the metric name and the P50 column (percentile family P95/P99/P999/P999_MAX is read afterwards); a row missing NAME_COL or P50_COL cannot be parsed, so a RuntimeException flags it.","triggerScenarios":"The prepared getLatenciesMetricsStatement returns rows lacking the name or P50 columns — typically because the latencies virtual table schema on some node differs (version skew, partially applied change) or the SELECT was altered to fetch fewer columns.","commonSituations":"Mixed-version clusters during rolling upgrade where percentile column set changed; customized monitoring scripts replacing the built-in statement; reading the table from a node whose virtual-table implementation is older.","solutions":["Ensure all nodes are on the same Cassandra version so the latencies virtual table emits all percentile columns.","Confirm the SELECT statement projects the full column set (name + p50/p95/p99/p999/p999_max).","Re-execute the query against a specific healthy node.","Treat persistent occurrences as an internal bug and report with the offending row's column list."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"for (UntypedResultSet.Row row : result)\n    if (!row.has(\"name\") || !row.has(\"p50\"))\n        throw new IllegalStateException(\"CIDR latencies table schema mismatch; check node versions\");\n","typeGuard":null,"tryCatchPattern":"try {\n    latencies = getLatenciesMetricsFromVtable();\n} catch (RuntimeException e) {\n    if (e.getMessage().startsWith(\"Invalid row\")) {\n        logger.warn(\"CIDR latency metrics unavailable: {}\", e.getMessage());\n        latencies = Collections.emptyMap(); // fallback\n    } else throw e;\n}\n","preventionTips":["Ensure the SELECT projects name and all percentile columns (p50, p95, p99, p999, p999_max).","Avoid reading virtual metrics tables during rolling upgrades / mixed-version windows.","Match monitoring tooling to the exact Cassandra version's virtual table schema.","Treat missing-column rows as version-skew indicators and gate reads on cluster schema agreement."],"tags":["cassandra","virtual-table","metrics","latency"],"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"}