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.
This commit is contained in:
Anthony Romano 2017-06-09 10:18:52 -07:00 committed by Gyu-Ho Lee
parent 5586a5806e
commit c765bef483
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))