This is an automated email from the ASF dual-hosted git repository.

vongosling pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/rocketmq.git


The following commit(s) were added to refs/heads/develop by this push:
     new d429aa2  [ISSUE #3375] Lazy init GetMessageResult only when find 
message
d429aa2 is described below

commit d429aa24d3f5743cd8944a1cd9f04aee112503a4
Author: WJL3333 <[email protected]>
AuthorDate: Sun Sep 26 18:47:27 2021 +0800

    [ISSUE #3375] Lazy init GetMessageResult only when find message
---
 .../java/org/apache/rocketmq/store/DefaultMessageStore.java | 11 ++++++++++-
 .../java/org/apache/rocketmq/store/GetMessageResult.java    | 13 +++++++++----
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git 
a/store/src/main/java/org/apache/rocketmq/store/DefaultMessageStore.java 
b/store/src/main/java/org/apache/rocketmq/store/DefaultMessageStore.java
index bf61789..f6c652e 100644
--- a/store/src/main/java/org/apache/rocketmq/store/DefaultMessageStore.java
+++ b/store/src/main/java/org/apache/rocketmq/store/DefaultMessageStore.java
@@ -537,7 +537,8 @@ public class DefaultMessageStore implements MessageStore {
         long minOffset = 0;
         long maxOffset = 0;
 
-        GetMessageResult getResult = new GetMessageResult();
+        // lazy init when find msg.
+        GetMessageResult getResult = null;
 
         final long maxOffsetPy = this.commitLog.getMaxOffset();
 
@@ -574,6 +575,9 @@ public class DefaultMessageStore implements MessageStore {
                         int i = 0;
                         final int maxFilterMessageCount = Math.max(16000, 
maxMsgNums * ConsumeQueue.CQ_STORE_UNIT_SIZE);
                         final boolean diskFallRecorded = 
this.messageStoreConfig.isDiskFallRecorded();
+
+                        getResult = new GetMessageResult(maxMsgNums);
+
                         ConsumeQueueExt.CqExtUnit cqExtUnit = new 
ConsumeQueueExt.CqExtUnit();
                         for (; i < bufferConsumeQueue.getSize() && i < 
maxFilterMessageCount; i += ConsumeQueue.CQ_STORE_UNIT_SIZE) {
                             long offsetPy = 
bufferConsumeQueue.getByteBuffer().getLong();
@@ -677,6 +681,11 @@ public class DefaultMessageStore implements MessageStore {
         long elapsedTime = this.getSystemClock().now() - beginTime;
         this.storeStatsService.setGetMessageEntireTimeMax(elapsedTime);
 
+        // lazy init no data found.
+        if (getResult == null) {
+            getResult = new GetMessageResult(0);
+        }
+
         getResult.setStatus(status);
         getResult.setNextBeginOffset(nextBeginOffset);
         getResult.setMaxOffset(maxOffset);
diff --git 
a/store/src/main/java/org/apache/rocketmq/store/GetMessageResult.java 
b/store/src/main/java/org/apache/rocketmq/store/GetMessageResult.java
index 996e24d..4e6eccb 100644
--- a/store/src/main/java/org/apache/rocketmq/store/GetMessageResult.java
+++ b/store/src/main/java/org/apache/rocketmq/store/GetMessageResult.java
@@ -23,10 +23,8 @@ import org.apache.rocketmq.store.stats.BrokerStatsManager;
 
 public class GetMessageResult {
 
-    private final List<SelectMappedBufferResult> messageMapedList =
-        new ArrayList<SelectMappedBufferResult>(100);
-
-    private final List<ByteBuffer> messageBufferList = new 
ArrayList<ByteBuffer>(100);
+    private final List<SelectMappedBufferResult> messageMapedList;
+    private final List<ByteBuffer> messageBufferList;
 
     private GetMessageStatus status;
     private long nextBeginOffset;
@@ -40,6 +38,13 @@ public class GetMessageResult {
     private int msgCount4Commercial = 0;
 
     public GetMessageResult() {
+        messageMapedList = new ArrayList<>(100);
+        messageBufferList = new ArrayList<>(100);
+    }
+
+    public GetMessageResult(int resultSize) {
+        messageMapedList = new ArrayList<>(resultSize);
+        messageBufferList = new ArrayList<>(resultSize);
     }
 
     public GetMessageStatus getStatus() {

Reply via email to