Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change package for art #162

Open
wants to merge 8 commits into
base: feat/enterprise-blobber
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
81 changes: 38 additions & 43 deletions cmd/disk-cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
"sync/atomic"
"time"

"github.com/armon/go-radix"
objectlock "github.com/minio/minio/internal/bucket/object/lock"
"github.com/minio/minio/internal/color"
"github.com/minio/minio/internal/config/cache"
Expand All @@ -39,7 +40,6 @@ import (
"github.com/minio/minio/internal/logger"
"github.com/minio/minio/internal/sync/errgroup"
"github.com/minio/pkg/wildcard"
art "github.com/plar/go-adaptive-radix-tree"
)

const (
Expand Down Expand Up @@ -180,7 +180,7 @@ func (c *cacheObjects) updateMetadataIfChanged(ctx context.Context, dcache *disk
func (c *cacheObjects) DeleteObject(ctx context.Context, bucket, object string, opts ObjectOptions) (objInfo ObjectInfo, err error) {
// delete from backend and then delete from cache always
objInfoB, errB := c.InnerDeleteObjectFn(ctx, bucket, object, opts)

log.Println("delete object from cache", bucket, object)
if c.isCacheExclude(bucket, object) || c.skipCache() {
return
}
Expand Down Expand Up @@ -501,7 +501,6 @@ func (c *cacheObjects) CopyObject(ctx context.Context, srcBucket, srcObject, dst

// ListObjects from disk cache
func (c *cacheObjects) ListObjects(ctx context.Context, bucket, prefix, marker, delimiter string, maxKeys int) (result ListObjectsInfo, err error) {
log.Printf("listobject cache prefix %s marker %s delim %s maxkey %d \n", prefix, marker, delimiter, maxKeys)
objInfos := []ObjectInfo{}
prefixes := map[string]bool{}

Expand Down Expand Up @@ -530,32 +529,30 @@ func (c *cacheObjects) ListObjects(ctx context.Context, bucket, prefix, marker,
rootprefix := bucket + "/" + prefix
rootMarker := bucket + "/" + marker
objectCount := 0
leafFilter := func(n art.Node) bool {
if n.Kind() == art.Leaf {
if strings.HasPrefix(string(n.Key()), rootprefix) {
if marker == "" || string(n.Key()) > rootMarker {
trimmed := strings.TrimPrefix(string(n.Key()), rootprefix)
parts := strings.Split(trimmed, delimiter)
if len(parts) > 0 && parts[0] != "" {
if (len(objInfos) + len(prefixes)) < maxKeys {
if len(parts) == 1 {
ob, ok := n.Value().(ObjectInfo)
if ok {
objInfos = append(objInfos, ob)
}
} else if delimiter != "" {
dir := prefix + parts[0] + delimiter
if marker == "" || dir > marker {
prefixes[dir] = true
}
leafFilter := func(key string, value any) bool {
if strings.HasPrefix(key, rootprefix) {
if marker == "" || key > rootMarker {
trimmed := strings.TrimPrefix(key, rootprefix)
parts := strings.Split(trimmed, delimiter)
if len(parts) > 0 && parts[0] != "" {
if (len(objInfos) + len(prefixes)) < maxKeys {
if len(parts) == 1 {
ob, ok := value.(ObjectInfo)
if ok {
objInfos = append(objInfos, ob)
}
} else if delimiter != "" {
dir := prefix + parts[0] + delimiter
if marker == "" || dir > marker {
prefixes[dir] = true
}
}
}
objectCount++
}
objectCount++
}
}
return true
return false
}
c.prefixSearch(rootprefix, leafFilter)
var uPrefixes []string
Expand All @@ -566,20 +563,21 @@ func (c *cacheObjects) ListObjects(ctx context.Context, bucket, prefix, marker,
if objectCount > maxKeys {
isTruncated = true
}
log.Printf("listobject cache prefix %s marker %s delim %s maxkey %d result %d \n", prefix, marker, delimiter, maxKeys, len(objInfos))
return ListObjectsInfo{
Objects: objInfos,
Prefixes: unique(uPrefixes),
IsTruncated: isTruncated,
}, nil
}

func (c *cacheObjects) prefixSearch(rootprefix string, leafFilter art.Callback) {
defer func() {
if r := recover(); r != nil {
log.Println("recovered from panic from list tree listobj")
}
}()
c.listTree.ForEachPrefix([]byte(rootprefix), leafFilter)
func (c *cacheObjects) prefixSearch(rootprefix string, leafFilter radix.WalkFn) {
// defer func() {
// if r := recover(); r != nil {
// log.Println("recovered from panic from list tree listobj")
// }
// }()
c.listTree.ForEachPrefix(rootprefix, leafFilter)
}

func (c *cacheObjects) ListObjectsV2(ctx context.Context, bucket, prefix, continuationToken, delimiter string, maxKeys int, fetchOwner bool, startAfter string) (result ListObjectsV2Info, err error) {
Expand Down Expand Up @@ -851,10 +849,11 @@ func (c *cacheObjects) PutObject(ctx context.Context, bucket, object string, r *
return ObjectInfo{}, err
}
objPath := oi.Bucket + "/" + oi.Name
c.listTree.Insert([]byte(objPath), oi)
c.listTree.Insert(objPath, oi)
coi := oi.Clone()
//go c.uploadObject(GlobalContext, oi) // use schedule to upload in batch
select {
case c.writeBackInputCh <- oi:
case c.writeBackInputCh <- coi:
default:
}
return oi, nil
Expand Down Expand Up @@ -988,12 +987,12 @@ func (c *cacheObjects) uploadObject(ctx context.Context, oi ObjectInfo) {
}

func (c *cacheObjects) deleteFromListTree(key string) {
defer func() {
if r := recover(); r != nil {
log.Println("Recovered from panic from list tree delete")
}
}()
c.listTree.Delete([]byte(key))
// defer func() {
// if r := recover(); r != nil {
// log.Println("Recovered from panic from list tree delete")
// }
// }()
c.listTree.Delete(key)
}

func (c *cacheObjects) queueWritebackRetry(oi ObjectInfo) {
Expand All @@ -1015,10 +1014,6 @@ func newServerCacheObjects(ctx context.Context, config cache.Config) (CacheObjec
if err != nil {
return nil, err
}
uploadGoPool, err := ants.NewMultiPool(10, 40, ants.RoundRobin)
if err != nil {
return nil, err
}

c := &cacheObjects{
cache: cache,
Expand Down Expand Up @@ -1174,7 +1169,7 @@ func (c *cacheObjects) recreateListTreeOnStartUp() {
if !ok || status == CommitComplete.String() {
return nil
}
c.listTree.Insert([]byte(objInfo.Bucket+"/"+objInfo.Name), objInfo)
c.listTree.Insert(objInfo.Bucket+"/"+objInfo.Name, objInfo)
return nil
}

Expand Down
3 changes: 3 additions & 0 deletions cmd/gateway/zcn/gateway-zcn.go
Original file line number Diff line number Diff line change
Expand Up @@ -461,12 +461,14 @@ func (zob *zcnObjects) ListObjects(ctx context.Context, bucket, prefix, marker,
ref, err = getSingleRegularRef(zob.alloc, remotePath)
if err != nil {
if isPathNoExistError(err) {
log.Println("path does not exist: ", remotePath)
return result, nil
}
return
}

if ref.Type == fileType {
log.Println("path is file: ", remotePath)
if strings.HasSuffix(prefix, "/") {
return minio.ListObjectsInfo{
IsTruncated: false,
Expand Down Expand Up @@ -561,6 +563,7 @@ func (zob *zcnObjects) ListObjects(ctx context.Context, bucket, prefix, marker,
result.NextMarker = nextMarker
result.Objects = objects
result.Prefixes = prefixes
log.Printf("listobject cache prefix %s marker %s delim %s maxkey %d result %d \n", prefix, marker, delimiter, maxKeys, len(objects))
return
}

Expand Down
14 changes: 7 additions & 7 deletions cmd/thread-safe-list-tree.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,32 @@ package cmd
import (
"sync"

art "github.com/plar/go-adaptive-radix-tree"
"github.com/armon/go-radix"
)

type ThreadSafeListTree struct {
tree art.Tree
tree *radix.Tree
mu sync.RWMutex
}

func newThreadSafeListTree() *ThreadSafeListTree {
return &ThreadSafeListTree{tree: art.New()}
return &ThreadSafeListTree{tree: radix.New()}
}

func (t *ThreadSafeListTree) Insert(key art.Key, value art.Value) (oldValue art.Value, updated bool) {
func (t *ThreadSafeListTree) Insert(key string, value any) (any, bool) {
t.mu.Lock()
defer t.mu.Unlock()
return t.tree.Insert(key, value)
}

func (t *ThreadSafeListTree) Delete(key art.Key) (value art.Value, deleted bool) {
func (t *ThreadSafeListTree) Delete(key string) (any, bool) {
t.mu.Lock()
defer t.mu.Unlock()
return t.tree.Delete(key)
}

func (t *ThreadSafeListTree) ForEachPrefix(keyPrefix art.Key, callback art.Callback) {
func (t *ThreadSafeListTree) ForEachPrefix(keyPrefix string, callback radix.WalkFn) {
t.mu.RLock()
defer t.mu.RUnlock()
t.tree.ForEachPrefix(keyPrefix, callback)
t.tree.WalkPrefix(keyPrefix, callback)
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ require (
github.com/Shopify/sarama v1.28.0
github.com/VividCortex/ewma v1.1.1
github.com/alecthomas/participle v0.2.1
github.com/armon/go-radix v1.0.0
github.com/bcicen/jstream v1.0.1
github.com/beevik/ntp v0.3.0
github.com/bits-and-blooms/bloom/v3 v3.0.1
Expand Down Expand Up @@ -72,7 +73,6 @@ require (
github.com/philhofer/fwd v1.1.2-0.20210722190033-5c56ac6d0bb9
github.com/pierrec/lz4/v4 v4.1.21
github.com/pkg/errors v0.9.1
github.com/plar/go-adaptive-radix-tree v1.0.5
github.com/prometheus/client_golang v1.14.0
github.com/prometheus/client_model v0.3.0
github.com/prometheus/procfs v0.9.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,8 @@ github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQh
github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q=
github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
github.com/asaskevich/govalidator v0.0.0-20180720115003-f9ffefc3facf/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
Expand Down Expand Up @@ -1406,8 +1408,6 @@ github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdL
github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
github.com/pkg/xattr v0.4.3 h1:5Jx4GCg5ABtqWZH8WLzeI4fOtM1HyX4RBawuCoua1es=
github.com/pkg/xattr v0.4.3/go.mod h1:sBD3RAqlr8Q+RC3FutZcikpT8nyDrIEEBw2J744gVWs=
github.com/plar/go-adaptive-radix-tree v1.0.5 h1:rHR89qy/6c24TBAHullFMrJsU9hGlKmPibdBGU6/gbM=
github.com/plar/go-adaptive-radix-tree v1.0.5/go.mod h1:15VOUO7R9MhJL8HOJdpydR0rvanrtRE6fA6XSa/tqWE=
github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
Expand Down
Loading
Loading