> Will there be any compatibility issues after moving enum `StorageTypeProto` from `ScmServerDatanodeHeartbeatProtocol.proto` to `hdds.proto` and standardize, and change all the places where `StorageTypeProto` is used in the existing protobuf to `hdds.proto#StorageTypeProto`?
There are different levels of compatibility: For binary compatibility, it is okay since "enum is compatible with int32, uint32, int64, and uint64 in terms of wire format" according to https://protobuf.dev/programming-guides/proto2/#updating It is easy to test: write both the new and the old protos to files and then compare the binaries. For API compatibility, the Java classes will be different. The question: are we using it in a public API? It also seems not since we are using - org.apache.hadoop.hdds.protocol.StorageType in the public APIs. (e.g. OzoneBucket.getStorageType(). ) According to https://protobuf.dev/programming-guides/proto2/#enum , we should add [deprecated=true] to each field instead of removing the old protos. Please try. BTW, we also have another StorageTypeProto defined in OmClientProtocol.proto. We should deprecate it as well. Please file a JIRA for the further discussion. Tsz-Wo On Mon, Aug 19, 2024 at 2:17 AM mrchenx <mrch...@126.com> wrote: > Dear Ozone Devs, > > > > > I am currently developing some features related to StoragePolicy and have > encountered an issue for which I am seeking a solution. > > > > > ## What I want to do > > - Move the enum `StorageTypeProto` from > `ScmServerDatanodeHeartbeatProtocol.proto` to `hdds.proto`. > > - Most of the protobuf definitions that need to be imported in our > project are located in `hdds.proto`, so I want to move enum > `StorageTypeProto` to `hdds.proto`. > > > > > - Standardize the usage of `hdds.proto#StorageTypeProto` across all > protobuf files in the project. > > - This would require removing > `ScmServerDatanodeHeartbeatProtocol.proto#StorageTypeProto` and > `OmClientProtocol.proto#StorageTypeProto`. > > > > > ## The error I encountered > > However, I encountered an issue where `proto-backwards-compatibility` > throws errors after moving the `enum StorageTypeProto`. > > > > > ```bash > > [INFO] --- > proto-backwards-compatibility:1.0.7:backwards-compatibility-check (default) > @ hdds-interface-server --- > > //... > > [ERROR] CONFLICT: "StorageTypeProto" field: "ARCHIVE" has been removed, > but is not reserved [ScmServerDatanodeHeartbeatProtocol.proto] > > [ERROR] CONFLICT: "StorageTypeProto" field: "DISK" has been removed, but > is not reserved [ScmServerDatanodeHeartbeatProtocol.proto] > > [ERROR] CONFLICT: "StorageTypeProto" field: "PROVIDED" has been removed, > but is not reserved [ScmServerDatanodeHeartbeatProtocol.proto] > > [ERROR] CONFLICT: "StorageTypeProto" field: "RAM_DISK" has been removed, > but is not reserved [ScmServerDatanodeHeartbeatProtocol.proto] > > [ERROR] CONFLICT: "StorageTypeProto" field: "SSD" has been removed, but is > not reserved [ScmServerDatanodeHeartbeatProtocol.proto] > > [ERROR] CONFLICT: "StorageTypeProto" integer: "1" has been removed, but is > not reserved [ScmServerDatanodeHeartbeatProtocol.proto] > > [ERROR] CONFLICT: "StorageTypeProto" integer: "2" has been removed, but is > not reserved [ScmServerDatanodeHeartbeatProtocol.proto] > > [ERROR] CONFLICT: "StorageTypeProto" integer: "3" has been removed, but is > not reserved [ScmServerDatanodeHeartbeatProtocol.proto] > > [ERROR] CONFLICT: "StorageTypeProto" integer: "4" has been removed, but is > not reserved [ScmServerDatanodeHeartbeatProtocol.proto] > > [ERROR] CONFLICT: "StorageTypeProto" integer: "5" has been removed, but is > not reserved [ScmServerDatanodeHeartbeatProtocol.proto] > > ``` > > > > > ## My question > > - Will there be any compatibility issues after moving enum > `StorageTypeProto` from `ScmServerDatanodeHeartbeatProtocol.proto` to > `hdds.proto` and standardize, and change all the places where > `StorageTypeProto` is used in the existing protobuf to > `hdds.proto#StorageTypeProto`? > > - According to my tests, when I add the compile flag > `-DallowBreakingChanges=true` to bypass the errors, old clients can still > successfully execute create/list bucket operations. > > - As I understand it, the `field id` of a protobuf enum is what matters, > as the `id` is the valid payload, while changes to the enum's field names > or the package in which the enum is defined should not cause compatibility > issues (though we will need to update the relevant Java code to reflect > these changes). > > > > > - If this does not cause compatibility issues, how should I handle the > errors reported by `proto-backwards-compatibility`? > > >