Добавлена локальная загрузка снапшота
This commit is contained in:
@@ -11,6 +11,7 @@ import (
|
||||
"google.golang.org/grpc/credentials/insecure"
|
||||
|
||||
agateGrpc "gitea.unprism.ru/KRBL/Agate/grpc"
|
||||
"gitea.unprism.ru/KRBL/Agate/hash"
|
||||
"gitea.unprism.ru/KRBL/Agate/interfaces"
|
||||
"gitea.unprism.ru/KRBL/Agate/store"
|
||||
)
|
||||
@@ -89,8 +90,43 @@ func (c *Client) FetchSnapshotDetails(ctx context.Context, snapshotID string) (*
|
||||
return snapshot, nil
|
||||
}
|
||||
|
||||
// GetDiffInfo gets the hash and size of a differential archive.
|
||||
func (c *Client) GetDiffInfo(ctx context.Context, snapshotID, localParentID string) (*store.DiffInfo, error) {
|
||||
req := &agateGrpc.GetDiffInfoRequest{
|
||||
SnapshotId: snapshotID,
|
||||
LocalParentId: localParentID,
|
||||
}
|
||||
|
||||
info, err := c.client.GetDiffInfo(ctx, req)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get diff info: %w", err)
|
||||
}
|
||||
|
||||
return &store.DiffInfo{
|
||||
SHA256: info.Sha256Hash,
|
||||
Size: info.SizeBytes,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// DownloadSnapshotDiff скачивает архив с разницей между снапшотами.
|
||||
func (c *Client) DownloadSnapshotDiff(ctx context.Context, snapshotID, localParentID, targetPath string) error {
|
||||
// Check for local file and validate it
|
||||
if fileInfo, err := os.Stat(targetPath); err == nil {
|
||||
remoteDiffInfo, err := c.GetDiffInfo(ctx, snapshotID, localParentID)
|
||||
if err != nil {
|
||||
// Log the error but proceed with download
|
||||
fmt.Printf("could not get remote diff info: %v. proceeding with download.", err)
|
||||
} else {
|
||||
if fileInfo.Size() == remoteDiffInfo.Size {
|
||||
localHash, err := hash.CalculateFileHash(targetPath)
|
||||
if err == nil && localHash == remoteDiffInfo.SHA256 {
|
||||
fmt.Printf("local snapshot archive %s is valid, skipping download.", targetPath)
|
||||
return nil // File is valid, skip download
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var offset int64
|
||||
fileInfo, err := os.Stat(targetPath)
|
||||
if err == nil {
|
||||
|
||||
@@ -158,6 +158,19 @@ func (s *Server) DownloadSnapshotDiff(req *agateGrpc.DownloadSnapshotDiffRequest
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetDiffInfo реализует gRPC-метод GetDiffInfo.
|
||||
func (s *Server) GetDiffInfo(ctx context.Context, req *agateGrpc.GetDiffInfoRequest) (*agateGrpc.DiffInfo, error) {
|
||||
diffInfo, err := s.manager.GetSnapshotDiffInfo(ctx, req.SnapshotId, req.LocalParentId)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get diff info: %w", err)
|
||||
}
|
||||
|
||||
return &agateGrpc.DiffInfo{
|
||||
Sha256Hash: diffInfo.SHA256,
|
||||
SizeBytes: diffInfo.Size,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// Вспомогательная функция для конвертации store.SnapshotInfo в grpc.SnapshotInfo
|
||||
func convertToGrpcSnapshotInfo(info store.SnapshotInfo) *agateGrpc.SnapshotInfo {
|
||||
return &agateGrpc.SnapshotInfo{
|
||||
|
||||
Reference in New Issue
Block a user