mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-09-08 15:41:15 +02:00
volume: EC decode onto a clean peer via staged-new-volume adopt (Go+Rust) (#10463)
Decoding EC shards back to a normal volume in place reconstructs <vid>.dat
in the shards' own directory, so the vid is momentarily registered as both
an EC and a normal volume in one location — the load/scan path then sees it
as both, risking mount ambiguity and needle loss. VolumeEcShardsToVolume
still supports that in-place path; this adds the primitives to decode onto
a *clean* peer instead:
- ReceiveFile gains a staged-new-volume mode: when the volume does not
exist here and ReceiveFileInfo.disk_type is set, pick a free-slot disk
of that medium and write <base><ext>.copying (not a valid volume name,
so the scanner never half-loads a partial push).
- VolumeEcShardsToVolume gains from_staged: adopt the pushed .dat/.idx/
.vif — rename .copying into place under a .note in-progress marker,
then mount — so <vid> lands on the peer only as a normal volume.
The caller decodes the shards off-box and streams the finished volume to a
peer holding no shard of the vid on the target medium. Go and Rust volume
servers get identical handlers. Proto: ReceiveFileInfo.disk_type (12; 8-11
reserved for versioned-EC), VolumeEcShardsToVolumeRequest.from_staged (3) +
disk_type (4).
Claude-Session: https://claude.ai/code/session_01Ks16jnt4S7gdDk8cheQ3xu
This commit is contained in:
@@ -351,6 +351,13 @@ message ReceiveFileInfo {
|
||||
uint32 shard_id = 5;
|
||||
uint64 file_size = 6;
|
||||
uint32 disk_id = 7; // EC shard disk; 0 = auto-select (see VolumeEcShardsCopyRequest.disk_id)
|
||||
|
||||
// Field numbers 8-11 are reserved for versioned-EC; disk_type stays at 12.
|
||||
// Staged-new-volume mode (EC decode onto a clean peer): set on a non-EC push
|
||||
// whose volume does not yet exist on this server. The server picks a disk
|
||||
// location of this medium with a free slot and writes <base><ext>.copying,
|
||||
// finalized by VolumeEcShardsToVolume(from_staged).
|
||||
string disk_type = 12;
|
||||
}
|
||||
|
||||
message ReceiveFileResponse {
|
||||
@@ -512,6 +519,13 @@ message VolumeEcBlobDeleteResponse {
|
||||
message VolumeEcShardsToVolumeRequest {
|
||||
uint32 volume_id = 1;
|
||||
string collection = 2;
|
||||
// Staged mode: the caller already decoded the EC shards off-box and pushed
|
||||
// .dat/.idx/.vif as <base><ext>.copying to this server (ReceiveFile
|
||||
// staged-new-volume mode). Adopt them as a normal volume instead of decoding
|
||||
// local EC shards in place, so <vid> is never registered as both EC and
|
||||
// normal on one disk.
|
||||
bool from_staged = 3;
|
||||
string disk_type = 4; // target medium's disk location for the normal volume (staged mode)
|
||||
}
|
||||
message VolumeEcShardsToVolumeResponse {
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user