[ 
https://issues.apache.org/jira/browse/HDFS-4403?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13554527#comment-13554527
 ] 

Todd Lipcon commented on HDFS-4403:
-----------------------------------

bq. new client talks to old server: new clients infers the checksum type by 
reading first byte

If you mark it 'required', then the new client will fail to deserialize a 
response from an old server, due to the missing field. To verify this, I 
changed my test protobuf above to make the field required, and tried to 
deserialize a byte array which didn't include the field using 
MyTestProto.parseFrom. It threw "InvalidProtocolBufferException: Message 
missing required fields: testField"

BTW, the protobuf guide also talks about this specific case of changing the 
default:
{quote}
Changing a default value is generally OK, as long as you remember that default 
values are never sent over the wire. Thus, if a program receives a message in 
which a particular field isn't set, the program will see the default value as 
it was defined in that program's version of the protocol. It will NOT see the 
default value that was defined in the sender's code.
{quote}
                
> DFSClient can infer checksum type when not provided by reading first byte
> -------------------------------------------------------------------------
>
>                 Key: HDFS-4403
>                 URL: https://issues.apache.org/jira/browse/HDFS-4403
>             Project: Hadoop HDFS
>          Issue Type: Bug
>          Components: hdfs-client
>    Affects Versions: 2.0.2-alpha
>            Reporter: Todd Lipcon
>            Assignee: Todd Lipcon
>            Priority: Minor
>         Attachments: hdfs-4403.txt
>
>
> HDFS-3177 added the checksum type to OpBlockChecksumResponseProto, but the 
> new protobuf field is optional, with a default of CRC32. This means that this 
> API, when used against an older cluster (like earlier 0.23 releases) will 
> falsely return CRC32 even if that cluster has written files with CRC32C. This 
> can cause issues for distcp, for example.
> Instead of defaulting the protobuf field to CRC32, we can leave it with no 
> default, and if the OpBlockChecksumResponseProto has no checksum type set, 
> the client can send OP_READ_BLOCK to read the first byte of the block, then 
> grab the checksum type out of that response (which has always been present)

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to