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.
release-3.3
Anthony Romano 2017-06-09 10:18:52 -07:00
parent 3b460506d9
commit 9543431aeb
2 changed files with 7 additions and 2 deletions

View File

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

View File

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