diff options
| author | chrislu <chris.lu@gmail.com> | 2022-03-06 02:44:40 -0800 |
|---|---|---|
| committer | chrislu <chris.lu@gmail.com> | 2022-03-06 02:44:40 -0800 |
| commit | c7e8ac18f00f2d4dad91745d4ad446ac396c48fb (patch) | |
| tree | 60a4e11d03446e9a22faee39833721d03269c346 /weed | |
| parent | b7c992f410098ae53409329cf02ddc2935aed03a (diff) | |
| download | seaweedfs-c7e8ac18f00f2d4dad91745d4ad446ac396c48fb.tar.xz seaweedfs-c7e8ac18f00f2d4dad91745d4ad446ac396c48fb.zip | |
mount: quota for one mounted collection
related to https://github.com/seaweedfs/seaweedfs-csi-driver/issues/48
Diffstat (limited to 'weed')
| -rw-r--r-- | weed/command/mount.go | 2 | ||||
| -rw-r--r-- | weed/command/mount_std.go | 1 | ||||
| -rw-r--r-- | weed/mount/weedfs.go | 2 | ||||
| -rw-r--r-- | weed/mount/weedfs_quota.go | 53 |
4 files changed, 58 insertions, 0 deletions
diff --git a/weed/command/mount.go b/weed/command/mount.go index 545ba8a43..428e073f2 100644 --- a/weed/command/mount.go +++ b/weed/command/mount.go @@ -11,6 +11,7 @@ type MountOptions struct { dir *string dirAutoCreate *bool collection *string + collectionQuota *int replication *string diskType *string ttlSec *int @@ -44,6 +45,7 @@ func init() { mountOptions.dir = cmdMount.Flag.String("dir", ".", "mount weed filer to this directory") mountOptions.dirAutoCreate = cmdMount.Flag.Bool("dirAutoCreate", false, "auto create the directory to mount to") mountOptions.collection = cmdMount.Flag.String("collection", "", "collection to create the files") + mountOptions.collectionQuota = cmdMount.Flag.Int("collectionQuotaMB", 0, "quota for the collection") mountOptions.replication = cmdMount.Flag.String("replication", "", "replication(e.g. 000, 001) to create to files. If empty, let filer decide.") mountOptions.diskType = cmdMount.Flag.String("disk", "", "[hdd|ssd|<tag>] hard drive or solid state drive or any tag") mountOptions.ttlSec = cmdMount.Flag.Int("ttl", 0, "file ttl in seconds") diff --git a/weed/command/mount_std.go b/weed/command/mount_std.go index dd07636fe..d865e053f 100644 --- a/weed/command/mount_std.go +++ b/weed/command/mount_std.go @@ -209,6 +209,7 @@ func RunMount(option *MountOptions, umask os.FileMode) bool { CacheDir: *option.cacheDir, CacheSizeMB: *option.cacheSizeMB, DataCenter: *option.dataCenter, + Quota: int64(*option.collectionQuota) * 1024 * 1024, MountUid: uid, MountGid: gid, MountMode: mountMode, diff --git a/weed/mount/weedfs.go b/weed/mount/weedfs.go index 25a203044..52eefab32 100644 --- a/weed/mount/weedfs.go +++ b/weed/mount/weedfs.go @@ -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 { diff --git a/weed/mount/weedfs_quota.go b/weed/mount/weedfs_quota.go new file mode 100644 index 000000000..f9307a6b3 --- /dev/null +++ b/weed/mount/weedfs_quota.go @@ -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) + } + +} |
