pinpoint-apm/pinpoint · error · IllegalArgumentException

Unexpected schema change log check sum for :

Error message

Unexpected schema change log check sum for : 

What it means

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.

Source

Thrown at hbase/hbase-schema/src/main/java/com/navercorp/pinpoint/hbase/schema/core/ChangeSetManager.java:107

    }

    private List<SchemaChangeLog> sortSchemaChangeLogs(List<SchemaChangeLog> schemaChangeLogs) {
        List<SchemaChangeLog> sortedSchemaChangeLogs = new ArrayList<>(schemaChangeLogs);
        sortedSchemaChangeLogs.sort(Comparator.comparingInt(SchemaChangeLog::getExecOrder));
        return sortedSchemaChangeLogs;
    }

    private void verifyChangeLog(SchemaChangeLog schemaChangeLog, ChangeSet changeSet, int expectedOrder) {
        String changeSetId = changeSet.getId();
        String schemaChangeLogId = schemaChangeLog.getId();
        if (!changeSetId.equals(schemaChangeLogId)) {
            throw new IllegalArgumentException("Unexpected schema change log id, expected : " + changeSetId + " , was : " + schemaChangeLogId);
        }

        CheckSum actualCheckSum = schemaChangeLog.getCheckSum();
        CheckSum expectedCheckSum = CheckSum.compute(actualCheckSum.getVersion(), changeSet.getValue());
        if (!expectedCheckSum.equals(actualCheckSum)) {
            throw new IllegalArgumentException("Unexpected schema change log check sum for : " + schemaChangeLogId);
        }
        int actualOrder = schemaChangeLog.getExecOrder();
        if (expectedOrder != actualOrder) {
            throw new IllegalArgumentException("Unexpected schema change log execution order for " + schemaChangeLogId + ", expected : " + expectedOrder + ", was : " + actualOrder);
        }
    }
}

View on GitHub (pinned to 744c3d3075)

Solutions

  1. Revert the change set value to its originally applied content so the checksum matches.
  2. Create a NEW change set with a fresh id for the additional schema change instead of editing the old one.
  3. If the historical edit is intentional and safe, regenerate/update the stored change log checksum to match the new content.

Example fix

// before
// edited already-applied changeset
String value = "CREATE TABLE AgentInfo (... modified option ...)";
// after
// restore original applied value; put modification in a new change set
String value = "CREATE TABLE AgentInfo (... original ...)";
// new ChangeSet("hbase-change-3-v1", modifiedDdl)
Defensive patterns

Strategy: validation

Validate before calling

// Detect edited applied change sets before startup
for (ChangeSet cs : changeSets) {
    SchemaChangeLog log = logsById.get(cs.getId());
    if (log != null) {
        CheckSum expected = CheckSum.compute(log.getCheckSum().getVersion(), cs.getValue());
        if (!expected.equals(log.getCheckSum())) {
            throw new IllegalStateException("ChangeSet " + cs.getId() + " was modified after apply");
        }
    }
}

Try / catch

try {
    manager.updateExistingSchemas(changeSets);
} catch (IllegalArgumentException e) {
    logger.error("Checksum verification failed: {}", e.getMessage());
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Understand the failure class

Background: Checksum mismatch errors: "checksum verification failed", "digest mismatch", "expected vs actual checksum" — what they mean and how to fix them — this error's family across 41 libraries.

Related errors


AI-assisted analysis of pinpoint-apm/pinpoint@744c3d3075 (2026-09-07). Data as JSON: /api/errors/30eca2f3ee3610fd. Report an issue: GitHub.