@@ -18,6 +18,10 @@ type messageSetReader struct {
18
18
* readerStack // used for decompressing compressed messages and record batches
19
19
empty bool // if true, short circuits messageSetReader methods
20
20
debug bool // enable debug log messages
21
+ // How many bytes are expected to remain in the response.
22
+ //
23
+ // This is used to detect truncation of the response.
24
+ lengthRemain int
21
25
}
22
26
23
27
type readerStack struct {
@@ -114,7 +118,7 @@ func (r *messageSetReader) discard() (err error) {
114
118
}
115
119
116
120
func (r * messageSetReader ) readMessage (min int64 , key readBytesFunc , val readBytesFunc ) (
117
- offset int64 , timestamp int64 , headers []Header , err error ) {
121
+ offset int64 , lastOffset int64 , timestamp int64 , headers []Header , err error ) {
118
122
119
123
if r .empty {
120
124
err = RequestTimedOut
@@ -126,8 +130,10 @@ func (r *messageSetReader) readMessage(min int64, key readBytesFunc, val readByt
126
130
switch r .header .magic {
127
131
case 0 , 1 :
128
132
offset , timestamp , headers , err = r .readMessageV1 (min , key , val )
133
+ // Set an invalid value so that it can be ignored
134
+ lastOffset = - 1
129
135
case 2 :
130
- offset , timestamp , headers , err = r .readMessageV2 (min , key , val )
136
+ offset , lastOffset , timestamp , headers , err = r .readMessageV2 (min , key , val )
131
137
default :
132
138
err = r .header .badMagic ()
133
139
}
@@ -239,7 +245,7 @@ func (r *messageSetReader) readMessageV1(min int64, key readBytesFunc, val readB
239
245
}
240
246
241
247
func (r * messageSetReader ) readMessageV2 (_ int64 , key readBytesFunc , val readBytesFunc ) (
242
- offset int64 , timestamp int64 , headers []Header , err error ) {
248
+ offset int64 , lastOffset int64 , timestamp int64 , headers []Header , err error ) {
243
249
if err = r .readHeader (); err != nil {
244
250
return
245
251
}
@@ -282,10 +288,12 @@ func (r *messageSetReader) readMessageV2(_ int64, key readBytesFunc, val readByt
282
288
r .readerStack .parent .count = 0
283
289
}
284
290
}
291
+ remainBefore := r .remain
285
292
var length int64
286
293
if err = r .readVarInt (& length ); err != nil {
287
294
return
288
295
}
296
+ lengthOfLength := remainBefore - r .remain
289
297
var attrs int8
290
298
if err = r .readInt8 (& attrs ); err != nil {
291
299
return
@@ -316,6 +324,8 @@ func (r *messageSetReader) readMessageV2(_ int64, key readBytesFunc, val readByt
316
324
return
317
325
}
318
326
}
327
+ lastOffset = r .header .firstOffset + int64 (r .header .v2 .lastOffsetDelta )
328
+ r .lengthRemain -= int (length ) + lengthOfLength
319
329
r .markRead ()
320
330
return
321
331
}
@@ -407,6 +417,9 @@ func (r *messageSetReader) readHeader() (err error) {
407
417
return
408
418
}
409
419
r .count = 1
420
+ // Set arbitrary non-zero length so that we always assume the
421
+ // message is truncated since bytes remain.
422
+ r .lengthRemain = 1
410
423
r .log ("Read v0 header with offset=%d len=%d magic=%d attributes=%d" , r .header .firstOffset , r .header .length , r .header .magic , r .header .v1 .attributes )
411
424
case 1 :
412
425
r .header .crc = crcOrLeaderEpoch
@@ -417,6 +430,9 @@ func (r *messageSetReader) readHeader() (err error) {
417
430
return
418
431
}
419
432
r .count = 1
433
+ // Set arbitrary non-zero length so that we always assume the
434
+ // message is truncated since bytes remain.
435
+ r .lengthRemain = 1
420
436
r .log ("Read v1 header with remain=%d offset=%d magic=%d and attributes=%d" , r .remain , r .header .firstOffset , r .header .magic , r .header .v1 .attributes )
421
437
case 2 :
422
438
r .header .v2 .leaderEpoch = crcOrLeaderEpoch
@@ -448,6 +464,8 @@ func (r *messageSetReader) readHeader() (err error) {
448
464
return
449
465
}
450
466
r .count = int (r .header .v2 .count )
467
+ // Subtracts the header bytes from the length
468
+ r .lengthRemain = int (r .header .length ) - 49
451
469
r .log ("Read v2 header with count=%d offset=%d len=%d magic=%d attributes=%d" , r .count , r .header .firstOffset , r .header .length , r .header .magic , r .header .v2 .attributes )
452
470
default :
453
471
err = r .header .badMagic ()
0 commit comments