shell: multi-target fs.mergeVolumes and volume.mark -readonlyCanDelete (#10706)

* shell: fs.mergeVolumes distributes one volume across multiple -toVolumeId targets

* volume: volume.mark -readonlyCanDelete rejects writes but keeps accepting deletes

* seaweed-volume: mirror readonlyCanDelete volume state
This commit is contained in:
Chris Lu authored and GitHub committed 2026-08-10 16:31:26 -07:00
1 parent 0b1f0cafee
commit c6e1387f59
18 files changed
+782 -158

No files matched your search

+3 -3
View File
@@ -256,7 +256,7 @@ func (vs *VolumeServer) VolumeConfigure(ctx context.Context, req *volume_server_
}
func (vs *VolumeServer) makeVolumeReadonly(ctx context.Context, v *storage.Volume, persist bool) error {
func (vs *VolumeServer) makeVolumeReadonly(ctx context.Context, v *storage.Volume, canDelete bool, persist bool) error {
if err := vs.CheckMaintenanceMode(); err != nil {
return err
}
@@ -269,7 +269,7 @@ func (vs *VolumeServer) makeVolumeReadonly(ctx context.Context, v *storage.Volum
// rare case 1.5: it will be unlucky if heartbeat happened between step 1 and 2.
// step 2: mark local volume as readonly
if err := vs.store.MarkVolumeReadonly(v.Id, persist); err != nil {
if err := vs.store.MarkVolumeReadonly(v.Id, canDelete, persist); err != nil {
glog.Errorf("mark volume %d readonly: %v", v.Id, err)
return err
} else {
@@ -357,7 +357,7 @@ func (vs *VolumeServer) VolumeMarkReadonly(ctx context.Context, req *volume_serv
return resp, fmt.Errorf("volume %d not found", req.VolumeId)
}
if err := vs.makeVolumeReadonly(ctx, v, req.GetPersist()); err != nil {
if err := vs.makeVolumeReadonly(ctx, v, req.GetCanDelete(), req.GetPersist()); err != nil {
return resp, err
}
+1 -1
View File
@@ -66,7 +66,7 @@ func (vs *VolumeServer) ScrubVolume(ctx context.Context, req *volume_server_pb.S
errs := []error{}
if req.GetMarkBrokenVolumesReadonly() {
for _, v := range brokenVolumes {
if err := vs.makeVolumeReadonly(ctx, v, true); err != nil {
if err := vs.makeVolumeReadonly(ctx, v, false, true); err != nil {
errs = append(errs, err)
details = append(details, err.Error())
} else {