in component/azstorage/datalake.go [379:451]
func (dl *Datalake) GetAttr(name string) (blobAttr *internal.ObjAttr, err error) {
log.Trace("Datalake::GetAttr : name %s", name)
fileClient := dl.Filesystem.NewFileClient(filepath.Join(dl.Config.prefixPath, name))
prop, err := fileClient.GetProperties(context.Background(), &file.GetPropertiesOptions{
CPKInfo: dl.datalakeCPKOpt,
})
if err != nil {
e := storeDatalakeErrToErr(err)
if e == ErrFileNotFound {
return blobAttr, syscall.ENOENT
} else if e == InvalidPermission {
log.Err("Datalake::GetAttr : Insufficient permissions for %s [%s]", name, err.Error())
return blobAttr, syscall.EACCES
} else {
log.Err("Datalake::GetAttr : Failed to get path properties for %s [%s]", name, err.Error())
return blobAttr, err
}
}
mode, err := getFileMode(*prop.Permissions)
if err != nil {
log.Err("Datalake::GetAttr : Failed to get file mode for %s [%s]", name, err.Error())
return blobAttr, err
}
blobAttr = &internal.ObjAttr{
Path: name,
Name: filepath.Base(name),
Size: *prop.ContentLength,
Mode: mode,
Mtime: *prop.LastModified,
Atime: *prop.LastModified,
Ctime: *prop.LastModified,
Crtime: *prop.LastModified,
Flags: internal.NewFileBitMap(),
ETag: sanitizeEtag(prop.ETag),
}
parseMetadata(blobAttr, prop.Metadata)
if *prop.ResourceType == "directory" {
blobAttr.Flags = internal.NewDirBitMap()
blobAttr.Mode = blobAttr.Mode | os.ModeDir
}
if dl.Config.honourACL && dl.Config.authConfig.ObjectID != "" {
acl, err := fileClient.GetAccessControl(context.Background(), nil)
if err != nil {
// Just ignore the error here as rest of the attributes have been retrieved
log.Err("Datalake::GetAttr : Failed to get ACL for %s [%s]", name, err.Error())
} else {
mode, err := getFileModeFromACL(dl.Config.authConfig.ObjectID, *acl.ACL, *acl.Owner)
if err != nil {
log.Err("Datalake::GetAttr : Failed to get file mode from ACL for %s [%s]", name, err.Error())
} else {
blobAttr.Mode = mode
}
}
}
if dl.Config.filter != nil {
if !dl.Config.filter.IsAcceptable(&blobfilter.BlobAttr{
Name: blobAttr.Name,
Mtime: blobAttr.Mtime,
Size: blobAttr.Size,
}) {
log.Debug("Datalake::GetAttr : Filtered out %s", name)
return nil, syscall.ENOENT
}
}
return blobAttr, nil
}