mirror of
https://github.com/minio/minio.git
synced 2025-11-20 09:56:07 -05:00
re-implement data usage crawler to be more efficient (#9075)
Implementation overview: https://gist.github.com/klauspost/1801c858d5e0df391114436fdad6987b
This commit is contained in:
@@ -17,7 +17,6 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"context"
|
||||
"crypto/tls"
|
||||
@@ -152,26 +151,25 @@ func (client *storageRESTClient) Hostname() string {
|
||||
return client.endpoint.Host
|
||||
}
|
||||
|
||||
func (client *storageRESTClient) CrawlAndGetDataUsage(endCh <-chan struct{}) (DataUsageInfo, error) {
|
||||
respBody, err := client.call(storageRESTMethodCrawlAndGetDataUsage, nil, nil, -1)
|
||||
func (client *storageRESTClient) CrawlAndGetDataUsage(ctx context.Context, cache dataUsageCache) (dataUsageCache, error) {
|
||||
b := cache.serialize()
|
||||
respBody, err := client.call(storageRESTMethodCrawlAndGetDataUsage,
|
||||
url.Values{},
|
||||
bytes.NewBuffer(b), int64(len(b)))
|
||||
defer http.DrainBody(respBody)
|
||||
if err != nil {
|
||||
return DataUsageInfo{}, err
|
||||
return cache, err
|
||||
}
|
||||
reader := bufio.NewReader(respBody)
|
||||
for {
|
||||
b, err := reader.ReadByte()
|
||||
if err != nil {
|
||||
return DataUsageInfo{}, err
|
||||
}
|
||||
if b != ' ' {
|
||||
reader.UnreadByte()
|
||||
break
|
||||
}
|
||||
reader, err := waitForHTTPResponse(respBody)
|
||||
if err != nil {
|
||||
return cache, err
|
||||
}
|
||||
var usageInfo DataUsageInfo
|
||||
err = gob.NewDecoder(reader).Decode(&usageInfo)
|
||||
return usageInfo, err
|
||||
b, err = ioutil.ReadAll(reader)
|
||||
if err != nil {
|
||||
return cache, err
|
||||
}
|
||||
var newCache dataUsageCache
|
||||
return newCache, newCache.deserialize(b)
|
||||
}
|
||||
|
||||
func (client *storageRESTClient) SetDiskID(id string) {
|
||||
@@ -418,7 +416,7 @@ func (client *storageRESTClient) DeleteFileBulk(volume string, paths []string) (
|
||||
return nil, err
|
||||
}
|
||||
|
||||
reader, err := clearLeadingSpaces(respBody)
|
||||
reader, err := waitForHTTPResponse(respBody)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -455,7 +453,7 @@ func (client *storageRESTClient) DeletePrefixes(volume string, paths []string) (
|
||||
return nil, err
|
||||
}
|
||||
|
||||
reader, err := clearLeadingSpaces(respBody)
|
||||
reader, err := waitForHTTPResponse(respBody)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -484,22 +482,6 @@ func (client *storageRESTClient) RenameFile(srcVolume, srcPath, dstVolume, dstPa
|
||||
return err
|
||||
}
|
||||
|
||||
// clearLeadingSpaces removes all the first spaces returned from a reader.
|
||||
func clearLeadingSpaces(r io.Reader) (io.Reader, error) {
|
||||
reader := bufio.NewReader(r)
|
||||
for {
|
||||
b, err := reader.ReadByte()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if b != ' ' {
|
||||
reader.UnreadByte()
|
||||
break
|
||||
}
|
||||
}
|
||||
return reader, nil
|
||||
}
|
||||
|
||||
func (client *storageRESTClient) VerifyFile(volume, path string, size int64, algo BitrotAlgorithm, sum []byte, shardSize int64) error {
|
||||
values := make(url.Values)
|
||||
values.Set(storageRESTVolume, volume)
|
||||
@@ -514,7 +496,7 @@ func (client *storageRESTClient) VerifyFile(volume, path string, size int64, alg
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
reader, err := clearLeadingSpaces(respBody)
|
||||
reader, err := waitForHTTPResponse(respBody)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user