You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							66 lines
						
					
					
						
							1.9 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							66 lines
						
					
					
						
							1.9 KiB
						
					
					
				| package weed_server | |
| 
 | |
| import ( | |
| 	"context" | |
| 	"fmt" | |
| 	"io" | |
| 
 | |
| 	"github.com/seaweedfs/seaweedfs/weed/pb/volume_server_pb" | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/backend" | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/needle" | |
| ) | |
| 
 | |
| func (vs *VolumeServer) VolumeIncrementalCopy(req *volume_server_pb.VolumeIncrementalCopyRequest, stream volume_server_pb.VolumeServer_VolumeIncrementalCopyServer) error { | |
| 
 | |
| 	v := vs.store.GetVolume(needle.VolumeId(req.VolumeId)) | |
| 	if v == nil { | |
| 		return fmt.Errorf("not found volume id %d", req.VolumeId) | |
| 	} | |
| 
 | |
| 	stopOffset, _, _ := v.FileStat() | |
| 	foundOffset, isLastOne, err := v.BinarySearchByAppendAtNs(req.SinceNs) | |
| 	if err != nil { | |
| 		return fmt.Errorf("fail to locate by appendAtNs %d: %s", req.SinceNs, err) | |
| 	} | |
| 
 | |
| 	if isLastOne { | |
| 		return nil | |
| 	} | |
| 
 | |
| 	startOffset := foundOffset.ToActualOffset() | |
| 
 | |
| 	buf := make([]byte, 1024*1024*2) | |
| 	return sendFileContent(v.DataBackend, buf, startOffset, int64(stopOffset), stream) | |
| 
 | |
| } | |
| 
 | |
| func (vs *VolumeServer) VolumeSyncStatus(ctx context.Context, req *volume_server_pb.VolumeSyncStatusRequest) (*volume_server_pb.VolumeSyncStatusResponse, error) { | |
| 
 | |
| 	v := vs.store.GetVolume(needle.VolumeId(req.VolumeId)) | |
| 	if v == nil { | |
| 		return nil, fmt.Errorf("not found volume id %d", req.VolumeId) | |
| 	} | |
| 
 | |
| 	resp := v.GetVolumeSyncStatus() | |
| 
 | |
| 	return resp, nil | |
| 
 | |
| } | |
| 
 | |
| func sendFileContent(datBackend backend.BackendStorageFile, buf []byte, startOffset, stopOffset int64, stream volume_server_pb.VolumeServer_VolumeIncrementalCopyServer) error { | |
| 	var blockSizeLimit = int64(len(buf)) | |
| 	for i := int64(0); i < stopOffset-startOffset; i += blockSizeLimit { | |
| 		n, readErr := datBackend.ReadAt(buf, startOffset+i) | |
| 		if readErr == nil || readErr == io.EOF { | |
| 			resp := &volume_server_pb.VolumeIncrementalCopyResponse{} | |
| 			resp.FileContent = buf[:int64(n)] | |
| 			sendErr := stream.Send(resp) | |
| 			if sendErr != nil { | |
| 				return sendErr | |
| 			} | |
| 		} else { | |
| 			return readErr | |
| 		} | |
| 	} | |
| 	return nil | |
| }
 |