{"record":{"id":"30eca2f3ee3610fd","repo":"pinpoint-apm/pinpoint","slug":"unexpected-schema-change-log-check-sum-for","errorCode":null,"errorMessage":"Unexpected schema change log check sum for : ","messagePattern":"Unexpected schema change log check sum for : ","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hbase/hbase-schema/src/main/java/com/navercorp/pinpoint/hbase/schema/core/ChangeSetManager.java","lineNumber":107,"sourceCode":"    }\n\n    private List<SchemaChangeLog> sortSchemaChangeLogs(List<SchemaChangeLog> schemaChangeLogs) {\n        List<SchemaChangeLog> sortedSchemaChangeLogs = new ArrayList<>(schemaChangeLogs);\n        sortedSchemaChangeLogs.sort(Comparator.comparingInt(SchemaChangeLog::getExecOrder));\n        return sortedSchemaChangeLogs;\n    }\n\n    private void verifyChangeLog(SchemaChangeLog schemaChangeLog, ChangeSet changeSet, int expectedOrder) {\n        String changeSetId = changeSet.getId();\n        String schemaChangeLogId = schemaChangeLog.getId();\n        if (!changeSetId.equals(schemaChangeLogId)) {\n            throw new IllegalArgumentException(\"Unexpected schema change log id, expected : \" + changeSetId + \" , was : \" + schemaChangeLogId);\n        }\n\n        CheckSum actualCheckSum = schemaChangeLog.getCheckSum();\n        CheckSum expectedCheckSum = CheckSum.compute(actualCheckSum.getVersion(), changeSet.getValue());\n        if (!expectedCheckSum.equals(actualCheckSum)) {\n            throw new IllegalArgumentException(\"Unexpected schema change log check sum for : \" + schemaChangeLogId);\n        }\n        int actualOrder = schemaChangeLog.getExecOrder();\n        if (expectedOrder != actualOrder) {\n            throw new IllegalArgumentException(\"Unexpected schema change log execution order for \" + schemaChangeLogId + \", expected : \" + expectedOrder + \", was : \" + actualOrder);\n        }\n    }\n}\n","sourceCodeStart":89,"sourceCodeEnd":115,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/hbase/hbase-schema/src/main/java/com/navercorp/pinpoint/hbase/schema/core/ChangeSetManager.java#L89-L115","documentation":"ChangeSetManager.verifyChangeLog recomputes the CheckSum of the ChangeSet's value and compares it to the checksum recorded in the persisted SchemaChangeLog. A mismatch throws IllegalArgumentException, meaning an already-applied change set's content was modified after execution.","triggerScenarios":"Calling getExecutedChangeSets or filterExecutedChangeSets when the ChangeSet body (its value) differs from what was stored when the change log was written — i.e. the change set was edited after being applied.","commonSituations":"Editing a previously-applied change set script (adding a column family, changing options) instead of appending a new change set; merging branches where two developers edited the same applied change set.","solutions":["Revert the change set value to its originally applied content so the checksum matches.","Create a NEW change set with a fresh id for the additional schema change instead of editing the old one.","If the historical edit is intentional and safe, regenerate/update the stored change log checksum to match the new content."],"exampleFix":"// before\n// edited already-applied changeset\nString value = \"CREATE TABLE AgentInfo (... modified option ...)\";\n// after\n// restore original applied value; put modification in a new change set\nString value = \"CREATE TABLE AgentInfo (... original ...)\";\n// new ChangeSet(\"hbase-change-3-v1\", modifiedDdl)","handlingStrategy":"validation","validationCode":"// Detect edited applied change sets before startup\nfor (ChangeSet cs : changeSets) {\n    SchemaChangeLog log = logsById.get(cs.getId());\n    if (log != null) {\n        CheckSum expected = CheckSum.compute(log.getCheckSum().getVersion(), cs.getValue());\n        if (!expected.equals(log.getCheckSum())) {\n            throw new IllegalStateException(\"ChangeSet \" + cs.getId() + \" was modified after apply\");\n        }\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    manager.updateExistingSchemas(changeSets);\n} catch (IllegalArgumentException e) {\n    logger.error(\"Checksum verification failed: {}\", e.getMessage());\n}","preventionTips":["Never edit a change set body once it has been applied; always add a new one.","Version-control change sets and review checksum-affecting diffs.","Run checksum verification in CI against a snapshot of the change log table."],"tags":["hbase","schema-migration","checksum"],"backgroundTag":"checksum-mismatch","analyzedSha":"744c3d3075e595656abb1ae331ad2c0e4c9eb996","analyzedAt":"2026-09-07T18:48:45.289Z","contentChangedAt":"2026-09-07T18:48:45.289Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}