shell: volume.move handles volume moved to cloud tier

fix https://github.com/seaweedfs/seaweedfs/issues/3803
This commit is contained in:
chrislu 2022-10-16 17:52:22 -07:00
parent 52e0a88a15
commit de286fe662
4 changed files with 712 additions and 687 deletions

View file

@ -429,6 +429,7 @@ message ReadVolumeFileStatusResponse {
uint32 compaction_revision = 7; uint32 compaction_revision = 7;
string collection = 8; string collection = 8;
string disk_type = 9; string disk_type = 9;
VolumeInfo volume_info = 10;
} }
message DiskStatus { message DiskStatus {

File diff suppressed because it is too large Load diff

View file

@ -11,6 +11,7 @@ import (
// This is a compile-time assertion to ensure that this generated file // This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against. // is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.32.0 or later.
const _ = grpc.SupportPackageIsVersion7 const _ = grpc.SupportPackageIsVersion7
// VolumeServerClient is the client API for VolumeServer service. // VolumeServerClient is the client API for VolumeServer service.

View file

@ -48,6 +48,7 @@ func (vs *VolumeServer) VolumeCopy(req *volume_server_pb.VolumeCopyRequest, stre
// confirm size and timestamp // confirm size and timestamp
var volFileInfoResp *volume_server_pb.ReadVolumeFileStatusResponse var volFileInfoResp *volume_server_pb.ReadVolumeFileStatusResponse
var dataBaseFileName, indexBaseFileName, idxFileName, datFileName string var dataBaseFileName, indexBaseFileName, idxFileName, datFileName string
var hasRemoteDatFile bool
err := operation.WithVolumeServerClient(true, pb.ServerAddress(req.SourceDataNode), vs.grpcDialOption, func(client volume_server_pb.VolumeServerClient) error { err := operation.WithVolumeServerClient(true, pb.ServerAddress(req.SourceDataNode), vs.grpcDialOption, func(client volume_server_pb.VolumeServerClient) error {
var err error var err error
volFileInfoResp, err = client.ReadVolumeFileStatus(context.Background(), volFileInfoResp, err = client.ReadVolumeFileStatus(context.Background(),
@ -69,6 +70,7 @@ func (vs *VolumeServer) VolumeCopy(req *volume_server_pb.VolumeCopyRequest, stre
dataBaseFileName = storage.VolumeFileName(location.Directory, volFileInfoResp.Collection, int(req.VolumeId)) dataBaseFileName = storage.VolumeFileName(location.Directory, volFileInfoResp.Collection, int(req.VolumeId))
indexBaseFileName = storage.VolumeFileName(location.IdxDirectory, volFileInfoResp.Collection, int(req.VolumeId)) indexBaseFileName = storage.VolumeFileName(location.IdxDirectory, volFileInfoResp.Collection, int(req.VolumeId))
hasRemoteDatFile = volFileInfoResp.VolumeInfo != nil && len(volFileInfoResp.VolumeInfo.Files) > 0
util.WriteFile(dataBaseFileName+".note", []byte(fmt.Sprintf("copying from %s", req.SourceDataNode)), 0755) util.WriteFile(dataBaseFileName+".note", []byte(fmt.Sprintf("copying from %s", req.SourceDataNode)), 0755)
@ -95,7 +97,7 @@ func (vs *VolumeServer) VolumeCopy(req *volume_server_pb.VolumeCopyRequest, stre
glog.V(0).Infof("connect to %s: %v", vs.GetMaster(), grpcErr) glog.V(0).Infof("connect to %s: %v", vs.GetMaster(), grpcErr)
} }
if preallocateSize > 0 { if preallocateSize > 0 && !hasRemoteDatFile {
volumeFile := dataBaseFileName + ".dat" volumeFile := dataBaseFileName + ".dat"
_, err := backend.CreateVolumeFile(volumeFile, preallocateSize, 0) _, err := backend.CreateVolumeFile(volumeFile, preallocateSize, 0)
if err != nil { if err != nil {
@ -116,6 +118,8 @@ func (vs *VolumeServer) VolumeCopy(req *volume_server_pb.VolumeCopyRequest, stre
ioBytePerSecond = req.IoBytePerSecond ioBytePerSecond = req.IoBytePerSecond
} }
throttler := util.NewWriteThrottler(ioBytePerSecond) throttler := util.NewWriteThrottler(ioBytePerSecond)
if !hasRemoteDatFile {
if modifiedTsNs, err = vs.doCopyFileWithThrottler(client, false, req.Collection, req.VolumeId, volFileInfoResp.CompactionRevision, volFileInfoResp.DatFileSize, dataBaseFileName, ".dat", false, true, func(processed int64) bool { if modifiedTsNs, err = vs.doCopyFileWithThrottler(client, false, req.Collection, req.VolumeId, volFileInfoResp.CompactionRevision, volFileInfoResp.DatFileSize, dataBaseFileName, ".dat", false, true, func(processed int64) bool {
if processed > nextReportTarget { if processed > nextReportTarget {
copyResponse.ProcessedBytes = processed copyResponse.ProcessedBytes = processed
@ -134,6 +138,7 @@ func (vs *VolumeServer) VolumeCopy(req *volume_server_pb.VolumeCopyRequest, stre
if modifiedTsNs > 0 { if modifiedTsNs > 0 {
os.Chtimes(dataBaseFileName+".dat", time.Unix(0, modifiedTsNs), time.Unix(0, modifiedTsNs)) os.Chtimes(dataBaseFileName+".dat", time.Unix(0, modifiedTsNs), time.Unix(0, modifiedTsNs))
} }
}
if modifiedTsNs, err = vs.doCopyFileWithThrottler(client, false, req.Collection, req.VolumeId, volFileInfoResp.CompactionRevision, volFileInfoResp.IdxFileSize, indexBaseFileName, ".idx", false, false, nil, throttler); err != nil { if modifiedTsNs, err = vs.doCopyFileWithThrottler(client, false, req.Collection, req.VolumeId, volFileInfoResp.CompactionRevision, volFileInfoResp.IdxFileSize, indexBaseFileName, ".idx", false, false, nil, throttler); err != nil {
return err return err
@ -172,7 +177,7 @@ func (vs *VolumeServer) VolumeCopy(req *volume_server_pb.VolumeCopyRequest, stre
} }
}() }()
if err = checkCopyFiles(volFileInfoResp, idxFileName, datFileName); err != nil { // added by panyc16 if err = checkCopyFiles(volFileInfoResp, hasRemoteDatFile, idxFileName, datFileName); err != nil { // added by panyc16
return err return err
} }
@ -224,7 +229,7 @@ func (vs *VolumeServer) doCopyFileWithThrottler(client volume_server_pb.VolumeSe
only check the the differ of the file size only check the the differ of the file size
todo: maybe should check the received count and deleted count of the volume todo: maybe should check the received count and deleted count of the volume
*/ */
func checkCopyFiles(originFileInf *volume_server_pb.ReadVolumeFileStatusResponse, idxFileName, datFileName string) error { func checkCopyFiles(originFileInf *volume_server_pb.ReadVolumeFileStatusResponse, hasRemoteDatFile bool, idxFileName, datFileName string) error {
stat, err := os.Stat(idxFileName) stat, err := os.Stat(idxFileName)
if err != nil { if err != nil {
return fmt.Errorf("stat idx file %s failed: %v", idxFileName, err) return fmt.Errorf("stat idx file %s failed: %v", idxFileName, err)
@ -234,6 +239,10 @@ func checkCopyFiles(originFileInf *volume_server_pb.ReadVolumeFileStatusResponse
idxFileName, stat.Size(), originFileInf.IdxFileSize) idxFileName, stat.Size(), originFileInf.IdxFileSize)
} }
if hasRemoteDatFile {
return nil
}
stat, err = os.Stat(datFileName) stat, err = os.Stat(datFileName)
if err != nil { if err != nil {
return fmt.Errorf("get dat file info failed, %v", err) return fmt.Errorf("get dat file info failed, %v", err)
@ -298,6 +307,7 @@ func (vs *VolumeServer) ReadVolumeFileStatus(ctx context.Context, req *volume_se
resp.CompactionRevision = uint32(v.CompactionRevision) resp.CompactionRevision = uint32(v.CompactionRevision)
resp.Collection = v.Collection resp.Collection = v.Collection
resp.DiskType = string(v.DiskType()) resp.DiskType = string(v.DiskType())
resp.VolumeInfo = v.GetVolumeInfo()
return resp, nil return resp, nil
} }