[ 
https://issues.apache.org/jira/browse/HDFS-1081?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Jakob Homan updated HDFS-1081:
------------------------------

    Attachment: HADOOP-1081-Y20-1.patch

Patch for review.

In our Y20S benchmarking, we saw dramatic increase for the getBlockLocations, 
due to two operations introduced by block access tokens:

*TokenIdentifier.getBytes() is expensive and is called twice*
In getFileBlockLocations TokenIdentifier.getBytes() is called twice in rapid 
succession: 
{code}
  // Token.java:50
  public Token(T id, SecretManager<T> mgr) {
    password = mgr.createPassword(id); // Calls id.getBytes()
    identifier = id.getBytes();                   // and here
{code}
This call is relatively expensive, as the BlockTokenIdentifier is serialized to 
a new DataOutPutBuffer and copied to a new array each time .  This patch caches 
the results of the getBytes() call and returns that, assuming no mutation to 
the token state.  

*For n blocks in a getBlockLocations() call, n block access tokens are created 
and each is relatively expensive*
In a call to getBlockLocations(), for every block that is returned, a new  
Token<BlockTokenIdentifier> is created and attached to the block.  Each new 
Token<BlockTokenIdentifier> means a call to hmac.DoFinal on the BTI's bytes.  
This call to the hmac calculation, which generates the token's password, turns 
out to be relatively expensive and was dramatically slowing down the function, 
particularly for files with large numbers of blocks.

This patch updates BlockTokenIdentifiers to be valid for a collection of 
blockIds rather than a single blockid.  This allows us to generate a single 
Token<BlockTokenIdentifier> for every call to getBlockLocations, calling the 
hmac function only once.  A quick benchmark of hmac.doFinal shows that its 
processing time is pretty much constant even for large byte arrays (by our 
standards for these tokens), meaning with this optimization, our time in hmac 
for n blocks should be constant.  This is a pretty surgical change and does not 
require much change to other parts of the Token authentication and 
authorization code.  For files with a small number of blocks there should be no 
penalty in performance.

> Performance regression in DistributedFileSystem::getFileBlockLocations in 
> secure systems
> ----------------------------------------------------------------------------------------
>
>                 Key: HDFS-1081
>                 URL: https://issues.apache.org/jira/browse/HDFS-1081
>             Project: Hadoop HDFS
>          Issue Type: Improvement
>          Components: security
>            Reporter: Jakob Homan
>            Assignee: Jakob Homan
>         Attachments: HADOOP-1081-Y20-1.patch
>
>
> We've seen a significant decrease in the performance of 
> DistributedFileSystem::getFileBlockLocations() with security turned on Y20. 
> This JIRA is for correcting and tracking it both on Y20 and trunk.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
https://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to