Skip to content

Commit fcff483

Browse files
[FIXED] Make sure to hold lock for duration of truncate (#5279)
Make sure to hold lock for duration of truncate, was calling slotInfo unprotected. Signed-off-by: Derek Collison <[email protected]>
2 parents 4d9732c + bcdbb2e commit fcff483

File tree

1 file changed

+5
-14
lines changed

1 file changed

+5
-14
lines changed

server/filestore.go

+5-14
Original file line numberDiff line numberDiff line change
@@ -4313,8 +4313,11 @@ func (mb *msgBlock) eraseMsg(seq uint64, ri, rl int) error {
43134313

43144314
// Truncate this message block to the storedMsg.
43154315
func (mb *msgBlock) truncate(sm *StoreMsg) (nmsgs, nbytes uint64, err error) {
4316+
mb.mu.Lock()
4317+
defer mb.mu.Unlock()
4318+
43164319
// Make sure we are loaded to process messages etc.
4317-
if err := mb.loadMsgs(); err != nil {
4320+
if err := mb.loadMsgsWithLock(); err != nil {
43184321
return 0, 0, err
43194322
}
43204323

@@ -4328,8 +4331,6 @@ func (mb *msgBlock) truncate(sm *StoreMsg) (nmsgs, nbytes uint64, err error) {
43284331

43294332
var purged, bytes uint64
43304333

4331-
mb.mu.Lock()
4332-
43334334
checkDmap := mb.dmap.Size() > 0
43344335
var smv StoreMsg
43354336

@@ -4365,28 +4366,24 @@ func (mb *msgBlock) truncate(sm *StoreMsg) (nmsgs, nbytes uint64, err error) {
43654366
if mb.cmp != NoCompression {
43664367
buf, err := mb.loadBlock(nil)
43674368
if err != nil {
4368-
mb.mu.Unlock()
43694369
return 0, 0, fmt.Errorf("failed to load block from disk: %w", err)
43704370
}
43714371
if mb.bek != nil && len(buf) > 0 {
43724372
bek, err := genBlockEncryptionKey(mb.fs.fcfg.Cipher, mb.seed, mb.nonce)
43734373
if err != nil {
4374-
mb.mu.Unlock()
43754374
return 0, 0, err
43764375
}
43774376
mb.bek = bek
43784377
mb.bek.XORKeyStream(buf, buf)
43794378
}
43804379
buf, err = mb.decompressIfNeeded(buf)
43814380
if err != nil {
4382-
mb.mu.Unlock()
43834381
return 0, 0, fmt.Errorf("failed to decompress block: %w", err)
43844382
}
43854383
buf = buf[:eof]
43864384
copy(mb.lchk[0:], buf[:len(buf)-checksumSize])
43874385
buf, err = mb.cmp.Compress(buf)
43884386
if err != nil {
4389-
mb.mu.Unlock()
43904387
return 0, 0, fmt.Errorf("failed to recompress block: %w", err)
43914388
}
43924389
meta := &CompressionInfo{
@@ -4397,19 +4394,16 @@ func (mb *msgBlock) truncate(sm *StoreMsg) (nmsgs, nbytes uint64, err error) {
43974394
if mb.bek != nil && len(buf) > 0 {
43984395
bek, err := genBlockEncryptionKey(mb.fs.fcfg.Cipher, mb.seed, mb.nonce)
43994396
if err != nil {
4400-
mb.mu.Unlock()
44014397
return 0, 0, err
44024398
}
44034399
mb.bek = bek
44044400
mb.bek.XORKeyStream(buf, buf)
44054401
}
44064402
n, err := mb.writeAt(buf, 0)
44074403
if err != nil {
4408-
mb.mu.Unlock()
44094404
return 0, 0, fmt.Errorf("failed to rewrite compressed block: %w", err)
44104405
}
44114406
if n != len(buf) {
4412-
mb.mu.Unlock()
44134407
return 0, 0, fmt.Errorf("short write (%d != %d)", n, len(buf))
44144408
}
44154409
mb.mfd.Truncate(int64(len(buf)))
@@ -4422,7 +4416,6 @@ func (mb *msgBlock) truncate(sm *StoreMsg) (nmsgs, nbytes uint64, err error) {
44224416
mb.mfd.ReadAt(lchk[:], eof-8)
44234417
copy(mb.lchk[0:], lchk[:])
44244418
} else {
4425-
mb.mu.Unlock()
44264419
return 0, 0, fmt.Errorf("failed to truncate msg block %d, file not open", mb.index)
44274420
}
44284421

@@ -4436,10 +4429,8 @@ func (mb *msgBlock) truncate(sm *StoreMsg) (nmsgs, nbytes uint64, err error) {
44364429
// Redo per subject info for this block.
44374430
mb.resetPerSubjectInfo()
44384431

4439-
mb.mu.Unlock()
4440-
44414432
// Load msgs again.
4442-
mb.loadMsgs()
4433+
mb.loadMsgsWithLock()
44434434

44444435
return purged, bytes, nil
44454436
}

0 commit comments

Comments
 (0)