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

Manoj Govindassamy updated HDFS-12201:
--------------------------------------
    Description: 
Problem: When an external INodeAttributesProvider is enabled, SnapshotDiff is 
not detecting changes in files when the external ACL/XAttr attributes change. 

{{FileWithSnapshotFeature#changedBetweenSnapshots()}} when trying to detect 
changes in snapshots for the given file, does meta data comparison which takes 
in the attributes retrieved from {{INode#getSnapshotINode()}}

{{INodeFile}}
{noformat}
  @Override
  public INodeFileAttributes getSnapshotINode(final int snapshotId) {
    FileWithSnapshotFeature sf = this.getFileWithSnapshotFeature();
    if (sf != null) {
      return sf.getDiffs().getSnapshotINode(snapshotId, this);
    } else {
      return this;
    }
  }
{noformat}

{{AbstractINodeDiffList#getSnapshotINode}}
{noformat}
  public A getSnapshotINode(final int snapshotId, final A currentINode) {
    final D diff = getDiffById(snapshotId);
    final A inode = diff == null? null: diff.getSnapshotINode();
    return inode == null? currentINode: inode;
  }
{noformat}

But, INodeFile, INodeDirectory #getSnapshotINode() returns the current INode's 
local INodeAttributes if there is anything available for the given snapshot id. 
When there is an INodeAttributesProvider configured, attributes provided by the 
external provider could be different from the local. But, getSnapshotINode() 
always returns the local attributes without retrieving them from attributes 
provider. 

  was:
{{INodeFile}}
{noformat}
  @Override
  public INodeFileAttributes getSnapshotINode(final int snapshotId) {
    FileWithSnapshotFeature sf = this.getFileWithSnapshotFeature();
    if (sf != null) {
      return sf.getDiffs().getSnapshotINode(snapshotId, this);
    } else {
      return this;
    }
  }
{noformat}

{{AbstractINodeDiffList#getSnapshotINode}}
{noformat}
  public A getSnapshotINode(final int snapshotId, final A currentINode) {
    final D diff = getDiffById(snapshotId);
    final A inode = diff == null? null: diff.getSnapshotINode();
    return inode == null? currentINode: inode;
  }
{noformat}

INodeFile, INodeDirectory #getSnapshotINode() returns the current INode's local 
INodeAttributes if there is anything available for the given snapshot id. When 
there is an INodeAttributesProvider configured, attributes are retrieved from 
this external provider instead of the local. But, getSnapshotINode always 
returns the local attributes without retrieving them from attributes provider. 





Thanks [~daryn] for the comment. Updated the description with problem 
statement. Please take a look. The problem boils down to the expectation for 
Snapshot Diff when there is an external attributes provider configured. Should 
the diff be w.r.t to local attributes or include the external attributes as 
well. Your thoughts are welcome.

> INode#getSnapshotINode() should get INodeAttributes from 
> INodeAttributesProvider for the current INode
> ------------------------------------------------------------------------------------------------------
>
>                 Key: HDFS-12201
>                 URL: https://issues.apache.org/jira/browse/HDFS-12201
>             Project: Hadoop HDFS
>          Issue Type: Bug
>          Components: snapshots
>    Affects Versions: 2.8.0
>            Reporter: Manoj Govindassamy
>            Assignee: Manoj Govindassamy
>
> Problem: When an external INodeAttributesProvider is enabled, SnapshotDiff is 
> not detecting changes in files when the external ACL/XAttr attributes change. 
> {{FileWithSnapshotFeature#changedBetweenSnapshots()}} when trying to detect 
> changes in snapshots for the given file, does meta data comparison which 
> takes in the attributes retrieved from {{INode#getSnapshotINode()}}
> {{INodeFile}}
> {noformat}
>   @Override
>   public INodeFileAttributes getSnapshotINode(final int snapshotId) {
>     FileWithSnapshotFeature sf = this.getFileWithSnapshotFeature();
>     if (sf != null) {
>       return sf.getDiffs().getSnapshotINode(snapshotId, this);
>     } else {
>       return this;
>     }
>   }
> {noformat}
> {{AbstractINodeDiffList#getSnapshotINode}}
> {noformat}
>   public A getSnapshotINode(final int snapshotId, final A currentINode) {
>     final D diff = getDiffById(snapshotId);
>     final A inode = diff == null? null: diff.getSnapshotINode();
>     return inode == null? currentINode: inode;
>   }
> {noformat}
> But, INodeFile, INodeDirectory #getSnapshotINode() returns the current 
> INode's local INodeAttributes if there is anything available for the given 
> snapshot id. When there is an INodeAttributesProvider configured, attributes 
> provided by the external provider could be different from the local. But, 
> getSnapshotINode() always returns the local attributes without retrieving 
> them from attributes provider. 



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to