From 9543431aeb52cb2b872ebec4e34d56ffdcf60053 Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Fri, 9 Jun 2017 10:18:52 -0700 Subject: [PATCH] rafthttp: permit very large v2 snapshots v2 snapshots were hitting the 512MB message decode limit, causing sending snapshots to new members to fail for being too big. --- rafthttp/http.go | 3 ++- rafthttp/msg_codec.go | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/rafthttp/http.go b/rafthttp/http.go index 471028a61..55df26e9b 100644 --- a/rafthttp/http.go +++ b/rafthttp/http.go @@ -183,7 +183,8 @@ func (h *snapshotHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { } dec := &messageDecoder{r: r.Body} - m, err := dec.decode() + // let snapshots be very large since they can exceed 512MB for large installations + m, err := dec.decodeLimit(uint64(1 << 63)) if err != nil { msg := fmt.Sprintf("failed to decode raft message (%v)", err) plog.Errorf(msg) diff --git a/rafthttp/msg_codec.go b/rafthttp/msg_codec.go index bf1f6bc00..ef59bc888 100644 --- a/rafthttp/msg_codec.go +++ b/rafthttp/msg_codec.go @@ -48,12 +48,16 @@ var ( ) func (dec *messageDecoder) decode() (raftpb.Message, error) { + return dec.decodeLimit(readBytesLimit) +} + +func (dec *messageDecoder) decodeLimit(numBytes uint64) (raftpb.Message, error) { var m raftpb.Message var l uint64 if err := binary.Read(dec.r, binary.BigEndian, &l); err != nil { return m, err } - if l > readBytesLimit { + if l > numBytes { return m, ErrExceedSizeLimit } buf := make([]byte, int(l))