From 7de1eea4840df5a79b77b953495db5aa03435fd1 Mon Sep 17 00:00:00 2001 From: jasonyuchen Date: Sun, 23 Jan 2022 00:25:21 +0800 Subject: [PATCH] transport: introduce snapshot streaming --- README.md | 7 ++++--- rafter.drawio | 2 +- transport/README.md | 15 ++++++++++++++- transport/transport.snapshot.drawio.png | Bin 0 -> 45780 bytes 4 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 transport/transport.snapshot.drawio.png diff --git a/README.md b/README.md index 87379c9..03bf47f 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ clusters. 3. ⚠️exchanger test 4. ⚠️registry, for group discovery and peer addresses management 5. ⭕registry test -6. ⭕express, for sending replicated state machine's snapshot +6. ⚠️express, for sending replicated state machine's snapshot 7. ⭕express test ### Replicated State Machine @@ -81,8 +81,9 @@ Various utilities to support different modules of the rafter. 1. ✔️backoff, retry in coroutine style 2. ⚠️circuit_breaker 3. ✔️fragmented_temporary_buffer, for aligned (de)serialization -4. ✔️serializer, for raft message's (de)serialization -5. ✔️worker, double-buffering multi-producer single-consumer worker coroutine, building block for pipelined service in +4. ⚠️rate limiter +5. ✔️serializer, for raft message's (de)serialization +6. ✔️worker, double-buffering multi-producer single-consumer worker coroutine, building block for pipelined service in rafter ### Test diff --git a/rafter.drawio b/rafter.drawio index 69e8e74..3b97fc5 100644 --- a/rafter.drawio +++ b/rafter.drawio @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/transport/README.md b/transport/README.md index 60b01d0..3268d0e 100644 --- a/transport/README.md +++ b/transport/README.md @@ -28,7 +28,20 @@ sharded and maintains a shard-to-node connection map. ## Snapshot Streaming -TODO: introduce the snapshot express and the management of ongoing/out-dated snapshots. +### Sender + +Once received a `send_snapshot` request, transport layer will instantiate a new `express` object for snapshot loading +and sending. The snapshot files (snapshot itself and corresponding disk files specified by the replicated state machine) +will be loaded and sent concurrently as they belong to two different IO stack: + +- load snapshot chunks (**disk IO**) and push them to the worker queue +- fetch chunks from worker queue and send them out (**network IO**) + +![transport.snapshot.drawio.png](transport.snapshot.drawio.png) + +### Receiver + +TODO: introduce the receiving-side management of ongoing/out-dated snapshots. ## Node Discovery & Registry diff --git a/transport/transport.snapshot.drawio.png b/transport/transport.snapshot.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..5ec6aac221850c66debe0f8e1e837903cfc3535c GIT binary patch literal 45780 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

fuK3gzSTZ&nwh<@NA7 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 literal 0 HcmV?d00001