Skip to content

Commit 50853fc

Browse files
authored
Add stream file transfer (#1002)
1 parent e85480c commit 50853fc

12 files changed

+3145
-346
lines changed

Diff for: api/grpc/mpi/v1/files.pb.go

+610-337
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: api/grpc/mpi/v1/files.pb.validate.go

+457
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: api/grpc/mpi/v1/files.proto

+49
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,55 @@ service FileService {
2727
rpc GetFile(GetFileRequest) returns (GetFileResponse) {}
2828
// Update a file from the Agent to the Server
2929
rpc UpdateFile(UpdateFileRequest) returns (UpdateFileResponse) {}
30+
31+
// GetFileStream requests the file content in chunks. MP and agent should agree on size to use stream
32+
// vs non-stream. For smaller files, it may be more efficient to not-stream.
33+
rpc GetFileStream(GetFileRequest) returns (stream FileDataChunk) {}
34+
35+
// UpdateFileStream uploads the file content in streams. MP and agent should agree on size to use stream
36+
// vs non-stream. For smaller files, it may be more efficient to not-stream.
37+
rpc UpdateFileStream(stream FileDataChunk) returns (UpdateFileResponse) {}
38+
}
39+
40+
// Represents a data chunk for streaming file transfer.
41+
// For any Stream file transfer, following assumptions should be asserted (by implementation):
42+
// - invalid to contain more or less than one FileDataChunkHeaders
43+
// - invalid to have FileDataChunkContents before FileDataChunkHeaders
44+
// - invalid to have more/fewer FileDataChunkContents than FileDataChunkHeader.chunks
45+
// - invalid to have two FileDataChunkContents with same chunk_id
46+
// - invalid to have FileDataChunkContent with zero-length data
47+
// - invalid to have FileDataChunk message without either header or content
48+
// - hash of the combined contents should match FileDataChunkHeader.file_meta.hash
49+
// - total size of the combined contents should match FileDataChunkHeader.file_meta.size
50+
// - chunk_size should be less than the gRPC max message size
51+
message FileDataChunk {
52+
// meta regarding the transfer request
53+
mpi.v1.MessageMeta meta = 1;
54+
oneof chunk {
55+
// Chunk header
56+
FileDataChunkHeader header = 2;
57+
// Chunk data
58+
FileDataChunkContent content = 3;
59+
}
60+
}
61+
62+
// Represents a chunked resource Header
63+
message FileDataChunkHeader {
64+
// meta regarding the file, help identity the file name, size, hash, perm
65+
// receiver should validate the hash against the combined contents
66+
FileMeta file_meta = 1;
67+
// total number of chunks expected in the transfer
68+
uint32 chunks = 2 [(buf.validate.field).uint32 = { gt: 0 }];
69+
// max size of individual chunks, can be undersized if EOF
70+
uint32 chunk_size = 3 [(buf.validate.field).uint32 = { gt: 0 }];
71+
}
72+
73+
// Represents a chunked resource chunk
74+
message FileDataChunkContent {
75+
// chunk id, i.e. x of y, zero-indexed
76+
uint32 chunk_id = 1;
77+
// chunk data, should be at most chunk_size
78+
bytes data = 2;
3079
}
3180

3281
// Represents a request payload for a file overview

Diff for: api/grpc/mpi/v1/files_grpc.pb.go

+86-5
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: api/grpc/mpi/v1/mocks.go

+2
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@ package v1
88
//go:generate go run github.com/maxbrunsfeld/counterfeiter/[email protected] -generate
99
//counterfeiter:generate . CommandServiceClient
1010
//counterfeiter:generate . FileServiceClient
11+
//counterfeiter:generate . FileService_GetFileStreamServer
12+
//counterfeiter:generate . FileService_GetFileStreamClient

0 commit comments

Comments
 (0)