Avoid frivolous GetObjectMetadata() calls at driver level, return back all the information in donut ListObjects()

This commit is contained in:
Harshavardhana
2015-06-29 10:59:27 -07:00
parent f05ad062ee
commit 6921328b93
4 changed files with 66 additions and 57 deletions

View File

@@ -448,6 +448,12 @@ func (d donutDriver) GetObjectMetadata(bucketName, objectName string) (drivers.O
return objectMetadata, nil
}
type byObjectName []drivers.ObjectMetadata
func (b byObjectName) Len() int { return len(b) }
func (b byObjectName) Swap(i, j int) { b[i], b[j] = b[j], b[i] }
func (b byObjectName) Less(i, j int) bool { return b[i].Key < b[j].Key }
// ListObjects - returns list of objects
func (d donutDriver) ListObjects(bucketName string, resources drivers.BucketResourcesMetadata) ([]drivers.ObjectMetadata, drivers.BucketResourcesMetadata, error) {
d.lock.RLock()
@@ -470,23 +476,18 @@ func (d donutDriver) ListObjects(bucketName string, resources drivers.BucketReso
}
resources.CommonPrefixes = listObjects.CommonPrefixes
resources.IsTruncated = listObjects.IsTruncated
if resources.IsTruncated && resources.IsDelimiterSet() {
resources.NextMarker = listObjects.Objects[len(listObjects.Objects)-1]
}
// make sure to keep the lexical order same as returned by donut
// we do not have to sort here again
results := make([]drivers.ObjectMetadata, len(listObjects.Objects))
for i, objectName := range listObjects.Objects {
objectMetadata, err := d.donut.GetObjectMetadata(bucketName, objectName)
if err != nil {
return nil, drivers.BucketResourcesMetadata{}, iodine.New(err, errParams)
}
var results []drivers.ObjectMetadata
for _, objMetadata := range listObjects.Objects {
metadata := drivers.ObjectMetadata{
Key: objectMetadata.Object,
Created: objectMetadata.Created,
Size: objectMetadata.Size,
Key: objMetadata.Object,
Created: objMetadata.Created,
Size: objMetadata.Size,
}
results[i] = metadata
results = append(results, metadata)
}
sort.Sort(byObjectName(results))
if resources.IsTruncated && resources.IsDelimiterSet() {
resources.NextMarker = results[len(results)-1].Key
}
return results, resources, nil
}