Browse Source

[shell] feat:stop vacuum immediately once volume.vacuum.disable was executed (#6375)

stop vacuum immediately once volume.vacuum.disable was executed

Co-authored-by: dsd <dsd2019@foxmail.com>
pull/6377/head
dsd 4 days ago
committed by GitHub
parent
commit
72af97162f
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      weed/server/master_grpc_server_volume.go
  2. 7
      weed/server/master_server_handlers_admin.go
  3. 2
      weed/topology/topology_event_handling.go
  4. 24
      weed/topology/topology_vacuum.go

2
weed/server/master_grpc_server_volume.go

@ -271,7 +271,7 @@ func (ms *MasterServer) VacuumVolume(ctx context.Context, req *master_pb.VacuumV
resp := &master_pb.VacuumVolumeResponse{} resp := &master_pb.VacuumVolumeResponse{}
ms.Topo.Vacuum(ms.grpcDialOption, float64(req.GarbageThreshold), ms.option.MaxParallelVacuumPerServer, req.VolumeId, req.Collection, ms.preallocateSize)
ms.Topo.Vacuum(ms.grpcDialOption, float64(req.GarbageThreshold), ms.option.MaxParallelVacuumPerServer, req.VolumeId, req.Collection, ms.preallocateSize, false)
return resp, nil return resp, nil
} }

7
weed/server/master_server_handlers_admin.go

@ -3,12 +3,13 @@ package weed_server
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/seaweedfs/seaweedfs/weed/pb"
"github.com/seaweedfs/seaweedfs/weed/pb/master_pb"
"math/rand/v2" "math/rand/v2"
"net/http" "net/http"
"strconv" "strconv"
"github.com/seaweedfs/seaweedfs/weed/pb"
"github.com/seaweedfs/seaweedfs/weed/pb/master_pb"
"github.com/seaweedfs/seaweedfs/weed/glog" "github.com/seaweedfs/seaweedfs/weed/glog"
"github.com/seaweedfs/seaweedfs/weed/operation" "github.com/seaweedfs/seaweedfs/weed/operation"
"github.com/seaweedfs/seaweedfs/weed/pb/volume_server_pb" "github.com/seaweedfs/seaweedfs/weed/pb/volume_server_pb"
@ -66,7 +67,7 @@ func (ms *MasterServer) volumeVacuumHandler(w http.ResponseWriter, r *http.Reque
} }
} }
// glog.Infoln("garbageThreshold =", gcThreshold) // glog.Infoln("garbageThreshold =", gcThreshold)
ms.Topo.Vacuum(ms.grpcDialOption, gcThreshold, ms.option.MaxParallelVacuumPerServer, 0, "", ms.preallocateSize)
ms.Topo.Vacuum(ms.grpcDialOption, gcThreshold, ms.option.MaxParallelVacuumPerServer, 0, "", ms.preallocateSize, false)
ms.dirStatusHandler(w, r) ms.dirStatusHandler(w, r)
} }

2
weed/topology/topology_event_handling.go

@ -27,7 +27,7 @@ func (t *Topology) StartRefreshWritableVolumes(grpcDialOption grpc.DialOption, g
for { for {
if t.IsLeader() { if t.IsLeader() {
if !t.isDisableVacuum { if !t.isDisableVacuum {
t.Vacuum(grpcDialOption, garbageThreshold, concurrentVacuumLimitPerVolumeServer, 0, "", preallocate)
t.Vacuum(grpcDialOption, garbageThreshold, concurrentVacuumLimitPerVolumeServer, 0, "", preallocate, true)
} }
} else { } else {
stats.MasterReplicaPlacementMismatch.Reset() stats.MasterReplicaPlacementMismatch.Reset()

24
weed/topology/topology_vacuum.go

@ -2,12 +2,13 @@ package topology
import ( import (
"context" "context"
"github.com/seaweedfs/seaweedfs/weed/util"
"io" "io"
"sync" "sync"
"sync/atomic" "sync/atomic"
"time" "time"
"github.com/seaweedfs/seaweedfs/weed/util"
"github.com/seaweedfs/seaweedfs/weed/pb" "github.com/seaweedfs/seaweedfs/weed/pb"
"google.golang.org/grpc" "google.golang.org/grpc"
@ -215,11 +216,12 @@ func (t *Topology) batchVacuumVolumeCleanup(grpcDialOption grpc.DialOption, vl *
} }
} }
func (t *Topology) Vacuum(grpcDialOption grpc.DialOption, garbageThreshold float64, maxParallelVacuumPerServer int, volumeId uint32, collection string, preallocate int64) {
func (t *Topology) Vacuum(grpcDialOption grpc.DialOption, garbageThreshold float64, maxParallelVacuumPerServer int, volumeId uint32, collection string, preallocate int64, automatic bool) {
// if there is vacuum going on, return immediately // if there is vacuum going on, return immediately
swapped := atomic.CompareAndSwapInt64(&t.vacuumLockCounter, 0, 1) swapped := atomic.CompareAndSwapInt64(&t.vacuumLockCounter, 0, 1)
if !swapped { if !swapped {
glog.V(0).Infof("Vacuum is already running")
return return
} }
defer atomic.StoreInt64(&t.vacuumLockCounter, 0) defer atomic.StoreInt64(&t.vacuumLockCounter, 0)
@ -245,14 +247,21 @@ func (t *Topology) Vacuum(grpcDialOption grpc.DialOption, garbageThreshold float
t.vacuumOneVolumeId(grpcDialOption, volumeLayout, c, garbageThreshold, locationList, vid, preallocate) t.vacuumOneVolumeId(grpcDialOption, volumeLayout, c, garbageThreshold, locationList, vid, preallocate)
} }
} else { } else {
t.vacuumOneVolumeLayout(grpcDialOption, volumeLayout, c, garbageThreshold, maxParallelVacuumPerServer, preallocate)
t.vacuumOneVolumeLayout(grpcDialOption, volumeLayout, c, garbageThreshold, maxParallelVacuumPerServer, preallocate, automatic)
} }
} }
if automatic && t.isDisableVacuum {
break
}
}
if automatic && t.isDisableVacuum {
glog.V(0).Infof("Vacuum is disabled")
break
} }
} }
} }
func (t *Topology) vacuumOneVolumeLayout(grpcDialOption grpc.DialOption, volumeLayout *VolumeLayout, c *Collection, garbageThreshold float64, maxParallelVacuumPerServer int, preallocate int64) {
func (t *Topology) vacuumOneVolumeLayout(grpcDialOption grpc.DialOption, volumeLayout *VolumeLayout, c *Collection, garbageThreshold float64, maxParallelVacuumPerServer int, preallocate int64, automatic bool) {
volumeLayout.accessLock.RLock() volumeLayout.accessLock.RLock()
todoVolumeMap := make(map[needle.VolumeId]*VolumeLocationList) todoVolumeMap := make(map[needle.VolumeId]*VolumeLocationList)
@ -312,8 +321,13 @@ func (t *Topology) vacuumOneVolumeLayout(grpcDialOption grpc.DialOption, volumeL
limiterLock.Unlock() limiterLock.Unlock()
} }
}) })
if automatic && t.isDisableVacuum {
break
}
}
if automatic && t.isDisableVacuum {
break
} }
if len(todoVolumeMap) == len(pendingVolumeMap) { if len(todoVolumeMap) == len(pendingVolumeMap) {
time.Sleep(10 * time.Second) time.Sleep(10 * time.Second)
} }

Loading…
Cancel
Save