{"record":{"id":"313ec5e565756973","repo":"pinpoint-apm/pinpoint","slug":"invalid-metadata-serviceuid-serviceuid","errorCode":null,"errorMessage":"invalid metadata serviceUid: ${serviceUid}","messagePattern":"invalid metadata serviceUid: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/serializer/metadata/MetadataDecoder.java","lineNumber":77,"sourceCode":"    }\n\n    private ServiceUid readServiceUid(byte[] rowKey, int offset) {\n        final int remaining = rowKey.length - offset;\n        if (remaining == 0) {\n            return ServiceUid.DEFAULT;\n        } else if (remaining == BytesUtils.INT_BYTE_LENGTH) {\n            ServiceUid serviceUid = ServiceUid.of(ByteArrayUtils.bytesToInt(rowKey, offset));\n            validateServiceUid(serviceUid);\n            return serviceUid;\n        } else {\n            throw new IllegalArgumentException(\"invalid metadata rowkey length: \" + rowKey.length);\n        }\n    }\n\n    private static void validateServiceUid(ServiceUid serviceUid) {\n        if (ServiceUid.ERROR.equals(serviceUid)\n                || ServiceUid.UNKNOWN.equals(serviceUid)) {\n            throw new IllegalArgumentException(\"invalid metadata serviceUid: \" + serviceUid);\n        }\n    }\n}\n","sourceCodeStart":59,"sourceCodeEnd":81,"githubUrl":"https://github.com/pinpoint-apm/pinpoint/blob/744c3d3075e595656abb1ae331ad2c0e4c9eb996/commons-server/src/main/java/com/navercorp/pinpoint/common/server/bo/serializer/metadata/MetadataDecoder.java#L59-L81","documentation":"MetadataDecoder.validateServiceUid throws IllegalArgumentException when a decoded ServiceUid equals the ERROR or UNKNOWN sentinel values. It guards the binary metadata decoding path (readServiceUid) against corrupt or unwritten UID bytes that decode to reserved sentinel values. A valid metadata record must always carry a concrete service UID.","triggerScenarios":"Decoding metadata bytes whose serviceUid long value decodes to ServiceUid.ERROR or ServiceUid.UNKNOWN sentinels, e.g. reading a corrupted hbase cell, a record written by an older writer with unset UID, or deserializing an empty/default buffer.","commonSituations":"HBase cells written before serviceUid was populated; schema/version mismatch between writer and reader; corrupted serialized payload; tests feeding dummy zero-value buffers into MetadataDecoder.","solutions":["Inspect the raw source bytes/cell that produced the ServiceUid and confirm the serviceUid field was actually written by the producer","Regenerate or rewrite the metadata record with a valid ServiceUid (not ERROR/UNKNOWN sentinels)","Check writer/reader version compatibility — old rows written before serviceUid was introduced may need migration","Wrap decode calls in try-catch for IllegalArgumentException and skip/log the malformed record instead of failing the whole scan"],"exampleFix":"// before\nServiceUid serviceUid = decoder.readServiceUid(buffer); // throws on sentinel\n// after\nif (ServiceUid.ERROR.equals(serviceUid) || ServiceUid.UNKNOWN.equals(serviceUid)) {\n    logger.warn(\"skipping metadata with sentinel serviceUid\");\n    return null;\n}","handlingStrategy":"validation","validationCode":"if (ServiceUid.ERROR.equals(uid) || ServiceUid.UNKNOWN.equals(uid)) { skipOrReject(uid); }","typeGuard":"boolean isValidServiceUid(ServiceUid uid) { return uid != null && !ServiceUid.ERROR.equals(uid) && !ServiceUid.UNKNOWN.equals(uid); }","tryCatchPattern":"try { decoder.decode(bytes); } catch (IllegalArgumentException e) { log.warn(\"malformed metadata: {}\", e.getMessage()); }","preventionTips":["Always write a concrete serviceUid when producing metadata records","Version-check rows written before serviceUid existed and migrate them","Log and skip sentinel-valued records instead of failing whole scans"],"tags":["java","serialization","metadata","hbase"],"backgroundTag":"invalid-identifier-format","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"}