aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwusong <75450248+wusongANKANG@users.noreply.github.com>2023-05-22 13:18:50 +0800
committerGitHub <noreply@github.com>2023-05-21 22:18:50 -0700
commit8fffe3e82266530f29385085cfa1e20275a4c8d8 (patch)
tree04d13810492aa4fa7a35435f2493754ef43042c7
parent8f3bd202e54b1e83bbd76ee63d103202308f3e39 (diff)
downloadseaweedfs-8fffe3e82266530f29385085cfa1e20275a4c8d8.tar.xz
seaweedfs-8fffe3e82266530f29385085cfa1e20275a4c8d8.zip
fix no more writables volumes while disk free space is sufficient (#4491)
Co-authored-by: wang wusong <wangwusong@virtaitech.com>
-rw-r--r--weed/topology/node.go2
-rw-r--r--weed/topology/topology_vacuum.go15
2 files changed, 17 insertions, 0 deletions
diff --git a/weed/topology/node.go b/weed/topology/node.go
index ae58891e4..89a6305e8 100644
--- a/weed/topology/node.go
+++ b/weed/topology/node.go
@@ -243,6 +243,7 @@ func (n *NodeImpl) CollectDeadNodeAndFullVolumes(freshThreshHold int64, volumeSi
if n.IsRack() {
for _, c := range n.Children() {
dn := c.(*DataNode) //can not cast n to DataNode
+ dn.RLock()
for _, v := range dn.GetVolumes() {
if v.Size >= volumeSizeLimit {
//fmt.Println("volume",v.Id,"size",v.Size,">",volumeSizeLimit)
@@ -259,6 +260,7 @@ func (n *NodeImpl) CollectDeadNodeAndFullVolumes(freshThreshHold int64, volumeSi
}
}
}
+ dn.RUnlock()
}
} else {
for _, c := range n.Children() {
diff --git a/weed/topology/topology_vacuum.go b/weed/topology/topology_vacuum.go
index d302afe8c..1581d52fb 100644
--- a/weed/topology/topology_vacuum.go
+++ b/weed/topology/topology_vacuum.go
@@ -172,6 +172,21 @@ func (t *Topology) batchVacuumVolumeCommit(grpcDialOption grpc.DialOption, vl *V
}
if isCommitSuccess {
+ //reset all vacuumed volumes size
+ for _, dn := range vacuumLocationList.list {
+ vInfo, err := dn.GetVolumesById(vid)
+ if err != nil {
+ glog.V(0).Infof("get volume info for volume: %d failed %v", vid, err)
+ return false
+ }
+
+ dn.Lock()
+ disk := dn.getOrCreateDisk(vInfo.DiskType)
+ vInfo.Size = 0
+ disk.doAddOrUpdateVolume(vInfo)
+ dn.Unlock()
+ }
+
for _, dn := range vacuumLocationList.list {
vl.SetVolumeAvailable(dn, vid, isReadOnly)
}