mount: quota for one mounted collection
related to https://github.com/seaweedfs/seaweedfs-csi-driver/issues/48
This commit is contained in:
@@ -37,6 +37,7 @@ type Option struct {
|
||||
CacheSizeMB int64
|
||||
DataCenter string
|
||||
Umask os.FileMode
|
||||
Quota int64
|
||||
|
||||
MountUid uint32
|
||||
MountGid uint32
|
||||
@@ -107,6 +108,7 @@ func NewSeaweedFileSystem(option *Option) *WFS {
|
||||
func (wfs *WFS) StartBackgroundTasks() {
|
||||
startTime := time.Now()
|
||||
go meta_cache.SubscribeMetaEvents(wfs.metaCache, wfs.signature, wfs, wfs.option.FilerMountRootPath, startTime.UnixNano())
|
||||
go wfs.loopCheckQuota()
|
||||
}
|
||||
|
||||
func (wfs *WFS) String() string {
|
||||
|
||||
53
weed/mount/weedfs_quota.go
Normal file
53
weed/mount/weedfs_quota.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package mount
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/chrislusf/seaweedfs/weed/glog"
|
||||
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
|
||||
"time"
|
||||
)
|
||||
|
||||
func (wfs *WFS) loopCheckQuota() {
|
||||
|
||||
if wfs.option.Quota <= 0 {
|
||||
return
|
||||
}
|
||||
|
||||
for {
|
||||
|
||||
err := wfs.WithFilerClient(false, func(client filer_pb.SeaweedFilerClient) error {
|
||||
|
||||
request := &filer_pb.StatisticsRequest{
|
||||
Collection: wfs.option.Collection,
|
||||
Replication: wfs.option.Replication,
|
||||
Ttl: fmt.Sprintf("%ds", wfs.option.TtlSec),
|
||||
DiskType: string(wfs.option.DiskType),
|
||||
}
|
||||
|
||||
resp, err := client.Statistics(context.Background(), request)
|
||||
if err != nil {
|
||||
glog.V(0).Infof("reading quota usage %v: %v", request, err)
|
||||
return err
|
||||
}
|
||||
glog.V(4).Infof("read quota usage: %+v", resp)
|
||||
|
||||
isOverQuota := int64(resp.UsedSize) > wfs.option.Quota
|
||||
if isOverQuota && !wfs.IsOverQuota {
|
||||
glog.Warningf("Quota Exceeded! quota:%d used:%d", wfs.option.Quota, resp.UsedSize)
|
||||
} else if !isOverQuota && wfs.IsOverQuota {
|
||||
glog.Warningf("Within quota limit! quota:%d used:%d", wfs.option.Quota, resp.UsedSize)
|
||||
}
|
||||
wfs.IsOverQuota = isOverQuota
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
glog.Warningf("read quota usage: %v", err)
|
||||
}
|
||||
|
||||
time.Sleep(61 * time.Second)
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user