From 4fe5712dc2cf7ec60ae6c595b942acaebf17997d Mon Sep 17 00:00:00 2001 From: Xiong LIU Date: Fri, 11 Jun 2021 17:25:08 +0800 Subject: [PATCH] fix: snapshot.Next iterates forever until raft error when sending snapshot --- transport_replicate.go | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/transport_replicate.go b/transport_replicate.go index e1f2b32..2b17c4a 100644 --- a/transport_replicate.go +++ b/transport_replicate.go @@ -151,13 +151,20 @@ func (t *replicateTransport) sendSnapshot(m *proto.Message, rs *snapshotStatus) default: data, err = m.Snapshot.Next() + + // to prevent err from being overrided + var innerError error if len(data) > 0 { // write block size binary.BigEndian.PutUint32(sizeBuf, uint32(len(data))) - if _, err = bufWr.Write(sizeBuf); err == nil { - _, err = bufWr.Write(data) + if _, innerError = bufWr.Write(sizeBuf); innerError == nil { + _, innerError = bufWr.Write(data) } } + + if err == nil { + err = innerError + } } } @@ -165,10 +172,6 @@ func (t *replicateTransport) sendSnapshot(m *proto.Message, rs *snapshotStatus) if err != nil && err != io.EOF { return } - binary.BigEndian.PutUint32(sizeBuf, 0) - if _, err = bufWr.Write(sizeBuf); err != nil { - return - } if err = bufWr.Flush(); err != nil { return }