[
https://issues.apache.org/jira/browse/HDFS-10759?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Ewan Higgs updated HDFS-10759:
------------------------------
Attachment: HDFS-10759.0002.patch
Attached is HDFS-10759.0002.patch which will make this change backwards
compatible to the existing {{boolean isStriped}} in the {{fsimage}}. This is
done by making the {{BlockType}} enum work with {{CONTIGUOUS=0, STRIPED=1}} as
this mirrors the boolean behaviour.
As both the boolean and the enum are optional, they are usually left out of the
wire protocol. If they are explicitly set then they will have the same semantic
values on the wire now.
Given the following messages:
{code}
/**
* Types of recognized blocks.
*/
enum BlockTypeProto {
CONTIGUOUS = 0;
STRIPED = 1;
}
message INodeFile {
optional uint32 replication = 1;
optional uint64 modificationTime = 2;
optional uint64 accessTime = 3;
optional uint64 preferredBlockSize = 4;
optional fixed64 permission = 5;
repeated BlockProto blocks = 6;
optional FileUnderConstructionFeature fileUC = 7;
optional AclFeatureProto acl = 8;
optional XAttrFeatureProto xAttrs = 9;
optional uint32 storagePolicyID = 10;
optional BlockTypeProto blockType = 11;
}
/* ehiggs - old style using bool blockType */
message INodeFileOld {
optional uint32 replication = 1;
optional uint64 modificationTime = 2;
optional uint64 accessTime = 3;
optional uint64 preferredBlockSize = 4;
optional fixed64 permission = 5;
repeated BlockProto blocks = 6;
optional FileUnderConstructionFeature fileUC = 7;
optional AclFeatureProto acl = 8;
optional XAttrFeatureProto xAttrs = 9;
optional uint32 storagePolicyID = 10;
optional bool isStriped = 11;
}
{code}
We can then see that these serialise as the same values:
{code}
In [1]: import fsimage_pb2
In [2]: f_enum = fsimage_pb2.INodeSection.INodeFile()
In [3]: f_bool = fsimage_pb2.INodeSection.INodeFileOld()
In [4]: f_enum.SerializeToString() # Wire format of entirely optional message.
Empty!
Out[4]: ''
In [5]: f_bool.SerializeToString() # With a bool, everything is still empty. No
surprises.
Out[5]: ''
In [6]: f_enum.blockType = 0
In [7]: f_bool.isStriped = False
In [8]: f_enum.SerializeToString() # wire format of explicit
BlockType.CONTIGUOUS
Out[8]: 'X\x00'
In [9]: f_bool.SerializeToString() # wire format of explicit false
Out[9]: 'X\x00'
In [10]: f_enum.blockType = 1 # Set explicity to STRIPED
In [11]: f_bool.isStriped = True # turn isStriped to True.
In [12]: f_enum.SerializeToString()
Out[12]: 'X\x01'
In [13]: f_bool.SerializeToString()
Out[13]: 'X\x01'
{code}
> Change fsimage bool isStriped from boolean to an enum
> -----------------------------------------------------
>
> Key: HDFS-10759
> URL: https://issues.apache.org/jira/browse/HDFS-10759
> Project: Hadoop HDFS
> Issue Type: Bug
> Components: hdfs
> Affects Versions: 3.0.0-alpha1, 3.0.0-beta1, 3.0.0-alpha2
> Reporter: Ewan Higgs
> Labels: hdfs-ec-3.0-must-do
> Attachments: HDFS-10759.0001.patch, HDFS-10759.0002.patch
>
>
> The new erasure coding project has updated the protocol for fsimage such that
> the {{INodeFile}} has a boolean '{{isStriped}}'. I think this is better as an
> enum or integer since a boolean precludes any future block types.
> For example:
> {code}
> enum BlockType {
> CONTIGUOUS = 0,
> STRIPED = 1,
> }
> {code}
> We can also make this more robust to future changes where there are different
> block types supported in a staged rollout. Here, we would use
> {{UNKNOWN_BLOCK_TYPE}} as the first value since this is the default value.
> See
> [here|http://androiddevblog.com/protocol-buffers-pitfall-adding-enum-values/]
> for more discussion.
> {code}
> enum BlockType {
> UNKNOWN_BLOCK_TYPE = 0,
> CONTIGUOUS = 1,
> STRIPED = 2,
> }
> {code}
> But I'm not convinced this is necessary since there are other enums that
> don't use this approach.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]