[
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]