From d5c40f7e74ebf95e7f9c1939514f1441772f05fe Mon Sep 17 00:00:00 2001 From: Miroslav Crnic Date: Mon, 17 Nov 2025 10:19:52 +0000 Subject: [PATCH] span.go write blocks in parallel --- go/client/span.go | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/go/client/span.go b/go/client/span.go index 1bd91631..64b51a69 100644 --- a/go/client/span.go +++ b/go/client/span.go @@ -19,7 +19,6 @@ import ( "xtx/ternfs/core/log" "xtx/ternfs/core/parity" "xtx/ternfs/core/rs" - "xtx/ternfs/core/timing" "xtx/ternfs/msgs" ) @@ -313,30 +312,39 @@ func (c *Client) CreateSpan( for _, block := range initiateResp.Resp.Blocks { blocks = append(blocks, block.BlockId) } - // write blocks certifyReq := msgs.AddSpanCertifyReq{ FileId: id, Cookie: cookie, ByteOffset: offset, Proofs: make([]msgs.BlockProof, len(initiateResp.Resp.Blocks)), } + writeCh := make(chan *blockCompletion, len(initiateResp.Resp.Blocks)) for i, block := range initiateResp.Resp.Blocks { - var proof [8]byte blockCrc, blockReader := mkBlockReader(&initiateReq.Req, *data, i) - // fail immediately to other block services - proof, err = c.WriteBlock(log, &timing.NoTimeouts, &block, blockReader, initiateReq.Req.CellSize*uint32(initiateReq.Req.Stripes), blockCrc) - if err != nil { + // Start writing block asynchronously + if startErr := c.StartWriteBlock(log, &block, blockReader, initiateReq.Req.CellSize*uint32(initiateReq.Req.Stripes), blockCrc, i, writeCh); startErr != nil { initiateReq.Req.Blacklist = append(initiateReq.Req.Blacklist, msgs.BlacklistEntry{FailureDomain: block.BlockServiceFailureDomain}) - log.Info("failed to write block to %+v: %v, might retry without failure domain %q", block, err, string(block.BlockServiceFailureDomain.Name[:])) + log.Info("failed to start write block to %+v: %v, might retry without failure domain %q", block, startErr, string(block.BlockServiceFailureDomain.Name[:])) goto FailedAttempt } - certifyReq.Proofs[i].BlockId = block.BlockId - certifyReq.Proofs[i].Proof = proof + } + for range initiateResp.Resp.Blocks { + result := <-writeCh + blockIdx := result.Extra.(int) + if result.Error != nil { + block := initiateResp.Resp.Blocks[blockIdx] + initiateReq.Req.Blacklist = append(initiateReq.Req.Blacklist, msgs.BlacklistEntry{FailureDomain: block.BlockServiceFailureDomain}) + log.Info("failed to write block to %+v: %v, might retry without failure domain %q", block, result.Error, string(block.BlockServiceFailureDomain.Name[:])) + err = result.Error + goto FailedAttempt + } + certifyReq.Proofs[blockIdx].BlockId = initiateResp.Resp.Blocks[blockIdx].BlockId + certifyReq.Proofs[blockIdx].Proof = result.Resp.(*msgs.WriteBlockResp).Proof } if err = c.ShardRequest(log, id.Shard(), &certifyReq, &msgs.AddSpanCertifyResp{}); err != nil { return nil, err } - // we've managed + // we've managed to write the span successfully break FailedAttempt: