{"record":{"id":"8c73bf77b93f2621","repo":"apache/pulsar","slug":"empty-package-metadata","errorCode":null,"errorMessage":"Empty package metadata","messagePattern":"Empty package metadata","errorType":"exception","errorClass":"MetadataFormatException","httpStatus":null,"severity":"error","filePath":"pulsar-package-management/core/src/main/java/org/apache/pulsar/packages/management/core/common/PackageMetadataUtil.java","lineNumber":77,"sourceCode":"\n    private PackageMetadataUtil() {\n    }\n\n    public static byte[] toBytes(PackageMetadata packageMetadata, boolean jsonSerializationEnabled) {\n        if (jsonSerializationEnabled) {\n            try {\n                return JSON_WRITER.writeValueAsBytes(packageMetadata);\n            } catch (IOException e) {\n                throw new IllegalStateException(\"Failed to serialize package metadata as JSON\", e);\n            }\n        }\n        return SerializationUtils.serialize(packageMetadata);\n    }\n\n    public static PackageMetadata fromBytes(byte[] bytes, boolean allowLegacyJavaSerialization)\n            throws MetadataFormatException {\n        if (bytes == null || bytes.length == 0) {\n            throw new MetadataFormatException(\"Empty package metadata\");\n        }\n        int firstNonWhitespace = indexOfFirstNonWhitespace(bytes);\n        if (firstNonWhitespace >= 0 && bytes[firstNonWhitespace] == JSON_LEADING_BYTE) {\n            return readJson(bytes);\n        }\n        if (bytes.length >= 2 && bytes[0] == JAVA_MAGIC_BYTE_0 && bytes[1] == JAVA_MAGIC_BYTE_1) {\n            if (!allowLegacyJavaSerialization) {\n                throw new MetadataFormatException(\n                        \"Package metadata is in legacy Java serialization format but reading it is disabled. \"\n                                + \"Enable packagesManagementAllowLegacyJavaSerialization or re-upload the package.\");\n            }\n            return readLegacy(bytes);\n        }\n        throw new MetadataFormatException(\"Unrecognized package metadata format\");\n    }\n\n    private static PackageMetadata readJson(byte[] bytes) throws MetadataFormatException {\n        try {","sourceCodeStart":59,"sourceCodeEnd":95,"githubUrl":"https://github.com/apache/pulsar/blob/820761864ed8e2a7d2e52dd9763ad2ae117c1395/pulsar-package-management/core/src/main/java/org/apache/pulsar/packages/management/core/common/PackageMetadataUtil.java#L59-L95","documentation":"Deserialization guard in PackageMetadataUtil.fromBytes: the byte payload for package metadata is null or empty, so no JSON (or legacy Java-serialized) metadata can be read from it; the bytes argument from the package storage read is the faulty input.","triggerScenarios":"Reading package metadata from a metadata store entry that was never written, was truncated, or was deleted concurrently, then passing null/empty bytes to fromBytes.","commonSituations":"Corrupted or partially-written package entries in BookKeeper storage, a bug in the upload path that stored an empty payload, or reading metadata of a package that failed to upload.","solutions":["Upload non-empty package metadata with the package","Check the client isn't sending an empty metadata body"],"exampleFix":"// before\nPackageMetadata m = PackageMetadataUtil.fromBytes(bytes, allow);\n// after\nif (bytes == null || bytes.length == 0) throw new IllegalArgumentException(\"missing metadata blob\");\nPackageMetadata m = PackageMetadataUtil.fromBytes(bytes, allow);","handlingStrategy":"validation","validationCode":"if (bytes == null || bytes.length == 0) {\n    throw new IllegalArgumentException(\"package metadata blob is missing or empty; re-upload the package\");\n}","typeGuard":"static boolean hasMetadata(byte[] bytes) {\n    return bytes != null && bytes.length > 0;\n}","tryCatchPattern":"try {\n    PackageMetadata m = PackageMetadataUtil.fromBytes(bytes, allowLegacy);\n} catch (MetadataFormatException e) {\n    if (\"Empty package metadata\".equals(e.getMessage())) {\n        // trigger re-upload path\n    }\n}","preventionTips":["Check blob non-emptiness before parsing.","Monitor storage for truncated/empty entries and alert.","Ensure uploads write metadata atomically.","Treat empty blobs as corrupt data and re-upload."],"tags":["deserialization","packages","corruption","validation"],"backgroundTag":"empty-payload","analyzedSha":"820761864ed8e2a7d2e52dd9763ad2ae117c1395","analyzedAt":"2026-09-06T00:14:20.138Z","contentChangedAt":"2026-09-06T00:14:20.138Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}