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))