Skip to content

Commit e909eed

Browse files
author
guyinyou
committed
add checkCommitLogOffsetOnRecover in MessageStoreConfig
Change-Id: Iac9afbb8b3ffb03fa15890decaf502afbfa44cf9
1 parent 1b76315 commit e909eed

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

store/src/main/java/org/apache/rocketmq/store/CommitLog.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,7 @@ public void recoverAbnormally(long maxPhyOffsetOfConsumeQueue) throws RocksDBExc
738738
// recover by the minimum time stamp
739739
boolean checkCRCOnRecover = this.defaultMessageStore.getMessageStoreConfig().isCheckCRCOnRecover();
740740
boolean checkDupInfo = this.defaultMessageStore.getMessageStoreConfig().isDuplicationEnable();
741+
boolean checkCommitLogOffsetOnRecover = this.defaultMessageStore.getMessageStoreConfig().isCheckCommitLogOffsetOnRecover();
741742
int maxRecoverNum = this.defaultMessageStore.getMessageStoreConfig().getCommitLogRecoverMaxNum();
742743
if (maxRecoverNum <= 0) {
743744
maxRecoverNum = 10;
@@ -793,13 +794,16 @@ public void recoverAbnormally(long maxPhyOffsetOfConsumeQueue) throws RocksDBExc
793794
DispatchRequest dispatchRequest = this.checkMessageAndReturnSize(byteBuffer, checkCRCOnRecover, checkDupInfo);
794795
int size = dispatchRequest.getMsgSize();
795796
if (dispatchRequest.isSuccess()) {
796-
if (dispatchRequest.getCommitLogOffset() < mappedFile.getFileFromOffset()
797-
|| dispatchRequest.getCommitLogOffset() > mappedFile.getFileFromOffset() + mappedFile.getFileSize()) {
798-
log.warn("found illegal commitlog offset {} in {}, current pos={}, it will be truncated.",
799-
dispatchRequest.getCommitLogOffset(), mappedFile.getFileName(), processOffset + mappedFileOffset);
800-
log.info("recover physics file end, {} pos={}", mappedFile.getFileName(), byteBuffer.position());
797+
// Check commitlog offset validity if enabled
798+
if (checkCommitLogOffsetOnRecover) {
799+
if (dispatchRequest.getCommitLogOffset() < mappedFile.getFileFromOffset()
800+
|| dispatchRequest.getCommitLogOffset() > mappedFile.getFileFromOffset() + mappedFile.getFileSize()) {
801+
log.warn("found illegal commitlog offset {} in {}, current pos={}, it will be truncated.",
802+
dispatchRequest.getCommitLogOffset(), mappedFile.getFileName(), processOffset + mappedFileOffset);
803+
log.info("recover physics file end, {} pos={}", mappedFile.getFileName(), byteBuffer.position());
801804

802-
break;
805+
break;
806+
}
803807
}
804808
// Normal data
805809
if (size > 0) {

store/src/main/java/org/apache/rocketmq/store/config/MessageStoreConfig.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,9 @@ public class MessageStoreConfig {
194194
// This ensures no on-the-wire or on-disk corruption to the messages occurred.
195195
// This check adds some overhead,so it may be disabled in cases seeking extreme performance.
196196
private boolean checkCRCOnRecover = true;
197+
// Whether check the commitlog offset validity during abnormal recovery.
198+
// This helps detect and truncate old file data that may pass CRC checks but contains invalid offsets.
199+
private boolean checkCommitLogOffsetOnRecover = false;
197200
// How many pages are to be flushed when flush CommitLog
198201
private int flushCommitLogLeastPages = 4;
199202
// How many pages are to be committed when commit data to file
@@ -795,6 +798,14 @@ public void setCheckCRCOnRecover(boolean checkCRCOnRecover) {
795798
this.checkCRCOnRecover = checkCRCOnRecover;
796799
}
797800

801+
public boolean isCheckCommitLogOffsetOnRecover() {
802+
return checkCommitLogOffsetOnRecover;
803+
}
804+
805+
public void setCheckCommitLogOffsetOnRecover(boolean checkCommitLogOffsetOnRecover) {
806+
this.checkCommitLogOffsetOnRecover = checkCommitLogOffsetOnRecover;
807+
}
808+
798809
public boolean isForceVerifyPropCRC() {
799810
return forceVerifyPropCRC;
800811
}

0 commit comments

Comments
 (0)