mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2024-01-19 02:48:24 +00:00
shell: volume.move handles volume moved to cloud tier
fix https://github.com/seaweedfs/seaweedfs/issues/3803
This commit is contained in:
parent
52e0a88a15
commit
de286fe662
|
@ -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
|
@ -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.
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue