mirror of
https://github.com/minio/minio.git
synced 2025-11-09 05:34:56 -05:00
metacache: Allow prefix filtering (#10920)
Do listings with prefix filter when bloom filter is dirty. This will forward the prefix filter to the lister which will make it only scan the folders/objects with the specified prefix. If we have a clean bloom filter we try to build a more generally useful cache so in that case, we will list all objects/folders.
This commit is contained in:
@@ -47,6 +47,11 @@ type listPathOptions struct {
|
||||
// Scan/return only content with prefix.
|
||||
Prefix string
|
||||
|
||||
// FilterPrefix will return only results with this prefix when scanning.
|
||||
// Should never contain a slash.
|
||||
// Prefix should still be set.
|
||||
FilterPrefix string
|
||||
|
||||
// Marker to resume listing.
|
||||
// The response will be the first entry AFTER this object name.
|
||||
Marker string
|
||||
@@ -112,6 +117,7 @@ func (o listPathOptions) newMetacache() metacache {
|
||||
startedCycle: o.CurrentCycle,
|
||||
endedCycle: 0,
|
||||
dataVersion: metacacheStreamVersion,
|
||||
filter: o.FilterPrefix,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -279,6 +285,28 @@ func (o *listPathOptions) objectPath(block int) string {
|
||||
return pathJoin(metacachePrefixForID(o.Bucket, o.ID), "block-"+strconv.Itoa(block)+".s2")
|
||||
}
|
||||
|
||||
func (o *listPathOptions) SetFilter() {
|
||||
switch {
|
||||
case metacacheSharePrefix:
|
||||
return
|
||||
case o.CurrentCycle != o.OldestCycle:
|
||||
// We have a clean bloom filter
|
||||
return
|
||||
case o.Prefix == o.BaseDir:
|
||||
// No additional prefix
|
||||
return
|
||||
}
|
||||
// Remove basedir.
|
||||
o.FilterPrefix = strings.TrimPrefix(o.Prefix, o.BaseDir)
|
||||
// Remove leading and trailing slashes.
|
||||
o.FilterPrefix = strings.Trim(o.FilterPrefix, slashSeparator)
|
||||
|
||||
if strings.Contains(o.FilterPrefix, slashSeparator) {
|
||||
// Sanity check, should not happen.
|
||||
o.FilterPrefix = ""
|
||||
}
|
||||
}
|
||||
|
||||
// filter will apply the options and return the number of objects requested by the limit.
|
||||
// Will return io.EOF if there are no more entries with the same filter.
|
||||
// The last entry can be used as a marker to resume the listing.
|
||||
@@ -604,7 +632,11 @@ func (er *erasureObjects) listPath(ctx context.Context, o listPathOptions) (entr
|
||||
}
|
||||
// Send request to each disk.
|
||||
go func() {
|
||||
err := d.WalkDir(ctx, WalkDirOptions{Bucket: o.Bucket, BaseDir: o.BaseDir, Recursive: o.Recursive || o.Separator != SlashSeparator}, w)
|
||||
err := d.WalkDir(ctx, WalkDirOptions{
|
||||
Bucket: o.Bucket,
|
||||
BaseDir: o.BaseDir,
|
||||
Recursive: o.Recursive || o.Separator != SlashSeparator,
|
||||
FilterPrefix: o.FilterPrefix}, w)
|
||||
w.CloseWithError(err)
|
||||
if err != io.EOF {
|
||||
logger.LogIf(ctx, err)
|
||||
|
||||
Reference in New Issue
Block a user