/// <summary>Set xattr for a file or directory.</summary> /// <param name="src">- path on which it sets the xattr</param> /// <param name="xAttr">- xAttr details to set</param> /// <param name="flag">- xAttrs flags</param> /// <exception cref="System.IO.IOException"/> internal static HdfsFileStatus SetXAttr(FSDirectory fsd, string src, XAttr xAttr, EnumSet <XAttrSetFlag> flag, bool logRetryCache) { CheckXAttrsConfigFlag(fsd); CheckXAttrSize(fsd, xAttr); FSPermissionChecker pc = fsd.GetPermissionChecker(); XAttrPermissionFilter.CheckPermissionForApi(pc, xAttr, FSDirectory.IsReservedRawName (src)); byte[][] pathComponents = FSDirectory.GetPathComponentsForReservedPath(src); src = fsd.ResolvePath(pc, src, pathComponents); IList <XAttr> xAttrs = Lists.NewArrayListWithCapacity(1); xAttrs.AddItem(xAttr); INodesInPath iip; fsd.WriteLock(); try { iip = fsd.GetINodesInPath4Write(src); CheckXAttrChangeAccess(fsd, iip, xAttr, pc); UnprotectedSetXAttrs(fsd, src, xAttrs, flag); } finally { fsd.WriteUnlock(); } fsd.GetEditLog().LogSetXAttrs(src, xAttrs, logRetryCache); return(fsd.GetAuditFileInfo(iip)); }
/// <exception cref="System.IO.IOException"/> internal static IList <XAttr> GetXAttrs(FSDirectory fsd, string srcArg, IList <XAttr > xAttrs) { string src = srcArg; CheckXAttrsConfigFlag(fsd); FSPermissionChecker pc = fsd.GetPermissionChecker(); bool isRawPath = FSDirectory.IsReservedRawName(src); bool getAll = xAttrs == null || xAttrs.IsEmpty(); if (!getAll) { XAttrPermissionFilter.CheckPermissionForApi(pc, xAttrs, isRawPath); } byte[][] pathComponents = FSDirectory.GetPathComponentsForReservedPath(src); src = fsd.ResolvePath(pc, src, pathComponents); INodesInPath iip = fsd.GetINodesInPath(src, true); if (fsd.IsPermissionEnabled()) { fsd.CheckPathAccess(pc, iip, FsAction.Read); } IList <XAttr> all = FSDirXAttrOp.GetXAttrs(fsd, src); IList <XAttr> filteredAll = XAttrPermissionFilter.FilterXAttrsForApi(pc, all, isRawPath ); if (getAll) { return(filteredAll); } if (filteredAll == null || filteredAll.IsEmpty()) { return(null); } IList <XAttr> toGet = Lists.NewArrayListWithCapacity(xAttrs.Count); foreach (XAttr xAttr in xAttrs) { bool foundIt = false; foreach (XAttr a in filteredAll) { if (xAttr.GetNameSpace() == a.GetNameSpace() && xAttr.GetName().Equals(a.GetName( ))) { toGet.AddItem(a); foundIt = true; break; } } if (!foundIt) { throw new IOException("At least one of the attributes provided was not found."); } } return(toGet); }
/// <exception cref="System.IO.IOException"/> internal static IList <XAttr> ListXAttrs(FSDirectory fsd, string src) { FSDirXAttrOp.CheckXAttrsConfigFlag(fsd); FSPermissionChecker pc = fsd.GetPermissionChecker(); bool isRawPath = FSDirectory.IsReservedRawName(src); byte[][] pathComponents = FSDirectory.GetPathComponentsForReservedPath(src); src = fsd.ResolvePath(pc, src, pathComponents); INodesInPath iip = fsd.GetINodesInPath(src, true); if (fsd.IsPermissionEnabled()) { /* To access xattr names, you need EXECUTE in the owning directory. */ fsd.CheckParentAccess(pc, iip, FsAction.Execute); } IList <XAttr> all = FSDirXAttrOp.GetXAttrs(fsd, src); return(XAttrPermissionFilter.FilterXAttrsForApi(pc, all, isRawPath)); }
/// <summary>Remove an xattr for a file or directory.</summary> /// <param name="src">- path to remove the xattr from</param> /// <param name="xAttr">- xAttr to remove</param> /// <exception cref="System.IO.IOException"/> internal static HdfsFileStatus RemoveXAttr(FSDirectory fsd, string src, XAttr xAttr , bool logRetryCache) { FSDirXAttrOp.CheckXAttrsConfigFlag(fsd); FSPermissionChecker pc = fsd.GetPermissionChecker(); XAttrPermissionFilter.CheckPermissionForApi(pc, xAttr, FSDirectory.IsReservedRawName (src)); byte[][] pathComponents = FSDirectory.GetPathComponentsForReservedPath(src); IList <XAttr> xAttrs = Lists.NewArrayListWithCapacity(1); xAttrs.AddItem(xAttr); INodesInPath iip; fsd.WriteLock(); try { src = fsd.ResolvePath(pc, src, pathComponents); iip = fsd.GetINodesInPath4Write(src); CheckXAttrChangeAccess(fsd, iip, xAttr, pc); IList <XAttr> removedXAttrs = UnprotectedRemoveXAttrs(fsd, src, xAttrs); if (removedXAttrs != null && !removedXAttrs.IsEmpty()) { fsd.GetEditLog().LogRemoveXAttrs(src, removedXAttrs, logRetryCache); } else { throw new IOException("No matching attributes found for remove operation"); } } finally { fsd.WriteUnlock(); } return(fsd.GetAuditFileInfo(iip)); }