Skip to content

Commit fa2fb1a

Browse files
committed
feat: add listobv1
1 parent ef7a391 commit fa2fb1a

File tree

2 files changed

+68
-6
lines changed

2 files changed

+68
-6
lines changed

cmd/bucket-listobjects-handlers.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,15 +403,24 @@ func (api objectAPIHandlers) ListObjectsV1Handler(w http.ResponseWriter, r *http
403403
}
404404

405405
listObjects := objectAPI.ListObjects
406-
406+
listObjectsCache := objectAPI.ListObjects
407+
if api.CacheAPI() != nil {
408+
listObjectsCache = api.CacheAPI().ListObjects
409+
}
407410
// Inititate a list objects operation based on the input params.
408411
// On success would return back ListObjectsInfo object to be
409412
// marshaled into S3 compatible XML header.
410413
listObjectsInfo, err := listObjects(ctx, bucket, prefix, marker, delimiter, maxKeys)
411-
if err != nil {
414+
listObjectsInfoCache, errC := listObjectsCache(ctx, bucket, prefix, marker, delimiter, maxKeys)
415+
if err != nil || errC != nil {
412416
writeErrorResponse(ctx, w, toAPIError(ctx, err), r.URL)
413417
return
414418
}
419+
mergeObjects := mergeListObjects(listObjectsInfo.Objects, listObjectsInfoCache.Objects)
420+
mergePrefixes := mergePrefixes(listObjectsInfo.Prefixes, listObjectsInfoCache.Prefixes)
421+
422+
listObjectsInfo.Objects = mergeObjects
423+
listObjectsInfo.Prefixes = mergePrefixes
415424

416425
concurrentDecryptETag(ctx, listObjectsInfo.Objects)
417426

cmd/disk-cache.go

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ type CacheObjectLayer interface {
8888
DeleteObjects(ctx context.Context, bucket string, objects []ObjectToDelete, opts ObjectOptions) ([]DeletedObject, []error)
8989
PutObject(ctx context.Context, bucket, object string, data *PutObjReader, opts ObjectOptions) (objInfo ObjectInfo, err error)
9090
CopyObject(ctx context.Context, srcBucket, srcObject, destBucket, destObject string, srcInfo ObjectInfo, srcOpts, dstOpts ObjectOptions) (objInfo ObjectInfo, err error)
91+
ListObjects(ctx context.Context, bucket, prefix, marker, delimiter string, maxKeys int) (result ListObjectsInfo, err error)
9192
ListObjectsV2(ctx context.Context, bucket, prefix, continuationToken, delimiter string, maxKeys int, fetchOwner bool, startAfter string) (result ListObjectsV2Info, err error)
9293
// Multipart operations.
9394
NewMultipartUpload(ctx context.Context, bucket, object string, opts ObjectOptions) (uploadID string, err error)
@@ -493,6 +494,57 @@ func (c *cacheObjects) CopyObject(ctx context.Context, srcBucket, srcObject, dst
493494
return copyObjectFn(ctx, srcBucket, srcObject, dstBucket, dstObject, srcInfo, srcOpts, dstOpts)
494495
}
495496

497+
// ListObjects from disk cache
498+
func (c *cacheObjects) ListObjects(ctx context.Context, bucket, prefix, marker, delimiter string, maxKeys int) (result ListObjectsInfo, err error) {
499+
objInfos := []ObjectInfo{}
500+
prefixes := []string{}
501+
for _, cache := range c.cache {
502+
dir := cache.dir
503+
fmt.Println("cache dirss", dir)
504+
filterFn := func(name string, typ os.FileMode) error {
505+
if name == minioMetaBucket {
506+
// Proceed to next file.
507+
return nil
508+
}
509+
cacheDir := pathJoin(cache.dir, name)
510+
fmt.Println("Harsh cachedirr", cacheDir)
511+
meta, _, _, err := cache.statCachedMeta(ctx, cacheDir)
512+
if err != nil {
513+
return nil
514+
}
515+
objInfo := meta.ToObjectInfo()
516+
if objInfo.Bucket == bucket {
517+
if strings.HasPrefix(objInfo.Name, prefix) {
518+
trimmed := strings.TrimPrefix(objInfo.Name, prefix)
519+
parts := strings.Split(trimmed, delimiter)
520+
if len(parts) > 0 && parts[0] != "" {
521+
if (len(objInfos) + len(prefixes)) < maxKeys {
522+
if len(parts) == 1 {
523+
// If there's only one part, it's a file
524+
objInfos = append(objInfos, objInfo)
525+
} else {
526+
// If there are more parts, it's a folder
527+
prefixes = append(prefixes, prefix+parts[0]+delimiter)
528+
}
529+
}
530+
}
531+
}
532+
}
533+
return nil
534+
}
535+
536+
if err := readDirFn(cache.dir, filterFn); err != nil {
537+
logger.LogIf(ctx, err)
538+
return ListObjectsInfo{}, err
539+
}
540+
}
541+
fmt.Println("Harsh ListObjectsInfo len from cache", len(objInfos))
542+
return ListObjectsInfo{
543+
Objects: objInfos,
544+
Prefixes: unique(prefixes),
545+
}, nil
546+
}
547+
496548
// ListObjectsV2 from disk cache
497549
func (c *cacheObjects) ListObjectsV2(ctx context.Context, bucket, prefix, continuationToken, delimiter string, maxKeys int, fetchOwner bool, startAfter string) (result ListObjectsV2Info, err error) {
498550
objInfos := []ObjectInfo{}
@@ -588,10 +640,10 @@ func (c *cacheObjects) skipCache() bool {
588640

589641
// Returns true if object should be excluded from cache
590642
func (c *cacheObjects) isCacheExclude(bucket, object string) bool {
591-
// exclude directories from cache
592-
if strings.HasSuffix(object, SlashSeparator) {
593-
return true
594-
}
643+
// uncomment this to exclude directories from cache
644+
// if strings.HasSuffix(object, SlashSeparator) {
645+
// return true
646+
// }
595647
for _, pattern := range c.exclude {
596648
matchStr := fmt.Sprintf("%s/%s", bucket, object)
597649
if ok := wildcard.MatchSimple(pattern, matchStr); ok {
@@ -718,6 +770,7 @@ func (c *cacheObjects) migrateCacheFromV1toV2(ctx context.Context) {
718770

719771
// PutObject - caches the uploaded object for single Put operations
720772
func (c *cacheObjects) PutObject(ctx context.Context, bucket, object string, r *PutObjReader, opts ObjectOptions) (objInfo ObjectInfo, err error) {
773+
fmt.Println("Object to be cached", object)
721774
putObjectFn := c.InnerPutObjectFn
722775
dcache, err := c.getCacheToLoc(ctx, bucket, object)
723776
if err != nil {

0 commit comments

Comments
 (0)