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

Andrew Wang commented on HDFS-11382:
------------------------------------

Hi Manoj, thanks for the rev! Looks like my last wave of comments were mostly 
addressed, a few follow-ups:

* FSDirWriteOp#addFileForEditLog and #addFile, would prefer that we set up the 
parameters for newINodeFile outside of the call, like how we set up 
{{blockType}}. This is a little cleaner.
* [~ehiggs] hasn't responded, but I'd like to remove {{blockType}} from the 
INodeFile PB definition since it looks extraneous to me, and is extra overhead. 
BlockType can remain as an in-memory abstraction.
* When reading and writing the fsimage, shouldn't we set replication XOR ec 
policy? This is in FSImageFormatPBINode. I'd also prefer we setup the 
parameters outside of the call, similar to above review comments
* FSImageFormatPBSnapshot, if we use the boxed Short and Byte, we can avoid the 
ternary checks right? Paranoia precondition checks are never a bad idea if you 
want to add some.
* INodeFile#DEFAULT_REPL_FOR_STRIPED_BLOCKS could use a javadoc comment, we can 
also explain why we chose "1" for the value
* It looks like we use {{getSysPoliciesMinID}} and {{MaxID}} to validate that 
the policy ID is valid; could we just check that {{getPolicyByPolicyID}} isn't 
null instead? I get that this is more efficient, but it's cleaner to use the 
helper function instead, and we can optimize the helper to use a hashtable 
later if this becomes a bottleneck.
* The new INodeFile header helpers look good, except it seems like we have some 
boiler plate now that callers need to do around blockType. I think what Zhe 
wanted was for callers to use a function like your {{getBlockLayoutRedundancy}} 
directly, which would in turn call into the more specific {{getContiguous}} and 
{{getStriped}} that would be the two halves of the {{blockType == STRIPED}} if 
statement currently in {{getBlockLayoutRedundancy}}. Hopefully that makes 
sense, I can provide a code snippet if it's unclear.

For the findbugs issue, we should add this to the hdfs findbugsExcludeFile.xml, 
and possibly a code comment near the signed OR for the future.

> Persist Erasure Coding Policy ID in a new optional field in INodeFile in 
> FSImage
> --------------------------------------------------------------------------------
>
>                 Key: HDFS-11382
>                 URL: https://issues.apache.org/jira/browse/HDFS-11382
>             Project: Hadoop HDFS
>          Issue Type: Task
>          Components: hdfs
>    Affects Versions: 3.0.0-alpha1
>            Reporter: Manoj Govindassamy
>            Assignee: Manoj Govindassamy
>         Attachments: HDFS-11382.01.patch, HDFS-11382.02.patch
>
>
> For Erasure Coded files, replication field in INodeFile message is re-used  
> to store the EC Policy ID. 
> *FSDirWriteFileOp#addFile*
> {noformat}
>   private static INodesInPath addFile(
>       FSDirectory fsd, INodesInPath existing, byte[] localName,
>       PermissionStatus permissions, short replication, long 
> preferredBlockSize,
>       String clientName, String clientMachine)
>       throws IOException {
>     .. .. ..
>     try {
>       ErasureCodingPolicy ecPolicy = FSDirErasureCodingOp.
>           getErasureCodingPolicy(fsd.getFSNamesystem(), existing);
>       if (ecPolicy != null) {
>         replication = ecPolicy.getId();   <===
>       }
>       final BlockType blockType = ecPolicy != null?
>           BlockType.STRIPED : BlockType.CONTIGUOUS;
>       INodeFile newNode = newINodeFile(fsd.allocateNewInodeId(), permissions,
>           modTime, modTime, replication, preferredBlockSize, blockType);
>       newNode.setLocalName(localName);
>       newNode.toUnderConstruction(clientName, clientMachine);
>       newiip = fsd.addINode(existing, newNode, permissions.getPermission());
> {noformat}
> With HDFS-11268 fix, {{FSImageFormatPBINode#Loader#loadInodeFile}} is rightly 
> getting the EC ID from the replication field and then uses the right Policy 
> to construct the blocks.
> *FSImageFormatPBINode#Loader#loadInodeFile*
> {noformat}
>       ErasureCodingPolicy ecPolicy = (blockType == BlockType.STRIPED) ?
>           ErasureCodingPolicyManager.getPolicyByPolicyID((byte) replication) :
>           null;
> {noformat}
> The original intention was to re-use the replication field so the in-memory 
> representation would be compact. But, this isn't necessary for the on-disk 
> representation. replication is an optional field, and if we add another 
> optional field for the EC policy, it won't be any extra space.
> Also, we need to make sure to have the appropriate asserts in place to make 
> sure both fields aren't set for the same INodeField.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

---------------------------------------------------------------------
To unsubscribe, e-mail: hdfs-issues-unsubscr...@hadoop.apache.org
For additional commands, e-mail: hdfs-issues-h...@hadoop.apache.org

Reply via email to