From 6cee569f2b5c15ed1b5d3416552cd130f177d667 Mon Sep 17 00:00:00 2001 From: osgoo Date: Sat, 30 May 2020 11:45:34 +0800 Subject: [PATCH 01/83] duplicate doAfterRpcHooks fix bug: doAfterRpcHooks execute twice. --- .../apache/rocketmq/remoting/netty/NettyRemotingAbstract.java | 1 - 1 file changed, 1 deletion(-) diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java index 23376727ce..3f21eb8ff1 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java @@ -226,7 +226,6 @@ public abstract class NettyRemotingAbstract { } else { NettyRequestProcessor processor = pair.getObject1(); RemotingCommand response = processor.processRequest(ctx, cmd); - doAfterRpcHooks(RemotingHelper.parseChannelRemoteAddr(ctx.channel()), cmd, response); callback.callback(response); } } catch (Throwable e) { From bc3eeed412ca33b7c0090d70cd3be72015bc8fb3 Mon Sep 17 00:00:00 2001 From: wangyalou <1374178468@qq.com> Date: Sun, 31 May 2020 10:29:46 +0800 Subject: [PATCH 02/83] fix: fix issue 2055 --- .../rocketmq/broker/processor/SendMessageProcessor.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java index 801d886c43..1b836ebf43 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java @@ -178,7 +178,10 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement int maxReconsumeTimes = subscriptionGroupConfig.getRetryMaxTimes(); if (request.getVersion() >= MQVersion.Version.V3_4_9.ordinal()) { - maxReconsumeTimes = requestHeader.getMaxReconsumeTimes(); + Integer times = requestHeader.getMaxReconsumeTimes(); + if (times != null){ + maxReconsumeTimes = times; + } } if (msgExt.getReconsumeTimes() >= maxReconsumeTimes From b954d358ab6b960484bd0c31a172e57df1c079a2 Mon Sep 17 00:00:00 2001 From: "ezlippi.ouyang" Date: Tue, 9 Mar 2021 13:52:27 +0800 Subject: [PATCH 03/83] feat: issue2715, make netty parameter configure by system property --- .../remoting/netty/NettyClientConfig.java | 8 ++++---- .../remoting/netty/NettySystemConfig.java | 19 ++++++++++++++++++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyClientConfig.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyClientConfig.java index fbc071b28f..5ba3534cb8 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyClientConfig.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyClientConfig.java @@ -20,23 +20,23 @@ public class NettyClientConfig { /** * Worker thread number */ - private int clientWorkerThreads = 4; + private int clientWorkerThreads = NettySystemConfig.clientWorkerSize; private int clientCallbackExecutorThreads = Runtime.getRuntime().availableProcessors(); private int clientOnewaySemaphoreValue = NettySystemConfig.CLIENT_ONEWAY_SEMAPHORE_VALUE; private int clientAsyncSemaphoreValue = NettySystemConfig.CLIENT_ASYNC_SEMAPHORE_VALUE; - private int connectTimeoutMillis = 3000; + private int connectTimeoutMillis = NettySystemConfig.connectTimeoutMillis; private long channelNotActiveInterval = 1000 * 60; /** * IdleStateEvent will be triggered when neither read nor write was performed for * the specified period of this time. Specify {@code 0} to disable */ - private int clientChannelMaxIdleTimeSeconds = 120; + private int clientChannelMaxIdleTimeSeconds = NettySystemConfig.clientChannelMaxIdleTimeSeconds; private int clientSocketSndBufSize = NettySystemConfig.socketSndbufSize; private int clientSocketRcvBufSize = NettySystemConfig.socketRcvbufSize; private boolean clientPooledByteBufAllocatorEnable = false; - private boolean clientCloseSocketIfTimeout = false; + private boolean clientCloseSocketIfTimeout = NettySystemConfig.clientCloseSocketIfTimeout; private boolean useTLS; diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettySystemConfig.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettySystemConfig.java index 6357c03ba8..ef767a36ed 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettySystemConfig.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettySystemConfig.java @@ -28,8 +28,17 @@ public class NettySystemConfig { "com.rocketmq.remoting.clientAsyncSemaphoreValue"; public static final String COM_ROCKETMQ_REMOTING_CLIENT_ONEWAY_SEMAPHORE_VALUE = "com.rocketmq.remoting.clientOnewaySemaphoreValue"; + public static final String COM_ROCKETMQ_REMOTING_CLIENT_WORKER_SIZE = + "com.rocketmq.remoting.client.worker.size"; + public static final String COM_ROCKETMQ_REMOTING_CLIENT_CONNECT_TIMEOUT = + "com.rocketmq.remoting.client.connect.timeout"; + public static final String COM_ROCKETMQ_REMOTING_CLIENT_CHANNEL_MAX_IDLE_SECONDS = + "com.rocketmq.remoting.client.channel.maxIdleTimeSeconds"; + public static final String COM_ROCKETMQ_REMOTING_CLIENT_CLOSE_SOCKET_IF_TIMEOUT = + "com.rocketmq.remoting.client.closeSocketIfTimeout"; - public static final boolean NETTY_POOLED_BYTE_BUF_ALLOCATOR_ENABLE = // + + public static final boolean NETTY_POOLED_BYTE_BUF_ALLOCATOR_ENABLE = // Boolean.parseBoolean(System.getProperty(COM_ROCKETMQ_REMOTING_NETTY_POOLED_BYTE_BUF_ALLOCATOR_ENABLE, "false")); public static final int CLIENT_ASYNC_SEMAPHORE_VALUE = // Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_ASYNC_SEMAPHORE_VALUE, "65535")); @@ -39,4 +48,12 @@ public class NettySystemConfig { Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_SOCKET_SNDBUF_SIZE, "65535")); public static int socketRcvbufSize = Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_SOCKET_RCVBUF_SIZE, "65535")); + public static int clientWorkerSize = + Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_WORKER_SIZE, "4")); + public static int connectTimeoutMillis = + Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CONNECT_TIMEOUT, "3000")); + public static int clientChannelMaxIdleTimeSeconds = + Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CHANNEL_MAX_IDLE_SECONDS, "120")); + public static boolean clientCloseSocketIfTimeout = + Boolean.parseBoolean(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CLOSE_SOCKET_IF_TIMEOUT, "true")); } From 33a533b3b713ecc37f9c7168949a3e111a269ff5 Mon Sep 17 00:00:00 2001 From: "ezlippi.ouyang" Date: Fri, 12 Mar 2021 14:14:14 +0800 Subject: [PATCH 04/83] feat: add some test case --- .../remoting/netty/NettyClientConfigTest.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java diff --git a/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java b/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java new file mode 100644 index 0000000000..2352871ed3 --- /dev/null +++ b/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java @@ -0,0 +1,34 @@ +package org.apache.rocketmq.remoting.netty; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(MockitoJUnitRunner.class) +public class NettyClientConfigTest { + + @Test + public void testChangeConfigBySystemProperty() throws NoSuchFieldException, IllegalAccessException { + + System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_WORKER_SIZE, "1"); + System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_ONEWAY_SEMAPHORE_VALUE, "1023"); + System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_ASYNC_SEMAPHORE_VALUE, "1024"); + System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_CONNECT_TIMEOUT, "2000"); + System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_CHANNEL_MAX_IDLE_SECONDS, "60"); + System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_SOCKET_SNDBUF_SIZE, "16383"); + System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_SOCKET_RCVBUF_SIZE, "16384"); + System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_CLOSE_SOCKET_IF_TIMEOUT, "false"); + + NettyClientConfig changedConfig = new NettyClientConfig(); + assertThat(changedConfig.getClientWorkerThreads()).isEqualTo(1); + assertThat(changedConfig.getClientOnewaySemaphoreValue()).isEqualTo(1023); + assertThat(changedConfig.getClientAsyncSemaphoreValue()).isEqualTo(1024); + assertThat(changedConfig.getConnectTimeoutMillis()).isEqualTo(2000); + assertThat(changedConfig.getClientChannelMaxIdleTimeSeconds()).isEqualTo(60); + assertThat(changedConfig.getClientSocketSndBufSize()).isEqualTo(16383); + assertThat(changedConfig.getClientSocketRcvBufSize()).isEqualTo(16384); + assertThat(changedConfig.isClientCloseSocketIfTimeout()).isEqualTo(false); + } +} From 03adb63c4c6ea5cedf5a2a43546eaa9cede41c74 Mon Sep 17 00:00:00 2001 From: "ezlippi.ouyang" Date: Fri, 12 Mar 2021 14:47:56 +0800 Subject: [PATCH 05/83] feat: add some test case --- .../remoting/netty/NettyClientConfigTest.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java b/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java index 2352871ed3..488bd0371a 100644 --- a/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java +++ b/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java @@ -11,20 +11,33 @@ public class NettyClientConfigTest { @Test public void testChangeConfigBySystemProperty() throws NoSuchFieldException, IllegalAccessException { + System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_WORKER_SIZE, "1"); - System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_ONEWAY_SEMAPHORE_VALUE, "1023"); - System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_ASYNC_SEMAPHORE_VALUE, "1024"); System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_CONNECT_TIMEOUT, "2000"); System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_CHANNEL_MAX_IDLE_SECONDS, "60"); System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_SOCKET_SNDBUF_SIZE, "16383"); System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_SOCKET_RCVBUF_SIZE, "16384"); System.setProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_CLOSE_SOCKET_IF_TIMEOUT, "false"); + + NettySystemConfig.socketSndbufSize = + Integer.parseInt(System.getProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_SOCKET_SNDBUF_SIZE, "65535")); + NettySystemConfig.socketRcvbufSize = + Integer.parseInt(System.getProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_SOCKET_RCVBUF_SIZE, "65535")); + NettySystemConfig.clientWorkerSize = + Integer.parseInt(System.getProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_WORKER_SIZE, "4")); + NettySystemConfig.connectTimeoutMillis = + Integer.parseInt(System.getProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_CONNECT_TIMEOUT, "3000")); + NettySystemConfig.clientChannelMaxIdleTimeSeconds = + Integer.parseInt(System.getProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_CHANNEL_MAX_IDLE_SECONDS, "120")); + NettySystemConfig.clientCloseSocketIfTimeout = + Boolean.parseBoolean(System.getProperty(NettySystemConfig.COM_ROCKETMQ_REMOTING_CLIENT_CLOSE_SOCKET_IF_TIMEOUT, "true")); + NettyClientConfig changedConfig = new NettyClientConfig(); assertThat(changedConfig.getClientWorkerThreads()).isEqualTo(1); - assertThat(changedConfig.getClientOnewaySemaphoreValue()).isEqualTo(1023); - assertThat(changedConfig.getClientAsyncSemaphoreValue()).isEqualTo(1024); + assertThat(changedConfig.getClientOnewaySemaphoreValue()).isEqualTo(65535); + assertThat(changedConfig.getClientAsyncSemaphoreValue()).isEqualTo(65535); assertThat(changedConfig.getConnectTimeoutMillis()).isEqualTo(2000); assertThat(changedConfig.getClientChannelMaxIdleTimeSeconds()).isEqualTo(60); assertThat(changedConfig.getClientSocketSndBufSize()).isEqualTo(16383); From 98237b139ae57f274c78f6765fe039995b7755eb Mon Sep 17 00:00:00 2001 From: "ezlippi.ouyang" Date: Fri, 12 Mar 2021 15:27:31 +0800 Subject: [PATCH 06/83] feat: add some test case --- .../apache/rocketmq/remoting/netty/NettyClientConfigTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java b/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java index 488bd0371a..3864ce87e0 100644 --- a/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java +++ b/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java @@ -43,5 +43,6 @@ public class NettyClientConfigTest { assertThat(changedConfig.getClientSocketSndBufSize()).isEqualTo(16383); assertThat(changedConfig.getClientSocketRcvBufSize()).isEqualTo(16384); assertThat(changedConfig.isClientCloseSocketIfTimeout()).isEqualTo(false); + } } From 67ceb64eb6ae0e59f06347bbf74004e21f4ef188 Mon Sep 17 00:00:00 2001 From: "ezlippi.ouyang" Date: Fri, 12 Mar 2021 18:05:22 +0800 Subject: [PATCH 07/83] fix: add license --- .../remoting/netty/NettyClientConfigTest.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java b/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java index 3864ce87e0..c0acdbe0cb 100644 --- a/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java +++ b/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java @@ -1,3 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package org.apache.rocketmq.remoting.netty; import org.junit.Test; From 59cbbc4337d79b070ab089cb91be02af19393863 Mon Sep 17 00:00:00 2001 From: "ezlippi.ouyang" Date: Mon, 15 Mar 2021 10:08:26 +0800 Subject: [PATCH 08/83] feat: add some test case --- .../apache/rocketmq/remoting/netty/NettyClientConfigTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java b/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java index c0acdbe0cb..15cf033864 100644 --- a/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java +++ b/remoting/src/test/java/org/apache/rocketmq/remoting/netty/NettyClientConfigTest.java @@ -60,6 +60,5 @@ public class NettyClientConfigTest { assertThat(changedConfig.getClientSocketSndBufSize()).isEqualTo(16383); assertThat(changedConfig.getClientSocketRcvBufSize()).isEqualTo(16384); assertThat(changedConfig.isClientCloseSocketIfTimeout()).isEqualTo(false); - } } From 56c3ad8718485d2b47953e2f6ef4cfa80223558c Mon Sep 17 00:00:00 2001 From: zhurunhua Date: Wed, 12 May 2021 16:15:52 +0800 Subject: [PATCH 09/83] update the option's description of deleteAccessConfig command --- .../tools/command/acl/DeleteAccessConfigSubCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/acl/DeleteAccessConfigSubCommand.java b/tools/src/main/java/org/apache/rocketmq/tools/command/acl/DeleteAccessConfigSubCommand.java index 8570b2f758..0a1a4b2382 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/acl/DeleteAccessConfigSubCommand.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/acl/DeleteAccessConfigSubCommand.java @@ -44,10 +44,10 @@ public class DeleteAccessConfigSubCommand implements SubCommand { public Options buildCommandlineOptions(Options options) { OptionGroup optionGroup = new OptionGroup(); - Option opt = new Option("b", "brokerAddr", true, "delete acl config account to which broker"); + Option opt = new Option("b", "brokerAddr", true, "delete acl config account from which broker"); optionGroup.addOption(opt); - opt = new Option("c", "clusterName", true, "delete cl config account to which cluster"); + opt = new Option("c", "clusterName", true, "delete acl config account from which cluster"); optionGroup.addOption(opt); optionGroup.setRequired(true); From 22647dea4df1fae4108abeafc68a9df4919a50cd Mon Sep 17 00:00:00 2001 From: zhurunhua Date: Thu, 13 May 2021 14:47:56 +0800 Subject: [PATCH 10/83] update the option's description of updateAccessConfig command --- .../tools/command/acl/DeleteAccessConfigSubCommand.java | 4 ++-- .../tools/command/acl/UpdateAccessConfigSubCommand.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/acl/DeleteAccessConfigSubCommand.java b/tools/src/main/java/org/apache/rocketmq/tools/command/acl/DeleteAccessConfigSubCommand.java index 0a1a4b2382..d82453dc9f 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/acl/DeleteAccessConfigSubCommand.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/acl/DeleteAccessConfigSubCommand.java @@ -76,7 +76,7 @@ public class DeleteAccessConfigSubCommand implements SubCommand { defaultMQAdminExt.start(); defaultMQAdminExt.deletePlainAccessConfig(addr, accessKey); - System.out.printf("delete plain access config account to %s success.%n", addr); + System.out.printf("delete plain access config account from %s success.%n", addr); System.out.printf("account's accesskey is:%s", accessKey); return; @@ -89,7 +89,7 @@ public class DeleteAccessConfigSubCommand implements SubCommand { CommandUtil.fetchMasterAddrByClusterName(defaultMQAdminExt, clusterName); for (String addr : masterSet) { defaultMQAdminExt.deletePlainAccessConfig(addr, accessKey); - System.out.printf("delete plain access config account to %s success.%n", addr); + System.out.printf("delete plain access config account from %s success.%n", addr); } System.out.printf("account's accesskey is:%s", accessKey); diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/acl/UpdateAccessConfigSubCommand.java b/tools/src/main/java/org/apache/rocketmq/tools/command/acl/UpdateAccessConfigSubCommand.java index 10241bf91e..b625cd94c1 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/acl/UpdateAccessConfigSubCommand.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/acl/UpdateAccessConfigSubCommand.java @@ -50,7 +50,7 @@ public class UpdateAccessConfigSubCommand implements SubCommand { Option opt = new Option("b", "brokerAddr", true, "update acl config file to which broker"); optionGroup.addOption(opt); - opt = new Option("c", "clusterName", true, "update cl config file to which cluster"); + opt = new Option("c", "clusterName", true, "update acl config file to which cluster"); optionGroup.addOption(opt); optionGroup.setRequired(true); From 5fe0041686739ce3959dfa17a6ae63b84ab6320c Mon Sep 17 00:00:00 2001 From: huangli Date: Tue, 9 Feb 2021 20:42:35 +0800 Subject: [PATCH 11/83] Change default value of some parameters: sendMessageThreadPoolNums/useReentrantLockWhenPutMessage/flushCommitLogTimed/endTransactionThreadPoolNums --- .../java/org/apache/rocketmq/common/BrokerConfig.java | 8 ++++---- .../apache/rocketmq/store/config/MessageStoreConfig.java | 7 +++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java index d80b3d2169..f710cdb403 100644 --- a/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java +++ b/common/src/main/java/org/apache/rocketmq/common/BrokerConfig.java @@ -57,10 +57,9 @@ public class BrokerConfig { @ImportantField private boolean traceTopicEnable = false; /** - * thread numbers for send message thread pool, since spin lock will be used by default since 4.0.x, the default - * value is 1. + * thread numbers for send message thread pool. */ - private int sendMessageThreadPoolNums = 1; //16 + Runtime.getRuntime().availableProcessors() * 4; + private int sendMessageThreadPoolNums = Math.min(Runtime.getRuntime().availableProcessors(), 4); private int pullMessageThreadPoolNums = 16 + Runtime.getRuntime().availableProcessors() * 2; private int processReplyMessageThreadPoolNums = 16 + Runtime.getRuntime().availableProcessors() * 2; private int queryMessageThreadPoolNums = 8 + Runtime.getRuntime().availableProcessors(); @@ -73,7 +72,8 @@ public class BrokerConfig { /** * Thread numbers for EndTransactionProcessor */ - private int endTransactionThreadPoolNums = 8 + Runtime.getRuntime().availableProcessors() * 2; + private int endTransactionThreadPoolNums = Math.max(8 + Runtime.getRuntime().availableProcessors() * 2, + sendMessageThreadPoolNums * 4); private int flushConsumerOffsetInterval = 1000 * 5; diff --git a/store/src/main/java/org/apache/rocketmq/store/config/MessageStoreConfig.java b/store/src/main/java/org/apache/rocketmq/store/config/MessageStoreConfig.java index c13ad4cfa2..978e85baca 100644 --- a/store/src/main/java/org/apache/rocketmq/store/config/MessageStoreConfig.java +++ b/store/src/main/java/org/apache/rocketmq/store/config/MessageStoreConfig.java @@ -54,13 +54,12 @@ public class MessageStoreConfig { /** * introduced since 4.0.x. Determine whether to use mutex reentrantLock when putting message.
- * By default it is set to false indicating using spin lock when putting message. */ - private boolean useReentrantLockWhenPutMessage = false; + private boolean useReentrantLockWhenPutMessage = true; - // Whether schedule flush,default is real-time + // Whether schedule flush @ImportantField - private boolean flushCommitLogTimed = false; + private boolean flushCommitLogTimed = true; // ConsumeQueue flush interval private int flushIntervalConsumeQueue = 1000; // Resource reclaim interval From b186bcd53f7f211a6557d5121ffd4a7afdfc93bb Mon Sep 17 00:00:00 2001 From: zhurunhua Date: Wed, 26 May 2021 15:10:38 +0800 Subject: [PATCH 12/83] update the option's description of consumer.sh --- .../java/org/apache/rocketmq/example/benchmark/Consumer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/src/main/java/org/apache/rocketmq/example/benchmark/Consumer.java b/example/src/main/java/org/apache/rocketmq/example/benchmark/Consumer.java index b6c6ae410f..1b52a91ffa 100644 --- a/example/src/main/java/org/apache/rocketmq/example/benchmark/Consumer.java +++ b/example/src/main/java/org/apache/rocketmq/example/benchmark/Consumer.java @@ -190,7 +190,7 @@ public class Consumer { opt.setRequired(false); options.addOption(opt); - opt = new Option("p", "group prefix enable", true, "Consumer group name, Default: false"); + opt = new Option("p", "group prefix enable", true, "Is group prefix enable, Default: false"); opt.setRequired(false); options.addOption(opt); From 20b6cddb9454bc8671aaf0a16d8e4b0b0bc529c3 Mon Sep 17 00:00:00 2001 From: huangli Date: Thu, 27 May 2021 15:36:13 +0800 Subject: [PATCH 13/83] [ISSUE 2883] Remove an duplicate MessageDecoder.string2messageProperties for each message, and prevent store "WAIT=true" property (in most case) to save 9 bytes for each message. --- .../broker/processor/SendMessageProcessor.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java index 724cf54c81..45d71f4aeb 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java @@ -277,18 +277,26 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement msgInner.setBody(body); msgInner.setFlag(requestHeader.getFlag()); - MessageAccessor.setProperties(msgInner, MessageDecoder.string2messageProperties(requestHeader.getProperties())); - msgInner.setPropertiesString(requestHeader.getProperties()); + Map origProps = MessageDecoder.string2messageProperties(requestHeader.getProperties()); + MessageAccessor.setProperties(msgInner, origProps); msgInner.setBornTimestamp(requestHeader.getBornTimestamp()); msgInner.setBornHost(ctx.channel().remoteAddress()); msgInner.setStoreHost(this.getStoreHost()); msgInner.setReconsumeTimes(requestHeader.getReconsumeTimes() == null ? 0 : requestHeader.getReconsumeTimes()); String clusterName = this.brokerController.getBrokerConfig().getBrokerClusterName(); MessageAccessor.putProperty(msgInner, MessageConst.PROPERTY_CLUSTER, clusterName); - msgInner.setPropertiesString(MessageDecoder.messageProperties2String(msgInner.getProperties())); + if (origProps.containsKey(MessageConst.PROPERTY_WAIT_STORE_MSG_OK)) { + // There is no need to store "WAIT=true", remove it from propertiesString to save 9 bytes for each message. + // It works for most case. In some cases msgInner.setPropertiesString invoked later and replace it. + String waitStoreMsgOKValue = origProps.remove(MessageConst.PROPERTY_WAIT_STORE_MSG_OK); + msgInner.setPropertiesString(MessageDecoder.messageProperties2String(msgInner.getProperties())); + // Reput to properties, since msgInner.isWaitStoreMsgOK() will be invoked later + origProps.put(MessageConst.PROPERTY_WAIT_STORE_MSG_OK, waitStoreMsgOKValue); + } else { + msgInner.setPropertiesString(MessageDecoder.messageProperties2String(msgInner.getProperties())); + } CompletableFuture putMessageResult = null; - Map origProps = MessageDecoder.string2messageProperties(requestHeader.getProperties()); String transFlag = origProps.get(MessageConst.PROPERTY_TRANSACTION_PREPARED); if (transFlag != null && Boolean.parseBoolean(transFlag)) { if (this.brokerController.getBrokerConfig().isRejectTransactionMessage()) { From f42db53bb024633dae1350f0bead4e73458dde0a Mon Sep 17 00:00:00 2001 From: nilei3 Date: Thu, 3 Jun 2021 23:23:41 +0800 Subject: [PATCH 14/83] Changing the comma input method --- docs/cn/design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cn/design.md b/docs/cn/design.md index dcd39026f2..ab88e1c530 100644 --- a/docs/cn/design.md +++ b/docs/cn/design.md @@ -10,7 +10,7 @@ #### 1.1 消息存储整体架构 消息存储架构图中主要有下面三个跟消息存储相关的文件构成。 -(1) CommitLog:消息主体以及元数据的存储主体,存储Producer端写入的消息主体内容,消息内容不是定长的。单个文件大小默认1G ,文件名长度为20位,左边补零,剩余为起始偏移量,比如00000000000000000000代表了第一个文件,起始偏移量为0,文件大小为1G=1073741824;当第一个文件写满了,第二个文件为00000000001073741824,起始偏移量为1073741824,以此类推。消息主要是顺序写入日志文件,当文件满了,写入下一个文件; +(1) CommitLog:消息主体以及元数据的存储主体,存储Producer端写入的消息主体内容,消息内容不是定长的。单个文件大小默认1G,文件名长度为20位,左边补零,剩余为起始偏移量,比如00000000000000000000代表了第一个文件,起始偏移量为0,文件大小为1G=1073741824;当第一个文件写满了,第二个文件为00000000001073741824,起始偏移量为1073741824,以此类推。消息主要是顺序写入日志文件,当文件满了,写入下一个文件; (2) ConsumeQueue:消息消费队列,引入的目的主要是提高消息消费的性能,由于RocketMQ是基于主题topic的订阅模式,消息消费是针对主题进行的,如果要遍历commitlog文件中根据topic检索消息是非常低效的。Consumer即可根据ConsumeQueue来查找待消费的消息。其中,ConsumeQueue(逻辑消费队列)作为消费消息的索引,保存了指定Topic下的队列消息在CommitLog中的起始物理偏移量offset,消息大小size和消息Tag的HashCode值。consumequeue文件可以看成是基于topic的commitlog索引文件,故consumequeue文件夹的组织方式如下:topic/queue/file三层组织结构,具体存储路径为:$HOME/store/consumequeue/{topic}/{queueId}/{fileName}。同样consumequeue文件采取定长设计,每一个条目共20个字节,分别为8字节的commitlog物理偏移量、4字节的消息长度、8字节tag hashcode,单个文件由30W个条目组成,可以像数组一样随机访问每一个条目,每个ConsumeQueue文件大小约5.72M; From 317fd7e01d859189812848b580ada087892bffaa Mon Sep 17 00:00:00 2001 From: "iostream2008@163.com" Date: Thu, 3 Jun 2021 23:29:59 +0800 Subject: [PATCH 15/83] Changing the comma input method --- docs/cn/design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cn/design.md b/docs/cn/design.md index ab88e1c530..99950746f7 100644 --- a/docs/cn/design.md +++ b/docs/cn/design.md @@ -10,7 +10,7 @@ #### 1.1 消息存储整体架构 消息存储架构图中主要有下面三个跟消息存储相关的文件构成。 -(1) CommitLog:消息主体以及元数据的存储主体,存储Producer端写入的消息主体内容,消息内容不是定长的。单个文件大小默认1G,文件名长度为20位,左边补零,剩余为起始偏移量,比如00000000000000000000代表了第一个文件,起始偏移量为0,文件大小为1G=1073741824;当第一个文件写满了,第二个文件为00000000001073741824,起始偏移量为1073741824,以此类推。消息主要是顺序写入日志文件,当文件满了,写入下一个文件; +(1) CommitLog:消息主体以及元数据的存储主体,存储Producer端写入的消息主体内容,消息内容不是定长的。单个文件大小默认1G, 文件名长度为20位,左边补零,剩余为起始偏移量,比如00000000000000000000代表了第一个文件,起始偏移量为0,文件大小为1G=1073741824;当第一个文件写满了,第二个文件为00000000001073741824,起始偏移量为1073741824,以此类推。消息主要是顺序写入日志文件,当文件满了,写入下一个文件; (2) ConsumeQueue:消息消费队列,引入的目的主要是提高消息消费的性能,由于RocketMQ是基于主题topic的订阅模式,消息消费是针对主题进行的,如果要遍历commitlog文件中根据topic检索消息是非常低效的。Consumer即可根据ConsumeQueue来查找待消费的消息。其中,ConsumeQueue(逻辑消费队列)作为消费消息的索引,保存了指定Topic下的队列消息在CommitLog中的起始物理偏移量offset,消息大小size和消息Tag的HashCode值。consumequeue文件可以看成是基于topic的commitlog索引文件,故consumequeue文件夹的组织方式如下:topic/queue/file三层组织结构,具体存储路径为:$HOME/store/consumequeue/{topic}/{queueId}/{fileName}。同样consumequeue文件采取定长设计,每一个条目共20个字节,分别为8字节的commitlog物理偏移量、4字节的消息长度、8字节tag hashcode,单个文件由30W个条目组成,可以像数组一样随机访问每一个条目,每个ConsumeQueue文件大小约5.72M; From a027f8d6a0d4d6406c8265199433781f21ad7566 Mon Sep 17 00:00:00 2001 From: zongtanghu Date: Sat, 5 Jun 2021 12:29:37 +0800 Subject: [PATCH 16/83] [maven-release-plugin] prepare release rocketmq-all-4.9.0 --- acl/pom.xml | 2 +- broker/pom.xml | 2 +- client/pom.xml | 2 +- common/pom.xml | 2 +- distribution/pom.xml | 2 +- example/pom.xml | 2 +- filter/pom.xml | 2 +- logappender/pom.xml | 2 +- logging/pom.xml | 2 +- namesrv/pom.xml | 2 +- openmessaging/pom.xml | 2 +- pom.xml | 4 ++-- remoting/pom.xml | 2 +- srvutil/pom.xml | 2 +- store/pom.xml | 2 +- test/pom.xml | 2 +- tools/pom.xml | 2 +- 17 files changed, 18 insertions(+), 18 deletions(-) diff --git a/acl/pom.xml b/acl/pom.xml index 36dae6ad04..5e61c7cbdd 100644 --- a/acl/pom.xml +++ b/acl/pom.xml @@ -13,7 +13,7 @@ org.apache.rocketmq rocketmq-all - 4.8.1-SNAPSHOT + 4.9.0 rocketmq-acl rocketmq-acl ${project.version} diff --git a/broker/pom.xml b/broker/pom.xml index 0137b55678..f31f0af807 100644 --- a/broker/pom.xml +++ b/broker/pom.xml @@ -13,7 +13,7 @@ org.apache.rocketmq rocketmq-all - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 diff --git a/client/pom.xml b/client/pom.xml index 87dc89426a..446c5efaee 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 diff --git a/common/pom.xml b/common/pom.xml index 068de26dcb..0e3bf7bfb7 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 diff --git a/distribution/pom.xml b/distribution/pom.xml index d5ab667229..1d090dec0c 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -20,7 +20,7 @@ org.apache.rocketmq rocketmq-all - 4.8.1-SNAPSHOT + 4.9.0 rocketmq-distribution rocketmq-distribution ${project.version} diff --git a/example/pom.xml b/example/pom.xml index 568dd80295..1a54df7379 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -19,7 +19,7 @@ rocketmq-all org.apache.rocketmq - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 diff --git a/filter/pom.xml b/filter/pom.xml index c12dd1fb28..f7cccd71f8 100644 --- a/filter/pom.xml +++ b/filter/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 diff --git a/logappender/pom.xml b/logappender/pom.xml index a6e979a83e..181f1bd478 100644 --- a/logappender/pom.xml +++ b/logappender/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 rocketmq-logappender diff --git a/logging/pom.xml b/logging/pom.xml index 77d0f29a97..e9fa2a42f4 100644 --- a/logging/pom.xml +++ b/logging/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 diff --git a/namesrv/pom.xml b/namesrv/pom.xml index c5d6d05bc2..95cc7b2faa 100644 --- a/namesrv/pom.xml +++ b/namesrv/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 diff --git a/openmessaging/pom.xml b/openmessaging/pom.xml index 7f0e937996..069900cb48 100644 --- a/openmessaging/pom.xml +++ b/openmessaging/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 diff --git a/pom.xml b/pom.xml index 39f368538e..ed700c9551 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 2012 org.apache.rocketmq rocketmq-all - 4.8.1-SNAPSHOT + 4.9.0 pom Apache RocketMQ ${project.version} http://rocketmq.apache.org/ @@ -38,7 +38,7 @@ git@github.com:apache/rocketmq.git scm:git:git@github.com:apache/rocketmq.git scm:git:git@github.com:apache/rocketmq.git - HEAD + rocketmq-all-4.9.0 diff --git a/remoting/pom.xml b/remoting/pom.xml index d9dab9efa6..6df93dc692 100644 --- a/remoting/pom.xml +++ b/remoting/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 diff --git a/srvutil/pom.xml b/srvutil/pom.xml index b95808b7c2..7f1d4c0102 100644 --- a/srvutil/pom.xml +++ b/srvutil/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 diff --git a/store/pom.xml b/store/pom.xml index ed54db1b24..33e8dc9e60 100644 --- a/store/pom.xml +++ b/store/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index 851d9ab9aa..02f90101d8 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 diff --git a/tools/pom.xml b/tools/pom.xml index eeccae81bf..355464e2ff 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.8.1-SNAPSHOT + 4.9.0 4.0.0 From a1babab507934e81f0e05b2867566c8b459be341 Mon Sep 17 00:00:00 2001 From: zongtanghu Date: Sat, 5 Jun 2021 12:30:00 +0800 Subject: [PATCH 17/83] [maven-release-plugin] prepare for next development iteration --- acl/pom.xml | 2 +- broker/pom.xml | 2 +- client/pom.xml | 2 +- common/pom.xml | 2 +- distribution/pom.xml | 2 +- example/pom.xml | 2 +- filter/pom.xml | 2 +- logappender/pom.xml | 2 +- logging/pom.xml | 2 +- namesrv/pom.xml | 2 +- openmessaging/pom.xml | 2 +- pom.xml | 4 ++-- remoting/pom.xml | 2 +- srvutil/pom.xml | 2 +- store/pom.xml | 2 +- test/pom.xml | 2 +- tools/pom.xml | 2 +- 17 files changed, 18 insertions(+), 18 deletions(-) diff --git a/acl/pom.xml b/acl/pom.xml index 5e61c7cbdd..d624934178 100644 --- a/acl/pom.xml +++ b/acl/pom.xml @@ -13,7 +13,7 @@ org.apache.rocketmq rocketmq-all - 4.9.0 + 4.9.1-SNAPSHOT rocketmq-acl rocketmq-acl ${project.version} diff --git a/broker/pom.xml b/broker/pom.xml index f31f0af807..3a58aa0c71 100644 --- a/broker/pom.xml +++ b/broker/pom.xml @@ -13,7 +13,7 @@ org.apache.rocketmq rocketmq-all - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 diff --git a/client/pom.xml b/client/pom.xml index 446c5efaee..95ef4617dd 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 diff --git a/common/pom.xml b/common/pom.xml index 0e3bf7bfb7..ac1d086b4c 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 diff --git a/distribution/pom.xml b/distribution/pom.xml index 1d090dec0c..a5698bca1c 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -20,7 +20,7 @@ org.apache.rocketmq rocketmq-all - 4.9.0 + 4.9.1-SNAPSHOT rocketmq-distribution rocketmq-distribution ${project.version} diff --git a/example/pom.xml b/example/pom.xml index 1a54df7379..81f7515dbe 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -19,7 +19,7 @@ rocketmq-all org.apache.rocketmq - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 diff --git a/filter/pom.xml b/filter/pom.xml index f7cccd71f8..41bda9d0d2 100644 --- a/filter/pom.xml +++ b/filter/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 diff --git a/logappender/pom.xml b/logappender/pom.xml index 181f1bd478..cac520b610 100644 --- a/logappender/pom.xml +++ b/logappender/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 rocketmq-logappender diff --git a/logging/pom.xml b/logging/pom.xml index e9fa2a42f4..8ebb243045 100644 --- a/logging/pom.xml +++ b/logging/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 diff --git a/namesrv/pom.xml b/namesrv/pom.xml index 95cc7b2faa..01ef5b60fe 100644 --- a/namesrv/pom.xml +++ b/namesrv/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 diff --git a/openmessaging/pom.xml b/openmessaging/pom.xml index 069900cb48..4688c04043 100644 --- a/openmessaging/pom.xml +++ b/openmessaging/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index ed700c9551..b6f1770e2d 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 2012 org.apache.rocketmq rocketmq-all - 4.9.0 + 4.9.1-SNAPSHOT pom Apache RocketMQ ${project.version} http://rocketmq.apache.org/ @@ -38,7 +38,7 @@ git@github.com:apache/rocketmq.git scm:git:git@github.com:apache/rocketmq.git scm:git:git@github.com:apache/rocketmq.git - rocketmq-all-4.9.0 + HEAD diff --git a/remoting/pom.xml b/remoting/pom.xml index 6df93dc692..765e1a93bc 100644 --- a/remoting/pom.xml +++ b/remoting/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 diff --git a/srvutil/pom.xml b/srvutil/pom.xml index 7f1d4c0102..9c4544c0b2 100644 --- a/srvutil/pom.xml +++ b/srvutil/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 diff --git a/store/pom.xml b/store/pom.xml index 33e8dc9e60..23e9763d81 100644 --- a/store/pom.xml +++ b/store/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index 02f90101d8..41296501c2 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 diff --git a/tools/pom.xml b/tools/pom.xml index 355464e2ff..abe8197de3 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.0 + 4.9.1-SNAPSHOT 4.0.0 From 2fe6dc3034f3d886227c0afbade7ad785e5f9edc Mon Sep 17 00:00:00 2001 From: yuz10 <845238369@qq.com> Date: Wed, 9 Jun 2021 00:57:42 +0800 Subject: [PATCH 18/83] #2990 Add message tracing switch in sendMessage command of mqadmin --- .../command/message/SendMessageCommand.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/message/SendMessageCommand.java b/tools/src/main/java/org/apache/rocketmq/tools/command/message/SendMessageCommand.java index e4921c6f04..9550742e8f 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/message/SendMessageCommand.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/message/SendMessageCommand.java @@ -68,14 +68,18 @@ public class SendMessageCommand implements SubCommand { opt.setRequired(false); options.addOption(opt); + opt = new Option("m", "msgTraceEnable", true, "Message Trace Enable, Default: false"); + opt.setRequired(false); + options.addOption(opt); + return options; } - private DefaultMQProducer createProducer(RPCHook rpcHook) { + private DefaultMQProducer createProducer(RPCHook rpcHook, boolean msgTraceEnable) { if (this.producer != null) { return producer; } else { - producer = new DefaultMQProducer(rpcHook); + producer = new DefaultMQProducer(null, rpcHook, msgTraceEnable, null); producer.setProducerGroup(Long.toString(System.currentTimeMillis())); return producer; } @@ -112,8 +116,11 @@ public class SendMessageCommand implements SubCommand { } catch (Exception e) { throw new RuntimeException(this.getClass().getSimpleName() + " command failed", e); } - - DefaultMQProducer producer = this.createProducer(rpcHook); + boolean msgTraceEnable = false; + if (commandLine.hasOption('m')) { + msgTraceEnable = Boolean.parseBoolean(commandLine.getOptionValue('m').trim()); + } + DefaultMQProducer producer = this.createProducer(rpcHook, msgTraceEnable); SendResult result; try { producer.start(); @@ -153,4 +160,4 @@ public class SendMessageCommand implements SubCommand { ); } } -} \ No newline at end of file +} From 93dd0867c8e52d978a02610d5aced4d71b961c33 Mon Sep 17 00:00:00 2001 From: "fuzhi.lfz" Date: Wed, 16 Jun 2021 16:31:16 +0800 Subject: [PATCH 19/83] AsyncTraceDispatcher unique groupName --- .../apache/rocketmq/client/trace/AsyncTraceDispatcher.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java index 8210b41cd4..754cbd55ac 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java @@ -28,6 +28,7 @@ import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.client.AccessChannel; @@ -54,6 +55,7 @@ import static org.apache.rocketmq.client.trace.TraceConstants.TRACE_INSTANCE_NAM public class AsyncTraceDispatcher implements TraceDispatcher { private final static InternalLogger log = ClientLogger.getLog(); + private final static AtomicInteger COUNTER = new AtomicInteger(); private final int queueSize; private final int batchSize; private final int maxMsgSize; @@ -165,7 +167,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { } private String genGroupNameForTrace() { - return TraceConstants.GROUP_NAME_PREFIX + "-" + this.group + "-" + this.type ; + return TraceConstants.GROUP_NAME_PREFIX + "-" + this.group + "-" + this.type + "-" + COUNTER.incrementAndGet(); } @Override From 0c36d14e934ad428cd8edabefe94fb9f9e54bb79 Mon Sep 17 00:00:00 2001 From: "fuzhi.lfz" Date: Thu, 17 Jun 2021 11:27:58 +0800 Subject: [PATCH 20/83] remove SubAfter field --- .../org/apache/rocketmq/client/trace/TraceDataEncoder.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java index b65ba46a39..10aa241359 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/TraceDataEncoder.java @@ -188,9 +188,7 @@ public class TraceDataEncoder { .append(ctx.getCostTime()).append(TraceConstants.CONTENT_SPLITOR)// .append(ctx.isSuccess()).append(TraceConstants.CONTENT_SPLITOR)// .append(bean.getKeys()).append(TraceConstants.CONTENT_SPLITOR)// - .append(ctx.getContextCode()).append(TraceConstants.CONTENT_SPLITOR) - .append(ctx.getTimeStamp()).append(TraceConstants.CONTENT_SPLITOR) - .append(ctx.getGroupName()).append(TraceConstants.FIELD_SPLITOR); + .append(ctx.getContextCode()).append(TraceConstants.FIELD_SPLITOR); } } From e1263107ebbe3182a0b4871d8d20d3ed40c16076 Mon Sep 17 00:00:00 2001 From: zourunxin Date: Sat, 19 Jun 2021 10:54:37 +0800 Subject: [PATCH 21/83] [ISSUE #2997] Add a Chinese version of Configuration_System.md --- docs/cn/Configuration_System.md | 70 +++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 docs/cn/Configuration_System.md diff --git a/docs/cn/Configuration_System.md b/docs/cn/Configuration_System.md new file mode 100644 index 0000000000..d72ef93813 --- /dev/null +++ b/docs/cn/Configuration_System.md @@ -0,0 +1,70 @@ +# 系统配置 + +本节重点介绍系统(JVM/OS)的配置 +--- + +## **1 JVM 选项** ## + +建议使用最新发布的 JDK 1.8 版本。设置相同的 Xms 和 Xmx 值以防止 JVM 调整堆大小,并获得更好的性能。一种通用的JVM配置如下: + + -server -Xms8g -Xmx8g -Xmn4g + +设置 Direct ByteBuffer 内存大小。当 Direct ByteBuffer 达到指定大小时,将触发 Full GC: + + -XXMaxDirectMemorySize=15g + +如果你不在乎 RocketMQ broker 的启动时间,建议启用预分配 Java 堆以确保在 JVM 初始化期间为每个页面分配内存。你可以通过以下方式启用它: + + -XX+AlwaysPreTouch + +禁用偏向锁定可以减少 JVM 停顿: + + -XX-UseBiasedLocking + +关于垃圾收集器,推荐使用 JDK 1.8 的 G1 收集器: + + -XX+UseG1GC -XXG1HeapRegionSize=16m + -XXG1ReservePercent=25 + -XXInitiatingHeapOccupancyPercent=30 + +这些 GC 选项看起来有点激进,但事实证明它在生产环境中具有良好的性能 + +不要把-XXMaxGCPauseMillis 的值设置太小,否则JVM会使用一个小的新生代来实现这个目标,从而导致频繁发生minor GC。因此,建议使用滚动 GC 日志文件: + + -XX+UseGCLogFileRotation + -XXNumberOfGCLogFiles=5 + -XXGCLogFileSize=30m + +写 GC 文件会增加 broker 的延迟,因此可以考虑将 GC 日志文件重定向到内存文件系统: + + -Xloggcdevshmmq_gc_%p.log123 + +## 2 Linux 内核参数 ## + +在 bin 文件夹里,有一个 os.sh 脚本,里面列出了许多的内核参数,只需稍作更改即可用于生产用途。需特别关注以下参数,如想了解更多细节,请参考文档/proc/sys/vm/*。 + + + +- **vm.extra_free_kbytes**, 控制VM在后台回收(kswapd)开始的阈值和直接回收(通过分配进程)开始的阈值之间保留额外的空闲内存。通过使用这个参数,RocketMQ 可以避免在内存分配过程中出现高延迟。(与内核版本版本有关) + + + +- **vm.min_free_kbytes**, 该值不应设置低于1024KB,否则系统将遭到破坏,并且在高负载环境下容易出现死锁。 + + + + + +- **vm.max_map_count**, 规定进程可以拥有的最大内存映射区域数。 RocketMQ 使用 mmap 来加载 CommitLog 和 ConsumeQueue,因此建议将此参数设置为较大的值。 + + + +- **vm.swappiness**, 定义内核交换内存页的频率。该值若较大,则会导致频繁交换,较小则会减少交换量。为了避免交换延迟,建议将此值设为 10。 + + + +- **File descriptor limits**, RocketMQ 需要给文件(CommitLog 和 ConsumeQueue)和网络连接分配文件描述符。因此建议将该值设置为 655350。 + + + +- **Disk scheduler**, 推荐使用deadline IO 调度器,它可以为请求提供有保证的延迟。 \ No newline at end of file From ece364a14ea679d5eb765ca03fac5886d637feac Mon Sep 17 00:00:00 2001 From: CharliePu Date: Mon, 21 Jun 2021 15:13:19 +0800 Subject: [PATCH 22/83] Improve the comment of maxReconsumeTimes --- .../rocketmq/client/consumer/DefaultMQPushConsumer.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java index 9011117a79..caf166de47 100644 --- a/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java +++ b/client/src/main/java/org/apache/rocketmq/client/consumer/DefaultMQPushConsumer.java @@ -236,11 +236,11 @@ public class DefaultMQPushConsumer extends ClientConfig implements MQPushConsume private boolean unitMode = false; /** - * Max re-consume times. -1 means 16 times. - *

+ * Max re-consume times. + * In concurrently mode, -1 means 16; + * In orderly mode, -1 means Integer.MAX_VALUE. * - * If messages are re-consumed more than {@link #maxReconsumeTimes} before success, it's be directed to a deletion - * queue waiting. + * If messages are re-consumed more than {@link #maxReconsumeTimes} before success. */ private int maxReconsumeTimes = -1; From 2b236c3cd8ce2883c0188c759ccaa644fea8e00c Mon Sep 17 00:00:00 2001 From: Git_Yang <30995057+Git-Yang@users.noreply.github.com> Date: Mon, 21 Jun 2021 20:35:32 +0800 Subject: [PATCH 23/83] [ISSUE 3019] Fixed bug with batch-sent message statistics Signed-off-by: zhangyang --- .../org/apache/rocketmq/store/dledger/DLedgerCommitLog.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java b/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java index 9241ffe423..90fd6f3f16 100644 --- a/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java +++ b/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java @@ -553,7 +553,7 @@ public class DLedgerCommitLog extends CommitLog { msgIdBuilder.setLength(0); long elapsedTimeInLock; long queueOffset; - long msgNum = 0; + int msgNum = 0; try { beginTimeInDledgerLock = this.defaultMessageStore.getSystemClock().now(); queueOffset = getQueueOffsetByKey(encodeResult.queueOffsetKey, tranType); @@ -592,6 +592,7 @@ public class DLedgerCommitLog extends CommitLog { elapsedTimeInLock = this.defaultMessageStore.getSystemClock().now() - beginTimeInDledgerLock; appendResult = new AppendMessageResult(AppendMessageStatus.PUT_OK, firstWroteOffset, encodeResult.totalMsgLen, msgIdBuilder.toString(), System.currentTimeMillis(), queueOffset, elapsedTimeInLock); + appendResult.setMsgNum(msgNum); DLedgerCommitLog.this.topicQueueTable.put(encodeResult.queueOffsetKey, queueOffset + msgNum); } catch (Exception e) { log.error("Put message error", e); @@ -779,7 +780,7 @@ public class DLedgerCommitLog extends CommitLog { msgIdBuilder.setLength(0); long elapsedTimeInLock; long queueOffset; - long msgNum = 0; + int msgNum = 0; try { beginTimeInDledgerLock = this.defaultMessageStore.getSystemClock().now(); queueOffset = getQueueOffsetByKey(encodeResult.queueOffsetKey, tranType); @@ -818,6 +819,7 @@ public class DLedgerCommitLog extends CommitLog { elapsedTimeInLock = this.defaultMessageStore.getSystemClock().now() - beginTimeInDledgerLock; appendResult = new AppendMessageResult(AppendMessageStatus.PUT_OK, firstWroteOffset, encodeResult.totalMsgLen, msgIdBuilder.toString(), System.currentTimeMillis(), queueOffset, elapsedTimeInLock); + appendResult.setMsgNum(msgNum); DLedgerCommitLog.this.topicQueueTable.put(encodeResult.queueOffsetKey, queueOffset + msgNum); } catch (Exception e) { log.error("Put message error", e); From 25f6711d7fd6fe0f00532a810b9fef7e81467b03 Mon Sep 17 00:00:00 2001 From: zhangyang Date: Mon, 21 Jun 2021 20:42:29 +0800 Subject: [PATCH 24/83] [statistics] Fix the inconsistency of putMessageDistributeTime statistics Signed-off-by: zhangyang --- .../java/org/apache/rocketmq/store/StoreStatsService.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/store/src/main/java/org/apache/rocketmq/store/StoreStatsService.java b/store/src/main/java/org/apache/rocketmq/store/StoreStatsService.java index d43b34342f..8372845e7f 100644 --- a/store/src/main/java/org/apache/rocketmq/store/StoreStatsService.java +++ b/store/src/main/java/org/apache/rocketmq/store/StoreStatsService.java @@ -57,6 +57,7 @@ public class StoreStatsService extends ServiceThread { private final LinkedList getTimesMissList = new LinkedList(); private final LinkedList transferedMsgCountList = new LinkedList(); private volatile AtomicLong[] putMessageDistributeTime; + private volatile AtomicLong[] lastPutMessageDistributeTime; private long messageStoreBootTimestamp = System.currentTimeMillis(); private volatile long putMessageEntireTimeMax = 0; private volatile long getMessageEntireTimeMax = 0; @@ -80,11 +81,11 @@ public class StoreStatsService extends ServiceThread { next[i] = new AtomicLong(0); } - AtomicLong[] old = this.putMessageDistributeTime; + this.lastPutMessageDistributeTime = this.putMessageDistributeTime; this.putMessageDistributeTime = next; - return old; + return lastPutMessageDistributeTime; } public long getPutMessageEntireTimeMax() { @@ -298,7 +299,7 @@ public class StoreStatsService extends ServiceThread { } private String putMessageDistributeTimeToString() { - final AtomicLong[] times = this.putMessageDistributeTime; + final AtomicLong[] times = this.lastPutMessageDistributeTime; if (null == times) return null; From d8dec654b76ecb840668f64cd3632958ddcff2a2 Mon Sep 17 00:00:00 2001 From: patrick Date: Wed, 23 Jun 2021 10:48:36 +0800 Subject: [PATCH 25/83] add different send examples --- .../rocketmq/example/quickstart/Producer.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java b/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java index 53a1d4dd64..0da6177996 100644 --- a/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java @@ -18,6 +18,7 @@ package org.apache.rocketmq.example.quickstart; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.producer.SendCallback; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.remoting.common.RemotingHelper; @@ -65,6 +66,39 @@ public class Producer { * Call send message to deliver message to one of brokers. */ SendResult sendResult = producer.send(msg); + /* + * There are different ways to send message, if you don't care about the send result,you can use this way + * {@code + * producer.sendOneway(msg); + * } + */ + + /* + * if you want to get the send result in a synchronize way, you can use this send method + * {@code + * SendResult sendResult = producer.send(msg); + * System.out.println(sendResult.toString()); + * } + */ + + /* + * if you want to get the send result in a asynchronize way, you can use this send method + * {@code + * + * producer.send(msg, new SendCallback() { + * @Override + * public void onSuccess(SendResult sendResult) { + * // do something + * } + * + * @Override + * public void onException(Throwable e) { + * // do something + * } + *}); + * + *} + */ System.out.printf("%s%n", sendResult); } catch (Exception e) { From 160c5772fbdf02e55cdc67bc3b74bb9f9c4c644b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E6=97=AD?= Date: Wed, 23 Jun 2021 11:00:07 +0800 Subject: [PATCH 26/83] test(benchmark): support delay message test (#3010) Co-authored-by: zhangxu16 --- .../rocketmq/example/benchmark/Producer.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java b/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java index 6975ab58b0..32d4b9f746 100644 --- a/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/benchmark/Producer.java @@ -61,9 +61,11 @@ public class Producer { final boolean msgTraceEnable = commandLine.hasOption('m') && Boolean.parseBoolean(commandLine.getOptionValue('m')); final boolean aclEnable = commandLine.hasOption('a') && Boolean.parseBoolean(commandLine.getOptionValue('a')); final long messageNum = commandLine.hasOption('q') ? Long.parseLong(commandLine.getOptionValue('q')) : 0; + final boolean delayEnable = commandLine.hasOption('d') && Boolean.parseBoolean(commandLine.getOptionValue('d')); + final int delayLevel = commandLine.hasOption('e') ? Integer.parseInt(commandLine.getOptionValue('e')) : 1; - System.out.printf("topic: %s threadCount: %d messageSize: %d keyEnable: %s propertySize: %d tagCount: %d traceEnable: %s aclEnable: %s messageQuantity: %d%n", - topic, threadCount, messageSize, keyEnable, propertySize, tagCount, msgTraceEnable, aclEnable, messageNum); + System.out.printf("topic: %s threadCount: %d messageSize: %d keyEnable: %s propertySize: %d tagCount: %d traceEnable: %s aclEnable: %s messageQuantity: %d%n delayEnable: %s%n delayLevel: %s%n", + topic, threadCount, messageSize, keyEnable, propertySize, tagCount, msgTraceEnable, aclEnable, messageNum, delayEnable, delayLevel); final InternalLogger log = ClientLogger.getLog(); @@ -147,6 +149,9 @@ public class Producer { if (keyEnable) { msg.setKeys(String.valueOf(beginTimestamp / 1000)); } + if (delayEnable) { + msg.setDelayTimeLevel(delayLevel); + } if (tagCount > 0) { long sendSucCount = statsBenchmark.getReceiveResponseSuccessCount().get(); msg.setTags(String.format("tag%d", sendSucCount % tagCount)); @@ -266,6 +271,14 @@ public class Producer { opt.setRequired(false); options.addOption(opt); + opt = new Option("d", "delayEnable", true, "Delay message Enable, Default: false"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("e", "delayLevel", true, "Delay message level, Default: 1"); + opt.setRequired(false); + options.addOption(opt); + return options; } From 361eb8d286c3bdc19260d4315a87fa8427673fa5 Mon Sep 17 00:00:00 2001 From: messense Date: Tue, 22 Jun 2021 22:34:55 +0800 Subject: [PATCH 27/83] Upgrade netty-all dependency version to 4.1.65.Final --- .../broker/pagecache/ManyMessageTransfer.java | 27 +++++++++++ .../broker/pagecache/OneMessageTransfer.java | 27 +++++++++++ .../pagecache/QueryMessageTransfer.java | 27 +++++++++++ pom.xml | 2 +- .../rocketmq/remoting/netty/NettyLogger.java | 46 +++++++++++++++++++ 5 files changed, 128 insertions(+), 1 deletion(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/pagecache/ManyMessageTransfer.java b/broker/src/main/java/org/apache/rocketmq/broker/pagecache/ManyMessageTransfer.java index 968bcfb564..373a0a48b6 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/pagecache/ManyMessageTransfer.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/pagecache/ManyMessageTransfer.java @@ -53,6 +53,11 @@ public class ManyMessageTransfer extends AbstractReferenceCounted implements Fil return transferred; } + @Override + public long transferred() { + return transferred; + } + @Override public long count() { return byteBufferHeader.limit() + this.getMessageResult.getBufferTotalSize(); @@ -76,6 +81,28 @@ public class ManyMessageTransfer extends AbstractReferenceCounted implements Fil return 0; } + @Override + public FileRegion retain() { + super.retain(); + return this; + } + + @Override + public FileRegion retain(int increment) { + super.retain(increment); + return this; + } + + @Override + public FileRegion touch() { + return this; + } + + @Override + public FileRegion touch(Object hint) { + return this; + } + public void close() { this.deallocate(); } diff --git a/broker/src/main/java/org/apache/rocketmq/broker/pagecache/OneMessageTransfer.java b/broker/src/main/java/org/apache/rocketmq/broker/pagecache/OneMessageTransfer.java index b795d2d253..558f091763 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/pagecache/OneMessageTransfer.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/pagecache/OneMessageTransfer.java @@ -47,6 +47,11 @@ public class OneMessageTransfer extends AbstractReferenceCounted implements File return transferred; } + @Override + public long transferred() { + return transferred; + } + @Override public long count() { return this.byteBufferHeader.limit() + this.selectMappedBufferResult.getSize(); @@ -65,6 +70,28 @@ public class OneMessageTransfer extends AbstractReferenceCounted implements File return 0; } + @Override + public FileRegion retain() { + super.retain(); + return this; + } + + @Override + public FileRegion retain(int increment) { + super.retain(increment); + return this; + } + + @Override + public FileRegion touch() { + return this; + } + + @Override + public FileRegion touch(Object hint) { + return this; + } + public void close() { this.deallocate(); } diff --git a/broker/src/main/java/org/apache/rocketmq/broker/pagecache/QueryMessageTransfer.java b/broker/src/main/java/org/apache/rocketmq/broker/pagecache/QueryMessageTransfer.java index e8f3099667..db47b9e50e 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/pagecache/QueryMessageTransfer.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/pagecache/QueryMessageTransfer.java @@ -53,6 +53,11 @@ public class QueryMessageTransfer extends AbstractReferenceCounted implements Fi return transferred; } + @Override + public long transferred() { + return transferred; + } + @Override public long count() { return byteBufferHeader.limit() + this.queryMessageResult.getBufferTotalSize(); @@ -76,6 +81,28 @@ public class QueryMessageTransfer extends AbstractReferenceCounted implements Fi return 0; } + @Override + public FileRegion retain() { + super.retain(); + return this; + } + + @Override + public FileRegion retain(int increment) { + super.retain(increment); + return this; + } + + @Override + public FileRegion touch() { + return this; + } + + @Override + public FileRegion touch(Object hint) { + return this; + } + public void close() { this.deallocate(); } diff --git a/pom.xml b/pom.xml index b6f1770e2d..59fe5c8072 100644 --- a/pom.xml +++ b/pom.xml @@ -537,7 +537,7 @@ io.netty netty-all - 4.0.42.Final + 4.1.65.Final com.alibaba diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyLogger.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyLogger.java index 4b4e86e687..1a0c9b53e3 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyLogger.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyLogger.java @@ -52,6 +52,8 @@ public class NettyLogger { private InternalLogger logger = null; + private static final String EXCEPTION_MESSAGE = "Unexpected exception:"; + public NettyBridgeLogger(String name) { logger = InternalLoggerFactory.getLogger(name); } @@ -161,6 +163,25 @@ public class NettyLogger { } } + @Override + public void log(InternalLogLevel internalLogLevel, Throwable throwable) { + if (internalLogLevel.equals(InternalLogLevel.DEBUG)) { + logger.debug(EXCEPTION_MESSAGE, throwable); + } + if (internalLogLevel.equals(InternalLogLevel.TRACE)) { + logger.info(EXCEPTION_MESSAGE, throwable); + } + if (internalLogLevel.equals(InternalLogLevel.INFO)) { + logger.info(EXCEPTION_MESSAGE, throwable); + } + if (internalLogLevel.equals(InternalLogLevel.WARN)) { + logger.warn(EXCEPTION_MESSAGE, throwable); + } + if (internalLogLevel.equals(InternalLogLevel.ERROR)) { + logger.error(EXCEPTION_MESSAGE, throwable); + } + } + @Override public boolean isTraceEnabled() { return isEnabled(InternalLogLevel.TRACE); @@ -191,6 +212,11 @@ public class NettyLogger { logger.info(var1, var2); } + @Override + public void trace(Throwable var1) { + logger.info(EXCEPTION_MESSAGE, var1); + } + @Override public boolean isDebugEnabled() { return isEnabled(InternalLogLevel.DEBUG); @@ -221,6 +247,11 @@ public class NettyLogger { logger.debug(var1, var2); } + @Override + public void debug(Throwable var1) { + logger.debug(EXCEPTION_MESSAGE, var1); + } + @Override public boolean isInfoEnabled() { return isEnabled(InternalLogLevel.INFO); @@ -251,6 +282,11 @@ public class NettyLogger { logger.info(var1, var2); } + @Override + public void info(Throwable var1) { + logger.info(EXCEPTION_MESSAGE, var1); + } + @Override public boolean isWarnEnabled() { return isEnabled(InternalLogLevel.WARN); @@ -281,6 +317,11 @@ public class NettyLogger { logger.warn(var1, var2); } + @Override + public void warn(Throwable var1) { + logger.warn(EXCEPTION_MESSAGE, var1); + } + @Override public boolean isErrorEnabled() { return isEnabled(InternalLogLevel.ERROR); @@ -310,6 +351,11 @@ public class NettyLogger { public void error(String var1, Throwable var2) { logger.error(var1, var2); } + + @Override + public void error(Throwable var1) { + logger.error(EXCEPTION_MESSAGE, var1); + } } } From 278d3285bd7c5d2563a98533a0bac593504a8576 Mon Sep 17 00:00:00 2001 From: CuCu <503598058@qq.com> Date: Wed, 23 Jun 2021 14:41:59 +0800 Subject: [PATCH 28/83] add Chinese version --- docs/cn/Example_Delay.md | 85 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 docs/cn/Example_Delay.md diff --git a/docs/cn/Example_Delay.md b/docs/cn/Example_Delay.md new file mode 100644 index 0000000000..31df40f448 --- /dev/null +++ b/docs/cn/Example_Delay.md @@ -0,0 +1,85 @@ +# Schedule example + +### 1 启动消费者等待传入的订阅消息 + +```java +import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; +import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; +import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; +import org.apache.rocketmq.common.message.MessageExt; +import java.util.List; + +public class ScheduledMessageConsumer { + + public static void main(String[] args) throws Exception { + // Instantiate message consumer + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ExampleConsumer"); + // Subscribe topics + consumer.subscribe("TestTopic", "*"); + // Register message listener + consumer.registerMessageListener(new MessageListenerConcurrently() { + @Override + public ConsumeConcurrentlyStatus consumeMessage(List messages, ConsumeConcurrentlyContext context) { + for (MessageExt message : messages) { + // Print approximate delay time period + System.out.println("Receive message[msgId=" + message.getMsgId() + "] " + + (System.currentTimeMillis() - message.getStoreTimestamp()) + "ms later"); + } + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + }); + // Launch consumer + consumer.start(); + } +} +``` + +### 2 发送延迟消息 + +```java +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.common.message.Message; + +public class ScheduledMessageProducer { + + public static void main(String[] args) throws Exception { + // Instantiate a producer to send scheduled messages + DefaultMQProducer producer = new DefaultMQProducer("ExampleProducerGroup"); + // Launch producer + producer.start(); + int totalMessagesToSend = 100; + for (int i = 0; i < totalMessagesToSend; i++) { + Message message = new Message("TestTopic", ("Hello scheduled message " + i).getBytes()); + // This message will be delivered to consumer 10 seconds later. + message.setDelayTimeLevel(3); + // Send the message + producer.send(message); + } + + // Shutdown producer after use. + producer.shutdown(); + } + +} +``` + +### 3 确认 + +您应该会看到消息在其存储时间后大约 10 秒被消耗。 + +### 4 延迟消息的使用场景 + +例如在电子商务中,如果提交订单,可以发送延迟消息,1小时后可以查看订单状态。 如果订单仍未付款,则可以取消订单并释放库存。 + +### 5 使用延迟消息的限制 + +```java +// org/apache/rocketmq/store/config/MessageStoreConfig.java + +private String messageDelayLevel = "1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h"; +``` + +当前 RocketMQ 不支持任意时间的延迟。 生产者发送延迟消息前需要设置几个固定的延迟级别,分别对应1s到2h的1到18个延迟级,消息消费失败会进入延迟消息队列,消息发送时间与设置的延迟级别和重试次数有关。 + + See `SendMessageProcessor.java` From 23f3893787f1e738fefc5babaf0f9e6302829e44 Mon Sep 17 00:00:00 2001 From: oumengfan Date: Wed, 23 Jun 2021 16:00:01 +0800 Subject: [PATCH 29/83] Add a Chinese version of Deployment.md --- docs/cn/Deployment.md | 159 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100644 docs/cn/Deployment.md diff --git a/docs/cn/Deployment.md b/docs/cn/Deployment.md new file mode 100644 index 0000000000..1f00986b4b --- /dev/null +++ b/docs/cn/Deployment.md @@ -0,0 +1,159 @@ +# 部署架构和设置步骤 + +## 集群的设置 + +### 1 单master模式 + +这是最简单但也是最危险的模式,一旦broker服务器重启或宕机,整个服务将不可用。 建议在生产环境中不要使用这种部署方式,在本地测试和开发可以选择这种模式。 以下是构建的步骤。 + +**1)启动NameServer** + +```shell +### 第一步启动namesrv +$ nohup sh mqnamesrv & + +### 验证namesrv是否启动成功 +$ tail -f ~/logs/rocketmqlogs/namesrv.log +The Name Server boot success... +``` + +我们可以在namesrv.log 中看到'The Name Server boot success..',表示NameServer 已成功启动。 + +**2)启动Broker** + +```shell +### 第一步先启动broker +$ nohup sh bin/mqbroker -n localhost:9876 & + +### 验证broker是否启动成功, 比如, broker的ip是192.168.1.2 然后名字是broker-a +$ tail -f ~/logs/rocketmqlogs/Broker.log +The broker[broker-a,192.169.1.2:10911] boot success... +``` + +我们可以在 Broker.log 中看到“The broker[brokerName,ip:port] boot success..”,这表明 broker 已成功启动。 + +### 2 多Master模式 + +该模式是指所有节点都是master主节点(比如2个或3个主节点),没有slave从节点的模式。 这种模式的优缺点如下: + +- 优点: + 1. 配置简单。 + 2. 一个master节点的宕机或者重启(维护)对应用程序没有影响。 + 3. 当磁盘配置为RAID10时,消息不会丢失,因为RAID10磁盘非常可靠,即使机器不可恢复(消息异步刷盘模式的情况下,会丢失少量消息;如果消息是同步刷盘模式,不会丢失任何消息)。 + 4. 在这种模式下,性能是最高的。 +- 缺点: + 1. 单台机器宕机时,本机未消费的消息,直到机器恢复后才会订阅,影响消息实时性。 + +多Master模式的启动步骤如下: + +**1)启动 NameServer** + +```shell +### 第一步先启动broker +$ nohup sh mqnamesrv & + +### 验证namesrv是否启动成功 +$ tail -f ~/logs/rocketmqlogs/namesrv.log +The Name Server boot success... +``` + +**2)启动 Broker 集群** + +```shell +### 比如在A机器上启动第一个Master,假设配置的NameServer IP为:192.168.1.1 +$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-noslave/broker-a.properties & + +### 然后在机器B上启动第二个Master,假设配置的NameServer IP是:192.168.1.1 +$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-noslave/broker-b.properties & + +... +``` + +上面显示的boot命令用于单个NameServer的情况。对于多个NameServer的集群,broker boot命令中-n参数后面的地址列表用分号隔开,例如 192.168.1.1 : 9876; 192.161.2 : 9876 + +### 3 多Master多Slave模式-异步复制 + +每个主节点配置多个从节点,多对主从。HA采用异步复制,主节点和从节点之间有短消息延迟(毫秒)。这种模式的优缺点如下: + +- 优点: + 1. 即使磁盘损坏,也不会丢失极少的消息,不影响消息的实时性能。 + 2. 同时,当主节点宕机时,消费者仍然可以消费从节点的消息,这个过程对应用本身是透明的,不需要人为干预。 + 3. 性能几乎与多Master模式一样高。 +- 缺点: + 1. 主节点宕机、磁盘损坏时,会丢失少量消息。 + +多主多从模式的启动步骤如下: + +**1)启动 NameServer** + +```shell +### 第一步先启动broker +$ nohup sh mqnamesrv & + +### 验证namesrv是否启动成功 +$ tail -f ~/logs/rocketmqlogs/namesrv.log +The Name Server boot success... +``` + +**2)启动 Broker 集群** + +```shell +### 例如在A机器上启动第一个Master,假设配置的NameServer IP为:192.168.1.1,端口为9876。 +$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a.properties & + +### 然后在机器B上启动第二个Master,假设配置的NameServer IP为:192.168.1.1,端口为9876。 +$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b.properties & + +### 然后在C机器上启动第一个Slave,假设配置的NameServer IP为:192.168.1.1,端口为9876。 +$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-a-s.properties & + +### 最后在D机启动第二个Slave,假设配置的NameServer IP为:192.168.1.1,端口为9876。 +$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-async/broker-b-s.properties & +``` + +上图显示了 2M-2S-Async 模式的启动命令,类似于其他 nM-nS-Async 模式。 + +### 4 多Master多Slave模式-同步双写 + +这种模式下,每个master节点配置多个slave节点,有多对Master-Slave。HA采用同步双写,即只有消息成功写入到主节点并复制到多个从节点,才会返回成功响应给应用程序。 + +这种模式的优缺点如下: + +- 优点: + 1. 数据和服务都没有单点故障。 + 2. 在master节点关闭的情况下,消息也没有延迟。 + 3. 服务可用性和数据可用性非常高; +- 缺点: + 1. 这种模式下的性能略低于异步复制模式(大约低 10%)。 + 2. 发送单条消息的RT略高,目前版本,master节点宕机后,slave节点无法自动切换到master。 + +启动步骤如下: + +**1)启动NameServer** + +```shell +### 第一步启动broker +$ nohup sh mqnamesrv & + +### 验证namesrv是否启动成功 +$ tail -f ~/logs/rocketmqlogs/namesrv.log +The Name Server boot success... +``` + +**2)启动 Broker 集群** + +```shell +### 例如在A机器上启动第一个Master,假设配置的NameServer IP为:192.168.1.1,端口为9876。 +$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a.properties & + +### 然后在B机器上启动第二个Master,假设配置的NameServer IP为:192.168.1.1,端口为9876。 +$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b.properties & + +### 然后在C机器上启动第一个Slave,假设配置的NameServer IP为:192.168.1.1,端口为9876。 +$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-a-s.properties & + +### 最后在D机启动第二个Slave,假设配置的NameServer IP为:192.168.1.1,端口为9876。 +$ nohup sh mqbroker -n 192.168.1.1:9876 -c $ROCKETMQ_HOME/conf/2m-2s-sync/broker-b-s.properties & +``` + +上述Master和Slave是通过指定相同的config命名为“brokerName”来配对的,master节点的brokerId必须为0,slave节点的brokerId必须大于0。 \ No newline at end of file From 0cc5ad2d4fe9354507427cd078a5a3dceb7dde79 Mon Sep 17 00:00:00 2001 From: CuCu <503598058@qq.com> Date: Wed, 23 Jun 2021 16:03:14 +0800 Subject: [PATCH 30/83] add Chinese version of Example_Batch --- docs/cn/Example_Batch.md | 82 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 docs/cn/Example_Batch.md diff --git a/docs/cn/Example_Batch.md b/docs/cn/Example_Batch.md new file mode 100644 index 0000000000..6c8897fa6b --- /dev/null +++ b/docs/cn/Example_Batch.md @@ -0,0 +1,82 @@ +# 批量消息发送 +批量消息发送能够提高发送效率,提升系统吞吐量。同一批批量消息的topic、waitStoreMsgOK属性必须保持一致,批量消息不支持延迟消息。批量消息发送一次最多可以发送 4MiB 的消息,但是如果需要发送更大的消息,建议将较大的消息分成多个不超过 1MiB 的小消息。 + +### 1 发送批量消息 +如果你一次只发送不超过 4MiB 的消息,使用批处理很容易: +```java +String topic = "BatchTest"; +List messages = new ArrayList<>(); +messages.add(new Message(topic, "TagA", "OrderID001", "Hello world 0".getBytes())); +messages.add(new Message(topic, "TagA", "OrderID002", "Hello world 1".getBytes())); +messages.add(new Message(topic, "TagA", "OrderID003", "Hello world 2".getBytes())); +try { + producer.send(messages); +} catch (Exception e) { + e.printStackTrace(); + //handle the error +} +``` +### 2 拆分 +当您发送较大的消息时,复杂性会增加,如果您不确定它是否超过 4MiB的限制。 这时候,您最好将较大的消息分成多个不超过 1MiB 的小消息: + +```java +public class ListSplitter implements Iterator> { + private final int SIZE_LIMIT = 1024 * 1024 * 4; + private final List messages; + private int currIndex; + public ListSplitter(List messages) { + this.messages = messages; + } + @Override public boolean hasNext() { + return currIndex < messages.size(); + } + @Override public List next() { + int startIndex = getStartIndex(); + int nextIndex = startIndex; + int totalSize = 0; + for (; nextIndex < messages.size(); nextIndex++) { + Message message = messages.get(nextIndex); + int tmpSize = calcMessageSize(message); + if (tmpSize + totalSize > SIZE_LIMIT) { + break; + } else { + totalSize += tmpSize; + } + } + List subList = messages.subList(startIndex, nextIndex); + currIndex = nextIndex; + return subList; + } + private int getStartIndex() { + Message currMessage = messages.get(currIndex); + int tmpSize = calcMessageSize(currMessage); + while(tmpSize > SIZE_LIMIT) { + currIndex += 1; + Message message = messages.get(curIndex); + tmpSize = calcMessageSize(message); + } + return currIndex; + } + private int calcMessageSize(Message message) { + int tmpSize = message.getTopic().length() + message.getBody().length(); + Map properties = message.getProperties(); + for (Map.Entry entry : properties.entrySet()) { + tmpSize += entry.getKey().length() + entry.getValue().length(); + } + tmpSize = tmpSize + 20; // Increase the log overhead by 20 bytes + return tmpSize; + } +} + +// then you could split the large list into small ones: +ListSplitter splitter = new ListSplitter(messages); +while (splitter.hasNext()) { + try { + List listItem = splitter.next(); + producer.send(listItem); + } catch (Exception e) { + e.printStackTrace(); + // handle the error + } +} +``` \ No newline at end of file From a99cf37366eee9da34bc59a37db431a8fec6e43e Mon Sep 17 00:00:00 2001 From: 12425 Date: Wed, 23 Jun 2021 19:20:08 +0800 Subject: [PATCH 31/83] Add Chinses Version Doc of Example_Simple.md --- docs/cn/Example_Simple_cn.md | 136 +++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 docs/cn/Example_Simple_cn.md diff --git a/docs/cn/Example_Simple_cn.md b/docs/cn/Example_Simple_cn.md new file mode 100644 index 0000000000..f0a2b6a1de --- /dev/null +++ b/docs/cn/Example_Simple_cn.md @@ -0,0 +1,136 @@ +# Basic Sample +------ +基本示例中提供了以下两个功能 +* RocketMQ可用于以三种方式发送消息:可靠的同步、可靠的异步和单向传输。前两种消息类型是可靠的,因为无论它们是否成功发送都有响应。 +* RocketMQ可以用来消费消息。 +### 1 添加依赖 +maven: +``` java + + org.apache.rocketmq + rocketmq-client + 4.3.0 + +``` +gradle: +``` java +compile 'org.apache.rocketmq:rocketmq-client:4.3.0' +``` +### 2 发送消息 +##### 2.1 使用Producer发送同步消息 +可靠的同步传输被广泛应用于各种场景,如重要的通知消息、短消息通知等。 +``` java +public class SyncProducer { + public static void main(String[] args) throws Exception { + // Instantiate with a producer group name + DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); + // Specify name server addresses + producer.setNamesrvAddr("localhost:9876"); + // Launch the producer instance + producer.start(); + for (int i = 0; i < 100; i++) { + // Create a message instance with specifying topic, tag and message body + Message msg = new Message("TopicTest" /* Topic */, + "TagA" /* Tag */, + ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */ + ); + // Send message to one of brokers + SendResult sendResult = producer.send(msg); + // Check whether the message has been delivered by the callback of sendResult + System.out.printf("%s%n", sendResult); + } + // Shut down once the producer instance is not longer in use + producer.shutdown(); + } +} +``` +##### 2.2 发送异步消息 +异步传输通常用于响应时间敏感的业务场景。这意味着发送方无法等待代理的响应太长时间。 +``` java +public class AsyncProducer { + public static void main(String[] args) throws Exception { + // Instantiate with a producer group name + DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); + // Specify name server addresses + producer.setNamesrvAddr("localhost:9876"); + // Launch the producer instance + producer.start(); + producer.setRetryTimesWhenSendAsyncFailed(0); + for (int i = 0; i < 100; i++) { + final int index = i; + // Create a message instance with specifying topic, tag and message body + Message msg = new Message("TopicTest", + "TagA", + "OrderID188", + "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET)); + // SendCallback: receive the callback of the asynchronous return result. + producer.send(msg, new SendCallback() { + @Override + public void onSuccess(SendResult sendResult) { + System.out.printf("%-10d OK %s %n", index, + sendResult.getMsgId()); + } + @Override + public void onException(Throwable e) { + System.out.printf("%-10d Exception %s %n", index, e); + e.printStackTrace(); + } + }); + } + // Shut down once the producer instance is not longer in use + producer.shutdown(); + } +} +``` +##### 2.3 以单向模式发送消息 +单向传输用于需要中等可靠性的情况,如日志收集。 +``` java +public class OnewayProducer { + public static void main(String[] args) throws Exception{ + // Instantiate with a producer group name + DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); + // Specify name server addresses + producer.setNamesrvAddr("localhost:9876"); + // Launch the producer instance + producer.start(); + for (int i = 0; i < 100; i++) { + // Create a message instance with specifying topic, tag and message body + Message msg = new Message("TopicTest" /* Topic */, + "TagA" /* Tag */, + ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET) /* Message body */ + ); + // Send in one-way mode, no return result + producer.sendOneway(msg); + } + // Shut down once the producer instance is not longer in use + producer.shutdown(); + } +} +``` +### 3 消费消息 +``` java +public class Consumer { + public static void main(String[] args) throws InterruptedException, MQClientException { + // Instantiate with specified consumer group name + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name"); + + // Specify name server addresses + consumer.setNamesrvAddr("localhost:9876"); + + // Subscribe one or more topics and tags for finding those messages need to be consumed + consumer.subscribe("TopicTest", "*"); + // Register callback to execute on arrival of messages fetched from brokers + consumer.registerMessageListener(new MessageListenerConcurrently() { + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), msgs); + // Mark the message that have been consumed successfully + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + }); + // Launch the consumer instance + consumer.start(); + System.out.printf("Consumer Started.%n"); + } +} +``` \ No newline at end of file From 61cd395d68db3cd5682060a75fe1ab6e56c0d82d Mon Sep 17 00:00:00 2001 From: qingjiyuji <1114366223@qq.com> Date: Wed, 23 Jun 2021 20:22:03 +0800 Subject: [PATCH 32/83] code style(client):polish lite pull consumer code style --- .../consumer/DefaultLitePullConsumerImpl.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java index 4e139c44ce..b1caeedee8 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java @@ -100,7 +100,7 @@ public class DefaultLitePullConsumerImpl implements MQConsumerInner { private static final String NOT_RUNNING_EXCEPTION_MESSAGE = "The consumer not running, please start it first."; - private static final String SUBSCRIPTION_CONFILCT_EXCEPTION_MESSAGE = "Subscribe and assign are mutually exclusive."; + private static final String SUBSCRIPTION_CONFLICT_EXCEPTION_MESSAGE = "Subscribe and assign are mutually exclusive."; /** * the type of subscription */ @@ -195,8 +195,9 @@ public class DefaultLitePullConsumerImpl implements MQConsumerInner { } private void checkServiceState() { - if (this.serviceState != ServiceState.RUNNING) + if (this.serviceState != ServiceState.RUNNING) { throw new IllegalStateException(NOT_RUNNING_EXCEPTION_MESSAGE); + } } public void updateNameServerAddr(String newAddresses) { @@ -204,10 +205,11 @@ public class DefaultLitePullConsumerImpl implements MQConsumerInner { } private synchronized void setSubscriptionType(SubscriptionType type) { - if (this.subscriptionType == SubscriptionType.NONE) + if (this.subscriptionType == SubscriptionType.NONE) { this.subscriptionType = type; - else if (this.subscriptionType != type) - throw new IllegalStateException(SUBSCRIPTION_CONFILCT_EXCEPTION_MESSAGE); + } else if (this.subscriptionType != type) { + throw new IllegalStateException(SUBSCRIPTION_CONFLICT_EXCEPTION_MESSAGE); + } } private void updateAssignedMessageQueue(String topic, Set assignedMessageQueue) { @@ -533,8 +535,9 @@ public class DefaultLitePullConsumerImpl implements MQConsumerInner { public synchronized List poll(long timeout) { try { checkServiceState(); - if (timeout < 0) + if (timeout < 0) { throw new IllegalArgumentException("Timeout must not be negative"); + } if (defaultLitePullConsumer.isAutoCommit()) { maybeAutoCommit(); @@ -546,8 +549,9 @@ public class DefaultLitePullConsumerImpl implements MQConsumerInner { if (endTime - System.currentTimeMillis() > 0) { while (consumeRequest != null && consumeRequest.getProcessQueue().isDropped()) { consumeRequest = consumeRequestCache.poll(endTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS); - if (endTime - System.currentTimeMillis() <= 0) + if (endTime - System.currentTimeMillis() <= 0) { break; + } } } @@ -671,8 +675,9 @@ public class DefaultLitePullConsumerImpl implements MQConsumerInner { public long committed(MessageQueue messageQueue) throws MQClientException { checkServiceState(); long offset = this.offsetStore.readOffset(messageQueue, ReadOffsetType.MEMORY_FIRST_THEN_STORE); - if (offset == -2) + if (offset == -2) { throw new MQClientException("Fetch consume offset from broker exception", null); + } return offset; } @@ -683,8 +688,9 @@ public class DefaultLitePullConsumerImpl implements MQConsumerInner { } Iterator iter = consumeRequestCache.iterator(); while (iter.hasNext()) { - if (iter.next().getMessageQueue().equals(messageQueue)) + if (iter.next().getMessageQueue().equals(messageQueue)) { iter.remove(); + } } } @@ -737,8 +743,9 @@ public class DefaultLitePullConsumerImpl implements MQConsumerInner { if (consumeRequestCache.size() * defaultLitePullConsumer.getPullBatchSize() > defaultLitePullConsumer.getPullThresholdForAll()) { scheduledThreadPoolExecutor.schedule(this, PULL_TIME_DELAY_MILLS_WHEN_FLOW_CONTROL, TimeUnit.MILLISECONDS); - if ((consumeRequestFlowControlTimes++ % 1000) == 0) + if ((consumeRequestFlowControlTimes++ % 1000) == 0) { log.warn("The consume request count exceeds threshold {}, so do flow control, consume request count={}, flowControlTimes={}", consumeRequestCache.size(), consumeRequestFlowControlTimes); + } return; } From 622bbbf05cf41d4cbc6e2f1b1783ed6c4f791476 Mon Sep 17 00:00:00 2001 From: zplkq <869371335@qq.com> Date: Thu, 24 Jun 2021 00:26:03 +0800 Subject: [PATCH 33/83] add some doc of the API_Reference_DefaultMQProducer of English. --- .../java/API_Reference_DefaultMQProducer.md | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 docs/en/client/java/API_Reference_DefaultMQProducer.md diff --git a/docs/en/client/java/API_Reference_DefaultMQProducer.md b/docs/en/client/java/API_Reference_DefaultMQProducer.md new file mode 100644 index 0000000000..152f45dca2 --- /dev/null +++ b/docs/en/client/java/API_Reference_DefaultMQProducer.md @@ -0,0 +1,71 @@ +## DefaultMQProducer +--- +### Class introduction + +`public class DefaultMQProducer +extends ClientConfig +implements MQProducer` + +>`DefaultMQProducer` is the entry point for an application to post messages, out of the box,ca quickly create a producer with a no-argument construction. it is mainly responsible for message sending, support synchronous、asynchronous、one-way send. All of these send methods support batch send. The parameters of the sender can be adjusted through the getter/setter methods , provided by this class. `DefaultMQProducer` has multi send method and each method is slightly different. Make sure you know the usage before you use it . Blow is a producer example . [see more examples](https://github.com/apache/rocketmq/blob/master/example/src/main/java/org/apache/rocketmq/example/)。 + +``` java +public class Producer { + public static void main(String[] args) throws MQClientException { + // create a produce with producer_group_name + DefaultMQProducer producer = new DefaultMQProducer("ProducerGroupName"); + + // start the producer + producer.start(); + + for (int i = 0; i < 128; i++) + try { + // construct the msg + Message msg = new Message("TopicTest", + "TagA", + "OrderID188", + "Hello world".getBytes(RemotingHelper.DEFAULT_CHARSET)); + + // send sync + SendResult sendResult = producer.send(msg); + + // print the result + System.out.printf("%s%n", sendResult); + } catch (Exception e) { + e.printStackTrace(); + } + + producer.shutdown(); + } +} +``` + +**Note** : This class is thread safe. It can be safely shared between multiple threads after configuration and startup is complete. + +### Variable + +|Type|Name| description | +|------|-------|-------| +|DefaultMQProducerImpl|defaultMQProducerImpl|The producer's internal default implementation| +|String|producerGroup|The producer's group| +|String|createTopicKey| Topics that do not exist on the server are automatically created when the message is sent | +|int|defaultTopicQueueNums|The default number of queues to create a topic| +|int|sendMsgTimeout|The timeout for the message to be sent| +|int|compressMsgBodyOverHowmuch|the threshold of the compress of message body| +|int|retryTimesWhenSendFailed|Maximum number of internal attempts to send a message in synchronous mode| +|int|retryTimesWhenSendAsyncFailed|Maximum number of internal attempts to send a message in asynchronous mode| +|boolean|retryAnotherBrokerWhenNotStoreOK|Whether to retry another broker if an internal send fails| +|int|maxMessageSize| Maximum length of message | +|TraceDispatcher|traceDispatcher| Message trackers. Use rcpHook to track messages | + +### construction method + +|方法名称|方法描述| +|-------|------------| +|DefaultMQProducer()| creates a producer with default parameter values | +|DefaultMQProducer(final String producerGroup)| creates a producer with producer group name. | +|DefaultMQProducer(final String producerGroup, boolean enableMsgTrace)|creates a producer with producer group name and set whether to enable message tracking| +|DefaultMQProducer(final String producerGroup, boolean enableMsgTrace, final String customizedTraceTopic)|creates a producer with producer group name and set whether to enable message tracking、the trace topic.| +|DefaultMQProducer(RPCHook rpcHook)|creates a producer with a rpc hook.| +|DefaultMQProducer(final String producerGroup, RPCHook rpcHook)|creates a producer with a rpc hook and producer group.| +|DefaultMQProducer(final String producerGroup, RPCHook rpcHook, boolean enableMsgTrace,final String customizedTraceTopic)|all of above.| + From 893e8fd8881a1acdc18020016450463d642baa59 Mon Sep 17 00:00:00 2001 From: qingjiyuji <1114366223@qq.com> Date: Thu, 24 Jun 2021 02:11:06 +0800 Subject: [PATCH 34/83] code style(client):polish lite pull consumer code style --- .../impl/consumer/DefaultLitePullConsumerImpl.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java index b1caeedee8..e835be1cd5 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java @@ -466,7 +466,7 @@ public class DefaultLitePullConsumerImpl implements MQConsumerInner { public synchronized void subscribe(String topic, String subExpression) throws MQClientException { try { - if (topic == null || topic.equals("")) { + if (topic == null || "".equals(topic)) { throw new IllegalArgumentException("Topic can not be null or empty."); } setSubscriptionType(SubscriptionType.SUBSCRIBE); @@ -485,7 +485,7 @@ public class DefaultLitePullConsumerImpl implements MQConsumerInner { public synchronized void subscribe(String topic, MessageSelector messageSelector) throws MQClientException { try { - if (topic == null || topic.equals("")) { + if (topic == null || "".equals(topic)) { throw new IllegalArgumentException("Topic can not be null or empty."); } setSubscriptionType(SubscriptionType.SUBSCRIBE); @@ -741,7 +741,7 @@ public class DefaultLitePullConsumerImpl implements MQConsumerInner { return; } - if (consumeRequestCache.size() * defaultLitePullConsumer.getPullBatchSize() > defaultLitePullConsumer.getPullThresholdForAll()) { + if ((long) consumeRequestCache.size() * defaultLitePullConsumer.getPullBatchSize() > defaultLitePullConsumer.getPullThresholdForAll()) { scheduledThreadPoolExecutor.schedule(this, PULL_TIME_DELAY_MILLS_WHEN_FLOW_CONTROL, TimeUnit.MILLISECONDS); if ((consumeRequestFlowControlTimes++ % 1000) == 0) { log.warn("The consume request count exceeds threshold {}, so do flow control, consume request count={}, flowControlTimes={}", consumeRequestCache.size(), consumeRequestFlowControlTimes); @@ -797,11 +797,10 @@ public class DefaultLitePullConsumerImpl implements MQConsumerInner { long pullDelayTimeMills = 0; try { SubscriptionData subscriptionData; + String topic = this.messageQueue.getTopic(); if (subscriptionType == SubscriptionType.SUBSCRIBE) { - String topic = this.messageQueue.getTopic(); subscriptionData = rebalanceImpl.getSubscriptionInner().get(topic); } else { - String topic = this.messageQueue.getTopic(); subscriptionData = FilterAPI.buildSubscriptionData(topic, SubscriptionData.SUB_ALL); } From d0d2f157dc7cf8c892dda63d1746672a14d73f57 Mon Sep 17 00:00:00 2001 From: patrick Date: Thu, 24 Jun 2021 10:36:07 +0800 Subject: [PATCH 35/83] add chinese version of FAQ.md --- docs/cn/FAQ.md | 110 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 docs/cn/FAQ.md diff --git a/docs/cn/FAQ.md b/docs/cn/FAQ.md new file mode 100644 index 0000000000..b58807926a --- /dev/null +++ b/docs/cn/FAQ.md @@ -0,0 +1,110 @@ +# 经常被问到的问题 + +以下是关于RocketMQ项目的常见问题 + +## 1 基本 + +1. **为什么我们要使用RocketMQ而不是选择其他的产品?** + + 请参考[为什么要选择RocketMQ](http://rocketmq.apache.org/docs/motivation/) + +2. **我是否需要安装其他的软件才能使用RocketMQ,例如zookeeper?** + + 不需要,RocketMQ可以独立的运行。 + +## 2 使用 + +1. **新创建的Consumer ID从哪里开始消费消息?** + + 1)如果发送的消息在三天之内,那么消费者会从服务器中保存的第一条消息开始消费。 + + 2)如果发送的消息已经超过三天,则消费者会从服务器中的最新消息开始消费,也就是从队列的尾部开始消费。 + + 3)如果消费者重新启动,那么它会从最后一个消费位置开始消费消息。 + +2. **当消费失败的时候如何重新消费消息?** + + 1)在集群模式下,消费的业务逻辑代码会返回Action.ReconsumerLater,NULL,或者抛出异常,如果一条消息消费失败,最多会重试16次,之后该消息会被丢弃。 + + 2)在广播消费模式下,广播消费仍然保证消息至少被消费一次,但不提供重发的选项。 + +3. **当消费失败的时候如何找到失败的消息?** + + 1)使用按时间的主题查询,可以查询到一段时间内的消息。 + + 2)使用主题和消息ID来准确查询消息。 + + 3)使用主题和消息的Key来准确查询所有消息Key相同的消息。 + +4. **消息只会被传递一次吗?** + + RocketMQ 确保所有消息至少传递一次。 在大多数情况下,消息不会重复。 + +5. **如何增加一个新的Broker?** + + 1)启动一个新的Broker并将其注册到name server中的Broker列表里。 + + 2)默认只自动创建内部系统topic和consumer group。 如果您希望在新节点上拥有您的业务主题和消费者组,请从现有的Broker中复制它们。 我们提供了管理工具和命令行来处理此问题。 + +## 3 配置相关 + +以下回答均为默认值,可通过配置修改。 + +1. **消息在服务器上可以保存多长时间?** + + 存储的消息将最多保存 3 天,超过 3 天未使用的消息将被删除。 + +2. **消息体的大小限制是多少?** + + 通常是256KB + +3. **怎么设置消费者线程数?** + + 当你启动消费者的时候,可以设置 ConsumeThreadNums属性的值,举例如下: + + ```java + consumer.setConsumeThreadMin(20); + consumer.setConsumeThreadMax(20); + ``` + +## 4 错误 + +1. **当你启动一个生产者或消费者的过程失败了并且错误信息是生产者组或消费者重复** + + 原因:使用同一个Producer/Consumer Group在同一个JVM中启动多个Producer/Consumer实例可能会导致客户端无法启动。 + + 解决方案:确保一个 Producer/Consumer Group 对应的 JVM 只启动一个 Producer/Consumer 实例。 + +2. **消费者无法在广播模式下开始加载 json 文件** + + 原因:fastjson 版本太低,无法让广播消费者加载本地 offsets.json,导致消费者启动失败。 损坏的 fastjson 文件也会导致同样的问题。 + + 解决方案:Fastjson 版本必须升级到 RocketMQ 客户端依赖版本,以确保可以加载本地 offsets.json。 默认情况下,offsets.json 文件在 /home/{user}/.rocketmq_offsets 中。 或者检查fastjson的完整性。 + +3. **Broker崩溃以后有什么影响?** + + 1)Master节点崩溃 + + 消息不能再发送到该Broker集群,但是如果您有另一个可用的Broker集群,那么在主题存在的条件下仍然可以发送消息。消息仍然可以从Slave节点消费。 + + 2)一些Slave节点崩溃 + + 只要有另一个工作的slave,就不会影响发送消息。 对消费消息也不会产生影响,除非消费者组设置为优先从该Slave消费。 默认情况下,消费者组从 master 消费。 + + 3)所有Slave节点崩溃 + + 向master发送消息不会有任何影响,但是,如果master是SYNC_MASTER,producer会得到一个SLAVE_NOT_AVAILABLE,表示消息没有发送给任何slave。 对消费消息也没有影响,除非消费者组设置为优先从slave消费。 默认情况下,消费者组从master消费。 + +4. **Producer提示“No Topic Route Info”,如何诊断?** + + 当您尝试将消息发送到一个路由信息对生产者不可用的主题时,就会发生这种情况。 + + 1)确保生产者可以连接到名称服务器并且能够从中获取路由元信息。 + + 2)确保名称服务器确实包含主题的路由元信息。 您可以使用管理工具或 Web 控制台通过 topicRoute 从名称服务器查询路由元信息。 + + 3)确保您的Broker将心跳发送到您的生产者正在连接的同一name server列表。 + + 4)确保主题的权限为6(rw-),或至少为2(-w-)。 + + 如果找不到此主题,请通过管理工具命令updateTopic或Web控制台在Broker上创建它。 \ No newline at end of file From a0a2192c6517e350be22c3cbf4b6d2cd9c74a976 Mon Sep 17 00:00:00 2001 From: Git_Yang <30995057+Git-Yang@users.noreply.github.com> Date: Fri, 25 Jun 2021 10:28:20 +0800 Subject: [PATCH 36/83] [ISSUE #2873] add benchmark for batch message Signed-off-by: zhangyang --- distribution/benchmark/batchproducer.sh | 18 + .../example/benchmark/BatchProducer.java | 411 ++++++++++++++++++ 2 files changed, 429 insertions(+) create mode 100644 distribution/benchmark/batchproducer.sh create mode 100644 example/src/main/java/org/apache/rocketmq/example/benchmark/BatchProducer.java diff --git a/distribution/benchmark/batchproducer.sh b/distribution/benchmark/batchproducer.sh new file mode 100644 index 0000000000..07297004e6 --- /dev/null +++ b/distribution/benchmark/batchproducer.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +sh ./runclass.sh org.apache.rocketmq.example.benchmark.BatchProducer $@ & diff --git a/example/src/main/java/org/apache/rocketmq/example/benchmark/BatchProducer.java b/example/src/main/java/org/apache/rocketmq/example/benchmark/BatchProducer.java new file mode 100644 index 0000000000..843b84bf8e --- /dev/null +++ b/example/src/main/java/org/apache/rocketmq/example/benchmark/BatchProducer.java @@ -0,0 +1,411 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.rocketmq.example.benchmark; + +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; +import java.util.Timer; +import java.util.TimerTask; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicLong; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.PosixParser; +import org.apache.commons.collections.CollectionUtils; +import org.apache.rocketmq.acl.common.AclClientRPCHook; +import org.apache.rocketmq.acl.common.SessionCredentials; +import org.apache.rocketmq.client.exception.MQBrokerException; +import org.apache.rocketmq.client.exception.MQClientException; +import org.apache.rocketmq.client.log.ClientLogger; +import org.apache.rocketmq.client.producer.DefaultMQProducer; +import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.client.producer.SendStatus; +import org.apache.rocketmq.logging.InternalLogger; +import org.apache.rocketmq.common.message.Message; +import org.apache.rocketmq.remoting.RPCHook; +import org.apache.rocketmq.remoting.common.RemotingHelper; +import org.apache.rocketmq.remoting.exception.RemotingException; +import org.apache.rocketmq.srvutil.ServerUtil; + +public class BatchProducer { + + public static void main(String[] args) throws MQClientException, UnsupportedEncodingException { + + Options options = ServerUtil.buildCommandlineOptions(new Options()); + CommandLine commandLine = ServerUtil.parseCmdLine("benchmarkBatchProducer", args, buildCommandlineOptions(options), new PosixParser()); + if (null == commandLine) { + System.exit(-1); + } + + final String namesrv = getOptionValue(commandLine, 'n', "127.0.0.1:9876"); + final String topic = getOptionValue(commandLine, 't', "BenchmarkTest"); + final int threadCount = getOptionValue(commandLine, 'w', 64); + final int messageSize = getOptionValue(commandLine, 's', 128); + final int batchSize = getOptionValue(commandLine, 'b', 16); + final boolean keyEnable = getOptionValue(commandLine, 'k', false); + final int propertySize = getOptionValue(commandLine, 'p', 0); + final int tagCount = getOptionValue(commandLine, 'l', 0); + final boolean msgTraceEnable = getOptionValue(commandLine, 'm', false); + final boolean aclEnable = getOptionValue(commandLine, 'a', false); + final String ak = getOptionValue(commandLine, 'c', "rocketmq2"); + final String sk = getOptionValue(commandLine, 'e', "12346789"); + + System.out.printf("topic: %s threadCount: %d messageSize: %d batchSize: %d keyEnable: %s propertySize: %d tagCount: %d traceEnable: %s aclEnable: %s%n", + topic, threadCount, messageSize, batchSize, keyEnable, propertySize, tagCount, msgTraceEnable, aclEnable); + + final StatsBenchmarkBatchProducer statsBenchmark = new StatsBenchmarkBatchProducer(); + statsBenchmark.start(); + + final DefaultMQProducer producer = initInstance(namesrv, msgTraceEnable, aclEnable, ak, sk); + producer.start(); + + final InternalLogger log = ClientLogger.getLog(); + final ExecutorService sendThreadPool = Executors.newFixedThreadPool(threadCount); + for (int i = 0; i < threadCount; i++) { + sendThreadPool.execute(new Runnable() { + @Override + public void run() { + while (true) { + List msgs; + + try { + msgs = buildBathMessage(batchSize, messageSize, topic); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return; + } + + if (CollectionUtils.isEmpty(msgs)) { + return; + } + + try { + long beginTimestamp = System.currentTimeMillis(); + long sendSucCount = statsBenchmark.getSendMessageSuccessCount().get(); + + setKeys(keyEnable, msgs, String.valueOf(beginTimestamp / 1000)); + setTags(tagCount, msgs, sendSucCount); + setProperties(propertySize, msgs); + SendResult sendResult = producer.send(msgs); + if (sendResult.getSendStatus() == SendStatus.SEND_OK) { + statsBenchmark.getSendRequestSuccessCount().incrementAndGet(); + statsBenchmark.getSendMessageSuccessCount().addAndGet(msgs.size()); + } else { + statsBenchmark.getSendRequestFailedCount().incrementAndGet(); + statsBenchmark.getSendMessageFailedCount().addAndGet(msgs.size()); + } + long currentRT = System.currentTimeMillis() - beginTimestamp; + statsBenchmark.getSendMessageSuccessTimeTotal().addAndGet(currentRT); + long prevMaxRT = statsBenchmark.getSendMessageMaxRT().get(); + while (currentRT > prevMaxRT) { + boolean updated = statsBenchmark.getSendMessageMaxRT().compareAndSet(prevMaxRT, currentRT); + if (updated) { + break; + } + + prevMaxRT = statsBenchmark.getSendMessageMaxRT().get(); + } + } catch (RemotingException e) { + statsBenchmark.getSendRequestFailedCount().incrementAndGet(); + statsBenchmark.getSendMessageFailedCount().addAndGet(msgs.size()); + log.error("[BENCHMARK_PRODUCER] Send Exception", e); + + try { + Thread.sleep(3000); + } catch (InterruptedException ignored) { + } + } catch (InterruptedException e) { + statsBenchmark.getSendRequestFailedCount().incrementAndGet(); + statsBenchmark.getSendMessageFailedCount().addAndGet(msgs.size()); + try { + Thread.sleep(3000); + } catch (InterruptedException e1) { + } + statsBenchmark.getSendRequestFailedCount().incrementAndGet(); + statsBenchmark.getSendMessageFailedCount().addAndGet(msgs.size()); + log.error("[BENCHMARK_PRODUCER] Send Exception", e); + } catch (MQClientException e) { + statsBenchmark.getSendRequestFailedCount().incrementAndGet(); + statsBenchmark.getSendMessageFailedCount().addAndGet(msgs.size()); + log.error("[BENCHMARK_PRODUCER] Send Exception", e); + } catch (MQBrokerException e) { + statsBenchmark.getSendRequestFailedCount().incrementAndGet(); + statsBenchmark.getSendMessageFailedCount().addAndGet(msgs.size()); + log.error("[BENCHMARK_PRODUCER] Send Exception", e); + try { + Thread.sleep(3000); + } catch (InterruptedException ignored) { + } + } + } + } + }); + } + } + + public static Options buildCommandlineOptions(final Options options) { + Option opt = new Option("w", "threadCount", true, "Thread count, Default: 64"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("s", "messageSize", true, "Message Size, Default: 128"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("b", "batchSize", true, "Batch Size, Default: 16"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("k", "keyEnable", true, "Message Key Enable, Default: false"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("t", "topic", true, "Topic name, Default: BenchmarkTest"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("l", "tagCount", true, "Tag count, Default: 0"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("m", "msgTraceEnable", true, "Message Trace Enable, Default: false"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("a", "aclEnable", true, "Acl Enable, Default: false"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("c", "accessKey", true, "Acl Access Key, Default: rocketmq2"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("e", "secretKey", true, "Acl Secret Key, Default: 123456789"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("p", "propertySize", true, "Property Size, Default: 0"); + opt.setRequired(false); + options.addOption(opt); + + opt = new Option("n", "namesrv", true, "name server, Default: 127.0.0.1:9876"); + opt.setRequired(false); + options.addOption(opt); + return options; + } + + private static String getOptionValue(CommandLine commandLine, char key, String defaultValue) { + if (commandLine.hasOption(key)) { + return commandLine.getOptionValue(key).trim(); + } + return defaultValue; + } + + private static int getOptionValue(CommandLine commandLine, char key, int defaultValue) { + if (commandLine.hasOption(key)) { + return Integer.parseInt(commandLine.getOptionValue(key).trim()); + } + return defaultValue; + } + + private static boolean getOptionValue(CommandLine commandLine, char key, boolean defaultValue) { + if (commandLine.hasOption(key)) { + return Boolean.parseBoolean(commandLine.getOptionValue(key).trim()); + } + return defaultValue; + } + + private static List buildBathMessage(int batchSize, int messageSize, + String topic) throws UnsupportedEncodingException { + List batchMessage = new ArrayList<>(batchSize); + + for (int i = 0; i < batchSize; i++) { + Message msg = new Message(); + msg.setTopic(topic); + + StringBuilder sb = new StringBuilder(); + for (int j = 0; j < messageSize; j += 10) { + sb.append("hello baby"); + } + + msg.setBody(sb.toString().getBytes(RemotingHelper.DEFAULT_CHARSET)); + batchMessage.add(msg); + } + + return batchMessage; + } + + private static void setKeys(boolean keyEnable, List msgs, String keys) { + if (!keyEnable) { + return; + } + + for (Message msg : msgs) { + msg.setKeys(keys); + } + } + + private static void setTags(int tagCount, List msgs, long startTagId) { + if (tagCount <= 0) { + return; + } + + long tagId = startTagId % tagCount; + for (Message msg : msgs) { + msg.setTags(String.format("tag%d", tagId++)); + } + } + + private static void setProperties(int propertySize, List msgs) { + if (propertySize <= 0) { + return; + } + + for (Message msg : msgs) { + if (msg.getProperties() != null) { + msg.getProperties().clear(); + } + + int startValue = (new Random(System.currentTimeMillis())).nextInt(100); + int size = 0; + for (int i = 0; ; i++) { + String prop1 = "prop" + i, prop1V = "hello" + startValue; + msg.putUserProperty(prop1, prop1V); + size += prop1.length() + prop1V.length(); + if (size > propertySize) { + break; + } + startValue++; + } + } + } + + private static DefaultMQProducer initInstance(String namesrv, boolean traceEnable, boolean aclEnable, String ak, + String sk) { + RPCHook rpcHook = aclEnable ? new AclClientRPCHook(new SessionCredentials(ak, sk)) : null; + final DefaultMQProducer producer = new DefaultMQProducer("benchmark_batch_producer", rpcHook, traceEnable, null); + producer.setInstanceName(Long.toString(System.currentTimeMillis())); + + producer.setNamesrvAddr(namesrv); + producer.setCompressMsgBodyOverHowmuch(Integer.MAX_VALUE); + return producer; + } +} + +class StatsBenchmarkBatchProducer { + + private final AtomicLong sendRequestSuccessCount = new AtomicLong(0L); + + private final AtomicLong sendRequestFailedCount = new AtomicLong(0L); + + private final AtomicLong sendMessageSuccessTimeTotal = new AtomicLong(0L); + + private final AtomicLong sendMessageMaxRT = new AtomicLong(0L); + + private final AtomicLong sendMessageSuccessCount = new AtomicLong(0L); + + private final AtomicLong sendMessageFailedCount = new AtomicLong(0L); + + private final Timer timer = new Timer("BenchmarkTimerThread", true); + + private final LinkedList snapshotList = new LinkedList<>(); + + public Long[] createSnapshot() { + Long[] snap = new Long[] { + System.currentTimeMillis(), + this.sendRequestSuccessCount.get(), + this.sendRequestFailedCount.get(), + this.sendMessageSuccessCount.get(), + this.sendMessageFailedCount.get(), + this.sendMessageSuccessTimeTotal.get(), + }; + + return snap; + } + + public AtomicLong getSendRequestSuccessCount() { + return sendRequestSuccessCount; + } + + public AtomicLong getSendRequestFailedCount() { + return sendRequestFailedCount; + } + + public AtomicLong getSendMessageSuccessTimeTotal() { + return sendMessageSuccessTimeTotal; + } + + public AtomicLong getSendMessageMaxRT() { + return sendMessageMaxRT; + } + + public AtomicLong getSendMessageSuccessCount() { + return sendMessageSuccessCount; + } + + public AtomicLong getSendMessageFailedCount() { + return sendMessageFailedCount; + } + + public void start() { + + timer.scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + snapshotList.addLast(createSnapshot()); + if (snapshotList.size() > 10) { + snapshotList.removeFirst(); + } + } + }, 1000, 1000); + + timer.scheduleAtFixedRate(new TimerTask() { + private void printStats() { + if (snapshotList.size() >= 10) { + Long[] begin = snapshotList.getFirst(); + Long[] end = snapshotList.getLast(); + + final long sendTps = (long) (((end[1] - begin[1]) / (double) (end[0] - begin[0])) * 1000L); + final long sendMps = (long) (((end[3] - begin[3]) / (double) (end[0] - begin[0])) * 1000L); + final double averageRT = (end[5] - begin[5]) / (double) (end[1] - begin[1]); + final double averageMsgRT = (end[5] - begin[5]) / (double) (end[3] - begin[3]); + + System.out.printf("Current Time: %s Send TPS: %d Send MPS: %d Max RT(ms): %d Average RT(ms): %7.3f Average Message RT(ms): %7.3f Send Failed: %d Send Message Failed: %d%n", + System.currentTimeMillis(), sendTps, sendMps, getSendMessageMaxRT().get(), averageRT, averageMsgRT, end[2], end[4]); + } + } + + @Override + public void run() { + try { + this.printStats(); + } catch (Exception e) { + e.printStackTrace(); + } + } + }, 10000, 10000); + } + + public void shutdown() { + timer.cancel(); + } +} \ No newline at end of file From 6b519ef1df5852cc12981369cc8d57718f6dea3a Mon Sep 17 00:00:00 2001 From: yuz10 <845238369@qq.com> Date: Fri, 25 Jun 2021 10:32:26 +0800 Subject: [PATCH 37/83] [ISSUE #3068] remove jaeger tracing dependency in release package --- distribution/release.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/distribution/release.xml b/distribution/release.xml index 64cffc81ea..fd6e3db942 100644 --- a/distribution/release.xml +++ b/distribution/release.xml @@ -74,6 +74,10 @@ lib/ + + io.jaegertracing:jaeger-core + io.jaegertracing:jaeger-client + From a2f8810c9adedcd82fd4cb9a69b17128a1a96b5e Mon Sep 17 00:00:00 2001 From: yuz10 <845238369@qq.com> Date: Fri, 25 Jun 2021 10:47:48 +0800 Subject: [PATCH 38/83] [ISSUE #2988] fix fail to send trace of last message before shutting down producer --- .../client/trace/AsyncTraceDispatcher.java | 70 ++++++++++--------- 1 file changed, 37 insertions(+), 33 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java index 754cbd55ac..7ff8bd77e0 100644 --- a/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java +++ b/client/src/main/java/org/apache/rocketmq/client/trace/AsyncTraceDispatcher.java @@ -16,7 +16,6 @@ */ package org.apache.rocketmq.client.trace; -import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -30,6 +29,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; + import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.client.AccessChannel; import org.apache.rocketmq.client.common.ThreadLocalIndex; @@ -64,7 +64,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { // The last discard number of log private AtomicLong discardCount; private Thread worker; - private ArrayBlockingQueue traceContextQueue; + private final ArrayBlockingQueue traceContextQueue; private ArrayBlockingQueue appenderQueue; private volatile Thread shutDownHook; private volatile boolean stopped = false; @@ -78,7 +78,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { private String group; private Type type; - public AsyncTraceDispatcher(String group, Type type,String traceTopicName, RPCHook rpcHook) { + public AsyncTraceDispatcher(String group, Type type, String traceTopicName, RPCHook rpcHook) { // queueSize is greater than or equal to the n power of 2 of value this.queueSize = 2048; this.batchSize = 100; @@ -95,12 +95,12 @@ public class AsyncTraceDispatcher implements TraceDispatcher { this.traceTopicName = TopicValidator.RMQ_SYS_TRACE_TOPIC; } this.traceExecutor = new ThreadPoolExecutor(// - 10, // - 20, // - 1000 * 60, // - TimeUnit.MILLISECONDS, // - this.appenderQueue, // - new ThreadFactoryImpl("MQTraceSendThread_")); + 10, // + 20, // + 1000 * 60, // + TimeUnit.MILLISECONDS, // + this.appenderQueue, // + new ThreadFactoryImpl("MQTraceSendThread_")); traceProducer = getAndCreateTraceProducer(rpcHook); } @@ -180,10 +180,15 @@ public class AsyncTraceDispatcher implements TraceDispatcher { } @Override - public void flush() throws IOException { + public void flush() { // The maximum waiting time for refresh,avoid being written all the time, resulting in failure to return. long end = System.currentTimeMillis() + 500; - while (traceContextQueue.size() > 0 || appenderQueue.size() > 0 && System.currentTimeMillis() <= end) { + while (System.currentTimeMillis() <= end) { + synchronized (traceContextQueue) { + if (traceContextQueue.size() == 0 && appenderQueue.size() == 0) { + break; + } + } try { Thread.sleep(1); } catch (InterruptedException e) { @@ -196,6 +201,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { @Override public void shutdown() { this.stopped = true; + flush(); this.traceExecutor.shutdown(); if (isStarted.get()) { traceProducer.shutdown(); @@ -212,11 +218,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { public void run() { synchronized (this) { if (!this.hasShutdown) { - try { - flush(); - } catch (IOException e) { - log.error("system MQTrace hook shutdown failed ,maybe loss some trace data"); - } + flush(); } } } @@ -242,25 +244,27 @@ public class AsyncTraceDispatcher implements TraceDispatcher { public void run() { while (!stopped) { List contexts = new ArrayList(batchSize); - for (int i = 0; i < batchSize; i++) { - TraceContext context = null; - try { - //get trace data element from blocking Queue — traceContextQueue - context = traceContextQueue.poll(5, TimeUnit.MILLISECONDS); - } catch (InterruptedException e) { + synchronized (traceContextQueue) { + for (int i = 0; i < batchSize; i++) { + TraceContext context = null; + try { + //get trace data element from blocking Queue - traceContextQueue + context = traceContextQueue.poll(5, TimeUnit.MILLISECONDS); + } catch (InterruptedException e) { + } + if (context != null) { + contexts.add(context); + } else { + break; + } } - if (context != null) { - contexts.add(context); - } else { - break; + if (contexts.size() > 0) { + AsyncAppenderRequest request = new AsyncAppenderRequest(contexts); + traceExecutor.submit(request); + } else if (AsyncTraceDispatcher.this.stopped) { + this.stopped = true; } } - if (contexts.size() > 0) { - AsyncAppenderRequest request = new AsyncAppenderRequest(contexts); - traceExecutor.submit(request); - } else if (AsyncTraceDispatcher.this.stopped) { - this.stopped = true; - } } } @@ -352,7 +356,7 @@ public class AsyncTraceDispatcher implements TraceDispatcher { * Send message trace data * * @param keySet the keyset in this batch(including msgId in original message not offsetMsgId) - * @param data the message trace data in this batch + * @param data the message trace data in this batch */ private void sendTraceDataByMQ(Set keySet, final String data, String dataTopic, String regionId) { String traceTopic = traceTopicName; From fcc20dee22d92d4cf0cdba5db21e0de1663478a5 Mon Sep 17 00:00:00 2001 From: yumingyue98 <70364204+yumingyue98@users.noreply.github.com> Date: Sat, 26 Jun 2021 14:34:53 +0800 Subject: [PATCH 39/83] [ISSUE #3059] typo transactional message wiki Co-authored-by: yumingyue98 --- docs/en/Example_Transaction.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/Example_Transaction.md b/docs/en/Example_Transaction.md index a35b040f82..5d1cff9320 100644 --- a/docs/en/Example_Transaction.md +++ b/docs/en/Example_Transaction.md @@ -89,7 +89,7 @@ public class TransactionListenerImpl implements TransactionListener { ## 3 Usage Constraint 1. Messages of the transactional have no schedule and batch support. 2. In order to avoid a single message being checked too many times and lead to half queue message accumulation, we limited the number of checks for a single message to 15 times by default, but users can change this limit by change the ```transactionCheckMax``` parameter in the configuration of the broker, if one message has been checked over ```transactionCheckMax``` times, broker will discard this message and print an error log at the same time by default. Users can change this behavior by override the ```AbstractTransactionalMessageCheckListener``` class. -3. A transactional message will be checked after a certain period of time that determined by parameter g```transactionTimeout``` in the configuration of the broker. And users also can change this limit by set user property ```CHECK_IMMUNITY_TIME_IN_SECONDS``` when sending transactional message, this parameter takes precedence over the ```transactionTimeout``` parameter. +3. A transactional message will be checked after a certain period of time that determined by parameter ```transactionTimeout``` in the configuration of the broker. And users also can change this limit by set user property ```CHECK_IMMUNITY_TIME_IN_SECONDS``` when sending transactional message, this parameter takes precedence over the ```transactionTimeout``` parameter. 4. A transactional message maybe checked or consumed more than once. 5. Committed message reput to the user’s target topic may fail. Currently, it depends on the log record. High availability is ensured by the high availability mechanism of RocketMQ itself. If you want to ensure that the transactional message isn’t lost and the transaction integrity is guaranteed, it is recommended to use synchronous double write. mechanism. 6. Producer IDs of transactional messages cannot be shared with producer IDs of other types of messages. Unlike other types of message, transactional messages allow backward queries. MQ Server query clients by their Producer IDs. From 95a6275d54d589a410511c37e62d44eda5df77fc Mon Sep 17 00:00:00 2001 From: sunbufu Date: Sat, 26 Jun 2021 15:19:42 +0800 Subject: [PATCH 40/83] typo --- docs/cn/design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cn/design.md b/docs/cn/design.md index 1c32521ed5..e4f4648415 100644 --- a/docs/cn/design.md +++ b/docs/cn/design.md @@ -95,7 +95,7 @@ M1 | NettyServerCodecThread_%d | Worker线程池 M2 | RemotingExecutorThread_%d | 业务processor处理线程池 ### 3 消息过滤 -RocketMQ分布式消息队列的消息过滤方式有别于其它MQ中间件,是在Consumer端订阅消息时再做消息过滤的。RocketMQ这么做是在于其Producer端写入消息和Consumer端订阅消息采用分离存储的机制来实现的,Consumer端订阅消息是需要通过ConsumeQueue这个消息消费的逻辑队列拿到一个索引,然后再从CommitLog里面读取真正的消息实体内容,所以说到底也是还绕不开其存储结构。其ConsumeQueue的存储结构如下,可以看到其中有8个字节存储的Message Tag的哈希值,基于Tag的消息过滤正式基于这个字段值的。 +RocketMQ分布式消息队列的消息过滤方式有别于其它MQ中间件,是在Consumer端订阅消息时再做消息过滤的。RocketMQ这么做是在于其Producer端写入消息和Consumer端订阅消息采用分离存储的机制来实现的,Consumer端订阅消息是需要通过ConsumeQueue这个消息消费的逻辑队列拿到一个索引,然后再从CommitLog里面读取真正的消息实体内容,所以说到底也是还绕不开其存储结构。其ConsumeQueue的存储结构如下,可以看到其中有8个字节存储的Message Tag的哈希值,基于Tag的消息过滤正是基于这个字段值的。 ![](image/rocketmq_design_7.png) From 92f2d03878c45740e0c8449260a7e7549f576b95 Mon Sep 17 00:00:00 2001 From: sunbufu Date: Mon, 28 Jun 2021 22:00:05 +0800 Subject: [PATCH 41/83] log exception stack --- .../impl/consumer/ConsumeMessageConcurrentlyService.java | 3 ++- .../client/impl/consumer/ConsumeMessageOrderlyService.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java index b37f8a6359..e7b11a0c31 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java @@ -415,7 +415,8 @@ public class ConsumeMessageConcurrentlyService implements ConsumeMessageService RemotingHelper.exceptionSimpleDesc(e), ConsumeMessageConcurrentlyService.this.consumerGroup, msgs, - messageQueue); + messageQueue, + e); hasException = true; } long consumeRT = System.currentTimeMillis() - beginTimestamp; diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageOrderlyService.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageOrderlyService.java index 130effad9e..5bd856e823 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageOrderlyService.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageOrderlyService.java @@ -491,7 +491,8 @@ public class ConsumeMessageOrderlyService implements ConsumeMessageService { RemotingHelper.exceptionSimpleDesc(e), ConsumeMessageOrderlyService.this.consumerGroup, msgs, - messageQueue); + messageQueue, + e); hasException = true; } finally { this.processQueue.getConsumeLock().unlock(); From 7f1cb795bd80aa3792254d8c465ea8494184b83e Mon Sep 17 00:00:00 2001 From: codersfarm <1272198093@qq.com> Date: Wed, 30 Jun 2021 15:11:17 +0800 Subject: [PATCH 42/83] remove useless code --- .../apache/rocketmq/store/SelectMappedBufferResult.java | 7 ------- 1 file changed, 7 deletions(-) diff --git a/store/src/main/java/org/apache/rocketmq/store/SelectMappedBufferResult.java b/store/src/main/java/org/apache/rocketmq/store/SelectMappedBufferResult.java index 034b964bac..03061e6b48 100644 --- a/store/src/main/java/org/apache/rocketmq/store/SelectMappedBufferResult.java +++ b/store/src/main/java/org/apache/rocketmq/store/SelectMappedBufferResult.java @@ -48,13 +48,6 @@ public class SelectMappedBufferResult { this.byteBuffer.limit(this.size); } -// @Override -// protected void finalize() { -// if (this.mappedFile != null) { -// this.release(); -// } -// } - public synchronized void release() { if (this.mappedFile != null) { this.mappedFile.release(); From 9a5ec9082f6611629fc6c7459e32ac606a893c4d Mon Sep 17 00:00:00 2001 From: lizhiboo Date: Thu, 1 Jul 2021 15:00:27 +0800 Subject: [PATCH 43/83] [ISSUE #3109]Return a no-support value when not match any request code --- .../broker/processor/AdminBrokerProcessor.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java index 0a1d214b87..97ca51d966 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java @@ -116,6 +116,7 @@ import org.apache.rocketmq.remoting.netty.NettyRequestProcessor; import org.apache.rocketmq.remoting.protocol.LanguageCode; import org.apache.rocketmq.remoting.protocol.RemotingCommand; import org.apache.rocketmq.remoting.protocol.RemotingSerializable; +import org.apache.rocketmq.remoting.protocol.RemotingSysResponseCode; import org.apache.rocketmq.store.ConsumeQueue; import org.apache.rocketmq.store.ConsumeQueueExt; import org.apache.rocketmq.store.DefaultMessageStore; @@ -235,10 +236,8 @@ public class AdminBrokerProcessor extends AsyncNettyRequestProcessor implements case RequestCode.GET_BROKER_CLUSTER_ACL_CONFIG: return getBrokerClusterAclConfig(ctx, request); default: - break; + return getUnknownCmdResponse(ctx, request); } - - return null; } @Override @@ -459,6 +458,13 @@ public class AdminBrokerProcessor extends AsyncNettyRequestProcessor implements return null; } + private RemotingCommand getUnknownCmdResponse(ChannelHandlerContext ctx, RemotingCommand request) { + String error = " request type " + request.getCode() + " not supported"; + final RemotingCommand response = + RemotingCommand.createResponseCommand(RemotingSysResponseCode.REQUEST_CODE_NOT_SUPPORTED, error); + return response; + } + private RemotingCommand getAllTopicConfig(ChannelHandlerContext ctx, RemotingCommand request) { final RemotingCommand response = RemotingCommand.createResponseCommand(GetAllTopicConfigResponseHeader.class); // final GetAllTopicConfigResponseHeader responseHeader = From 94e08992a2bd37bce257b924b65ec38659fb6b13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=8C=E5=AD=A6=E7=9A=84=E5=8F=AF=E7=88=B1=E5=A5=B3?= =?UTF-8?q?=E5=8F=8B=E7=B3=96=E7=B3=96?= Date: Thu, 1 Jul 2021 15:01:22 +0800 Subject: [PATCH 44/83] [ISSUE #3097] docs remove obsolete/error configuration --- docs/cn/best_practice.md | 2 +- docs/en/best_practice.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cn/best_practice.md b/docs/cn/best_practice.md index 4ad6bb23fe..b24c6eca57 100755 --- a/docs/cn/best_practice.md +++ b/docs/cn/best_practice.md @@ -186,8 +186,8 @@ msgId一定是全局唯一标识符,但是实际使用中,可能会存在相 | brokerName | null | broker 的名称 | | brokerClusterName | DefaultCluster | 本 broker 所属的 Cluser 名称 | | brokerId | 0 | broker id, 0 表示 master, 其他的正整数表示 slave | +| storePathRootDir | $HOME/store/ | 存储根路径 | | storePathCommitLog | $HOME/store/commitlog/ | 存储 commit log 的路径 | -| storePathConsumerQueue | $HOME/store/consumequeue/ | 存储 consume queue 的路径 | | mappedFileSizeCommitLog | 1024 * 1024 * 1024(1G) | commit log 的映射文件大小 |​ | deleteWhen | 04 | 在每天的什么时间删除已经超过文件保留时间的 commit log |​ | fileReservedTime | 72 | 以小时计算的文件保留时间 |​ diff --git a/docs/en/best_practice.md b/docs/en/best_practice.md index be3b937d10..213dc3174d 100755 --- a/docs/en/best_practice.md +++ b/docs/en/best_practice.md @@ -20,8 +20,8 @@ | brokerName | null | broker name | | brokerClusterName | DefaultCluster | this broker belongs to which cluster | | brokerId | 0 | broker id, 0 means master, positive integers mean slave | +| storePathRootDir | $HOME/store/ | file path for root store | | storePathCommitLog | $HOME/store/commitlog/ | file path for commit log | -| storePathConsumerQueue | $HOME/store/consumequeue/ | file path for consume queue | | mappedFileSizeCommitLog | 1024 * 1024 * 1024(1G) | mapped file size for commit log |​ | deleteWhen | 04 | When to delete the commitlog which is out of the reserve time |​ | fileReserverdTime | 72 | The number of hours to keep a commitlog before deleting it |​ From 36422c52c95272e73579e2eb0cb9e72a8659b6ed Mon Sep 17 00:00:00 2001 From: sunhangda Date: Fri, 2 Jul 2021 15:36:53 +0800 Subject: [PATCH 45/83] [ISSUE #3066]producing a ghost consumer --- .../rocketmq/client/impl/factory/MQClientInstance.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java index 81e6d8468e..976dcba17d 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java @@ -863,7 +863,7 @@ public class MQClientInstance { } } - public boolean registerConsumer(final String group, final MQConsumerInner consumer) { + public synchronized boolean registerConsumer(final String group, final MQConsumerInner consumer) { if (null == group || null == consumer) { return false; } @@ -877,9 +877,9 @@ public class MQClientInstance { return true; } - public void unregisterConsumer(final String group) { + public synchronized void unregisterConsumer(final String group) { this.consumerTable.remove(group); - this.unregisterClientWithLock(null, group); + this.unregisterClient(null, group); } private void unregisterClientWithLock(final String producerGroup, final String consumerGroup) { From 4e5a60cb62e1fcb3b72f90c9262348a37c28e61d Mon Sep 17 00:00:00 2001 From: sunhangda Date: Fri, 2 Jul 2021 15:48:46 +0800 Subject: [PATCH 46/83] [ISSUE #2442] when happening system busy, retry --- .../rocketmq/client/impl/producer/DefaultMQProducerImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java index fac3ed3561..6238e3e2f0 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java @@ -633,6 +633,7 @@ public class DefaultMQProducerImpl implements MQProducerInner { case ResponseCode.TOPIC_NOT_EXIST: case ResponseCode.SERVICE_NOT_AVAILABLE: case ResponseCode.SYSTEM_ERROR: + case ResponseCode.SYSTEM_BUSY: case ResponseCode.NO_PERMISSION: case ResponseCode.NO_BUYER_ID: case ResponseCode.NOT_IN_CURRENT_UNIT: From f4b3d4f8350b594609640579c983774b296e6290 Mon Sep 17 00:00:00 2001 From: panzhi33 Date: Fri, 2 Jul 2021 17:12:51 +0800 Subject: [PATCH 47/83] fix namesrv endpoint --- .../src/main/java/org/apache/rocketmq/client/ClientConfig.java | 2 +- .../apache/rocketmq/common/utils/NameServerAddressUtils.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/ClientConfig.java b/client/src/main/java/org/apache/rocketmq/client/ClientConfig.java index 3ab214b8db..beeeb2f5e5 100644 --- a/client/src/main/java/org/apache/rocketmq/client/ClientConfig.java +++ b/client/src/main/java/org/apache/rocketmq/client/ClientConfig.java @@ -178,7 +178,7 @@ public class ClientConfig { } public String getNamesrvAddr() { - if (StringUtils.isNotEmpty(namesrvAddr) && NameServerAddressUtils.validateInstanceEndpoint(namesrvAddr.trim())) { + if (StringUtils.isNotEmpty(namesrvAddr) && NameServerAddressUtils.NAMESRV_ENDPOINT_PATTERN.matcher(namesrvAddr.trim()).matches()) { return NameServerAddressUtils.getNameSrvAddrFromNamesrvEndpoint(namesrvAddr); } return namesrvAddr; diff --git a/common/src/main/java/org/apache/rocketmq/common/utils/NameServerAddressUtils.java b/common/src/main/java/org/apache/rocketmq/common/utils/NameServerAddressUtils.java index 85dc95feb4..68f883935a 100644 --- a/common/src/main/java/org/apache/rocketmq/common/utils/NameServerAddressUtils.java +++ b/common/src/main/java/org/apache/rocketmq/common/utils/NameServerAddressUtils.java @@ -20,6 +20,7 @@ public class NameServerAddressUtils { public static final String INSTANCE_PREFIX = "MQ_INST_"; public static final String INSTANCE_REGEX = INSTANCE_PREFIX + "\\w+_\\w+"; public static final String ENDPOINT_PREFIX = "(\\w+://|)"; + public static final Pattern NAMESRV_ENDPOINT_PATTERN = Pattern.compile("^http://.*"); public static final Pattern INST_ENDPOINT_PATTERN = Pattern.compile("^" + ENDPOINT_PREFIX + INSTANCE_REGEX + "\\..*"); public static String getNameServerAddresses() { From 062e6f33e547b7290f75a0adde3a8f6211c454c3 Mon Sep 17 00:00:00 2001 From: sunhangda Date: Fri, 2 Jul 2021 17:36:51 +0800 Subject: [PATCH 48/83] revert [ISSUE #2442] when happening system busy, retry --- .../rocketmq/client/impl/producer/DefaultMQProducerImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java index 6238e3e2f0..fac3ed3561 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java @@ -633,7 +633,6 @@ public class DefaultMQProducerImpl implements MQProducerInner { case ResponseCode.TOPIC_NOT_EXIST: case ResponseCode.SERVICE_NOT_AVAILABLE: case ResponseCode.SYSTEM_ERROR: - case ResponseCode.SYSTEM_BUSY: case ResponseCode.NO_PERMISSION: case ResponseCode.NO_BUYER_ID: case ResponseCode.NOT_IN_CURRENT_UNIT: From b74c48b3607838f8e8f653d7c926ee0a851a9d6c Mon Sep 17 00:00:00 2001 From: lizhiboo Date: Fri, 2 Jul 2021 19:57:05 +0800 Subject: [PATCH 49/83] add trace data format test case --- .../client/trace/TraceDataEncoderTest.java | 104 +++++++++++++++++- 1 file changed, 103 insertions(+), 1 deletion(-) diff --git a/client/src/test/java/org/apache/rocketmq/client/trace/TraceDataEncoderTest.java b/client/src/test/java/org/apache/rocketmq/client/trace/TraceDataEncoderTest.java index af5a705395..e268dff345 100644 --- a/client/src/test/java/org/apache/rocketmq/client/trace/TraceDataEncoderTest.java +++ b/client/src/test/java/org/apache/rocketmq/client/trace/TraceDataEncoderTest.java @@ -60,7 +60,6 @@ public class TraceDataEncoderTest { Assert.assertEquals(contexts.get(0).getTraceType(), TraceType.Pub); } - @Test public void testEncoderFromContextBean() { TraceContext context = new TraceContext(); @@ -130,4 +129,107 @@ public class TraceDataEncoderTest { Assert.assertEquals(before.getTransactionState(), after.getTransactionState()); Assert.assertEquals(before.isFromTransactionCheck(), after.isFromTransactionCheck()); } + + @Test + public void testPubTraceDataFormatTest() { + TraceContext pubContext = new TraceContext(); + pubContext.setTraceType(TraceType.Pub); + pubContext.setTimeStamp(time); + pubContext.setRegionId("Default-region"); + pubContext.setGroupName("GroupName-test"); + pubContext.setCostTime(34); + pubContext.setSuccess(true); + TraceBean bean = new TraceBean(); + bean.setTopic("topic-test"); + bean.setMsgId("AC1415116D1418B4AAC217FE1B4E0000"); + bean.setTags("tags"); + bean.setKeys("keys"); + bean.setStoreHost("127.0.0.1:10911"); + bean.setBodyLength(100); + bean.setMsgType(MessageType.Normal_Msg); + bean.setOffsetMsgId("AC1415116D1418B4AAC217FE1B4E0000"); + pubContext.setTraceBeans(new ArrayList(1)); + pubContext.getTraceBeans().add(bean); + + TraceTransferBean traceTransferBean = TraceDataEncoder.encoderFromContextBean(pubContext); + String transData = traceTransferBean.getTransData(); + Assert.assertNotNull(transData); + String[] items = transData.split(String.valueOf(TraceConstants.CONTENT_SPLITOR)); + Assert.assertEquals(14, items.length); + + } + + @Test + public void testSubBeforeTraceDataFormatTest() { + TraceContext subBeforeContext = new TraceContext(); + subBeforeContext.setTraceType(TraceType.SubBefore); + subBeforeContext.setTimeStamp(time); + subBeforeContext.setRegionId("Default-region"); + subBeforeContext.setGroupName("GroupName-test"); + subBeforeContext.setRequestId("3455848576927"); + TraceBean bean = new TraceBean(); + bean.setMsgId("AC1415116D1418B4AAC217FE1B4E0000"); + bean.setRetryTimes(0); + bean.setKeys("keys"); + subBeforeContext.setTraceBeans(new ArrayList(1)); + subBeforeContext.getTraceBeans().add(bean); + + TraceTransferBean traceTransferBean = TraceDataEncoder.encoderFromContextBean(subBeforeContext); + String transData = traceTransferBean.getTransData(); + Assert.assertNotNull(transData); + String[] items = transData.split(String.valueOf(TraceConstants.CONTENT_SPLITOR)); + Assert.assertEquals(8, items.length); + + } + + @Test + public void testSubAfterTraceDataFormatTest() { + TraceContext subAfterContext = new TraceContext(); + subAfterContext.setTraceType(TraceType.SubAfter); + subAfterContext.setRequestId("3455848576927"); + subAfterContext.setCostTime(20); + subAfterContext.setSuccess(true); + subAfterContext.setContextCode(98623046); + TraceBean bean = new TraceBean(); + bean.setMsgId("AC1415116D1418B4AAC217FE1B4E0000"); + bean.setKeys("keys"); + subAfterContext.setTraceBeans(new ArrayList(1)); + subAfterContext.getTraceBeans().add(bean); + + TraceTransferBean traceTransferBean = TraceDataEncoder.encoderFromContextBean(subAfterContext); + String transData = traceTransferBean.getTransData(); + Assert.assertNotNull(transData); + String[] items = transData.split(String.valueOf(TraceConstants.CONTENT_SPLITOR)); + Assert.assertEquals(7, items.length); + + } + + @Test + public void testEndTrxTraceDataFormatTest() { + TraceContext endTrxContext = new TraceContext(); + endTrxContext.setTraceType(TraceType.EndTransaction); + endTrxContext.setGroupName("PID-test"); + endTrxContext.setRegionId("DefaultRegion"); + endTrxContext.setTimeStamp(time); + TraceBean endTrxTraceBean = new TraceBean(); + endTrxTraceBean.setTopic("topic-test"); + endTrxTraceBean.setKeys("Keys"); + endTrxTraceBean.setTags("Tags"); + endTrxTraceBean.setMsgId("AC1415116D1418B4AAC217FE1B4E0000"); + endTrxTraceBean.setStoreHost("127.0.0.1:10911"); + endTrxTraceBean.setMsgType(MessageType.Trans_msg_Commit); + endTrxTraceBean.setTransactionId("transactionId"); + endTrxTraceBean.setTransactionState(LocalTransactionState.COMMIT_MESSAGE); + endTrxTraceBean.setFromTransactionCheck(false); + List traceBeans = new ArrayList(); + traceBeans.add(endTrxTraceBean); + endTrxContext.setTraceBeans(traceBeans); + + TraceTransferBean traceTransferBean = TraceDataEncoder.encoderFromContextBean(endTrxContext); + String transData = traceTransferBean.getTransData(); + Assert.assertNotNull(transData); + String[] items = transData.split(String.valueOf(TraceConstants.CONTENT_SPLITOR)); + Assert.assertEquals(13, items.length); + + } } From bc73c32c905cf2a6d72edb4565cc0da1fee84cbc Mon Sep 17 00:00:00 2001 From: sunbufu Date: Sat, 3 Jul 2021 20:46:06 +0800 Subject: [PATCH 50/83] use String.format() in warn log. --- .../impl/consumer/ConsumeMessageConcurrentlyService.java | 5 ++--- .../client/impl/consumer/ConsumeMessageOrderlyService.java | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java index e7b11a0c31..925e5258b5 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java @@ -411,12 +411,11 @@ public class ConsumeMessageConcurrentlyService implements ConsumeMessageService } status = listener.consumeMessage(Collections.unmodifiableList(msgs), context); } catch (Throwable e) { - log.warn("consumeMessage exception: {} Group: {} Msgs: {} MQ: {}", + log.warn(String.format("consumeMessage exception: %s Group: %s Msgs: %s MQ: %s", RemotingHelper.exceptionSimpleDesc(e), ConsumeMessageConcurrentlyService.this.consumerGroup, msgs, - messageQueue, - e); + messageQueue), e); hasException = true; } long consumeRT = System.currentTimeMillis() - beginTimestamp; diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageOrderlyService.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageOrderlyService.java index 5bd856e823..8d92b5718a 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageOrderlyService.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageOrderlyService.java @@ -487,12 +487,11 @@ public class ConsumeMessageOrderlyService implements ConsumeMessageService { status = messageListener.consumeMessage(Collections.unmodifiableList(msgs), context); } catch (Throwable e) { - log.warn("consumeMessage exception: {} Group: {} Msgs: {} MQ: {}", + log.warn(String.format("consumeMessage exception: %s Group: %s Msgs: %s MQ: %s", RemotingHelper.exceptionSimpleDesc(e), ConsumeMessageOrderlyService.this.consumerGroup, msgs, - messageQueue, - e); + messageQueue), e); hasException = true; } finally { this.processQueue.getConsumeLock().unlock(); From 65915891828ef5314209dd8b6df41b2f4da7e2c7 Mon Sep 17 00:00:00 2001 From: Git_Yang <30995057+Git-Yang@users.noreply.github.com> Date: Mon, 5 Jul 2021 16:03:45 +0800 Subject: [PATCH 51/83] [ISSUE #3118] Fix type conversion exception Signed-off-by: zhangyang21 --- .../rocketmq/store/dledger/DLedgerCommitLog.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java b/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java index 90fd6f3f16..3b9876030d 100644 --- a/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java +++ b/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java @@ -562,11 +562,13 @@ public class DLedgerCommitLog extends CommitLog { request.setGroup(dLedgerConfig.getGroup()); request.setRemoteId(dLedgerServer.getMemberState().getSelfId()); request.setBatchMsgs(encodeResult.batchData); - dledgerFuture = (BatchAppendFuture) dLedgerServer.handleAppend(request); - if (dledgerFuture.getPos() == -1) { - log.warn("HandleAppend return false due to error code {}", dledgerFuture.get().getCode()); + AppendFuture appendFuture = (AppendFuture) dLedgerServer.handleAppend(request); + if (appendFuture.getPos() == -1) { + log.warn("HandleAppend return false due to error code {}", appendFuture.get().getCode()); return new PutMessageResult(PutMessageStatus.OS_PAGECACHE_BUSY, new AppendMessageResult(AppendMessageStatus.UNKNOWN_ERROR)); } + dledgerFuture = (BatchAppendFuture) appendFuture; + long wroteOffset = 0; int msgIdLength = (messageExtBatch.getSysFlag() & MessageSysFlag.STOREHOSTADDRESS_V6_FLAG) == 0 ? 4 + 4 + 8 : 16 + 4 + 8; @@ -789,11 +791,13 @@ public class DLedgerCommitLog extends CommitLog { request.setGroup(dLedgerConfig.getGroup()); request.setRemoteId(dLedgerServer.getMemberState().getSelfId()); request.setBatchMsgs(encodeResult.batchData); - dledgerFuture = (BatchAppendFuture) dLedgerServer.handleAppend(request); - if (dledgerFuture.getPos() == -1) { - log.warn("HandleAppend return false due to error code {}", dledgerFuture.get().getCode()); + AppendFuture appendFuture = (AppendFuture) dLedgerServer.handleAppend(request); + if (appendFuture.getPos() == -1) { + log.warn("HandleAppend return false due to error code {}", appendFuture.get().getCode()); return CompletableFuture.completedFuture(new PutMessageResult(PutMessageStatus.OS_PAGECACHE_BUSY, new AppendMessageResult(AppendMessageStatus.UNKNOWN_ERROR))); } + dledgerFuture = (BatchAppendFuture) appendFuture; + long wroteOffset = 0; int msgIdLength = (messageExtBatch.getSysFlag() & MessageSysFlag.STOREHOSTADDRESS_V6_FLAG) == 0 ? 4 + 4 + 8 : 16 + 4 + 8; From 7c364687c65bb1e9207600e1f4c1610363ae10bc Mon Sep 17 00:00:00 2001 From: mxsm Date: Mon, 5 Jul 2021 16:09:34 +0800 Subject: [PATCH 52/83] [ISSUE #3089] fix Print log format is incorrect in NettyRemotingAbstract class (#3126) --- .../apache/rocketmq/remoting/netty/NettyRemotingAbstract.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java index 3f21eb8ff1..c9b39946c0 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettyRemotingAbstract.java @@ -553,7 +553,7 @@ public abstract class NettyRemotingAbstract { throw new RemotingTooMuchRequestException("invokeOnewayImpl invoke too fast"); } else { String info = String.format( - "invokeOnewayImpl tryAcquire semaphore timeout, %dms, waiting thread nums: %d semaphoreAsyncValue: %d", + "invokeOnewayImpl tryAcquire semaphore timeout, %dms, waiting thread nums: %d semaphoreOnewayValue: %d", timeoutMillis, this.semaphoreOneway.getQueueLength(), this.semaphoreOneway.availablePermits() From d65778f3a83b2daf49cecf270a6bac166ad6f9b8 Mon Sep 17 00:00:00 2001 From: huangli Date: Tue, 6 Jul 2021 21:46:14 +0800 Subject: [PATCH 53/83] [ISSUE #2883] [Part B] Improve produce performance in M/S mode. (#2885) * Optimise lock in WaitNotifyObject * Remove lock in HAService * Remove lock in GroupCommitService --- .../org/apache/rocketmq/store/CommitLog.java | 65 ++++++++++--------- .../apache/rocketmq/store/ha/HAService.java | 55 +++++++++------- .../rocketmq/store/ha/WaitNotifyObject.java | 64 +++++++++--------- 3 files changed, 101 insertions(+), 83 deletions(-) diff --git a/store/src/main/java/org/apache/rocketmq/store/CommitLog.java b/store/src/main/java/org/apache/rocketmq/store/CommitLog.java index cce6481b8d..43b01f08d8 100644 --- a/store/src/main/java/org/apache/rocketmq/store/CommitLog.java +++ b/store/src/main/java/org/apache/rocketmq/store/CommitLog.java @@ -19,8 +19,8 @@ package org.apache.rocketmq.store; import java.net.Inet6Address; import java.net.InetSocketAddress; import java.nio.ByteBuffer; -import java.util.ArrayList; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -1403,48 +1403,55 @@ public class CommitLog { * GroupCommit Service */ class GroupCommitService extends FlushCommitLogService { - private volatile List requestsWrite = new ArrayList(); - private volatile List requestsRead = new ArrayList(); + private volatile LinkedList requestsWrite = new LinkedList(); + private volatile LinkedList requestsRead = new LinkedList(); + private final PutMessageSpinLock lock = new PutMessageSpinLock(); public synchronized void putRequest(final GroupCommitRequest request) { - synchronized (this.requestsWrite) { + lock.lock(); + try { this.requestsWrite.add(request); + } finally { + lock.unlock(); } this.wakeup(); } private void swapRequests() { - List tmp = this.requestsWrite; - this.requestsWrite = this.requestsRead; - this.requestsRead = tmp; + lock.lock(); + try { + LinkedList tmp = this.requestsWrite; + this.requestsWrite = this.requestsRead; + this.requestsRead = tmp; + } finally { + lock.unlock(); + } } private void doCommit() { - synchronized (this.requestsRead) { - if (!this.requestsRead.isEmpty()) { - for (GroupCommitRequest req : this.requestsRead) { - // There may be a message in the next file, so a maximum of - // two times the flush - boolean flushOK = CommitLog.this.mappedFileQueue.getFlushedWhere() >= req.getNextOffset(); - for (int i = 0; i < 2 && !flushOK; i++) { - CommitLog.this.mappedFileQueue.flush(0); - flushOK = CommitLog.this.mappedFileQueue.getFlushedWhere() >= req.getNextOffset(); - } - - req.wakeupCustomer(flushOK ? PutMessageStatus.PUT_OK : PutMessageStatus.FLUSH_DISK_TIMEOUT); + if (!this.requestsRead.isEmpty()) { + for (GroupCommitRequest req : this.requestsRead) { + // There may be a message in the next file, so a maximum of + // two times the flush + boolean flushOK = CommitLog.this.mappedFileQueue.getFlushedWhere() >= req.getNextOffset(); + for (int i = 0; i < 2 && !flushOK; i++) { + CommitLog.this.mappedFileQueue.flush(0); + flushOK = CommitLog.this.mappedFileQueue.getFlushedWhere() >= req.getNextOffset(); } - long storeTimestamp = CommitLog.this.mappedFileQueue.getStoreTimestamp(); - if (storeTimestamp > 0) { - CommitLog.this.defaultMessageStore.getStoreCheckpoint().setPhysicMsgTimestamp(storeTimestamp); - } - - this.requestsRead.clear(); - } else { - // Because of individual messages is set to not sync flush, it - // will come to this process - CommitLog.this.mappedFileQueue.flush(0); + req.wakeupCustomer(flushOK ? PutMessageStatus.PUT_OK : PutMessageStatus.FLUSH_DISK_TIMEOUT); } + + long storeTimestamp = CommitLog.this.mappedFileQueue.getStoreTimestamp(); + if (storeTimestamp > 0) { + CommitLog.this.defaultMessageStore.getStoreCheckpoint().setPhysicMsgTimestamp(storeTimestamp); + } + + this.requestsRead = new LinkedList<>(); + } else { + // Because of individual messages is set to not sync flush, it + // will come to this process + CommitLog.this.mappedFileQueue.flush(0); } } diff --git a/store/src/main/java/org/apache/rocketmq/store/ha/HAService.java b/store/src/main/java/org/apache/rocketmq/store/ha/HAService.java index 34c51eb9e2..d4d4109967 100644 --- a/store/src/main/java/org/apache/rocketmq/store/ha/HAService.java +++ b/store/src/main/java/org/apache/rocketmq/store/ha/HAService.java @@ -25,7 +25,6 @@ import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; -import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Set; @@ -39,6 +38,7 @@ import org.apache.rocketmq.logging.InternalLoggerFactory; import org.apache.rocketmq.remoting.common.RemotingUtil; import org.apache.rocketmq.store.CommitLog; import org.apache.rocketmq.store.DefaultMessageStore; +import org.apache.rocketmq.store.PutMessageSpinLock; import org.apache.rocketmq.store.PutMessageStatus; public class HAService { @@ -254,12 +254,16 @@ public class HAService { class GroupTransferService extends ServiceThread { private final WaitNotifyObject notifyTransferObject = new WaitNotifyObject(); - private volatile List requestsWrite = new ArrayList<>(); - private volatile List requestsRead = new ArrayList<>(); + private final PutMessageSpinLock lock = new PutMessageSpinLock(); + private volatile LinkedList requestsWrite = new LinkedList<>(); + private volatile LinkedList requestsRead = new LinkedList<>(); - public synchronized void putRequest(final CommitLog.GroupCommitRequest request) { - synchronized (this.requestsWrite) { + public void putRequest(final CommitLog.GroupCommitRequest request) { + lock.lock(); + try { this.requestsWrite.add(request); + } finally { + lock.unlock(); } this.wakeup(); } @@ -269,32 +273,35 @@ public class HAService { } private void swapRequests() { - List tmp = this.requestsWrite; - this.requestsWrite = this.requestsRead; - this.requestsRead = tmp; + lock.lock(); + try { + LinkedList tmp = this.requestsWrite; + this.requestsWrite = this.requestsRead; + this.requestsRead = tmp; + } finally { + lock.unlock(); + } } private void doWaitTransfer() { - synchronized (this.requestsRead) { - if (!this.requestsRead.isEmpty()) { - for (CommitLog.GroupCommitRequest req : this.requestsRead) { - boolean transferOK = HAService.this.push2SlaveMaxOffset.get() >= req.getNextOffset(); - long waitUntilWhen = HAService.this.defaultMessageStore.getSystemClock().now() + if (!this.requestsRead.isEmpty()) { + for (CommitLog.GroupCommitRequest req : this.requestsRead) { + boolean transferOK = HAService.this.push2SlaveMaxOffset.get() >= req.getNextOffset(); + long waitUntilWhen = HAService.this.defaultMessageStore.getSystemClock().now() + HAService.this.defaultMessageStore.getMessageStoreConfig().getSyncFlushTimeout(); - while (!transferOK && HAService.this.defaultMessageStore.getSystemClock().now() < waitUntilWhen) { - this.notifyTransferObject.waitForRunning(1000); - transferOK = HAService.this.push2SlaveMaxOffset.get() >= req.getNextOffset(); - } - - if (!transferOK) { - log.warn("transfer messsage to slave timeout, " + req.getNextOffset()); - } - - req.wakeupCustomer(transferOK ? PutMessageStatus.PUT_OK : PutMessageStatus.FLUSH_SLAVE_TIMEOUT); + while (!transferOK && HAService.this.defaultMessageStore.getSystemClock().now() < waitUntilWhen) { + this.notifyTransferObject.waitForRunning(1000); + transferOK = HAService.this.push2SlaveMaxOffset.get() >= req.getNextOffset(); } - this.requestsRead.clear(); + if (!transferOK) { + log.warn("transfer messsage to slave timeout, " + req.getNextOffset()); + } + + req.wakeupCustomer(transferOK ? PutMessageStatus.PUT_OK : PutMessageStatus.FLUSH_SLAVE_TIMEOUT); } + + this.requestsRead = new LinkedList<>(); } } diff --git a/store/src/main/java/org/apache/rocketmq/store/ha/WaitNotifyObject.java b/store/src/main/java/org/apache/rocketmq/store/ha/WaitNotifyObject.java index 75b7597fea..d5ed65f5f7 100644 --- a/store/src/main/java/org/apache/rocketmq/store/ha/WaitNotifyObject.java +++ b/store/src/main/java/org/apache/rocketmq/store/ha/WaitNotifyObject.java @@ -20,40 +20,43 @@ import org.apache.rocketmq.common.constant.LoggerName; import org.apache.rocketmq.logging.InternalLogger; import org.apache.rocketmq.logging.InternalLoggerFactory; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; public class WaitNotifyObject { private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.STORE_LOGGER_NAME); - protected final HashMap waitingThreadTable = - new HashMap(16); + protected final ConcurrentHashMap waitingThreadTable = + new ConcurrentHashMap(16); - protected volatile boolean hasNotified = false; + protected AtomicBoolean hasNotified = new AtomicBoolean(false); public void wakeup() { - synchronized (this) { - if (!this.hasNotified) { - this.hasNotified = true; + boolean needNotify = hasNotified.compareAndSet(false, true); + if (needNotify) { + synchronized (this) { this.notify(); } } } protected void waitForRunning(long interval) { + if (this.hasNotified.compareAndSet(true, false)) { + this.onWaitEnd(); + return; + } synchronized (this) { - if (this.hasNotified) { - this.hasNotified = false; - this.onWaitEnd(); - return; - } - try { + if (this.hasNotified.compareAndSet(true, false)) { + this.onWaitEnd(); + return; + } this.wait(interval); } catch (InterruptedException e) { log.error("Interrupted", e); } finally { - this.hasNotified = false; + this.hasNotified.set(false); this.onWaitEnd(); } } @@ -63,15 +66,14 @@ public class WaitNotifyObject { } public void wakeupAll() { - synchronized (this) { - boolean needNotify = false; - - for (Map.Entry entry : this.waitingThreadTable.entrySet()) { - needNotify = needNotify || !entry.getValue(); - entry.setValue(true); + boolean needNotify = false; + for (Map.Entry entry : this.waitingThreadTable.entrySet()) { + if (entry.getValue().compareAndSet(false, true)) { + needNotify = true; } - - if (needNotify) { + } + if (needNotify) { + synchronized (this) { this.notifyAll(); } } @@ -79,20 +81,22 @@ public class WaitNotifyObject { public void allWaitForRunning(long interval) { long currentThreadId = Thread.currentThread().getId(); + AtomicBoolean notified = this.waitingThreadTable.computeIfAbsent(currentThreadId, k -> new AtomicBoolean(false)); + if (notified.compareAndSet(true, false)) { + this.onWaitEnd(); + return; + } synchronized (this) { - Boolean notified = this.waitingThreadTable.get(currentThreadId); - if (notified != null && notified) { - this.waitingThreadTable.put(currentThreadId, false); - this.onWaitEnd(); - return; - } - try { + if (notified.compareAndSet(true, false)) { + this.onWaitEnd(); + return; + } this.wait(interval); } catch (InterruptedException e) { log.error("Interrupted", e); } finally { - this.waitingThreadTable.put(currentThreadId, false); + notified.set(false); this.onWaitEnd(); } } From 3183122c01cc2d0dc005634d028ccbcb62495bf6 Mon Sep 17 00:00:00 2001 From: huangli Date: Tue, 6 Jul 2021 21:47:12 +0800 Subject: [PATCH 54/83] Eliminate array copy (#2886) [Part C] Improve produce performance in M/S mode. --- .../broker/plugin/AbstractPluginMessageStore.java | 4 ++-- .../main/java/org/apache/rocketmq/store/CommitLog.java | 4 ++-- .../org/apache/rocketmq/store/DefaultMessageStore.java | 4 ++-- .../java/org/apache/rocketmq/store/MessageStore.java | 4 +++- .../rocketmq/store/dledger/DLedgerCommitLog.java | 2 +- .../java/org/apache/rocketmq/store/ha/HAService.java | 10 ++++------ 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/plugin/AbstractPluginMessageStore.java b/broker/src/main/java/org/apache/rocketmq/broker/plugin/AbstractPluginMessageStore.java index 1db019bec8..b95bab6249 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/plugin/AbstractPluginMessageStore.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/plugin/AbstractPluginMessageStore.java @@ -180,8 +180,8 @@ public abstract class AbstractPluginMessageStore implements MessageStore { } @Override - public boolean appendToCommitLog(long startOffset, byte[] data) { - return next.appendToCommitLog(startOffset, data); + public boolean appendToCommitLog(long startOffset, byte[] data, int dataStart, int dataLength) { + return next.appendToCommitLog(startOffset, data, dataStart, dataLength); } @Override diff --git a/store/src/main/java/org/apache/rocketmq/store/CommitLog.java b/store/src/main/java/org/apache/rocketmq/store/CommitLog.java index 43b01f08d8..57fa363785 100644 --- a/store/src/main/java/org/apache/rocketmq/store/CommitLog.java +++ b/store/src/main/java/org/apache/rocketmq/store/CommitLog.java @@ -1185,7 +1185,7 @@ public class CommitLog { this.mappedFileQueue.destroy(); } - public boolean appendData(long startOffset, byte[] data) { + public boolean appendData(long startOffset, byte[] data, int dataStart, int dataLength) { putMessageLock.lock(); try { MappedFile mappedFile = this.mappedFileQueue.getLastMappedFile(startOffset); @@ -1194,7 +1194,7 @@ public class CommitLog { return false; } - return mappedFile.appendMessage(data); + return mappedFile.appendMessage(data, dataStart, dataLength); } finally { putMessageLock.unlock(); } 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 b8ecdee8cc..7dd5a32b2f 100644 --- a/store/src/main/java/org/apache/rocketmq/store/DefaultMessageStore.java +++ b/store/src/main/java/org/apache/rocketmq/store/DefaultMessageStore.java @@ -921,13 +921,13 @@ public class DefaultMessageStore implements MessageStore { } @Override - public boolean appendToCommitLog(long startOffset, byte[] data) { + public boolean appendToCommitLog(long startOffset, byte[] data, int dataStart, int dataLength) { if (this.shutdown) { log.warn("message store has shutdown, so appendToPhyQueue is forbidden"); return false; } - boolean result = this.commitLog.appendData(startOffset, data); + boolean result = this.commitLog.appendData(startOffset, data, dataStart, dataLength); if (result) { this.reputMessageService.wakeup(); } else { diff --git a/store/src/main/java/org/apache/rocketmq/store/MessageStore.java b/store/src/main/java/org/apache/rocketmq/store/MessageStore.java index 64eb5250de..a8c658bfe2 100644 --- a/store/src/main/java/org/apache/rocketmq/store/MessageStore.java +++ b/store/src/main/java/org/apache/rocketmq/store/MessageStore.java @@ -245,9 +245,11 @@ public interface MessageStore { * * @param startOffset starting offset. * @param data data to append. + * @param dataStart the start index of data array + * @param dataLength the length of data array * @return true if success; false otherwise. */ - boolean appendToCommitLog(final long startOffset, final byte[] data); + boolean appendToCommitLog(final long startOffset, final byte[] data, int dataStart, int dataLength); /** * Execute file deletion manually. diff --git a/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java b/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java index 3b9876030d..ea791bd9ff 100644 --- a/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java +++ b/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java @@ -905,7 +905,7 @@ public class DLedgerCommitLog extends CommitLog { } @Override - public boolean appendData(long startOffset, byte[] data) { + public boolean appendData(long startOffset, byte[] data, int dataStart, int dataLength) { //the old ha service will invoke method, here to prevent it return false; } diff --git a/store/src/main/java/org/apache/rocketmq/store/ha/HAService.java b/store/src/main/java/org/apache/rocketmq/store/ha/HAService.java index d4d4109967..845935bb9d 100644 --- a/store/src/main/java/org/apache/rocketmq/store/ha/HAService.java +++ b/store/src/main/java/org/apache/rocketmq/store/ha/HAService.java @@ -440,7 +440,6 @@ public class HAService { private boolean dispatchReadRequest() { final int msgHeaderSize = 8 + 4; // phyoffset + size - int readSocketPos = this.byteBufferRead.position(); while (true) { int diff = this.byteBufferRead.position() - this.dispatchPosition; @@ -459,13 +458,12 @@ public class HAService { } if (diff >= (msgHeaderSize + bodySize)) { - byte[] bodyData = new byte[bodySize]; - this.byteBufferRead.position(this.dispatchPosition + msgHeaderSize); - this.byteBufferRead.get(bodyData); + byte[] bodyData = byteBufferRead.array(); + int dataStart = this.dispatchPosition + msgHeaderSize; - HAService.this.defaultMessageStore.appendToCommitLog(masterPhyOffset, bodyData); + HAService.this.defaultMessageStore.appendToCommitLog( + masterPhyOffset, bodyData, dataStart, bodySize); - this.byteBufferRead.position(readSocketPos); this.dispatchPosition += msgHeaderSize + bodySize; if (!reportSlaveMaxOffsetPlus()) { From 44e2669a2f48a1526bcd3418b81feded6f634d67 Mon Sep 17 00:00:00 2001 From: zhangjidi2016 Date: Wed, 7 Jul 2021 00:01:59 +0800 Subject: [PATCH 55/83] [ISSUE #3128] fix the delete global white addresses --- .../rocketmq/acl/plain/PlainPermissionManager.java | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionManager.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionManager.java index 078d34b10b..a22b0b25a7 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionManager.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionManager.java @@ -251,12 +251,6 @@ public class PlainPermissionManager { } public boolean updateGlobalWhiteAddrsConfig(List globalWhiteAddrsList) { - - if (globalWhiteAddrsList == null) { - log.error("Parameter value globalWhiteAddrsList is null,Please check your parameter"); - return false; - } - Map aclAccessConfigMap = AclUtils.getYamlDataObject(fileHome + File.separator + fileName, Map.class); if (aclAccessConfigMap == null || aclAccessConfigMap.isEmpty()) { @@ -266,9 +260,10 @@ public class PlainPermissionManager { if (globalWhiteRemoteAddrList != null) { globalWhiteRemoteAddrList.clear(); - globalWhiteRemoteAddrList.addAll(globalWhiteAddrsList); - - // Update globalWhiteRemoteAddr element in memeory map firstly + if (globalWhiteAddrsList != null) { + globalWhiteRemoteAddrList.addAll(globalWhiteAddrsList); + } + // Update globalWhiteRemoteAddr element in memory map firstly aclAccessConfigMap.put(AclConstants.CONFIG_GLOBAL_WHITE_ADDRS, globalWhiteRemoteAddrList); if (AclUtils.writeDataObject(fileHome + File.separator + fileName, updateAclConfigFileVersion(aclAccessConfigMap))) { return true; From 4c1998a54ef5b5b7f36130a626c99c9ca2064972 Mon Sep 17 00:00:00 2001 From: zhangjidi2016 Date: Wed, 7 Jul 2021 08:55:04 +0800 Subject: [PATCH 56/83] retrigger ci From b13a4c862fac5889318079e5fc81c3835d128676 Mon Sep 17 00:00:00 2001 From: huangli Date: Thu, 27 May 2021 18:55:30 +0800 Subject: [PATCH 57/83] [ISSUE 2883] [Part G] Optimise parse performance for SendMessageRequestHeaderV2 --- .../AbstractSendMessageProcessor.java | 73 ++++++++++++++++++- 1 file changed, 70 insertions(+), 3 deletions(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java index ced7c2014f..95602206a8 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java @@ -19,8 +19,10 @@ package org.apache.rocketmq.broker.processor; import io.netty.channel.ChannelHandlerContext; import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Random; import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.mqtrace.SendMessageContext; @@ -288,9 +290,7 @@ public abstract class AbstractSendMessageProcessor extends AsyncNettyRequestProc switch (request.getCode()) { case RequestCode.SEND_BATCH_MESSAGE: case RequestCode.SEND_MESSAGE_V2: - requestHeaderV2 = - (SendMessageRequestHeaderV2) request - .decodeCommandCustomHeader(SendMessageRequestHeaderV2.class); + requestHeaderV2 = decodeSendMessageHeaderV2(request); case RequestCode.SEND_MESSAGE: if (null == requestHeaderV2) { requestHeader = @@ -305,6 +305,73 @@ public abstract class AbstractSendMessageProcessor extends AsyncNettyRequestProc return requestHeader; } + private SendMessageRequestHeaderV2 decodeSendMessageHeaderV2(RemotingCommand request) { + SendMessageRequestHeaderV2 r = new SendMessageRequestHeaderV2(); + HashMap fields = request.getExtFields(); + if (fields == null) { + // keep same behavior with CommandCustomHeader.decodeCommandCustomHeader + return r; + } + + String s = fields.get("a"); + Objects.requireNonNull(s, "the custom field is null"); + r.setA(s); + + s = fields.get("b"); + Objects.requireNonNull(s, "the custom field is null"); + r.setB(s); + + s = fields.get("c"); + Objects.requireNonNull(s, "the custom field is null"); + r.setC(s); + + s = fields.get("d"); + Objects.requireNonNull(s, "the custom field is null"); + r.setD(Integer.parseInt(s)); + + s = fields.get("e"); + Objects.requireNonNull(s, "the custom field is null"); + r.setE(Integer.parseInt(s)); + + s = fields.get("f"); + Objects.requireNonNull(s, "the custom field is null"); + r.setF(Integer.parseInt(s)); + + s = fields.get("g"); + Objects.requireNonNull(s, "the custom field is null"); + r.setG(Long.parseLong(s)); + + s = fields.get("h"); + Objects.requireNonNull(s, "the custom field is null"); + r.setH(Integer.parseInt(s)); + + s = fields.get("i"); + if (s != null) { + r.setI(s); + } + + s = fields.get("j"); + if (s != null) { + r.setJ(Integer.parseInt(s)); + } + + s = fields.get("k"); + if (s != null) { + r.setK(Boolean.parseBoolean(s)); + } + + s = fields.get("l"); + if (s != null) { + r.setL(Integer.parseInt(s)); + } + + s = fields.get("m"); + if (s != null) { + r.setM(Boolean.parseBoolean(s)); + } + return r; + } + public void executeSendMessageHookAfter(final RemotingCommand response, final SendMessageContext context) { if (hasSendMessageHook()) { for (SendMessageHook hook : this.sendMessageHookList) { From 589e87c278147ee17cbcaac334d8558a8ef98ea2 Mon Sep 17 00:00:00 2001 From: xiaoyaofawai Date: Fri, 9 Jul 2021 13:40:02 +0800 Subject: [PATCH 58/83] [ISSUE #3099] Fix the incorrect judegment 'writePos - lastCommittedPosition > commitLeastPages' in the method 'commit0' of class 'MappedFile' (#3125) --- .../src/main/java/org/apache/rocketmq/store/MappedFile.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/store/src/main/java/org/apache/rocketmq/store/MappedFile.java b/store/src/main/java/org/apache/rocketmq/store/MappedFile.java index b5bdc7766b..25f0e39314 100644 --- a/store/src/main/java/org/apache/rocketmq/store/MappedFile.java +++ b/store/src/main/java/org/apache/rocketmq/store/MappedFile.java @@ -301,7 +301,7 @@ public class MappedFile extends ReferenceResource { } if (this.isAbleToCommit(commitLeastPages)) { if (this.hold()) { - commit0(commitLeastPages); + commit0(); this.release(); } else { log.warn("in commit, hold failed, commit offset = " + this.committedPosition.get()); @@ -317,11 +317,11 @@ public class MappedFile extends ReferenceResource { return this.committedPosition.get(); } - protected void commit0(final int commitLeastPages) { + protected void commit0() { int writePos = this.wrotePosition.get(); int lastCommittedPosition = this.committedPosition.get(); - if (writePos - lastCommittedPosition > commitLeastPages) { + if (writePos - lastCommittedPosition > 0) { try { ByteBuffer byteBuffer = writeBuffer.slice(); byteBuffer.position(lastCommittedPosition); From 17a8e93ba4dce34e6a9b2f35af46e62a71923882 Mon Sep 17 00:00:00 2001 From: huangjunwei Date: Wed, 14 Jul 2021 19:03:03 +0800 Subject: [PATCH 59/83] fix spell error --- docs/cn/image/rocketmq_architecture_1.png | Bin 89290 -> 62810 bytes docs/cn/image/rocketmq_architecture_3.png | Bin 106758 -> 74884 bytes docs/en/image/rocketmq_architecture_1.png | Bin 89290 -> 62810 bytes docs/en/image/rocketmq_architecture_3.png | Bin 106758 -> 74884 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/cn/image/rocketmq_architecture_1.png b/docs/cn/image/rocketmq_architecture_1.png index 1d3e82b354b563e17aa90d64c9f94dd9bfe476b6..addb571a84459640ad8e021e31bd4e4cad2e0f5e 100644 GIT binary patch literal 62810 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

!qPN)3p{-<=up^LyXachJ;V_6K2H!z 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 Ukd%*|l!DLJ|7_n}VC{M0zwT}noB#j- diff --git a/docs/en/image/rocketmq_architecture_1.png b/docs/en/image/rocketmq_architecture_1.png index 1d3e82b354b563e17aa90d64c9f94dd9bfe476b6..addb571a84459640ad8e021e31bd4e4cad2e0f5e 100644 GIT binary patch literal 62810 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.}%8=VT?#j4XZC}7uk@p!j5%+v4Csrdw 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 literal 89290 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%0DC*XO}bPka!nPY3Z|< z=<`NjkHtI$3Wh3`AmdKcm7r8flj<$%Ml_Zm)8BtGmCTND%DNx(tr*R0A3Zd3?9lZ1 zw|ru|!Jvrx6kjeQ`}X{e2}QmqPCkal=#;+FuNtWGVt!4#u?I^`AYtZvO*48V)@eS@ zp4AE_t~FV6GioG@@%bcvN^%KHuOD3v#R$n6emXSv|CX#8G6+bCZeeu?&zWeV+#n?P8i7=rEEqc>XHG-DqR*!_8r1= za#?%z`_bImvp12Q2)qzUg-?2y@2`Hdoqyfv~pS)IT3h-7?#~ z%%Um2MEa(3UC^h$bf+-wKA50t=#2ICd_kwm=@8MGSNgW{^Jn5xQRP&j*O~3l_Lg$~ z&vwF{9k9?onuJU%!;@p?ikH(UpKecfdAerLW*Wb~sgcpW-y?sk&$^xT2bv`uy#`gD zrA}Gfg!k|9CcEZ@WY%VF;R#IUdWa<(XN@~A3xDu#8MU{f~6s<)-W6_27`ce{Q5-}3jDI9h|}Qe+_*{VW(BF0g#m32yc!rlwqt2z0`l<;!Suu&sTIZ`E!`pg{MIpwN?Z}G{{R9PCrR=hOqM-D@9 ze;Wt?wt3Hkb6<3qHToZ!=)Xr7KyuOrv~7(tAZxU){=z50$1S=4^7uc^4c|f-yx*3T zG9Ucx!56_MH2;;R|NDvPL9j1yUI#7QHZ~(CziC_nJ0VH+66T+R)DMEBU(T=CMuC+= zTQ_?~6QQK3yO?yOl6$@TpEZ>wjr-vrdT56>=HVrF7be2~ZtfE~xxM5>U|XaG%dJ3I zFlKiHB&Gbf;RE3%pk1vwWk;r-FDZV*M2zfIc(PVopga>M&X=fG14TU7+Vo%Fho8TM zw<}>=9J%rcWg|7ygzktv%la>|!nr(uFS4)iEIj^|9i}HA45q=?nI3`{|9z92JQd= literal 106758 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

!qPN)3p{-<=up^LyXachJ;V_6K2H!z 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 Ukd%*|l!DLJ|7_n}VC{M0zwT}noB#j- From 04c7354149793f5da0dc1a94c3ef58bd1137f688 Mon Sep 17 00:00:00 2001 From: Steven Liang <1634074538@qq.com> Date: Fri, 16 Jul 2021 09:50:42 +0800 Subject: [PATCH 60/83] delete the unuse code --- .../ConsumeMessageConcurrentlyService.java | 24 ++----------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java index 925e5258b5..537dbee832 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/ConsumeMessageConcurrentlyService.java @@ -110,32 +110,12 @@ public class ConsumeMessageConcurrentlyService implements ConsumeMessageService @Override public void incCorePoolSize() { - // long corePoolSize = this.consumeExecutor.getCorePoolSize(); - // if (corePoolSize < this.defaultMQPushConsumer.getConsumeThreadMax()) - // { - // this.consumeExecutor.setCorePoolSize(this.consumeExecutor.getCorePoolSize() - // + 1); - // } - // log.info("incCorePoolSize Concurrently from {} to {}, ConsumerGroup: - // {}", - // corePoolSize, - // this.consumeExecutor.getCorePoolSize(), - // this.consumerGroup); + } @Override public void decCorePoolSize() { - // long corePoolSize = this.consumeExecutor.getCorePoolSize(); - // if (corePoolSize > this.defaultMQPushConsumer.getConsumeThreadMin()) - // { - // this.consumeExecutor.setCorePoolSize(this.consumeExecutor.getCorePoolSize() - // - 1); - // } - // log.info("decCorePoolSize Concurrently from {} to {}, ConsumerGroup: - // {}", - // corePoolSize, - // this.consumeExecutor.getCorePoolSize(), - // this.consumerGroup); + } @Override From d7c2d25c2a7344506ee001f7dfaf72f62c5f6c47 Mon Sep 17 00:00:00 2001 From: zanglei Date: Fri, 16 Jul 2021 11:01:15 +0800 Subject: [PATCH 61/83] [ISSUE #2708] fix offset rollback when fetch offset from broker exception --- .../client/impl/consumer/DefaultLitePullConsumerImpl.java | 2 +- .../client/impl/consumer/DefaultMQPushConsumerImpl.java | 2 +- .../apache/rocketmq/client/impl/consumer/RebalanceImpl.java | 2 +- .../rocketmq/client/impl/consumer/RebalanceLitePullImpl.java | 3 ++- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java index e835be1cd5..d28d23ad6b 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultLitePullConsumerImpl.java @@ -785,7 +785,7 @@ public class DefaultLitePullConsumerImpl implements MQConsumerInner { long offset = 0L; try { offset = nextPullOffset(messageQueue); - } catch (MQClientException e) { + } catch (Exception e) { log.error("Failed to get next pull offset", e); scheduledThreadPoolExecutor.schedule(this, PULL_TIME_DELAY_MILLS_ON_EXCEPTION, TimeUnit.MILLISECONDS); return; diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java index bb0b7f1043..59b8deb3fb 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/DefaultMQPushConsumerImpl.java @@ -273,7 +273,7 @@ public class DefaultMQPushConsumerImpl implements MQConsumerInner { long offset = -1L; try { offset = this.rebalanceImpl.computePullFromWhereWithException(pullRequest.getMessageQueue()); - } catch (MQClientException e) { + } catch (Exception e) { this.executePullRequestLater(pullRequest, pullTimeDelayMillsWhenException); log.error("Failed to compute pull offset, pullResult: {}", pullRequest, e); return; diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java index 833d465a47..7677d8b685 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceImpl.java @@ -378,7 +378,7 @@ public abstract class RebalanceImpl { long nextOffset = -1L; try { nextOffset = this.computePullFromWhereWithException(mq); - } catch (MQClientException e) { + } catch (Exception e) { log.info("doRebalance, {}, compute offset failed, {}", consumerGroup, mq); continue; } diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceLitePullImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceLitePullImpl.java index 286c684e43..8fe9400b0f 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceLitePullImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/consumer/RebalanceLitePullImpl.java @@ -102,7 +102,8 @@ public class RebalanceLitePullImpl extends RebalanceImpl { try { result = this.mQClientFactory.getMQAdminImpl().maxOffset(mq); } catch (MQClientException e) { - result = -1; + log.warn("Compute consume offset from last offset exception, mq={}, exception={}", mq, e); + throw e; } } } else { From 40e1435510a322f8f15ec5b9a1cc5c53784be870 Mon Sep 17 00:00:00 2001 From: yuz10 <845238369@qq.com> Date: Sat, 12 Jun 2021 06:20:40 +0800 Subject: [PATCH 62/83] #2990 Add document --- docs/cn/msg_trace/user_guide.md | 19 ++++++++++++++++--- docs/en/msg_trace/user_guide.md | 16 ++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/docs/cn/msg_trace/user_guide.md b/docs/cn/msg_trace/user_guide.md index b6447186ce..b780733440 100644 --- a/docs/cn/msg_trace/user_guide.md +++ b/docs/cn/msg_trace/user_guide.md @@ -100,6 +100,19 @@ RocketMQ的消息轨迹特性支持两种存储轨迹数据的方式: ...... ``` - - - +### 4.4 使用mqadmin命令发送和查看轨迹 +- 发送消息 +```shell +./mqadmin sendMessage -m true --topic some-topic-name -n 127.0.0.1:9876 -p "your meesgae content" +``` +- 查询轨迹 +```shell +./mqadmin QueryMsgTraceById -n 127.0.0.1:9876 -i "some-message-id" +``` +- 查询轨迹结果 +``` +RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0). +RocketMQLog:WARN Please initialize the logger system properly. +#Type #ProducerGroup #ClientHost #SendTime #CostTimes #Status +Pub 1623305799667 xxx.xxx.xxx.xxx 2021-06-10 14:16:40 131ms success +``` diff --git a/docs/en/msg_trace/user_guide.md b/docs/en/msg_trace/user_guide.md index eb540d02be..9573056d13 100644 --- a/docs/en/msg_trace/user_guide.md +++ b/docs/en/msg_trace/user_guide.md @@ -101,5 +101,21 @@ Adjusting instantiation of DefaultMQProducer and DefaultMQPushConsumer as follow ``` +### 4.4 Send and query message trace by mqadmin command +- send message +```shell +./mqadmin sendMessage -m true --topic some-topic-name -n 127.0.0.1:9876 -p "your meesgae content" +``` +- query trace +```shell +./mqadmin QueryMsgTraceById -n 127.0.0.1:9876 -i "some-message-id" +``` +- query trace result +``` +RocketMQLog:WARN No appenders could be found for logger (io.netty.util.internal.PlatformDependent0). +RocketMQLog:WARN Please initialize the logger system properly. +#Type #ProducerGroup #ClientHost #SendTime #CostTimes #Status +Pub 1623305799667 xxx.xxx.xxx.xxx 2021-06-10 14:16:40 131ms success +``` From 58087722e414090fde5d85ab35d44293c619c48b Mon Sep 17 00:00:00 2001 From: yuz10 <845238369@qq.com> Date: Sun, 18 Jul 2021 23:12:09 +0800 Subject: [PATCH 63/83] fix checkstyle fail --- .../java/org/apache/rocketmq/example/quickstart/Producer.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java b/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java index 0da6177996..771eea1598 100644 --- a/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java @@ -18,7 +18,6 @@ package org.apache.rocketmq.example.quickstart; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.producer.DefaultMQProducer; -import org.apache.rocketmq.client.producer.SendCallback; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.remoting.common.RemotingHelper; @@ -77,7 +76,7 @@ public class Producer { * if you want to get the send result in a synchronize way, you can use this send method * {@code * SendResult sendResult = producer.send(msg); - * System.out.println(sendResult.toString()); + * System.out.printf("%s%n", sendResult); * } */ From df88bce1d160b090232311b59687087082c2c01f Mon Sep 17 00:00:00 2001 From: yuz10 <845238369@qq.com> Date: Mon, 19 Jul 2021 00:05:07 +0800 Subject: [PATCH 64/83] add msgTraceEnable config in transaction producer benchmark --- .../example/benchmark/TransactionProducer.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/example/src/main/java/org/apache/rocketmq/example/benchmark/TransactionProducer.java b/example/src/main/java/org/apache/rocketmq/example/benchmark/TransactionProducer.java index 85af04eabb..1b511d8a9e 100644 --- a/example/src/main/java/org/apache/rocketmq/example/benchmark/TransactionProducer.java +++ b/example/src/main/java/org/apache/rocketmq/example/benchmark/TransactionProducer.java @@ -69,6 +69,7 @@ public class TransactionProducer { config.batchId = commandLine.hasOption("b") ? Long.parseLong(commandLine.getOptionValue("b")) : System.currentTimeMillis(); config.sendInterval = commandLine.hasOption("i") ? Integer.parseInt(commandLine.getOptionValue("i")) : 0; config.aclEnable = commandLine.hasOption('a') && Boolean.parseBoolean(commandLine.getOptionValue('a')); + config.msgTraceEnable = commandLine.hasOption('m') && Boolean.parseBoolean(commandLine.getOptionValue('m')); final ExecutorService sendThreadPool = Executors.newFixedThreadPool(config.threadCount); @@ -123,8 +124,12 @@ public class TransactionProducer { }, 10000, 10000); final TransactionListener transactionCheckListener = new TransactionListenerImpl(statsBenchmark, config); - final TransactionMQProducer producer = - new TransactionMQProducer("benchmark_transaction_producer", config.aclEnable ? AclClient.getAclRPCHook() : null); + final TransactionMQProducer producer = new TransactionMQProducer( + null, + "benchmark_transaction_producer", + config.aclEnable ? AclClient.getAclRPCHook() : null, + config.msgTraceEnable, + null); producer.setInstanceName(Long.toString(System.currentTimeMillis())); producer.setTransactionListener(transactionCheckListener); producer.setDefaultTopicQueueNums(1000); @@ -256,6 +261,10 @@ public class TransactionProducer { opt.setRequired(false); options.addOption(opt); + opt = new Option("m", "msgTraceEnable", true, "Message Trace Enable, Default: false"); + opt.setRequired(false); + options.addOption(opt); + return options; } } @@ -439,6 +448,7 @@ class TxSendConfig { long batchId; int sendInterval; boolean aclEnable; + boolean msgTraceEnable; } class LRUMap extends LinkedHashMap { From 18e2a26b99bf45da61e68b9eb1ac1ea8a5eb48e6 Mon Sep 17 00:00:00 2001 From: zhangjidi2016 Date: Mon, 19 Jul 2021 09:21:48 +0800 Subject: [PATCH 65/83] [ISSUE #3164]Fix the checkstyle error --- .../java/org/apache/rocketmq/example/quickstart/Producer.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java b/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java index 0da6177996..771eea1598 100644 --- a/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java +++ b/example/src/main/java/org/apache/rocketmq/example/quickstart/Producer.java @@ -18,7 +18,6 @@ package org.apache.rocketmq.example.quickstart; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.client.producer.DefaultMQProducer; -import org.apache.rocketmq.client.producer.SendCallback; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.remoting.common.RemotingHelper; @@ -77,7 +76,7 @@ public class Producer { * if you want to get the send result in a synchronize way, you can use this send method * {@code * SendResult sendResult = producer.send(msg); - * System.out.println(sendResult.toString()); + * System.out.printf("%s%n", sendResult); * } */ From 74aa3e005689e2d46c1a7d6ebb9041930132b141 Mon Sep 17 00:00:00 2001 From: Heng Du Date: Wed, 21 Jul 2021 15:55:33 +0800 Subject: [PATCH 66/83] Update SendMessageProcessor.java --- .../apache/rocketmq/broker/processor/SendMessageProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java index 1b836ebf43..11407c97c3 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java @@ -179,7 +179,7 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement int maxReconsumeTimes = subscriptionGroupConfig.getRetryMaxTimes(); if (request.getVersion() >= MQVersion.Version.V3_4_9.ordinal()) { Integer times = requestHeader.getMaxReconsumeTimes(); - if (times != null){ + if (times != null) { maxReconsumeTimes = times; } } From 800421eeb08973873b3c9ee42060dd7b976c6499 Mon Sep 17 00:00:00 2001 From: sunhangda Date: Tue, 27 Jul 2021 17:57:07 +0800 Subject: [PATCH 67/83] registerProducer & unregisterProducer add synchronization too, how about add for producer --- .../client/impl/factory/MQClientInstance.java | 24 +++---------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java index 976dcba17d..d30534ff84 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/factory/MQClientInstance.java @@ -882,24 +882,6 @@ public class MQClientInstance { this.unregisterClient(null, group); } - private void unregisterClientWithLock(final String producerGroup, final String consumerGroup) { - try { - if (this.lockHeartbeat.tryLock(LOCK_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)) { - try { - this.unregisterClient(producerGroup, consumerGroup); - } catch (Exception e) { - log.error("unregisterClient exception", e); - } finally { - this.lockHeartbeat.unlock(); - } - } else { - log.warn("lock heartBeat, but failed. [{}]", this.clientId); - } - } catch (InterruptedException e) { - log.warn("unregisterClientWithLock exception", e); - } - } - private void unregisterClient(final String producerGroup, final String consumerGroup) { Iterator>> it = this.brokerAddrTable.entrySet().iterator(); while (it.hasNext()) { @@ -927,7 +909,7 @@ public class MQClientInstance { } } - public boolean registerProducer(final String group, final DefaultMQProducerImpl producer) { + public synchronized boolean registerProducer(final String group, final DefaultMQProducerImpl producer) { if (null == group || null == producer) { return false; } @@ -941,9 +923,9 @@ public class MQClientInstance { return true; } - public void unregisterProducer(final String group) { + public synchronized void unregisterProducer(final String group) { this.producerTable.remove(group); - this.unregisterClientWithLock(group, null); + this.unregisterClient(group, null); } public boolean registerAdminExt(final String group, final MQAdminExtInner admin) { From 66eeaed94f9adc4ce71aa22dca4f2d22f2026107 Mon Sep 17 00:00:00 2001 From: yuz10 <845238369@qq.com> Date: Sat, 24 Jul 2021 22:11:20 +0800 Subject: [PATCH 68/83] #3175 check acl config before update. otherwise broker may fail to start --- .../acl/plain/PlainPermissionManager.java | 17 +++++++++++------ .../acl/plain/PlainAccessValidatorTest.java | 10 ++++++++++ 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionManager.java b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionManager.java index a22b0b25a7..809cc75969 100644 --- a/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionManager.java +++ b/acl/src/main/java/org/apache/rocketmq/acl/plain/PlainPermissionManager.java @@ -130,6 +130,7 @@ public class PlainPermissionManager { log.error("Parameter value plainAccessConfig is null,Please check your parameter"); throw new AclException("Parameter value plainAccessConfig is null, Please check your parameter"); } + checkPlainAccessConfig(plainAccessConfig); Permission.checkResourcePerms(plainAccessConfig.getTopicPerms()); Permission.checkResourcePerms(plainAccessConfig.getGroupPerms()); @@ -357,15 +358,19 @@ public class PlainPermissionManager { this.globalWhiteRemoteAddressStrategy.clear(); } - public PlainAccessResource buildPlainAccessResource(PlainAccessConfig plainAccessConfig) throws AclException { + public void checkPlainAccessConfig(PlainAccessConfig plainAccessConfig) throws AclException { if (plainAccessConfig.getAccessKey() == null - || plainAccessConfig.getSecretKey() == null - || plainAccessConfig.getAccessKey().length() <= AclConstants.ACCESS_KEY_MIN_LENGTH - || plainAccessConfig.getSecretKey().length() <= AclConstants.SECRET_KEY_MIN_LENGTH) { + || plainAccessConfig.getSecretKey() == null + || plainAccessConfig.getAccessKey().length() <= AclConstants.ACCESS_KEY_MIN_LENGTH + || plainAccessConfig.getSecretKey().length() <= AclConstants.SECRET_KEY_MIN_LENGTH) { throw new AclException(String.format( - "The accessKey=%s and secretKey=%s cannot be null and length should longer than 6", - plainAccessConfig.getAccessKey(), plainAccessConfig.getSecretKey())); + "The accessKey=%s and secretKey=%s cannot be null and length should longer than 6", + plainAccessConfig.getAccessKey(), plainAccessConfig.getSecretKey())); } + } + + public PlainAccessResource buildPlainAccessResource(PlainAccessConfig plainAccessConfig) throws AclException { + checkPlainAccessConfig(plainAccessConfig); PlainAccessResource plainAccessResource = new PlainAccessResource(); plainAccessResource.setAccessKey(plainAccessConfig.getAccessKey()); plainAccessResource.setSecretKey(plainAccessConfig.getSecretKey()); diff --git a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java index c3d41919a7..056f011935 100644 --- a/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java +++ b/acl/src/test/java/org/apache/rocketmq/acl/plain/PlainAccessValidatorTest.java @@ -566,6 +566,16 @@ public class PlainAccessValidatorTest { plainAccessValidator.updateAccessConfig(plainAccessConfig); } + @Test(expected = AclException.class) + public void createAndUpdateAccessAclNullSkExceptionTest() { + PlainAccessConfig plainAccessConfig = new PlainAccessConfig(); + plainAccessConfig.setAccessKey("RocketMQ33"); + // secret key is null + + PlainAccessValidator plainAccessValidator = new PlainAccessValidator(); + plainAccessValidator.updateAccessConfig(plainAccessConfig); + } + @Test public void updateGlobalWhiteAddrsNormalTest() { System.setProperty("rocketmq.home.dir", "src/test/resources"); From 3aa4943776b86b459bf0fee4aec50f31c6b05e62 Mon Sep 17 00:00:00 2001 From: yuz10 <845238369@qq.com> Date: Tue, 27 Jul 2021 23:10:57 +0800 Subject: [PATCH 69/83] fix checkstyle --- .../remoting/netty/NettySystemConfig.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettySystemConfig.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettySystemConfig.java index ef767a36ed..5a09fd6138 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettySystemConfig.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettySystemConfig.java @@ -29,16 +29,16 @@ public class NettySystemConfig { public static final String COM_ROCKETMQ_REMOTING_CLIENT_ONEWAY_SEMAPHORE_VALUE = "com.rocketmq.remoting.clientOnewaySemaphoreValue"; public static final String COM_ROCKETMQ_REMOTING_CLIENT_WORKER_SIZE = - "com.rocketmq.remoting.client.worker.size"; + "com.rocketmq.remoting.client.worker.size"; public static final String COM_ROCKETMQ_REMOTING_CLIENT_CONNECT_TIMEOUT = - "com.rocketmq.remoting.client.connect.timeout"; + "com.rocketmq.remoting.client.connect.timeout"; public static final String COM_ROCKETMQ_REMOTING_CLIENT_CHANNEL_MAX_IDLE_SECONDS = - "com.rocketmq.remoting.client.channel.maxIdleTimeSeconds"; + "com.rocketmq.remoting.client.channel.maxIdleTimeSeconds"; public static final String COM_ROCKETMQ_REMOTING_CLIENT_CLOSE_SOCKET_IF_TIMEOUT = - "com.rocketmq.remoting.client.closeSocketIfTimeout"; + "com.rocketmq.remoting.client.closeSocketIfTimeout"; - public static final boolean NETTY_POOLED_BYTE_BUF_ALLOCATOR_ENABLE = // + public static final boolean NETTY_POOLED_BYTE_BUF_ALLOCATOR_ENABLE = // Boolean.parseBoolean(System.getProperty(COM_ROCKETMQ_REMOTING_NETTY_POOLED_BYTE_BUF_ALLOCATOR_ENABLE, "false")); public static final int CLIENT_ASYNC_SEMAPHORE_VALUE = // Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_ASYNC_SEMAPHORE_VALUE, "65535")); @@ -49,11 +49,11 @@ public class NettySystemConfig { public static int socketRcvbufSize = Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_SOCKET_RCVBUF_SIZE, "65535")); public static int clientWorkerSize = - Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_WORKER_SIZE, "4")); + Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_WORKER_SIZE, "4")); public static int connectTimeoutMillis = - Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CONNECT_TIMEOUT, "3000")); + Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CONNECT_TIMEOUT, "3000")); public static int clientChannelMaxIdleTimeSeconds = - Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CHANNEL_MAX_IDLE_SECONDS, "120")); + Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CHANNEL_MAX_IDLE_SECONDS, "120")); public static boolean clientCloseSocketIfTimeout = - Boolean.parseBoolean(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CLOSE_SOCKET_IF_TIMEOUT, "true")); + Boolean.parseBoolean(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CLOSE_SOCKET_IF_TIMEOUT, "true")); } From 360b616b6fc2e137f30340c87314b4c65a1750b2 Mon Sep 17 00:00:00 2001 From: guyinyou <36399867+guyinyou@users.noreply.github.com> Date: Wed, 28 Jul 2021 11:45:16 +0800 Subject: [PATCH 70/83] [ISSUE #3185]remove the arm machine test in travis ci --- .travis.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index df6a7356bf..4a70bccff6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,8 +16,8 @@ matrix: # On Linux we install latest OpenJDK 1.8 from Ubuntu repositories - name: Linux x86_64 arch: amd64 - - name: Linux aarch64 - arch: arm64 +# - name: Linux aarch64 +# arch: arm64 cache: directories: From 032577255ecd543908446aa272668c9f882bcce5 Mon Sep 17 00:00:00 2001 From: huangli Date: Wed, 28 Jul 2021 14:49:45 +0800 Subject: [PATCH 71/83] [ISSUE #2883] [Part E] Improve produce performance in M/S mode. (#2889) * Remove putMessage/putMessages method in CommitLog which has too many duplicated code. * Optimise performance of asyncPutMessage (extract some code out of putMessage lock) * extract generation of msgId out of lock in CommitLog (now only for single message processor) * extract generation of topicQueueTable key out of sync code * extract generation of msgId out of lock in CommitLog (for batch) * fix ipv6 problem introduced in commit "Optimise performance of asyncPutMessage (extract some code out of putMessage lock)" --- .../rocketmq/store/AppendMessageCallback.java | 5 +- .../rocketmq/store/AppendMessageResult.java | 17 + .../org/apache/rocketmq/store/CommitLog.java | 758 +++++++----------- .../rocketmq/store/DefaultMessageStore.java | 55 +- .../org/apache/rocketmq/store/MappedFile.java | 20 +- .../rocketmq/store/MessageExtBrokerInner.java | 12 + .../store/dledger/DLedgerCommitLog.java | 232 ------ .../rocketmq/store/AppendCallbackTest.java | 28 +- 8 files changed, 360 insertions(+), 767 deletions(-) diff --git a/store/src/main/java/org/apache/rocketmq/store/AppendMessageCallback.java b/store/src/main/java/org/apache/rocketmq/store/AppendMessageCallback.java index d33763847f..5499c90066 100644 --- a/store/src/main/java/org/apache/rocketmq/store/AppendMessageCallback.java +++ b/store/src/main/java/org/apache/rocketmq/store/AppendMessageCallback.java @@ -18,6 +18,7 @@ package org.apache.rocketmq.store; import java.nio.ByteBuffer; import org.apache.rocketmq.common.message.MessageExtBatch; +import org.apache.rocketmq.store.CommitLog.PutMessageContext; /** * Write messages callback interface @@ -30,7 +31,7 @@ public interface AppendMessageCallback { * @return How many bytes to write */ AppendMessageResult doAppend(final long fileFromOffset, final ByteBuffer byteBuffer, - final int maxBlank, final MessageExtBrokerInner msg); + final int maxBlank, final MessageExtBrokerInner msg, PutMessageContext putMessageContext); /** * After batched message serialization, write MapedByteBuffer @@ -39,5 +40,5 @@ public interface AppendMessageCallback { * @return How many bytes to write */ AppendMessageResult doAppend(final long fileFromOffset, final ByteBuffer byteBuffer, - final int maxBlank, final MessageExtBatch messageExtBatch); + final int maxBlank, final MessageExtBatch messageExtBatch, PutMessageContext putMessageContext); } diff --git a/store/src/main/java/org/apache/rocketmq/store/AppendMessageResult.java b/store/src/main/java/org/apache/rocketmq/store/AppendMessageResult.java index d6d1aa6a31..de3c03b307 100644 --- a/store/src/main/java/org/apache/rocketmq/store/AppendMessageResult.java +++ b/store/src/main/java/org/apache/rocketmq/store/AppendMessageResult.java @@ -16,6 +16,8 @@ */ package org.apache.rocketmq.store; +import java.util.function.Supplier; + /** * When write a message to the commit log, returns results */ @@ -28,6 +30,7 @@ public class AppendMessageResult { private int wroteBytes; // Message ID private String msgId; + private Supplier msgIdSupplier; // Message storage timestamp private long storeTimestamp; // Consume queue's offset(step by one) @@ -51,6 +54,17 @@ public class AppendMessageResult { this.pagecacheRT = pagecacheRT; } + public AppendMessageResult(AppendMessageStatus status, long wroteOffset, int wroteBytes, Supplier msgIdSupplier, + long storeTimestamp, long logicsOffset, long pagecacheRT) { + this.status = status; + this.wroteOffset = wroteOffset; + this.wroteBytes = wroteBytes; + this.msgIdSupplier = msgIdSupplier; + this.storeTimestamp = storeTimestamp; + this.logicsOffset = logicsOffset; + this.pagecacheRT = pagecacheRT; + } + public long getPagecacheRT() { return pagecacheRT; } @@ -88,6 +102,9 @@ public class AppendMessageResult { } public String getMsgId() { + if (msgId == null && msgIdSupplier != null) { + msgId = msgIdSupplier.get(); + } return msgId; } diff --git a/store/src/main/java/org/apache/rocketmq/store/CommitLog.java b/store/src/main/java/org/apache/rocketmq/store/CommitLog.java index 57fa363785..5e92654ace 100644 --- a/store/src/main/java/org/apache/rocketmq/store/CommitLog.java +++ b/store/src/main/java/org/apache/rocketmq/store/CommitLog.java @@ -16,17 +16,18 @@ */ package org.apache.rocketmq.store; +import java.net.Inet4Address; import java.net.Inet6Address; +import java.net.InetAddress; import java.net.InetSocketAddress; +import java.net.SocketAddress; import java.nio.ByteBuffer; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; +import java.util.function.Supplier; import org.apache.rocketmq.common.ServiceThread; import org.apache.rocketmq.common.UtilAll; @@ -62,7 +63,7 @@ public class CommitLog { private final FlushCommitLogService commitLogService; private final AppendMessageCallback appendMessageCallback; - private final ThreadLocal batchEncoderThreadLocal; + private final ThreadLocal putMessageThreadLocal; protected HashMap topicQueueTable = new HashMap(1024); protected volatile long confirmOffset = -1L; @@ -84,10 +85,10 @@ public class CommitLog { this.commitLogService = new CommitRealTimeService(); this.appendMessageCallback = new DefaultAppendMessageCallback(defaultMessageStore.getMessageStoreConfig().getMaxMessageSize()); - batchEncoderThreadLocal = new ThreadLocal() { + putMessageThreadLocal = new ThreadLocal() { @Override - protected MessageExtBatchEncoder initialValue() { - return new MessageExtBatchEncoder(defaultMessageStore.getMessageStoreConfig().getMaxMessageSize()); + protected PutMessageThreadLocal initialValue() { + return new PutMessageThreadLocal(defaultMessageStore.getMessageStoreConfig().getMaxMessageSize()); } }; this.putMessageLock = defaultMessageStore.getMessageStoreConfig().isUseReentrantLockWhenPutMessage() ? new PutMessageReentrantLock() : new PutMessageSpinLock(); @@ -555,6 +556,14 @@ public class CommitLog { return beginTimeInLock; } + private String generateKey(StringBuilder keyBuilder, MessageExt messageExt) { + keyBuilder.setLength(0); + keyBuilder.append(messageExt.getTopic()); + keyBuilder.append('-'); + keyBuilder.append(messageExt.getQueueId()); + return keyBuilder.toString(); + } + public CompletableFuture asyncPutMessage(final MessageExtBrokerInner msg) { // Set the storage time msg.setStoreTimestamp(System.currentTimeMillis()); @@ -591,12 +600,30 @@ public class CommitLog { } } + InetSocketAddress bornSocketAddress = (InetSocketAddress) msg.getBornHost(); + if (bornSocketAddress.getAddress() instanceof Inet6Address) { + msg.setBornHostV6Flag(); + } + + InetSocketAddress storeSocketAddress = (InetSocketAddress) msg.getStoreHost(); + if (storeSocketAddress.getAddress() instanceof Inet6Address) { + msg.setStoreHostAddressV6Flag(); + } + + PutMessageThreadLocal putMessageThreadLocal = this.putMessageThreadLocal.get(); + PutMessageResult encodeResult = putMessageThreadLocal.getEncoder().encode(msg); + if (encodeResult != null) { + return CompletableFuture.completedFuture(encodeResult); + } + msg.setEncodedBuff(putMessageThreadLocal.getEncoder().encoderBuffer); + PutMessageContext putMessageContext = new PutMessageContext(generateKey(putMessageThreadLocal.getKeyBuilder(), msg)); + long elapsedTimeInLock = 0; MappedFile unlockMappedFile = null; - MappedFile mappedFile = this.mappedFileQueue.getLastMappedFile(); putMessageLock.lock(); //spin or ReentrantLock ,depending on store config try { + MappedFile mappedFile = this.mappedFileQueue.getLastMappedFile(); long beginLockTimestamp = this.defaultMessageStore.getSystemClock().now(); this.beginTimeInLock = beginLockTimestamp; @@ -613,7 +640,7 @@ public class CommitLog { return CompletableFuture.completedFuture(new PutMessageResult(PutMessageStatus.CREATE_MAPEDFILE_FAILED, null)); } - result = mappedFile.appendMessage(msg, this.appendMessageCallback); + result = mappedFile.appendMessage(msg, this.appendMessageCallback, putMessageContext); switch (result.getStatus()) { case PUT_OK: break; @@ -627,7 +654,7 @@ public class CommitLog { beginTimeInLock = 0; return CompletableFuture.completedFuture(new PutMessageResult(PutMessageStatus.CREATE_MAPEDFILE_FAILED, result)); } - result = mappedFile.appendMessage(msg, this.appendMessageCallback); + result = mappedFile.appendMessage(msg, this.appendMessageCallback, putMessageContext); break; case MESSAGE_SIZE_EXCEEDED: case PROPERTIES_SIZE_EXCEEDED: @@ -693,14 +720,26 @@ public class CommitLog { return CompletableFuture.completedFuture(new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, null)); } + InetSocketAddress bornSocketAddress = (InetSocketAddress) messageExtBatch.getBornHost(); + if (bornSocketAddress.getAddress() instanceof Inet6Address) { + messageExtBatch.setBornHostV6Flag(); + } + + InetSocketAddress storeSocketAddress = (InetSocketAddress) messageExtBatch.getStoreHost(); + if (storeSocketAddress.getAddress() instanceof Inet6Address) { + messageExtBatch.setStoreHostAddressV6Flag(); + } + long elapsedTimeInLock = 0; MappedFile unlockMappedFile = null; MappedFile mappedFile = this.mappedFileQueue.getLastMappedFile(); //fine-grained lock instead of the coarse-grained - MessageExtBatchEncoder batchEncoder = batchEncoderThreadLocal.get(); + PutMessageThreadLocal pmThreadLocal = this.putMessageThreadLocal.get(); + MessageExtEncoder batchEncoder = pmThreadLocal.getEncoder(); - messageExtBatch.setEncodedBuff(batchEncoder.encode(messageExtBatch)); + PutMessageContext putMessageContext = new PutMessageContext(generateKey(pmThreadLocal.getKeyBuilder(), messageExtBatch)); + messageExtBatch.setEncodedBuff(batchEncoder.encode(messageExtBatch, putMessageContext)); putMessageLock.lock(); try { @@ -720,7 +759,7 @@ public class CommitLog { return CompletableFuture.completedFuture(new PutMessageResult(PutMessageStatus.CREATE_MAPEDFILE_FAILED, null)); } - result = mappedFile.appendMessages(messageExtBatch, this.appendMessageCallback); + result = mappedFile.appendMessages(messageExtBatch, this.appendMessageCallback, putMessageContext); switch (result.getStatus()) { case PUT_OK: break; @@ -734,7 +773,7 @@ public class CommitLog { beginTimeInLock = 0; return CompletableFuture.completedFuture(new PutMessageResult(PutMessageStatus.CREATE_MAPEDFILE_FAILED, result)); } - result = mappedFile.appendMessages(messageExtBatch, this.appendMessageCallback); + result = mappedFile.appendMessages(messageExtBatch, this.appendMessageCallback, putMessageContext); break; case MESSAGE_SIZE_EXCEEDED: case PROPERTIES_SIZE_EXCEEDED: @@ -784,129 +823,6 @@ public class CommitLog { } - public PutMessageResult putMessage(final MessageExtBrokerInner msg) { - // Set the storage time - msg.setStoreTimestamp(System.currentTimeMillis()); - // Set the message body BODY CRC (consider the most appropriate setting - // on the client) - msg.setBodyCRC(UtilAll.crc32(msg.getBody())); - // Back to Results - AppendMessageResult result = null; - - StoreStatsService storeStatsService = this.defaultMessageStore.getStoreStatsService(); - - String topic = msg.getTopic(); - int queueId = msg.getQueueId(); - - final int tranType = MessageSysFlag.getTransactionValue(msg.getSysFlag()); - if (tranType == MessageSysFlag.TRANSACTION_NOT_TYPE - || tranType == MessageSysFlag.TRANSACTION_COMMIT_TYPE) { - // Delay Delivery - if (msg.getDelayTimeLevel() > 0) { - if (msg.getDelayTimeLevel() > this.defaultMessageStore.getScheduleMessageService().getMaxDelayLevel()) { - msg.setDelayTimeLevel(this.defaultMessageStore.getScheduleMessageService().getMaxDelayLevel()); - } - - topic = TopicValidator.RMQ_SYS_SCHEDULE_TOPIC; - queueId = ScheduleMessageService.delayLevel2QueueId(msg.getDelayTimeLevel()); - - // Backup real topic, queueId - MessageAccessor.putProperty(msg, MessageConst.PROPERTY_REAL_TOPIC, msg.getTopic()); - MessageAccessor.putProperty(msg, MessageConst.PROPERTY_REAL_QUEUE_ID, String.valueOf(msg.getQueueId())); - msg.setPropertiesString(MessageDecoder.messageProperties2String(msg.getProperties())); - - msg.setTopic(topic); - msg.setQueueId(queueId); - } - } - - InetSocketAddress bornSocketAddress = (InetSocketAddress) msg.getBornHost(); - if (bornSocketAddress.getAddress() instanceof Inet6Address) { - msg.setBornHostV6Flag(); - } - - InetSocketAddress storeSocketAddress = (InetSocketAddress) msg.getStoreHost(); - if (storeSocketAddress.getAddress() instanceof Inet6Address) { - msg.setStoreHostAddressV6Flag(); - } - - long elapsedTimeInLock = 0; - - MappedFile unlockMappedFile = null; - MappedFile mappedFile = this.mappedFileQueue.getLastMappedFile(); - - putMessageLock.lock(); //spin or ReentrantLock ,depending on store config - try { - long beginLockTimestamp = this.defaultMessageStore.getSystemClock().now(); - this.beginTimeInLock = beginLockTimestamp; - - // Here settings are stored timestamp, in order to ensure an orderly - // global - msg.setStoreTimestamp(beginLockTimestamp); - - if (null == mappedFile || mappedFile.isFull()) { - mappedFile = this.mappedFileQueue.getLastMappedFile(0); // Mark: NewFile may be cause noise - } - if (null == mappedFile) { - log.error("create mapped file1 error, topic: " + msg.getTopic() + " clientAddr: " + msg.getBornHostString()); - beginTimeInLock = 0; - return new PutMessageResult(PutMessageStatus.CREATE_MAPEDFILE_FAILED, null); - } - - result = mappedFile.appendMessage(msg, this.appendMessageCallback); - switch (result.getStatus()) { - case PUT_OK: - break; - case END_OF_FILE: - unlockMappedFile = mappedFile; - // Create a new file, re-write the message - mappedFile = this.mappedFileQueue.getLastMappedFile(0); - if (null == mappedFile) { - // XXX: warn and notify me - log.error("create mapped file2 error, topic: " + msg.getTopic() + " clientAddr: " + msg.getBornHostString()); - beginTimeInLock = 0; - return new PutMessageResult(PutMessageStatus.CREATE_MAPEDFILE_FAILED, result); - } - result = mappedFile.appendMessage(msg, this.appendMessageCallback); - break; - case MESSAGE_SIZE_EXCEEDED: - case PROPERTIES_SIZE_EXCEEDED: - beginTimeInLock = 0; - return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, result); - case UNKNOWN_ERROR: - beginTimeInLock = 0; - return new PutMessageResult(PutMessageStatus.UNKNOWN_ERROR, result); - default: - beginTimeInLock = 0; - return new PutMessageResult(PutMessageStatus.UNKNOWN_ERROR, result); - } - - elapsedTimeInLock = this.defaultMessageStore.getSystemClock().now() - beginLockTimestamp; - beginTimeInLock = 0; - } finally { - putMessageLock.unlock(); - } - - if (elapsedTimeInLock > 500) { - log.warn("[NOTIFYME]putMessage in lock cost time(ms)={}, bodyLength={} AppendMessageResult={}", elapsedTimeInLock, msg.getBody().length, result); - } - - if (null != unlockMappedFile && this.defaultMessageStore.getMessageStoreConfig().isWarmMapedFileEnable()) { - this.defaultMessageStore.unlockMappedFile(unlockMappedFile); - } - - PutMessageResult putMessageResult = new PutMessageResult(PutMessageStatus.PUT_OK, result); - - // Statistics - storeStatsService.getSinglePutMessageTopicTimesTotal(msg.getTopic()).incrementAndGet(); - storeStatsService.getSinglePutMessageTopicSizeTotal(topic).addAndGet(result.getWroteBytes()); - - handleDiskFlush(result, putMessageResult, msg); - handleHA(result, putMessageResult, msg); - - return putMessageResult; - } - public CompletableFuture submitFlushRequest(AppendMessageResult result, MessageExt messageExt) { // Synchronization flush if (FlushDiskType.SYNC_FLUSH == this.defaultMessageStore.getMessageStoreConfig().getFlushDiskType()) { @@ -951,179 +867,6 @@ public class CommitLog { return CompletableFuture.completedFuture(PutMessageStatus.PUT_OK); } - - public void handleDiskFlush(AppendMessageResult result, PutMessageResult putMessageResult, MessageExt messageExt) { - // Synchronization flush - if (FlushDiskType.SYNC_FLUSH == this.defaultMessageStore.getMessageStoreConfig().getFlushDiskType()) { - final GroupCommitService service = (GroupCommitService) this.flushCommitLogService; - if (messageExt.isWaitStoreMsgOK()) { - GroupCommitRequest request = new GroupCommitRequest(result.getWroteOffset() + result.getWroteBytes()); - service.putRequest(request); - CompletableFuture flushOkFuture = request.future(); - PutMessageStatus flushStatus = null; - try { - flushStatus = flushOkFuture.get(this.defaultMessageStore.getMessageStoreConfig().getSyncFlushTimeout(), - TimeUnit.MILLISECONDS); - } catch (InterruptedException | ExecutionException | TimeoutException e) { - //flushOK=false; - } - if (flushStatus != PutMessageStatus.PUT_OK) { - log.error("do groupcommit, wait for flush failed, topic: " + messageExt.getTopic() + " tags: " + messageExt.getTags() - + " client address: " + messageExt.getBornHostString()); - putMessageResult.setPutMessageStatus(PutMessageStatus.FLUSH_DISK_TIMEOUT); - } - } else { - service.wakeup(); - } - } - // Asynchronous flush - else { - if (!this.defaultMessageStore.getMessageStoreConfig().isTransientStorePoolEnable()) { - flushCommitLogService.wakeup(); - } else { - commitLogService.wakeup(); - } - } - } - - public void handleHA(AppendMessageResult result, PutMessageResult putMessageResult, MessageExt messageExt) { - if (BrokerRole.SYNC_MASTER == this.defaultMessageStore.getMessageStoreConfig().getBrokerRole()) { - HAService service = this.defaultMessageStore.getHaService(); - if (messageExt.isWaitStoreMsgOK()) { - // Determine whether to wait - if (service.isSlaveOK(result.getWroteOffset() + result.getWroteBytes())) { - GroupCommitRequest request = new GroupCommitRequest(result.getWroteOffset() + result.getWroteBytes()); - service.putRequest(request); - service.getWaitNotifyObject().wakeupAll(); - PutMessageStatus replicaStatus = null; - try { - replicaStatus = request.future().get(this.defaultMessageStore.getMessageStoreConfig().getSyncFlushTimeout(), - TimeUnit.MILLISECONDS); - } catch (InterruptedException | ExecutionException | TimeoutException e) { - } - if (replicaStatus != PutMessageStatus.PUT_OK) { - log.error("do sync transfer other node, wait return, but failed, topic: " + messageExt.getTopic() + " tags: " - + messageExt.getTags() + " client address: " + messageExt.getBornHostNameString()); - putMessageResult.setPutMessageStatus(PutMessageStatus.FLUSH_SLAVE_TIMEOUT); - } - } - // Slave problem - else { - // Tell the producer, slave not available - putMessageResult.setPutMessageStatus(PutMessageStatus.SLAVE_NOT_AVAILABLE); - } - } - } - - } - - public PutMessageResult putMessages(final MessageExtBatch messageExtBatch) { - messageExtBatch.setStoreTimestamp(System.currentTimeMillis()); - AppendMessageResult result; - - StoreStatsService storeStatsService = this.defaultMessageStore.getStoreStatsService(); - - final int tranType = MessageSysFlag.getTransactionValue(messageExtBatch.getSysFlag()); - - if (tranType != MessageSysFlag.TRANSACTION_NOT_TYPE) { - return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, null); - } - if (messageExtBatch.getDelayTimeLevel() > 0) { - return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, null); - } - - InetSocketAddress bornSocketAddress = (InetSocketAddress) messageExtBatch.getBornHost(); - if (bornSocketAddress.getAddress() instanceof Inet6Address) { - messageExtBatch.setBornHostV6Flag(); - } - - InetSocketAddress storeSocketAddress = (InetSocketAddress) messageExtBatch.getStoreHost(); - if (storeSocketAddress.getAddress() instanceof Inet6Address) { - messageExtBatch.setStoreHostAddressV6Flag(); - } - - long elapsedTimeInLock = 0; - MappedFile unlockMappedFile = null; - MappedFile mappedFile = this.mappedFileQueue.getLastMappedFile(); - - //fine-grained lock instead of the coarse-grained - MessageExtBatchEncoder batchEncoder = batchEncoderThreadLocal.get(); - - messageExtBatch.setEncodedBuff(batchEncoder.encode(messageExtBatch)); - - putMessageLock.lock(); - try { - long beginLockTimestamp = this.defaultMessageStore.getSystemClock().now(); - this.beginTimeInLock = beginLockTimestamp; - - // Here settings are stored timestamp, in order to ensure an orderly - // global - messageExtBatch.setStoreTimestamp(beginLockTimestamp); - - if (null == mappedFile || mappedFile.isFull()) { - mappedFile = this.mappedFileQueue.getLastMappedFile(0); // Mark: NewFile may be cause noise - } - if (null == mappedFile) { - log.error("Create mapped file1 error, topic: {} clientAddr: {}", messageExtBatch.getTopic(), messageExtBatch.getBornHostString()); - beginTimeInLock = 0; - return new PutMessageResult(PutMessageStatus.CREATE_MAPEDFILE_FAILED, null); - } - - result = mappedFile.appendMessages(messageExtBatch, this.appendMessageCallback); - switch (result.getStatus()) { - case PUT_OK: - break; - case END_OF_FILE: - unlockMappedFile = mappedFile; - // Create a new file, re-write the message - mappedFile = this.mappedFileQueue.getLastMappedFile(0); - if (null == mappedFile) { - // XXX: warn and notify me - log.error("Create mapped file2 error, topic: {} clientAddr: {}", messageExtBatch.getTopic(), messageExtBatch.getBornHostString()); - beginTimeInLock = 0; - return new PutMessageResult(PutMessageStatus.CREATE_MAPEDFILE_FAILED, result); - } - result = mappedFile.appendMessages(messageExtBatch, this.appendMessageCallback); - break; - case MESSAGE_SIZE_EXCEEDED: - case PROPERTIES_SIZE_EXCEEDED: - beginTimeInLock = 0; - return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, result); - case UNKNOWN_ERROR: - beginTimeInLock = 0; - return new PutMessageResult(PutMessageStatus.UNKNOWN_ERROR, result); - default: - beginTimeInLock = 0; - return new PutMessageResult(PutMessageStatus.UNKNOWN_ERROR, result); - } - - elapsedTimeInLock = this.defaultMessageStore.getSystemClock().now() - beginLockTimestamp; - beginTimeInLock = 0; - } finally { - putMessageLock.unlock(); - } - - if (elapsedTimeInLock > 500) { - log.warn("[NOTIFYME]putMessages in lock cost time(ms)={}, bodyLength={} AppendMessageResult={}", elapsedTimeInLock, messageExtBatch.getBody().length, result); - } - - if (null != unlockMappedFile && this.defaultMessageStore.getMessageStoreConfig().isWarmMapedFileEnable()) { - this.defaultMessageStore.unlockMappedFile(unlockMappedFile); - } - - PutMessageResult putMessageResult = new PutMessageResult(PutMessageStatus.PUT_OK, result); - - // Statistics - storeStatsService.getSinglePutMessageTopicTimesTotal(messageExtBatch.getTopic()).addAndGet(result.getMsgNum()); - storeStatsService.getSinglePutMessageTopicSizeTotal(messageExtBatch.getTopic()).addAndGet(result.getWroteBytes()); - - handleDiskFlush(result, putMessageResult, messageExtBatch); - - handleHA(result, putMessageResult, messageExtBatch); - - return putMessageResult; - } - /** * According to receive certain message or offset storage time if an error occurs, it returns -1 */ @@ -1509,50 +1252,33 @@ public class CommitLog { private final ByteBuffer msgStoreItemMemory; // The maximum length of the message private final int maxMessageSize; - // Build Message Key - private final StringBuilder keyBuilder = new StringBuilder(); - - private final StringBuilder msgIdBuilder = new StringBuilder(); DefaultAppendMessageCallback(final int size) { this.msgIdMemory = ByteBuffer.allocate(4 + 4 + 8); this.msgIdV6Memory = ByteBuffer.allocate(16 + 4 + 8); - this.msgStoreItemMemory = ByteBuffer.allocate(size + END_FILE_MIN_BLANK_LENGTH); + this.msgStoreItemMemory = ByteBuffer.allocate(END_FILE_MIN_BLANK_LENGTH); this.maxMessageSize = size; } - public ByteBuffer getMsgStoreItemMemory() { - return msgStoreItemMemory; - } - public AppendMessageResult doAppend(final long fileFromOffset, final ByteBuffer byteBuffer, final int maxBlank, - final MessageExtBrokerInner msgInner) { + final MessageExtBrokerInner msgInner, PutMessageContext putMessageContext) { // STORETIMESTAMP + STOREHOSTADDRESS + OFFSET
// PHY OFFSET long wroteOffset = fileFromOffset + byteBuffer.position(); - int sysflag = msgInner.getSysFlag(); - - int bornHostLength = (sysflag & MessageSysFlag.BORNHOST_V6_FLAG) == 0 ? 4 + 4 : 16 + 4; - int storeHostLength = (sysflag & MessageSysFlag.STOREHOSTADDRESS_V6_FLAG) == 0 ? 4 + 4 : 16 + 4; - ByteBuffer bornHostHolder = ByteBuffer.allocate(bornHostLength); - ByteBuffer storeHostHolder = ByteBuffer.allocate(storeHostLength); - - this.resetByteBuffer(storeHostHolder, storeHostLength); - String msgId; - if ((sysflag & MessageSysFlag.STOREHOSTADDRESS_V6_FLAG) == 0) { - msgId = MessageDecoder.createMessageId(this.msgIdMemory, msgInner.getStoreHostBytes(storeHostHolder), wroteOffset); - } else { - msgId = MessageDecoder.createMessageId(this.msgIdV6Memory, msgInner.getStoreHostBytes(storeHostHolder), wroteOffset); - } + Supplier msgIdSupplier = () -> { + int sysflag = msgInner.getSysFlag(); + int msgIdLen = (sysflag & MessageSysFlag.STOREHOSTADDRESS_V6_FLAG) == 0 ? 4 + 4 + 8 : 16 + 4 + 8; + ByteBuffer msgIdBuffer = ByteBuffer.allocate(msgIdLen); + MessageExt.socketAddress2ByteBuffer(msgInner.getStoreHost(), msgIdBuffer); + msgIdBuffer.clear();//because socketAddress2ByteBuffer flip the buffer + msgIdBuffer.putLong(msgIdLen - 8, wroteOffset); + return UtilAll.bytes2string(msgIdBuffer.array()); + }; // Record ConsumeQueue information - keyBuilder.setLength(0); - keyBuilder.append(msgInner.getTopic()); - keyBuilder.append('-'); - keyBuilder.append(msgInner.getQueueId()); - String key = keyBuilder.toString(); + String key = putMessageContext.getTopicQueueTableKey(); Long queueOffset = CommitLog.this.topicQueueTable.get(key); if (null == queueOffset) { queueOffset = 0L; @@ -1574,36 +1300,12 @@ public class CommitLog { break; } - /** - * Serialize message - */ - final byte[] propertiesData = - msgInner.getPropertiesString() == null ? null : msgInner.getPropertiesString().getBytes(MessageDecoder.CHARSET_UTF8); - - final int propertiesLength = propertiesData == null ? 0 : propertiesData.length; - - if (propertiesLength > Short.MAX_VALUE) { - log.warn("putMessage message properties length too long. length={}", propertiesData.length); - return new AppendMessageResult(AppendMessageStatus.PROPERTIES_SIZE_EXCEEDED); - } - - final byte[] topicData = msgInner.getTopic().getBytes(MessageDecoder.CHARSET_UTF8); - final int topicLength = topicData.length; - - final int bodyLength = msgInner.getBody() == null ? 0 : msgInner.getBody().length; - - final int msgLen = calMsgLength(msgInner.getSysFlag(), bodyLength, topicLength, propertiesLength); - - // Exceeds the maximum message - if (msgLen > this.maxMessageSize) { - CommitLog.log.warn("message size exceeded, msg total size: " + msgLen + ", msg body size: " + bodyLength - + ", maxMessageSize: " + this.maxMessageSize); - return new AppendMessageResult(AppendMessageStatus.MESSAGE_SIZE_EXCEEDED); - } + ByteBuffer preEncodeBuffer = msgInner.getEncodedBuff(); + final int msgLen = preEncodeBuffer.getInt(0); // Determines whether there is sufficient free space if ((msgLen + END_FILE_MIN_BLANK_LENGTH) > maxBlank) { - this.resetByteBuffer(this.msgStoreItemMemory, maxBlank); + this.msgStoreItemMemory.clear(); // 1 TOTALSIZE this.msgStoreItemMemory.putInt(maxBlank); // 2 MAGICCODE @@ -1611,60 +1313,31 @@ public class CommitLog { // 3 The remaining space may be any value // Here the length of the specially set maxBlank final long beginTimeMills = CommitLog.this.defaultMessageStore.now(); - byteBuffer.put(this.msgStoreItemMemory.array(), 0, maxBlank); - return new AppendMessageResult(AppendMessageStatus.END_OF_FILE, wroteOffset, maxBlank, msgId, msgInner.getStoreTimestamp(), - queueOffset, CommitLog.this.defaultMessageStore.now() - beginTimeMills); + byteBuffer.put(this.msgStoreItemMemory.array(), 0, 8); + return new AppendMessageResult(AppendMessageStatus.END_OF_FILE, wroteOffset, + maxBlank, /* only wrote 8 bytes, but declare wrote maxBlank for compute write position */ + msgIdSupplier, msgInner.getStoreTimestamp(), + queueOffset, CommitLog.this.defaultMessageStore.now() - beginTimeMills); } - // Initialization of storage space - this.resetByteBuffer(msgStoreItemMemory, msgLen); - // 1 TOTALSIZE - this.msgStoreItemMemory.putInt(msgLen); - // 2 MAGICCODE - this.msgStoreItemMemory.putInt(CommitLog.MESSAGE_MAGIC_CODE); - // 3 BODYCRC - this.msgStoreItemMemory.putInt(msgInner.getBodyCRC()); - // 4 QUEUEID - this.msgStoreItemMemory.putInt(msgInner.getQueueId()); - // 5 FLAG - this.msgStoreItemMemory.putInt(msgInner.getFlag()); + int pos = 4 + 4 + 4 + 4 + 4; // 6 QUEUEOFFSET - this.msgStoreItemMemory.putLong(queueOffset); + preEncodeBuffer.putLong(pos, queueOffset); + pos += 8; // 7 PHYSICALOFFSET - this.msgStoreItemMemory.putLong(fileFromOffset + byteBuffer.position()); - // 8 SYSFLAG - this.msgStoreItemMemory.putInt(msgInner.getSysFlag()); - // 9 BORNTIMESTAMP - this.msgStoreItemMemory.putLong(msgInner.getBornTimestamp()); - // 10 BORNHOST - this.resetByteBuffer(bornHostHolder, bornHostLength); - this.msgStoreItemMemory.put(msgInner.getBornHostBytes(bornHostHolder)); - // 11 STORETIMESTAMP - this.msgStoreItemMemory.putLong(msgInner.getStoreTimestamp()); - // 12 STOREHOSTADDRESS - this.resetByteBuffer(storeHostHolder, storeHostLength); - this.msgStoreItemMemory.put(msgInner.getStoreHostBytes(storeHostHolder)); - // 13 RECONSUMETIMES - this.msgStoreItemMemory.putInt(msgInner.getReconsumeTimes()); - // 14 Prepared Transaction Offset - this.msgStoreItemMemory.putLong(msgInner.getPreparedTransactionOffset()); - // 15 BODY - this.msgStoreItemMemory.putInt(bodyLength); - if (bodyLength > 0) - this.msgStoreItemMemory.put(msgInner.getBody()); - // 16 TOPIC - this.msgStoreItemMemory.put((byte) topicLength); - this.msgStoreItemMemory.put(topicData); - // 17 PROPERTIES - this.msgStoreItemMemory.putShort((short) propertiesLength); - if (propertiesLength > 0) - this.msgStoreItemMemory.put(propertiesData); + preEncodeBuffer.putLong(pos, fileFromOffset + byteBuffer.position()); + int ipLen = (msgInner.getSysFlag() & MessageSysFlag.BORNHOST_V6_FLAG) == 0 ? 4 + 4 : 16 + 4; + // 8 SYSFLAG, 9 BORNTIMESTAMP, 10 BORNHOST, 11 STORETIMESTAMP + pos += 8 + 4 + 8 + ipLen; + // refresh store time stamp in lock + preEncodeBuffer.putLong(pos, msgInner.getStoreTimestamp()); + final long beginTimeMills = CommitLog.this.defaultMessageStore.now(); // Write messages to the queue buffer - byteBuffer.put(this.msgStoreItemMemory.array(), 0, msgLen); - - AppendMessageResult result = new AppendMessageResult(AppendMessageStatus.PUT_OK, wroteOffset, msgLen, msgId, + byteBuffer.put(preEncodeBuffer); + msgInner.setEncodedBuff(null); + AppendMessageResult result = new AppendMessageResult(AppendMessageStatus.PUT_OK, wroteOffset, msgLen, msgIdSupplier, msgInner.getStoreTimestamp(), queueOffset, CommitLog.this.defaultMessageStore.now() - beginTimeMills); switch (tranType) { @@ -1683,16 +1356,12 @@ public class CommitLog { } public AppendMessageResult doAppend(final long fileFromOffset, final ByteBuffer byteBuffer, final int maxBlank, - final MessageExtBatch messageExtBatch) { + final MessageExtBatch messageExtBatch, PutMessageContext putMessageContext) { byteBuffer.mark(); //physical offset long wroteOffset = fileFromOffset + byteBuffer.position(); // Record ConsumeQueue information - keyBuilder.setLength(0); - keyBuilder.append(messageExtBatch.getTopic()); - keyBuilder.append('-'); - keyBuilder.append(messageExtBatch.getQueueId()); - String key = keyBuilder.toString(); + String key = putMessageContext.getTopicQueueTableKey(); Long queueOffset = CommitLog.this.topicQueueTable.get(key); if (null == queueOffset) { queueOffset = 0L; @@ -1701,17 +1370,35 @@ public class CommitLog { long beginQueueOffset = queueOffset; int totalMsgLen = 0; int msgNum = 0; - msgIdBuilder.setLength(0); + final long beginTimeMills = CommitLog.this.defaultMessageStore.now(); ByteBuffer messagesByteBuff = messageExtBatch.getEncodedBuff(); int sysFlag = messageExtBatch.getSysFlag(); + int bornHostLength = (sysFlag & MessageSysFlag.BORNHOST_V6_FLAG) == 0 ? 4 + 4 : 16 + 4; int storeHostLength = (sysFlag & MessageSysFlag.STOREHOSTADDRESS_V6_FLAG) == 0 ? 4 + 4 : 16 + 4; - ByteBuffer storeHostHolder = ByteBuffer.allocate(storeHostLength); + Supplier msgIdSupplier = () -> { + int msgIdLen = storeHostLength + 8; + int batchCount = putMessageContext.getBatchSize(); + long[] phyPosArray = putMessageContext.getPhyPos(); + ByteBuffer msgIdBuffer = ByteBuffer.allocate(msgIdLen); + MessageExt.socketAddress2ByteBuffer(messageExtBatch.getStoreHost(), msgIdBuffer); + msgIdBuffer.clear();//because socketAddress2ByteBuffer flip the buffer + + StringBuilder buffer = new StringBuilder(batchCount * msgIdLen * 2 + batchCount - 1); + for (int i = 0; i < phyPosArray.length; i++) { + msgIdBuffer.putLong(msgIdLen - 8, phyPosArray[i]); + String msgId = UtilAll.bytes2string(msgIdBuffer.array()); + if (i != 0) { + buffer.append(','); + } + buffer.append(msgId); + } + return buffer.toString(); + }; - this.resetByteBuffer(storeHostHolder, storeHostLength); - ByteBuffer storeHostBytes = messageExtBatch.getStoreHostBytes(storeHostHolder); messagesByteBuff.mark(); + int index = 0; while (messagesByteBuff.hasRemaining()) { // 1 TOTALSIZE final int msgPos = messagesByteBuff.position(); @@ -1726,7 +1413,7 @@ public class CommitLog { totalMsgLen += msgLen; // Determines whether there is sufficient free space if ((totalMsgLen + END_FILE_MIN_BLANK_LENGTH) > maxBlank) { - this.resetByteBuffer(this.msgStoreItemMemory, 8); + this.msgStoreItemMemory.clear(); // 1 TOTALSIZE this.msgStoreItemMemory.putInt(maxBlank); // 2 MAGICCODE @@ -1737,27 +1424,20 @@ public class CommitLog { // Here the length of the specially set maxBlank byteBuffer.reset(); //ignore the previous appended messages byteBuffer.put(this.msgStoreItemMemory.array(), 0, 8); - return new AppendMessageResult(AppendMessageStatus.END_OF_FILE, wroteOffset, maxBlank, msgIdBuilder.toString(), messageExtBatch.getStoreTimestamp(), + return new AppendMessageResult(AppendMessageStatus.END_OF_FILE, wroteOffset, maxBlank, msgIdSupplier, messageExtBatch.getStoreTimestamp(), beginQueueOffset, CommitLog.this.defaultMessageStore.now() - beginTimeMills); } //move to add queue offset and commitlog offset - messagesByteBuff.position(msgPos + 20); - messagesByteBuff.putLong(queueOffset); - messagesByteBuff.putLong(wroteOffset + totalMsgLen - msgLen); + int pos = msgPos + 20; + messagesByteBuff.putLong(pos, queueOffset); + pos += 8; + messagesByteBuff.putLong(pos, wroteOffset + totalMsgLen - msgLen); + // 8 SYSFLAG, 9 BORNTIMESTAMP, 10 BORNHOST, 11 STORETIMESTAMP + pos += 8 + 4 + 8 + bornHostLength; + // refresh store time stamp in lock + messagesByteBuff.putLong(pos, messageExtBatch.getStoreTimestamp()); - storeHostBytes.rewind(); - String msgId; - if ((sysFlag & MessageSysFlag.STOREHOSTADDRESS_V6_FLAG) == 0) { - msgId = MessageDecoder.createMessageId(this.msgIdMemory, storeHostBytes, wroteOffset + totalMsgLen - msgLen); - } else { - msgId = MessageDecoder.createMessageId(this.msgIdV6Memory, storeHostBytes, wroteOffset + totalMsgLen - msgLen); - } - - if (msgIdBuilder.length() > 0) { - msgIdBuilder.append(',').append(msgId); - } else { - msgIdBuilder.append(msgId); - } + putMessageContext.getPhyPos()[index++] = wroteOffset + totalMsgLen - msgLen; queueOffset++; msgNum++; messagesByteBuff.position(msgPos + msgLen); @@ -1767,7 +1447,7 @@ public class CommitLog { messagesByteBuff.limit(totalMsgLen); byteBuffer.put(messagesByteBuff); messageExtBatch.setEncodedBuff(null); - AppendMessageResult result = new AppendMessageResult(AppendMessageStatus.PUT_OK, wroteOffset, totalMsgLen, msgIdBuilder.toString(), + AppendMessageResult result = new AppendMessageResult(AppendMessageStatus.PUT_OK, wroteOffset, totalMsgLen, msgIdSupplier, messageExtBatch.getStoreTimestamp(), beginQueueOffset, CommitLog.this.defaultMessageStore.now() - beginTimeMills); result.setMsgNum(msgNum); CommitLog.this.topicQueueTable.put(key, queueOffset); @@ -1782,19 +1462,104 @@ public class CommitLog { } - public static class MessageExtBatchEncoder { + public static class MessageExtEncoder { // Store the message content - private final ByteBuffer msgBatchMemory; + private final ByteBuffer encoderBuffer; // The maximum length of the message private final int maxMessageSize; - MessageExtBatchEncoder(final int size) { - this.msgBatchMemory = ByteBuffer.allocateDirect(size); + MessageExtEncoder(final int size) { + this.encoderBuffer = ByteBuffer.allocateDirect(size); this.maxMessageSize = size; } - public ByteBuffer encode(final MessageExtBatch messageExtBatch) { - msgBatchMemory.clear(); //not thread-safe + private void socketAddress2ByteBuffer(final SocketAddress socketAddress, final ByteBuffer byteBuffer) { + InetSocketAddress inetSocketAddress = (InetSocketAddress) socketAddress; + InetAddress address = inetSocketAddress.getAddress(); + if (address instanceof Inet4Address) { + byteBuffer.put(inetSocketAddress.getAddress().getAddress(), 0, 4); + } else { + byteBuffer.put(inetSocketAddress.getAddress().getAddress(), 0, 16); + } + byteBuffer.putInt(inetSocketAddress.getPort()); + } + + protected PutMessageResult encode(MessageExtBrokerInner msgInner) { + /** + * Serialize message + */ + final byte[] propertiesData = + msgInner.getPropertiesString() == null ? null : msgInner.getPropertiesString().getBytes(MessageDecoder.CHARSET_UTF8); + + final int propertiesLength = propertiesData == null ? 0 : propertiesData.length; + + if (propertiesLength > Short.MAX_VALUE) { + log.warn("putMessage message properties length too long. length={}", propertiesData.length); + return new PutMessageResult(PutMessageStatus.PROPERTIES_SIZE_EXCEEDED, null); + } + + final byte[] topicData = msgInner.getTopic().getBytes(MessageDecoder.CHARSET_UTF8); + final int topicLength = topicData.length; + + final int bodyLength = msgInner.getBody() == null ? 0 : msgInner.getBody().length; + + final int msgLen = calMsgLength(msgInner.getSysFlag(), bodyLength, topicLength, propertiesLength); + + // Exceeds the maximum message + if (msgLen > this.maxMessageSize) { + CommitLog.log.warn("message size exceeded, msg total size: " + msgLen + ", msg body size: " + bodyLength + + ", maxMessageSize: " + this.maxMessageSize); + return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, null); + } + + // Initialization of storage space + this.resetByteBuffer(encoderBuffer, msgLen); + // 1 TOTALSIZE + this.encoderBuffer.putInt(msgLen); + // 2 MAGICCODE + this.encoderBuffer.putInt(CommitLog.MESSAGE_MAGIC_CODE); + // 3 BODYCRC + this.encoderBuffer.putInt(msgInner.getBodyCRC()); + // 4 QUEUEID + this.encoderBuffer.putInt(msgInner.getQueueId()); + // 5 FLAG + this.encoderBuffer.putInt(msgInner.getFlag()); + // 6 QUEUEOFFSET, need update later + this.encoderBuffer.putLong(0); + // 7 PHYSICALOFFSET, need update later + this.encoderBuffer.putLong(0); + // 8 SYSFLAG + this.encoderBuffer.putInt(msgInner.getSysFlag()); + // 9 BORNTIMESTAMP + this.encoderBuffer.putLong(msgInner.getBornTimestamp()); + // 10 BORNHOST + socketAddress2ByteBuffer(msgInner.getBornHost() ,this.encoderBuffer); + // 11 STORETIMESTAMP + this.encoderBuffer.putLong(msgInner.getStoreTimestamp()); + // 12 STOREHOSTADDRESS + socketAddress2ByteBuffer(msgInner.getStoreHost() ,this.encoderBuffer); + // 13 RECONSUMETIMES + this.encoderBuffer.putInt(msgInner.getReconsumeTimes()); + // 14 Prepared Transaction Offset + this.encoderBuffer.putLong(msgInner.getPreparedTransactionOffset()); + // 15 BODY + this.encoderBuffer.putInt(bodyLength); + if (bodyLength > 0) + this.encoderBuffer.put(msgInner.getBody()); + // 16 TOPIC + this.encoderBuffer.put((byte) topicLength); + this.encoderBuffer.put(topicData); + // 17 PROPERTIES + this.encoderBuffer.putShort((short) propertiesLength); + if (propertiesLength > 0) + this.encoderBuffer.put(propertiesData); + + encoderBuffer.flip(); + return null; + } + + protected ByteBuffer encode(final MessageExtBatch messageExtBatch, PutMessageContext putMessageContext) { + encoderBuffer.clear(); //not thread-safe int totalMsgLen = 0; ByteBuffer messagesByteBuff = messageExtBatch.wrap(); @@ -1809,7 +1574,9 @@ public class CommitLog { final byte[] batchPropData = batchPropStr.getBytes(MessageDecoder.CHARSET_UTF8); final short batchPropLen = (short) batchPropData.length; + int batchSize = 0; while (messagesByteBuff.hasRemaining()) { + batchSize++; // 1 TOTALSIZE messagesByteBuff.getInt(); // 2 MAGICCODE @@ -1849,53 +1616,55 @@ public class CommitLog { } // 1 TOTALSIZE - this.msgBatchMemory.putInt(msgLen); + this.encoderBuffer.putInt(msgLen); // 2 MAGICCODE - this.msgBatchMemory.putInt(CommitLog.MESSAGE_MAGIC_CODE); + this.encoderBuffer.putInt(CommitLog.MESSAGE_MAGIC_CODE); // 3 BODYCRC - this.msgBatchMemory.putInt(bodyCrc); + this.encoderBuffer.putInt(bodyCrc); // 4 QUEUEID - this.msgBatchMemory.putInt(messageExtBatch.getQueueId()); + this.encoderBuffer.putInt(messageExtBatch.getQueueId()); // 5 FLAG - this.msgBatchMemory.putInt(flag); + this.encoderBuffer.putInt(flag); // 6 QUEUEOFFSET - this.msgBatchMemory.putLong(0); + this.encoderBuffer.putLong(0); // 7 PHYSICALOFFSET - this.msgBatchMemory.putLong(0); + this.encoderBuffer.putLong(0); // 8 SYSFLAG - this.msgBatchMemory.putInt(messageExtBatch.getSysFlag()); + this.encoderBuffer.putInt(messageExtBatch.getSysFlag()); // 9 BORNTIMESTAMP - this.msgBatchMemory.putLong(messageExtBatch.getBornTimestamp()); + this.encoderBuffer.putLong(messageExtBatch.getBornTimestamp()); // 10 BORNHOST this.resetByteBuffer(bornHostHolder, bornHostLength); - this.msgBatchMemory.put(messageExtBatch.getBornHostBytes(bornHostHolder)); + this.encoderBuffer.put(messageExtBatch.getBornHostBytes(bornHostHolder)); // 11 STORETIMESTAMP - this.msgBatchMemory.putLong(messageExtBatch.getStoreTimestamp()); + this.encoderBuffer.putLong(messageExtBatch.getStoreTimestamp()); // 12 STOREHOSTADDRESS this.resetByteBuffer(storeHostHolder, storeHostLength); - this.msgBatchMemory.put(messageExtBatch.getStoreHostBytes(storeHostHolder)); + this.encoderBuffer.put(messageExtBatch.getStoreHostBytes(storeHostHolder)); // 13 RECONSUMETIMES - this.msgBatchMemory.putInt(messageExtBatch.getReconsumeTimes()); + this.encoderBuffer.putInt(messageExtBatch.getReconsumeTimes()); // 14 Prepared Transaction Offset, batch does not support transaction - this.msgBatchMemory.putLong(0); + this.encoderBuffer.putLong(0); // 15 BODY - this.msgBatchMemory.putInt(bodyLen); + this.encoderBuffer.putInt(bodyLen); if (bodyLen > 0) - this.msgBatchMemory.put(messagesByteBuff.array(), bodyPos, bodyLen); + this.encoderBuffer.put(messagesByteBuff.array(), bodyPos, bodyLen); // 16 TOPIC - this.msgBatchMemory.put((byte) topicLength); - this.msgBatchMemory.put(topicData); + this.encoderBuffer.put((byte) topicLength); + this.encoderBuffer.put(topicData); // 17 PROPERTIES - this.msgBatchMemory.putShort((short) (propertiesLen + batchPropLen)); + this.encoderBuffer.putShort((short) (propertiesLen + batchPropLen)); if (propertiesLen > 0) { - this.msgBatchMemory.put(messagesByteBuff.array(), propertiesPos, propertiesLen); + this.encoderBuffer.put(messagesByteBuff.array(), propertiesPos, propertiesLen); } if (batchPropLen > 0) { - this.msgBatchMemory.put(batchPropData, 0, batchPropLen); + this.encoderBuffer.put(batchPropData, 0, batchPropLen); } } - msgBatchMemory.flip(); - return msgBatchMemory; + putMessageContext.setBatchSize(batchSize); + putMessageContext.setPhyPos(new long[batchSize]); + encoderBuffer.flip(); + return encoderBuffer; } private void resetByteBuffer(final ByteBuffer byteBuffer, final int limit) { @@ -1904,4 +1673,51 @@ public class CommitLog { } } + + static class PutMessageThreadLocal { + private MessageExtEncoder encoder; + private StringBuilder keyBuilder; + PutMessageThreadLocal(int size) { + encoder = new MessageExtEncoder(size); + keyBuilder = new StringBuilder(); + } + + public MessageExtEncoder getEncoder() { + return encoder; + } + + public StringBuilder getKeyBuilder() { + return keyBuilder; + } + } + + static class PutMessageContext { + private String topicQueueTableKey; + private long[] phyPos; + private int batchSize; + + public PutMessageContext(String topicQueueTableKey) { + this.topicQueueTableKey = topicQueueTableKey; + } + + public String getTopicQueueTableKey() { + return topicQueueTableKey; + } + + public long[] getPhyPos() { + return phyPos; + } + + public void setPhyPos(long[] phyPos) { + this.phyPos = phyPos; + } + + public int getBatchSize() { + return batchSize; + } + + public void setBatchSize(int batchSize) { + this.batchSize = batchSize; + } + } } 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 7dd5a32b2f..69019c1549 100644 --- a/store/src/main/java/org/apache/rocketmq/store/DefaultMessageStore.java +++ b/store/src/main/java/org/apache/rocketmq/store/DefaultMessageStore.java @@ -34,6 +34,7 @@ import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -476,58 +477,20 @@ public class DefaultMessageStore implements MessageStore { @Override public PutMessageResult putMessage(MessageExtBrokerInner msg) { - PutMessageStatus checkStoreStatus = this.checkStoreStatus(); - if (checkStoreStatus != PutMessageStatus.PUT_OK) { - return new PutMessageResult(checkStoreStatus, null); + try { + return asyncPutMessage(msg).get(); + } catch (InterruptedException | ExecutionException e) { + return new PutMessageResult(PutMessageStatus.UNKNOWN_ERROR, null); } - - PutMessageStatus msgCheckStatus = this.checkMessage(msg); - if (msgCheckStatus == PutMessageStatus.MESSAGE_ILLEGAL) { - return new PutMessageResult(msgCheckStatus, null); - } - - long beginTime = this.getSystemClock().now(); - PutMessageResult result = this.commitLog.putMessage(msg); - long elapsedTime = this.getSystemClock().now() - beginTime; - if (elapsedTime > 500) { - log.warn("not in lock elapsed time(ms)={}, bodyLength={}", elapsedTime, msg.getBody().length); - } - - this.storeStatsService.setPutMessageEntireTimeMax(elapsedTime); - - if (null == result || !result.isOk()) { - this.storeStatsService.getPutMessageFailedTimes().incrementAndGet(); - } - - return result; } @Override public PutMessageResult putMessages(MessageExtBatch messageExtBatch) { - PutMessageStatus checkStoreStatus = this.checkStoreStatus(); - if (checkStoreStatus != PutMessageStatus.PUT_OK) { - return new PutMessageResult(checkStoreStatus, null); + try { + return asyncPutMessages(messageExtBatch).get(); + } catch (InterruptedException | ExecutionException e) { + return new PutMessageResult(PutMessageStatus.UNKNOWN_ERROR, null); } - - PutMessageStatus msgCheckStatus = this.checkMessages(messageExtBatch); - if (msgCheckStatus == PutMessageStatus.MESSAGE_ILLEGAL) { - return new PutMessageResult(msgCheckStatus, null); - } - - long beginTime = this.getSystemClock().now(); - PutMessageResult result = this.commitLog.putMessages(messageExtBatch); - long elapsedTime = this.getSystemClock().now() - beginTime; - if (elapsedTime > 500) { - log.warn("not in lock elapsed time(ms)={}, bodyLength={}", elapsedTime, messageExtBatch.getBody().length); - } - - this.storeStatsService.setPutMessageEntireTimeMax(elapsedTime); - - if (null == result || !result.isOk()) { - this.storeStatsService.getPutMessageFailedTimes().incrementAndGet(); - } - - return result; } @Override diff --git a/store/src/main/java/org/apache/rocketmq/store/MappedFile.java b/store/src/main/java/org/apache/rocketmq/store/MappedFile.java index 25f0e39314..297271d38b 100644 --- a/store/src/main/java/org/apache/rocketmq/store/MappedFile.java +++ b/store/src/main/java/org/apache/rocketmq/store/MappedFile.java @@ -37,6 +37,7 @@ import org.apache.rocketmq.logging.InternalLogger; import org.apache.rocketmq.logging.InternalLoggerFactory; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.common.message.MessageExtBatch; +import org.apache.rocketmq.store.CommitLog.PutMessageContext; import org.apache.rocketmq.store.config.FlushDiskType; import org.apache.rocketmq.store.util.LibC; import sun.nio.ch.DirectBuffer; @@ -188,15 +189,18 @@ public class MappedFile extends ReferenceResource { return fileChannel; } - public AppendMessageResult appendMessage(final MessageExtBrokerInner msg, final AppendMessageCallback cb) { - return appendMessagesInner(msg, cb); + public AppendMessageResult appendMessage(final MessageExtBrokerInner msg, final AppendMessageCallback cb, + PutMessageContext putMessageContext) { + return appendMessagesInner(msg, cb, putMessageContext); } - public AppendMessageResult appendMessages(final MessageExtBatch messageExtBatch, final AppendMessageCallback cb) { - return appendMessagesInner(messageExtBatch, cb); + public AppendMessageResult appendMessages(final MessageExtBatch messageExtBatch, final AppendMessageCallback cb, + PutMessageContext putMessageContext) { + return appendMessagesInner(messageExtBatch, cb, putMessageContext); } - public AppendMessageResult appendMessagesInner(final MessageExt messageExt, final AppendMessageCallback cb) { + public AppendMessageResult appendMessagesInner(final MessageExt messageExt, final AppendMessageCallback cb, + PutMessageContext putMessageContext) { assert messageExt != null; assert cb != null; @@ -207,9 +211,11 @@ public class MappedFile extends ReferenceResource { byteBuffer.position(currentPos); AppendMessageResult result; if (messageExt instanceof MessageExtBrokerInner) { - result = cb.doAppend(this.getFileFromOffset(), byteBuffer, this.fileSize - currentPos, (MessageExtBrokerInner) messageExt); + result = cb.doAppend(this.getFileFromOffset(), byteBuffer, this.fileSize - currentPos, + (MessageExtBrokerInner) messageExt, putMessageContext); } else if (messageExt instanceof MessageExtBatch) { - result = cb.doAppend(this.getFileFromOffset(), byteBuffer, this.fileSize - currentPos, (MessageExtBatch) messageExt); + result = cb.doAppend(this.getFileFromOffset(), byteBuffer, this.fileSize - currentPos, + (MessageExtBatch) messageExt, putMessageContext); } else { return new AppendMessageResult(AppendMessageStatus.UNKNOWN_ERROR); } diff --git a/store/src/main/java/org/apache/rocketmq/store/MessageExtBrokerInner.java b/store/src/main/java/org/apache/rocketmq/store/MessageExtBrokerInner.java index e5f087b697..df7e6e586b 100644 --- a/store/src/main/java/org/apache/rocketmq/store/MessageExtBrokerInner.java +++ b/store/src/main/java/org/apache/rocketmq/store/MessageExtBrokerInner.java @@ -16,6 +16,8 @@ */ package org.apache.rocketmq.store; +import java.nio.ByteBuffer; + import org.apache.rocketmq.common.TopicFilterType; import org.apache.rocketmq.common.message.MessageExt; @@ -24,6 +26,16 @@ public class MessageExtBrokerInner extends MessageExt { private String propertiesString; private long tagsCode; + private ByteBuffer encodedBuff; + + public ByteBuffer getEncodedBuff() { + return encodedBuff; + } + + public void setEncodedBuff(ByteBuffer encodedBuff) { + this.encodedBuff = encodedBuff; + } + public static long tagsString2tagsCode(final TopicFilterType filter, final String tags) { if (null == tags || tags.length() == 0) { return 0; } diff --git a/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java b/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java index ea791bd9ff..011cbe169c 100644 --- a/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java +++ b/store/src/main/java/org/apache/rocketmq/store/dledger/DLedgerCommitLog.java @@ -37,7 +37,6 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.TimeUnit; import org.apache.rocketmq.common.UtilAll; import org.apache.rocketmq.common.message.MessageAccessor; import org.apache.rocketmq.common.message.MessageConst; @@ -413,237 +412,6 @@ public class DLedgerCommitLog extends CommitLog { } } - @Override - public PutMessageResult putMessage(final MessageExtBrokerInner msg) { - - StoreStatsService storeStatsService = this.defaultMessageStore.getStoreStatsService(); - final int tranType = MessageSysFlag.getTransactionValue(msg.getSysFlag()); - String topic = msg.getTopic(); - setMessageInfo(msg,tranType); - - // Back to Results - AppendMessageResult appendResult; - AppendFuture dledgerFuture; - EncodeResult encodeResult; - - encodeResult = this.messageSerializer.serialize(msg); - if (encodeResult.status != AppendMessageStatus.PUT_OK) { - return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, new AppendMessageResult(encodeResult.status)); - } - - putMessageLock.lock(); //spin or ReentrantLock ,depending on store config - long elapsedTimeInLock; - long queueOffset; - try { - beginTimeInDledgerLock = this.defaultMessageStore.getSystemClock().now(); - queueOffset = getQueueOffsetByKey(encodeResult.queueOffsetKey, tranType); - encodeResult.setQueueOffsetKey(queueOffset, false); - AppendEntryRequest request = new AppendEntryRequest(); - request.setGroup(dLedgerConfig.getGroup()); - request.setRemoteId(dLedgerServer.getMemberState().getSelfId()); - request.setBody(encodeResult.getData()); - dledgerFuture = (AppendFuture) dLedgerServer.handleAppend(request); - if (dledgerFuture.getPos() == -1) { - return new PutMessageResult(PutMessageStatus.OS_PAGECACHE_BUSY, new AppendMessageResult(AppendMessageStatus.UNKNOWN_ERROR)); - } - long wroteOffset = dledgerFuture.getPos() + DLedgerEntry.BODY_OFFSET; - - int msgIdLength = (msg.getSysFlag() & MessageSysFlag.STOREHOSTADDRESS_V6_FLAG) == 0 ? 4 + 4 + 8 : 16 + 4 + 8; - ByteBuffer buffer = ByteBuffer.allocate(msgIdLength); - - String msgId = MessageDecoder.createMessageId(buffer, msg.getStoreHostBytes(), wroteOffset); - elapsedTimeInLock = this.defaultMessageStore.getSystemClock().now() - beginTimeInDledgerLock; - appendResult = new AppendMessageResult(AppendMessageStatus.PUT_OK, wroteOffset, encodeResult.getData().length, msgId, System.currentTimeMillis(), queueOffset, elapsedTimeInLock); - switch (tranType) { - case MessageSysFlag.TRANSACTION_PREPARED_TYPE: - case MessageSysFlag.TRANSACTION_ROLLBACK_TYPE: - break; - case MessageSysFlag.TRANSACTION_NOT_TYPE: - case MessageSysFlag.TRANSACTION_COMMIT_TYPE: - // The next update ConsumeQueue information - DLedgerCommitLog.this.topicQueueTable.put(encodeResult.queueOffsetKey, queueOffset + 1); - break; - default: - break; - } - } catch (Exception e) { - log.error("Put message error", e); - return new PutMessageResult(PutMessageStatus.UNKNOWN_ERROR, new AppendMessageResult(AppendMessageStatus.UNKNOWN_ERROR)); - } finally { - beginTimeInDledgerLock = 0; - putMessageLock.unlock(); - } - - if (elapsedTimeInLock > 500) { - log.warn("[NOTIFYME]putMessage in lock cost time(ms)={}, bodyLength={} AppendMessageResult={}", elapsedTimeInLock, msg.getBody().length, appendResult); - } - - PutMessageStatus putMessageStatus = PutMessageStatus.UNKNOWN_ERROR; - try { - AppendEntryResponse appendEntryResponse = dledgerFuture.get(3, TimeUnit.SECONDS); - switch (DLedgerResponseCode.valueOf(appendEntryResponse.getCode())) { - case SUCCESS: - putMessageStatus = PutMessageStatus.PUT_OK; - break; - case INCONSISTENT_LEADER: - case NOT_LEADER: - case LEADER_NOT_READY: - case DISK_FULL: - putMessageStatus = PutMessageStatus.SERVICE_NOT_AVAILABLE; - break; - case WAIT_QUORUM_ACK_TIMEOUT: - //Do not return flush_slave_timeout to the client, for the ons client will ignore it. - putMessageStatus = PutMessageStatus.OS_PAGECACHE_BUSY; - break; - case LEADER_PENDING_FULL: - putMessageStatus = PutMessageStatus.OS_PAGECACHE_BUSY; - break; - } - } catch (Throwable t) { - log.error("Failed to get dledger append result", t); - } - - PutMessageResult putMessageResult = new PutMessageResult(putMessageStatus, appendResult); - if (putMessageStatus == PutMessageStatus.PUT_OK) { - // Statistics - storeStatsService.getSinglePutMessageTopicTimesTotal(msg.getTopic()).incrementAndGet(); - storeStatsService.getSinglePutMessageTopicSizeTotal(topic).addAndGet(appendResult.getWroteBytes()); - } - return putMessageResult; - } - - @Override - public PutMessageResult putMessages(final MessageExtBatch messageExtBatch) { - final int tranType = MessageSysFlag.getTransactionValue(messageExtBatch.getSysFlag()); - - if (tranType != MessageSysFlag.TRANSACTION_NOT_TYPE) { - return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, null); - } - if (messageExtBatch.getDelayTimeLevel() > 0) { - return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, null); - } - - // Set the storage time - messageExtBatch.setStoreTimestamp(System.currentTimeMillis()); - - StoreStatsService storeStatsService = this.defaultMessageStore.getStoreStatsService(); - - InetSocketAddress bornSocketAddress = (InetSocketAddress) messageExtBatch.getBornHost(); - if (bornSocketAddress.getAddress() instanceof Inet6Address) { - messageExtBatch.setBornHostV6Flag(); - } - - InetSocketAddress storeSocketAddress = (InetSocketAddress) messageExtBatch.getStoreHost(); - if (storeSocketAddress.getAddress() instanceof Inet6Address) { - messageExtBatch.setStoreHostAddressV6Flag(); - } - - // Back to Results - AppendMessageResult appendResult; - BatchAppendFuture dledgerFuture; - EncodeResult encodeResult; - - encodeResult = this.messageSerializer.serialize(messageExtBatch); - if (encodeResult.status != AppendMessageStatus.PUT_OK) { - return new PutMessageResult(PutMessageStatus.MESSAGE_ILLEGAL, new AppendMessageResult(encodeResult - .status)); - } - - putMessageLock.lock(); //spin or ReentrantLock ,depending on store config - msgIdBuilder.setLength(0); - long elapsedTimeInLock; - long queueOffset; - int msgNum = 0; - try { - beginTimeInDledgerLock = this.defaultMessageStore.getSystemClock().now(); - queueOffset = getQueueOffsetByKey(encodeResult.queueOffsetKey, tranType); - encodeResult.setQueueOffsetKey(queueOffset, true); - BatchAppendEntryRequest request = new BatchAppendEntryRequest(); - request.setGroup(dLedgerConfig.getGroup()); - request.setRemoteId(dLedgerServer.getMemberState().getSelfId()); - request.setBatchMsgs(encodeResult.batchData); - AppendFuture appendFuture = (AppendFuture) dLedgerServer.handleAppend(request); - if (appendFuture.getPos() == -1) { - log.warn("HandleAppend return false due to error code {}", appendFuture.get().getCode()); - return new PutMessageResult(PutMessageStatus.OS_PAGECACHE_BUSY, new AppendMessageResult(AppendMessageStatus.UNKNOWN_ERROR)); - } - dledgerFuture = (BatchAppendFuture) appendFuture; - - long wroteOffset = 0; - - int msgIdLength = (messageExtBatch.getSysFlag() & MessageSysFlag.STOREHOSTADDRESS_V6_FLAG) == 0 ? 4 + 4 + 8 : 16 + 4 + 8; - ByteBuffer buffer = ByteBuffer.allocate(msgIdLength); - - boolean isFirstOffset = true; - long firstWroteOffset = 0; - for (long pos : dledgerFuture.getPositions()) { - wroteOffset = pos + DLedgerEntry.BODY_OFFSET; - if (isFirstOffset) { - firstWroteOffset = wroteOffset; - isFirstOffset = false; - } - String msgId = MessageDecoder.createMessageId(buffer, messageExtBatch.getStoreHostBytes(), wroteOffset); - if (msgIdBuilder.length() > 0) { - msgIdBuilder.append(',').append(msgId); - } else { - msgIdBuilder.append(msgId); - } - msgNum++; - } - - elapsedTimeInLock = this.defaultMessageStore.getSystemClock().now() - beginTimeInDledgerLock; - appendResult = new AppendMessageResult(AppendMessageStatus.PUT_OK, firstWroteOffset, encodeResult.totalMsgLen, - msgIdBuilder.toString(), System.currentTimeMillis(), queueOffset, elapsedTimeInLock); - appendResult.setMsgNum(msgNum); - DLedgerCommitLog.this.topicQueueTable.put(encodeResult.queueOffsetKey, queueOffset + msgNum); - } catch (Exception e) { - log.error("Put message error", e); - return new PutMessageResult(PutMessageStatus.UNKNOWN_ERROR, new AppendMessageResult(AppendMessageStatus - .UNKNOWN_ERROR)); - } finally { - beginTimeInDledgerLock = 0; - putMessageLock.unlock(); - } - - if (elapsedTimeInLock > 500) { - log.warn("[NOTIFYME]putMessage in lock cost time(ms)={}, bodyLength={} AppendMessageResult={}", - elapsedTimeInLock, messageExtBatch.getBody().length, appendResult); - } - - PutMessageStatus putMessageStatus = PutMessageStatus.UNKNOWN_ERROR; - try { - AppendEntryResponse appendEntryResponse = dledgerFuture.get(3, TimeUnit.SECONDS); - switch (DLedgerResponseCode.valueOf(appendEntryResponse.getCode())) { - case SUCCESS: - putMessageStatus = PutMessageStatus.PUT_OK; - break; - case INCONSISTENT_LEADER: - case NOT_LEADER: - case LEADER_NOT_READY: - case DISK_FULL: - putMessageStatus = PutMessageStatus.SERVICE_NOT_AVAILABLE; - break; - case WAIT_QUORUM_ACK_TIMEOUT: - //Do not return flush_slave_timeout to the client, for the ons client will ignore it. - putMessageStatus = PutMessageStatus.OS_PAGECACHE_BUSY; - break; - case LEADER_PENDING_FULL: - putMessageStatus = PutMessageStatus.OS_PAGECACHE_BUSY; - break; - } - } catch (Throwable t) { - log.error("Failed to get dledger append result", t); - } - - PutMessageResult putMessageResult = new PutMessageResult(putMessageStatus, appendResult); - if (putMessageStatus == PutMessageStatus.PUT_OK) { - // Statistics - storeStatsService.getSinglePutMessageTopicTimesTotal(messageExtBatch.getTopic()).addAndGet(msgNum); - storeStatsService.getSinglePutMessageTopicSizeTotal(messageExtBatch.getTopic()).addAndGet(encodeResult.totalMsgLen); - } - return putMessageResult; - } - @Override public CompletableFuture asyncPutMessage(MessageExtBrokerInner msg) { diff --git a/store/src/test/java/org/apache/rocketmq/store/AppendCallbackTest.java b/store/src/test/java/org/apache/rocketmq/store/AppendCallbackTest.java index f46b3befed..715c9d334a 100644 --- a/store/src/test/java/org/apache/rocketmq/store/AppendCallbackTest.java +++ b/store/src/test/java/org/apache/rocketmq/store/AppendCallbackTest.java @@ -30,6 +30,8 @@ import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.common.message.MessageDecoder; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.common.message.MessageExtBatch; +import org.apache.rocketmq.store.CommitLog.MessageExtEncoder; +import org.apache.rocketmq.store.CommitLog.PutMessageContext; import org.apache.rocketmq.store.config.MessageStoreConfig; import org.junit.After; import org.junit.Before; @@ -42,7 +44,7 @@ public class AppendCallbackTest { AppendMessageCallback callback; - CommitLog.MessageExtBatchEncoder batchEncoder = new CommitLog.MessageExtBatchEncoder(10 * 1024 * 1024); + MessageExtEncoder batchEncoder = new MessageExtEncoder(10 * 1024 * 1024); @Before public void init() throws Exception { @@ -84,10 +86,12 @@ public class AppendCallbackTest { messageExtBatch.setStoreHost(new InetSocketAddress("127.0.0.1", 124)); messageExtBatch.setBody(MessageDecoder.encodeMessages(messages)); - messageExtBatch.setEncodedBuff(batchEncoder.encode(messageExtBatch)); + PutMessageContext putMessageContext = new PutMessageContext(topic + "-" + queue); + messageExtBatch.setEncodedBuff(batchEncoder.encode(messageExtBatch, putMessageContext)); ByteBuffer buff = ByteBuffer.allocate(1024 * 10); //encounter end of file when append half of the data - AppendMessageResult result = callback.doAppend(0, buff, 1000, messageExtBatch); + AppendMessageResult result = + callback.doAppend(0, buff, 1000, messageExtBatch, putMessageContext); assertEquals(AppendMessageStatus.END_OF_FILE, result.getStatus()); assertEquals(0, result.getWroteOffset()); assertEquals(0, result.getLogicsOffset()); @@ -121,10 +125,12 @@ public class AppendCallbackTest { messageExtBatch.setStoreHost(new InetSocketAddress("::1", 124)); messageExtBatch.setBody(MessageDecoder.encodeMessages(messages)); - messageExtBatch.setEncodedBuff(batchEncoder.encode(messageExtBatch)); + PutMessageContext putMessageContext = new PutMessageContext(topic + "-" + queue); + messageExtBatch.setEncodedBuff(batchEncoder.encode(messageExtBatch, putMessageContext)); ByteBuffer buff = ByteBuffer.allocate(1024 * 10); //encounter end of file when append half of the data - AppendMessageResult result = callback.doAppend(0, buff, 1000, messageExtBatch); + AppendMessageResult result = + callback.doAppend(0, buff, 1000, messageExtBatch, putMessageContext); assertEquals(AppendMessageStatus.END_OF_FILE, result.getStatus()); assertEquals(0, result.getWroteOffset()); assertEquals(0, result.getLogicsOffset()); @@ -154,9 +160,11 @@ public class AppendCallbackTest { messageExtBatch.setStoreHost(new InetSocketAddress("127.0.0.1", 124)); messageExtBatch.setBody(MessageDecoder.encodeMessages(messages)); - messageExtBatch.setEncodedBuff(batchEncoder.encode(messageExtBatch)); + PutMessageContext putMessageContext = new PutMessageContext(topic + "-" + queue); + messageExtBatch.setEncodedBuff(batchEncoder.encode(messageExtBatch, putMessageContext)); ByteBuffer buff = ByteBuffer.allocate(1024 * 10); - AppendMessageResult allresult = callback.doAppend(0, buff, 1024 * 10, messageExtBatch); + AppendMessageResult allresult = + callback.doAppend(0, buff, 1024 * 10, messageExtBatch, putMessageContext); assertEquals(AppendMessageStatus.PUT_OK, allresult.getStatus()); assertEquals(0, allresult.getWroteOffset()); @@ -214,9 +222,11 @@ public class AppendCallbackTest { messageExtBatch.setStoreHost(new InetSocketAddress("::1", 124)); messageExtBatch.setBody(MessageDecoder.encodeMessages(messages)); - messageExtBatch.setEncodedBuff(batchEncoder.encode(messageExtBatch)); + PutMessageContext putMessageContext = new PutMessageContext(topic + "-" + queue); + messageExtBatch.setEncodedBuff(batchEncoder.encode(messageExtBatch, putMessageContext)); ByteBuffer buff = ByteBuffer.allocate(1024 * 10); - AppendMessageResult allresult = callback.doAppend(0, buff, 1024 * 10, messageExtBatch); + AppendMessageResult allresult = + callback.doAppend(0, buff, 1024 * 10, messageExtBatch, putMessageContext); assertEquals(AppendMessageStatus.PUT_OK, allresult.getStatus()); assertEquals(0, allresult.getWroteOffset()); From b68724b1ff8e0628fed4c64e6ebf15ff88519c2c Mon Sep 17 00:00:00 2001 From: zhangjidi2016 <1017543663@qq.com> Date: Wed, 28 Jul 2021 22:04:20 +0800 Subject: [PATCH 72/83] [ISSUE #3030]Remove the -Xmn JVM parameter when using G1 (#3170) Co-authored-by: zhangjidi2016 --- distribution/bin/runbroker.cmd | 2 +- distribution/bin/runbroker.sh | 2 +- distribution/bin/runserver.cmd | 2 +- distribution/bin/runserver.sh | 6 +++--- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/distribution/bin/runbroker.cmd b/distribution/bin/runbroker.cmd index 753a11e9a4..6cbf1c031a 100644 --- a/distribution/bin/runbroker.cmd +++ b/distribution/bin/runbroker.cmd @@ -28,7 +28,7 @@ set CLASSPATH=.;%BASE_DIR%conf;%CLASSPATH% rem =========================================================================================== rem JVM Configuration rem =========================================================================================== -set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g" +set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g" set "JAVA_OPT=%JAVA_OPT% -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8" set "JAVA_OPT=%JAVA_OPT% -verbose:gc -Xloggc:%USERPROFILE%\mq_gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy" set "JAVA_OPT=%JAVA_OPT% -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m" diff --git a/distribution/bin/runbroker.sh b/distribution/bin/runbroker.sh index 1d1000ee4c..d1a148b36c 100644 --- a/distribution/bin/runbroker.sh +++ b/distribution/bin/runbroker.sh @@ -64,7 +64,7 @@ choose_gc_log_directory() choose_gc_log_directory -JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g" +JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g" JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0" JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_broker_gc_%p_%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy" JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m" diff --git a/distribution/bin/runserver.cmd b/distribution/bin/runserver.cmd index 76865f7a16..ddd9b5fc70 100644 --- a/distribution/bin/runserver.cmd +++ b/distribution/bin/runserver.cmd @@ -28,7 +28,7 @@ set CLASSPATH=.;%BASE_DIR%conf;%CLASSPATH% set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" set "JAVA_OPT=%JAVA_OPT% -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC" -set "JAVA_OPT=%JAVA_OPT% -verbose:gc -Xloggc:"%USERPROFILE%\rmq_srv_gc.log" -XX:+PrintGCDetails" +set "JAVA_OPT=%JAVA_OPT% -verbose:gc -Xloggc:"%USERPROFILE%\rmq_srv_gc.log" -XX:+PrintGCDetails -XX:+PrintGCDateStamps" set "JAVA_OPT=%JAVA_OPT% -XX:-OmitStackTraceInFastThrow" set "JAVA_OPT=%JAVA_OPT% -XX:-UseLargePages" set "JAVA_OPT=%JAVA_OPT% -Djava.ext.dirs=%BASE_DIR%lib;%JAVA_HOME%\jre\lib\ext" diff --git a/distribution/bin/runserver.sh b/distribution/bin/runserver.sh index 59f322085d..cfa577345b 100644 --- a/distribution/bin/runserver.sh +++ b/distribution/bin/runserver.sh @@ -68,18 +68,18 @@ choose_gc_options() # '1' means releases befor Java 9 JAVA_MAJOR_VERSION=$("$JAVA" -version 2>&1 | sed -r -n 's/.* version "([0-9]*).*$/\1/p') if [ -z "$JAVA_MAJOR_VERSION" ] || [ "$JAVA_MAJOR_VERSION" -lt "9" ] ; then + JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" JAVA_OPT="${JAVA_OPT} -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC" - JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log -XX:+PrintGCDetails" + JAVA_OPT="${JAVA_OPT} -verbose:gc -Xloggc:${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps" JAVA_OPT="${JAVA_OPT} -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m" else + JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0" JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=${GC_LOG_DIR}/rmq_srv_gc_%p_%t.log:time,tags:filecount=5,filesize=30M" fi } choose_gc_log_directory - -JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m" choose_gc_options JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow" JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages" From 17b9efe16d8c39c5c1c60199de8d44dcaad2348d Mon Sep 17 00:00:00 2001 From: zhangjidi2016 <1017543663@qq.com> Date: Fri, 30 Jul 2021 13:41:52 +0800 Subject: [PATCH 73/83] [ISSUE #3177]updateAclConfig in all brokers. (#3184) Co-authored-by: zhangjidi2016 --- .../tools/command/acl/UpdateAccessConfigSubCommand.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/src/main/java/org/apache/rocketmq/tools/command/acl/UpdateAccessConfigSubCommand.java b/tools/src/main/java/org/apache/rocketmq/tools/command/acl/UpdateAccessConfigSubCommand.java index b625cd94c1..465a2db586 100644 --- a/tools/src/main/java/org/apache/rocketmq/tools/command/acl/UpdateAccessConfigSubCommand.java +++ b/tools/src/main/java/org/apache/rocketmq/tools/command/acl/UpdateAccessConfigSubCommand.java @@ -164,9 +164,9 @@ public class UpdateAccessConfigSubCommand implements SubCommand { String clusterName = commandLine.getOptionValue('c').trim(); defaultMQAdminExt.start(); - Set masterSet = - CommandUtil.fetchMasterAddrByClusterName(defaultMQAdminExt, clusterName); - for (String addr : masterSet) { + Set brokerAddrSet = + CommandUtil.fetchMasterAndSlaveAddrByClusterName(defaultMQAdminExt, clusterName); + for (String addr : brokerAddrSet) { defaultMQAdminExt.createAndUpdatePlainAccessConfig(addr, accessConfig); System.out.printf("create or update plain access config to %s success.%n", addr); } From 1b757b402262568cb2d8ac7d4073a2d8f7e7236c Mon Sep 17 00:00:00 2001 From: gorden5566 Date: Fri, 30 Jul 2021 15:00:48 +0800 Subject: [PATCH 74/83] [ISSUE #3196] Check if "requestHeader" is null before "requestHeader.getTopic()" --- .../rocketmq/broker/processor/AbstractSendMessageProcessor.java | 2 +- .../apache/rocketmq/broker/processor/SendMessageProcessor.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java index ced7c2014f..29ffc4bb76 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java @@ -257,8 +257,8 @@ public abstract class AbstractSendMessageProcessor extends AsyncNettyRequestProc try { final SendMessageRequestHeader requestHeader = parseRequestHeader(request); - String namespace = NamespaceUtil.getNamespaceFromResource(requestHeader.getTopic()); if (null != requestHeader) { + String namespace = NamespaceUtil.getNamespaceFromResource(requestHeader.getTopic()); context.setNamespace(namespace); context.setProducerGroup(requestHeader.getProducerGroup()); context.setTopic(requestHeader.getTopic()); diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java index ccec5069c7..8b3caa7e12 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/SendMessageProcessor.java @@ -612,6 +612,7 @@ public class SendMessageProcessor extends AbstractSendMessageProcessor implement } } + @Override public SocketAddress getStoreHost() { return storeHost; } From a137e48a67f910da11d8d0478c523521c425e640 Mon Sep 17 00:00:00 2001 From: huangli Date: Thu, 22 Jul 2021 23:01:42 +0800 Subject: [PATCH 75/83] [ISSUE 2883] [Part G] Optimise parse performance for SendMessageRequestHeaderV2, unit test --- .../AbstractSendMessageProcessor.java | 28 ++++--- .../AbstractSendMessageProcessorTest.java | 82 +++++++++++++++++++ 2 files changed, 99 insertions(+), 11 deletions(-) create mode 100644 broker/src/test/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessorTest.java diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java index 95602206a8..e18e8f39bb 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java @@ -305,44 +305,44 @@ public abstract class AbstractSendMessageProcessor extends AsyncNettyRequestProc return requestHeader; } - private SendMessageRequestHeaderV2 decodeSendMessageHeaderV2(RemotingCommand request) { + static SendMessageRequestHeaderV2 decodeSendMessageHeaderV2(RemotingCommand request) + throws RemotingCommandException { SendMessageRequestHeaderV2 r = new SendMessageRequestHeaderV2(); HashMap fields = request.getExtFields(); if (fields == null) { - // keep same behavior with CommandCustomHeader.decodeCommandCustomHeader - return r; + throw new RemotingCommandException("the ext fields is null"); } String s = fields.get("a"); - Objects.requireNonNull(s, "the custom field
is null"); + checkNotNull(s, "the custom field is null"); r.setA(s); s = fields.get("b"); - Objects.requireNonNull(s, "the custom field is null"); + checkNotNull(s, "the custom field is null"); r.setB(s); s = fields.get("c"); - Objects.requireNonNull(s, "the custom field is null"); + checkNotNull(s, "the custom field is null"); r.setC(s); s = fields.get("d"); - Objects.requireNonNull(s, "the custom field is null"); + checkNotNull(s, "the custom field is null"); r.setD(Integer.parseInt(s)); s = fields.get("e"); - Objects.requireNonNull(s, "the custom field is null"); + checkNotNull(s, "the custom field is null"); r.setE(Integer.parseInt(s)); s = fields.get("f"); - Objects.requireNonNull(s, "the custom field is null"); + checkNotNull(s, "the custom field is null"); r.setF(Integer.parseInt(s)); s = fields.get("g"); - Objects.requireNonNull(s, "the custom field is null"); + checkNotNull(s, "the custom field is null"); r.setG(Long.parseLong(s)); s = fields.get("h"); - Objects.requireNonNull(s, "the custom field is null"); + checkNotNull(s, "the custom field is null"); r.setH(Integer.parseInt(s)); s = fields.get("i"); @@ -372,6 +372,12 @@ public abstract class AbstractSendMessageProcessor extends AsyncNettyRequestProc return r; } + private static void checkNotNull(String s, String msg) throws RemotingCommandException { + if (s == null) { + throw new RemotingCommandException(msg); + } + } + public void executeSendMessageHookAfter(final RemotingCommand response, final SendMessageContext context) { if (hasSendMessageHook()) { for (SendMessageHook hook : this.sendMessageHookList) { diff --git a/broker/src/test/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessorTest.java b/broker/src/test/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessorTest.java new file mode 100644 index 0000000000..da2611bd54 --- /dev/null +++ b/broker/src/test/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessorTest.java @@ -0,0 +1,82 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.rocketmq.broker.processor; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.rocketmq.common.protocol.header.SendMessageRequestHeaderV2; +import org.apache.rocketmq.remoting.protocol.RemotingCommand; +import org.junit.Assert; +import org.junit.Test; + +public class AbstractSendMessageProcessorTest { + @Test + public void testDecodeSendMessageHeaderV2() throws Exception { + Field[] declaredFields = SendMessageRequestHeaderV2.class.getDeclaredFields(); + List declaredFieldsList = new ArrayList<>(); + for (Field f : declaredFields) { + if (f.getName().startsWith("$")) { + continue; + } + f.setAccessible(true); + declaredFieldsList.add(f); + } + RemotingCommand command = RemotingCommand.createRequestCommand(0, null); + HashMap m = buildExtFields(declaredFieldsList); + command.setExtFields(m); + check(command, declaredFieldsList); + } + + private HashMap buildExtFields(List fields) { + HashMap extFields = new HashMap<>(); + for (Field f: fields) { + Class c = f.getType(); + if (c.equals(String.class)) { + extFields.put(f.getName(), "str"); + } else if (c.equals(Integer.class) || c.equals(int.class)) { + extFields.put(f.getName(), "123"); + } else if (c.equals(Long.class) || c.equals(long.class)) { + extFields.put(f.getName(), "1234"); + } else if (c.equals(Boolean.class) || c.equals(boolean.class)) { + extFields.put(f.getName(), "true"); + } else { + throw new RuntimeException(f.getName() + ":" + f.getType().getName()); + } + } + return extFields; + } + + private void check(RemotingCommand command, List fields) throws Exception { + SendMessageRequestHeaderV2 o1 = (SendMessageRequestHeaderV2) command.decodeCommandCustomHeader(SendMessageRequestHeaderV2.class); + SendMessageRequestHeaderV2 o2 = AbstractSendMessageProcessor.decodeSendMessageHeaderV2(command); + for (Field f : fields) { + Object value1 = f.get(o1); + Object value2 = f.get(o2); + if (value1 == null) { + Assert.assertNull(value2); + } else { + Assert.assertEquals(value1, value2); + } + } + } + +} From 1eaa38f63989fc06fa50a1aa0f162d8050982ce8 Mon Sep 17 00:00:00 2001 From: guyinyou <36399867+guyinyou@users.noreply.github.com> Date: Fri, 30 Jul 2021 19:06:27 +0800 Subject: [PATCH 76/83] [ISSUE #3200] Fix code style in 'NettySystemConfig.java' --- .../remoting/netty/NettySystemConfig.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettySystemConfig.java b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettySystemConfig.java index ef767a36ed..d4c3749a0f 100644 --- a/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettySystemConfig.java +++ b/remoting/src/main/java/org/apache/rocketmq/remoting/netty/NettySystemConfig.java @@ -29,16 +29,15 @@ public class NettySystemConfig { public static final String COM_ROCKETMQ_REMOTING_CLIENT_ONEWAY_SEMAPHORE_VALUE = "com.rocketmq.remoting.clientOnewaySemaphoreValue"; public static final String COM_ROCKETMQ_REMOTING_CLIENT_WORKER_SIZE = - "com.rocketmq.remoting.client.worker.size"; + "com.rocketmq.remoting.client.worker.size"; public static final String COM_ROCKETMQ_REMOTING_CLIENT_CONNECT_TIMEOUT = - "com.rocketmq.remoting.client.connect.timeout"; + "com.rocketmq.remoting.client.connect.timeout"; public static final String COM_ROCKETMQ_REMOTING_CLIENT_CHANNEL_MAX_IDLE_SECONDS = - "com.rocketmq.remoting.client.channel.maxIdleTimeSeconds"; + "com.rocketmq.remoting.client.channel.maxIdleTimeSeconds"; public static final String COM_ROCKETMQ_REMOTING_CLIENT_CLOSE_SOCKET_IF_TIMEOUT = - "com.rocketmq.remoting.client.closeSocketIfTimeout"; + "com.rocketmq.remoting.client.closeSocketIfTimeout"; - - public static final boolean NETTY_POOLED_BYTE_BUF_ALLOCATOR_ENABLE = // + public static final boolean NETTY_POOLED_BYTE_BUF_ALLOCATOR_ENABLE = // Boolean.parseBoolean(System.getProperty(COM_ROCKETMQ_REMOTING_NETTY_POOLED_BYTE_BUF_ALLOCATOR_ENABLE, "false")); public static final int CLIENT_ASYNC_SEMAPHORE_VALUE = // Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_ASYNC_SEMAPHORE_VALUE, "65535")); @@ -49,11 +48,11 @@ public class NettySystemConfig { public static int socketRcvbufSize = Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_SOCKET_RCVBUF_SIZE, "65535")); public static int clientWorkerSize = - Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_WORKER_SIZE, "4")); + Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_WORKER_SIZE, "4")); public static int connectTimeoutMillis = - Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CONNECT_TIMEOUT, "3000")); + Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CONNECT_TIMEOUT, "3000")); public static int clientChannelMaxIdleTimeSeconds = - Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CHANNEL_MAX_IDLE_SECONDS, "120")); + Integer.parseInt(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CHANNEL_MAX_IDLE_SECONDS, "120")); public static boolean clientCloseSocketIfTimeout = - Boolean.parseBoolean(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CLOSE_SOCKET_IF_TIMEOUT, "true")); + Boolean.parseBoolean(System.getProperty(COM_ROCKETMQ_REMOTING_CLIENT_CLOSE_SOCKET_IF_TIMEOUT, "true")); } From a23df96790ee81147abfb38fe1c58cbbf8941828 Mon Sep 17 00:00:00 2001 From: huangli Date: Fri, 28 May 2021 10:22:19 +0800 Subject: [PATCH 77/83] [ISSUE 2883] Improve performance of string2messageProperties/messageProperties2String, and save 1 byte for each message. --- .../common/message/MessageDecoder.java | 41 ++++++- .../common/message/MessageDecoderTest.java | 108 ++++++++++++++++++ .../rocketmq/store/BatchPutMessageTest.java | 18 +-- 3 files changed, 144 insertions(+), 23 deletions(-) diff --git a/common/src/main/java/org/apache/rocketmq/common/message/MessageDecoder.java b/common/src/main/java/org/apache/rocketmq/common/message/MessageDecoder.java index 2936c18eac..c94700e5fe 100644 --- a/common/src/main/java/org/apache/rocketmq/common/message/MessageDecoder.java +++ b/common/src/main/java/org/apache/rocketmq/common/message/MessageDecoder.java @@ -409,7 +409,23 @@ public class MessageDecoder { } public static String messageProperties2String(Map properties) { - StringBuilder sb = new StringBuilder(); + if (properties == null) { + return ""; + } + int len = 0; + for (final Map.Entry entry : properties.entrySet()) { + final String name = entry.getKey(); + final String value = entry.getValue(); + if (value == null) { + continue; + } + if (name != null) { + len += name.length(); + } + len += value.length(); + len += 2; // separator + } + StringBuilder sb = new StringBuilder(len); if (properties != null) { for (final Map.Entry entry : properties.entrySet()) { final String name = entry.getKey(); @@ -423,6 +439,9 @@ public class MessageDecoder { sb.append(value); sb.append(PROPERTY_SEPARATOR); } + if (sb.length() > 0) { + sb.deleteCharAt(sb.length() - 1); + } } return sb.toString(); } @@ -430,12 +449,22 @@ public class MessageDecoder { public static Map string2messageProperties(final String properties) { Map map = new HashMap(); if (properties != null) { - String[] items = properties.split(String.valueOf(PROPERTY_SEPARATOR)); - for (String i : items) { - String[] nv = i.split(String.valueOf(NAME_VALUE_SEPARATOR)); - if (2 == nv.length) { - map.put(nv[0], nv[1]); + int len = properties.length(); + int index = 0; + while (index < len) { + int newIndex = properties.indexOf(PROPERTY_SEPARATOR, index); + if (newIndex < 0) { + newIndex = len; } + if (newIndex - index >= 3) { + int kvSepIndex = properties.indexOf(NAME_VALUE_SEPARATOR, index); + if (kvSepIndex > index && kvSepIndex < newIndex - 1) { + String k = properties.substring(index, kvSepIndex); + String v = properties.substring(kvSepIndex + 1, newIndex); + map.put(k, v); + } + } + index = newIndex + 1; } } diff --git a/common/src/test/java/org/apache/rocketmq/common/message/MessageDecoderTest.java b/common/src/test/java/org/apache/rocketmq/common/message/MessageDecoderTest.java index fde523dba9..b27f24669a 100644 --- a/common/src/test/java/org/apache/rocketmq/common/message/MessageDecoderTest.java +++ b/common/src/test/java/org/apache/rocketmq/common/message/MessageDecoderTest.java @@ -25,6 +25,8 @@ import java.net.UnknownHostException; import java.nio.ByteBuffer; import java.util.Map; +import static org.apache.rocketmq.common.message.MessageDecoder.NAME_VALUE_SEPARATOR; +import static org.apache.rocketmq.common.message.MessageDecoder.PROPERTY_SEPARATOR; import static org.apache.rocketmq.common.message.MessageDecoder.createMessageId; import static org.assertj.core.api.Assertions.assertThat; @@ -265,4 +267,110 @@ public class MessageDecoderTest { } } + @Test + public void testString2messageProperties() { + StringBuilder sb = new StringBuilder(); + sb.append("k1").append(NAME_VALUE_SEPARATOR).append("v1"); + Map m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(1); + assertThat(m.get("k1")).isEqualTo("v1"); + + m = MessageDecoder.string2messageProperties(""); + assertThat(m).size().isEqualTo(0); + + m = MessageDecoder.string2messageProperties(" "); + assertThat(m).size().isEqualTo(0); + + m = MessageDecoder.string2messageProperties("aaa"); + assertThat(m).size().isEqualTo(0); + + sb.setLength(0); + sb.append("k1").append(NAME_VALUE_SEPARATOR); + m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(0); + + sb.setLength(0); + sb.append(NAME_VALUE_SEPARATOR).append("v1"); + m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(0); + + sb.setLength(0); + sb.append("k1").append(NAME_VALUE_SEPARATOR).append("v1").append(PROPERTY_SEPARATOR); + m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(1); + assertThat(m.get("k1")).isEqualTo("v1"); + + sb.setLength(0); + sb.append("k1").append(NAME_VALUE_SEPARATOR).append("v1").append(PROPERTY_SEPARATOR) + .append("k2").append(NAME_VALUE_SEPARATOR).append("v2"); + m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(2); + assertThat(m.get("k1")).isEqualTo("v1"); + assertThat(m.get("k2")).isEqualTo("v2"); + + sb.setLength(0); + sb.append("k1").append(NAME_VALUE_SEPARATOR).append("v1").append(PROPERTY_SEPARATOR) + .append(NAME_VALUE_SEPARATOR).append("v2"); + m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(1); + assertThat(m.get("k1")).isEqualTo("v1"); + + sb.setLength(0); + sb.append("k1").append(NAME_VALUE_SEPARATOR).append("v1").append(PROPERTY_SEPARATOR) + .append("k2").append(NAME_VALUE_SEPARATOR); + m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(1); + assertThat(m.get("k1")).isEqualTo("v1"); + + sb.setLength(0); + sb.append(NAME_VALUE_SEPARATOR).append("v1").append(PROPERTY_SEPARATOR) + .append("k2").append(NAME_VALUE_SEPARATOR).append("v2"); + m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(1); + assertThat(m.get("k2")).isEqualTo("v2"); + + sb.setLength(0); + sb.append("k1").append(NAME_VALUE_SEPARATOR).append(PROPERTY_SEPARATOR) + .append("k2").append(NAME_VALUE_SEPARATOR).append("v2"); + m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(1); + assertThat(m.get("k2")).isEqualTo("v2"); + + sb.setLength(0); + sb.append("1").append(NAME_VALUE_SEPARATOR).append("1").append(PROPERTY_SEPARATOR) + .append("2").append(NAME_VALUE_SEPARATOR).append("2"); + m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(2); + assertThat(m.get("1")).isEqualTo("1"); + assertThat(m.get("2")).isEqualTo("2"); + + sb.setLength(0); + sb.append("1").append(NAME_VALUE_SEPARATOR).append(PROPERTY_SEPARATOR) + .append("2").append(NAME_VALUE_SEPARATOR).append("2"); + m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(1); + assertThat(m.get("2")).isEqualTo("2"); + + sb.setLength(0); + sb.append(NAME_VALUE_SEPARATOR).append("1").append(PROPERTY_SEPARATOR) + .append("2").append(NAME_VALUE_SEPARATOR).append("2"); + m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(1); + assertThat(m.get("2")).isEqualTo("2"); + + sb.setLength(0); + sb.append("1").append(NAME_VALUE_SEPARATOR).append("1").append(PROPERTY_SEPARATOR) + .append("2").append(NAME_VALUE_SEPARATOR); + m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(1); + assertThat(m.get("1")).isEqualTo("1"); + + sb.setLength(0); + sb.append("1").append(NAME_VALUE_SEPARATOR).append("1").append(PROPERTY_SEPARATOR) + .append(NAME_VALUE_SEPARATOR).append("2"); + m = MessageDecoder.string2messageProperties(sb.toString()); + assertThat(m).size().isEqualTo(1); + assertThat(m.get("1")).isEqualTo("1"); + } + } \ No newline at end of file diff --git a/store/src/test/java/org/apache/rocketmq/store/BatchPutMessageTest.java b/store/src/test/java/org/apache/rocketmq/store/BatchPutMessageTest.java index b3a7c196f9..2c1fd25f01 100644 --- a/store/src/test/java/org/apache/rocketmq/store/BatchPutMessageTest.java +++ b/store/src/test/java/org/apache/rocketmq/store/BatchPutMessageTest.java @@ -23,7 +23,6 @@ import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.common.message.MessageDecoder; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.common.message.MessageExtBatch; -import org.apache.rocketmq.common.sysflag.MessageSysFlag; import org.apache.rocketmq.store.config.FlushDiskType; import org.apache.rocketmq.store.config.MessageStoreConfig; import org.apache.rocketmq.store.stats.BrokerStatsManager; @@ -39,6 +38,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static org.apache.rocketmq.common.message.MessageDecoder.messageProperties2String; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertTrue; @@ -230,22 +230,6 @@ public class BatchPutMessageTest { return msgLen; } - public String messageProperties2String(Map properties) { - StringBuilder sb = new StringBuilder(); - if (properties != null) { - for (final Map.Entry entry : properties.entrySet()) { - final String name = entry.getKey(); - final String value = entry.getValue(); - - sb.append(name); - sb.append(NAME_VALUE_SEPARATOR); - sb.append(value); - sb.append(PROPERTY_SEPARATOR); - } - } - return sb.toString(); - } - private class MyMessageArrivingListener implements MessageArrivingListener { @Override public void arriving(String topic, int queueId, long logicOffset, long tagsCode, long msgStoreTime, From d067bfc21410c11dc3c99bb2b67403aa4b344286 Mon Sep 17 00:00:00 2001 From: makabakaboom <402879834@qq.com> Date: Fri, 30 Jul 2021 21:56:32 +0800 Subject: [PATCH 78/83] [ISSUE #3192] Make free disk value more accurate make free disk value more accurate --- .../apache/rocketmq/broker/processor/AdminBrokerProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java index 97ca51d966..c481d14d22 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/AdminBrokerProcessor.java @@ -1445,7 +1445,7 @@ public class AdminBrokerProcessor extends AsyncNettyRequestProcessor implements java.io.File commitLogDir = new java.io.File(this.brokerController.getMessageStoreConfig().getStorePathRootDir()); if (commitLogDir.exists()) { - runtimeInfo.put("commitLogDirCapacity", String.format("Total : %s, Free : %s.", MixAll.humanReadableByteCount(commitLogDir.getTotalSpace(), false), MixAll.humanReadableByteCount(commitLogDir.getFreeSpace(), false))); + runtimeInfo.put("commitLogDirCapacity", String.format("Total : %s, Free : %s.", MixAll.humanReadableByteCount(commitLogDir.getTotalSpace(), false), MixAll.humanReadableByteCount(commitLogDir.getUsableSpace(), false))); } return runtimeInfo; From 94abced3f7b391a560421247ad0c70401d4bd6a8 Mon Sep 17 00:00:00 2001 From: panzhi Date: Sat, 31 Jul 2021 02:06:50 +0800 Subject: [PATCH 79/83] [ISSUE #3199] Two timed task for RequestFutureTable (#3202) Co-authored-by: panzhi33 --- .../impl/producer/DefaultMQProducerImpl.java | 40 +++++++++++++------ .../client/producer/RequestFutureTable.java | 7 ++++ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java b/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java index fac3ed3561..00ee3b0a67 100644 --- a/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java +++ b/client/src/main/java/org/apache/rocketmq/client/impl/producer/DefaultMQProducerImpl.java @@ -24,14 +24,14 @@ import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; -import java.util.Timer; -import java.util.TimerTask; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -107,7 +107,12 @@ public class DefaultMQProducerImpl implements MQProducerInner { private final RPCHook rpcHook; private final BlockingQueue asyncSenderThreadPoolQueue; private final ExecutorService defaultAsyncSenderExecutor; - private final Timer timer = new Timer("RequestHouseKeepingService", true); + private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { + @Override + public Thread newThread(Runnable r) { + return new Thread(r, "RequestHouseKeepingService"); + } + }); protected BlockingQueue checkRequestQueue; protected ExecutorService checkExecutor; private ServiceState serviceState = ServiceState.CREATE_JUST; @@ -227,16 +232,23 @@ public class DefaultMQProducerImpl implements MQProducerInner { this.mQClientFactory.sendHeartbeatToAllBrokerWithLock(); - this.timer.scheduleAtFixedRate(new TimerTask() { - @Override - public void run() { - try { - RequestFutureTable.scanExpiredRequest(); - } catch (Throwable e) { - log.error("scan RequestFutureTable exception", e); + this.startScheduledTask(); + + } + + private void startScheduledTask() { + if (RequestFutureTable.getProducerNum().incrementAndGet() == 1) { + this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() { + @Override + public void run() { + try { + RequestFutureTable.scanExpiredRequest(); + } catch (Throwable e) { + log.error("scan RequestFutureTable exception", e); + } } - } - }, 1000 * 3, 1000); + }, 1000 * 3, 1000, TimeUnit.MILLISECONDS); + } } private void checkConfig() throws MQClientException { @@ -266,7 +278,9 @@ public class DefaultMQProducerImpl implements MQProducerInner { if (shutdownFactory) { this.mQClientFactory.shutdown(); } - this.timer.cancel(); + if (RequestFutureTable.getProducerNum().decrementAndGet() == 0) { + scheduledExecutorService.shutdown(); + } log.info("the producer [{}] shutdown OK", this.defaultMQProducer.getProducerGroup()); this.serviceState = ServiceState.SHUTDOWN_ALREADY; break; diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/RequestFutureTable.java b/client/src/main/java/org/apache/rocketmq/client/producer/RequestFutureTable.java index 3d4caa208b..52cda3e889 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/RequestFutureTable.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/RequestFutureTable.java @@ -22,6 +22,8 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + import org.apache.rocketmq.client.common.ClientErrorCode; import org.apache.rocketmq.client.exception.RequestTimeoutException; import org.apache.rocketmq.client.log.ClientLogger; @@ -30,6 +32,7 @@ import org.apache.rocketmq.logging.InternalLogger; public class RequestFutureTable { private static InternalLogger log = ClientLogger.getLog(); private static ConcurrentHashMap requestFutureTable = new ConcurrentHashMap(); + private static final AtomicInteger producerNum = new AtomicInteger(0); public static ConcurrentHashMap getRequestFutureTable() { return requestFutureTable; @@ -59,4 +62,8 @@ public class RequestFutureTable { } } } + + public static AtomicInteger getProducerNum() { + return producerNum; + } } From 5e58893e6bbfb435f7385b7d3a2244f19de5d03d Mon Sep 17 00:00:00 2001 From: zongtanghu Date: Sun, 1 Aug 2021 17:14:48 +0800 Subject: [PATCH 80/83] prepare to release rocketmq 4.9.1 version --- common/src/main/java/org/apache/rocketmq/common/MQVersion.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/org/apache/rocketmq/common/MQVersion.java b/common/src/main/java/org/apache/rocketmq/common/MQVersion.java index 48cd1582cc..1d6d1f5355 100644 --- a/common/src/main/java/org/apache/rocketmq/common/MQVersion.java +++ b/common/src/main/java/org/apache/rocketmq/common/MQVersion.java @@ -18,7 +18,7 @@ package org.apache.rocketmq.common; public class MQVersion { - public static final int CURRENT_VERSION = Version.V4_9_0.ordinal(); + public static final int CURRENT_VERSION = Version.V4_9_1.ordinal(); public static String getVersionDesc(int value) { int length = Version.values().length; From 73db2970ff9fc5bfa018af3715b9cf641346cbe3 Mon Sep 17 00:00:00 2001 From: zongtanghu Date: Sun, 1 Aug 2021 18:22:54 +0800 Subject: [PATCH 81/83] [#Issue3205]Fix the issue of code style in client and broker modules. --- .../broker/processor/AbstractSendMessageProcessor.java | 1 - .../apache/rocketmq/client/producer/RequestFutureTable.java | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java b/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java index 2debf7904f..35f8660e97 100644 --- a/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java +++ b/broker/src/main/java/org/apache/rocketmq/broker/processor/AbstractSendMessageProcessor.java @@ -22,7 +22,6 @@ import java.net.SocketAddress; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Random; import org.apache.rocketmq.broker.BrokerController; import org.apache.rocketmq.broker.mqtrace.SendMessageContext; diff --git a/client/src/main/java/org/apache/rocketmq/client/producer/RequestFutureTable.java b/client/src/main/java/org/apache/rocketmq/client/producer/RequestFutureTable.java index 52cda3e889..9bdc3da45e 100644 --- a/client/src/main/java/org/apache/rocketmq/client/producer/RequestFutureTable.java +++ b/client/src/main/java/org/apache/rocketmq/client/producer/RequestFutureTable.java @@ -32,7 +32,7 @@ import org.apache.rocketmq.logging.InternalLogger; public class RequestFutureTable { private static InternalLogger log = ClientLogger.getLog(); private static ConcurrentHashMap requestFutureTable = new ConcurrentHashMap(); - private static final AtomicInteger producerNum = new AtomicInteger(0); + private static final AtomicInteger PRODUCER_NUM = new AtomicInteger(0); public static ConcurrentHashMap getRequestFutureTable() { return requestFutureTable; @@ -64,6 +64,6 @@ public class RequestFutureTable { } public static AtomicInteger getProducerNum() { - return producerNum; + return PRODUCER_NUM; } } From a1bfe1afce40c08083cae770b777aa2c9067479d Mon Sep 17 00:00:00 2001 From: zongtanghu Date: Mon, 16 Aug 2021 21:20:36 +0800 Subject: [PATCH 82/83] [maven-release-plugin] prepare release rocketmq-all-4.9.1 --- acl/pom.xml | 2 +- broker/pom.xml | 2 +- client/pom.xml | 2 +- common/pom.xml | 2 +- distribution/pom.xml | 2 +- example/pom.xml | 2 +- filter/pom.xml | 2 +- logappender/pom.xml | 2 +- logging/pom.xml | 2 +- namesrv/pom.xml | 2 +- openmessaging/pom.xml | 2 +- pom.xml | 4 ++-- remoting/pom.xml | 2 +- srvutil/pom.xml | 2 +- store/pom.xml | 2 +- test/pom.xml | 2 +- tools/pom.xml | 2 +- 17 files changed, 18 insertions(+), 18 deletions(-) diff --git a/acl/pom.xml b/acl/pom.xml index d624934178..8b362ca369 100644 --- a/acl/pom.xml +++ b/acl/pom.xml @@ -13,7 +13,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1-SNAPSHOT + 4.9.1 rocketmq-acl rocketmq-acl ${project.version} diff --git a/broker/pom.xml b/broker/pom.xml index 3a58aa0c71..4eeb833d36 100644 --- a/broker/pom.xml +++ b/broker/pom.xml @@ -13,7 +13,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 diff --git a/client/pom.xml b/client/pom.xml index 95ef4617dd..40b262c0bf 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 diff --git a/common/pom.xml b/common/pom.xml index ac1d086b4c..538b2f3983 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 diff --git a/distribution/pom.xml b/distribution/pom.xml index a5698bca1c..da31262d5b 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -20,7 +20,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1-SNAPSHOT + 4.9.1 rocketmq-distribution rocketmq-distribution ${project.version} diff --git a/example/pom.xml b/example/pom.xml index 81f7515dbe..7c9faad947 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -19,7 +19,7 @@ rocketmq-all org.apache.rocketmq - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 diff --git a/filter/pom.xml b/filter/pom.xml index 41bda9d0d2..b4ec32f7d6 100644 --- a/filter/pom.xml +++ b/filter/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 diff --git a/logappender/pom.xml b/logappender/pom.xml index cac520b610..3ec5be8177 100644 --- a/logappender/pom.xml +++ b/logappender/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 rocketmq-logappender diff --git a/logging/pom.xml b/logging/pom.xml index 8ebb243045..db6c8d4a07 100644 --- a/logging/pom.xml +++ b/logging/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 diff --git a/namesrv/pom.xml b/namesrv/pom.xml index 01ef5b60fe..41f7e012ed 100644 --- a/namesrv/pom.xml +++ b/namesrv/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 diff --git a/openmessaging/pom.xml b/openmessaging/pom.xml index 4688c04043..db8aebd3d7 100644 --- a/openmessaging/pom.xml +++ b/openmessaging/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 diff --git a/pom.xml b/pom.xml index 59fe5c8072..c4fe658d9b 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 2012 org.apache.rocketmq rocketmq-all - 4.9.1-SNAPSHOT + 4.9.1 pom Apache RocketMQ ${project.version} http://rocketmq.apache.org/ @@ -38,7 +38,7 @@ git@github.com:apache/rocketmq.git scm:git:git@github.com:apache/rocketmq.git scm:git:git@github.com:apache/rocketmq.git - HEAD + rocketmq-all-4.9.1 diff --git a/remoting/pom.xml b/remoting/pom.xml index 765e1a93bc..6155379783 100644 --- a/remoting/pom.xml +++ b/remoting/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 diff --git a/srvutil/pom.xml b/srvutil/pom.xml index 9c4544c0b2..543483fd9b 100644 --- a/srvutil/pom.xml +++ b/srvutil/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 diff --git a/store/pom.xml b/store/pom.xml index 23e9763d81..ce040d82fa 100644 --- a/store/pom.xml +++ b/store/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index 41296501c2..1f159469b4 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 diff --git a/tools/pom.xml b/tools/pom.xml index abe8197de3..85ce2c6c39 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1-SNAPSHOT + 4.9.1 4.0.0 From a7e71cb4ca5351a3416199b5bc269713cfc352e3 Mon Sep 17 00:00:00 2001 From: zongtanghu Date: Mon, 16 Aug 2021 21:21:07 +0800 Subject: [PATCH 83/83] [maven-release-plugin] prepare for next development iteration --- acl/pom.xml | 2 +- broker/pom.xml | 2 +- client/pom.xml | 2 +- common/pom.xml | 2 +- distribution/pom.xml | 2 +- example/pom.xml | 2 +- filter/pom.xml | 2 +- logappender/pom.xml | 2 +- logging/pom.xml | 2 +- namesrv/pom.xml | 2 +- openmessaging/pom.xml | 2 +- pom.xml | 4 ++-- remoting/pom.xml | 2 +- srvutil/pom.xml | 2 +- store/pom.xml | 2 +- test/pom.xml | 2 +- tools/pom.xml | 2 +- 17 files changed, 18 insertions(+), 18 deletions(-) diff --git a/acl/pom.xml b/acl/pom.xml index 8b362ca369..f2cbdbe9e2 100644 --- a/acl/pom.xml +++ b/acl/pom.xml @@ -13,7 +13,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1 + 4.9.2-SNAPSHOT rocketmq-acl rocketmq-acl ${project.version} diff --git a/broker/pom.xml b/broker/pom.xml index 4eeb833d36..40c5730f44 100644 --- a/broker/pom.xml +++ b/broker/pom.xml @@ -13,7 +13,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0 diff --git a/client/pom.xml b/client/pom.xml index 40b262c0bf..9387eb3b68 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0 diff --git a/common/pom.xml b/common/pom.xml index 538b2f3983..defddd224f 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0 diff --git a/distribution/pom.xml b/distribution/pom.xml index da31262d5b..6f10ff4f9a 100644 --- a/distribution/pom.xml +++ b/distribution/pom.xml @@ -20,7 +20,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1 + 4.9.2-SNAPSHOT rocketmq-distribution rocketmq-distribution ${project.version} diff --git a/example/pom.xml b/example/pom.xml index 7c9faad947..9d6aec6433 100644 --- a/example/pom.xml +++ b/example/pom.xml @@ -19,7 +19,7 @@ rocketmq-all org.apache.rocketmq - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0 diff --git a/filter/pom.xml b/filter/pom.xml index b4ec32f7d6..2dd396e782 100644 --- a/filter/pom.xml +++ b/filter/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0 diff --git a/logappender/pom.xml b/logappender/pom.xml index 3ec5be8177..2a1111a624 100644 --- a/logappender/pom.xml +++ b/logappender/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0 rocketmq-logappender diff --git a/logging/pom.xml b/logging/pom.xml index db6c8d4a07..88c8e24ee3 100644 --- a/logging/pom.xml +++ b/logging/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0 diff --git a/namesrv/pom.xml b/namesrv/pom.xml index 41f7e012ed..dade790f02 100644 --- a/namesrv/pom.xml +++ b/namesrv/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0 diff --git a/openmessaging/pom.xml b/openmessaging/pom.xml index db8aebd3d7..dfa0780c05 100644 --- a/openmessaging/pom.xml +++ b/openmessaging/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0 diff --git a/pom.xml b/pom.xml index c4fe658d9b..af0db5c52c 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,7 @@ 2012 org.apache.rocketmq rocketmq-all - 4.9.1 + 4.9.2-SNAPSHOT pom Apache RocketMQ ${project.version} http://rocketmq.apache.org/ @@ -38,7 +38,7 @@ git@github.com:apache/rocketmq.git scm:git:git@github.com:apache/rocketmq.git scm:git:git@github.com:apache/rocketmq.git - rocketmq-all-4.9.1 + HEAD diff --git a/remoting/pom.xml b/remoting/pom.xml index 6155379783..a019a4d624 100644 --- a/remoting/pom.xml +++ b/remoting/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0 diff --git a/srvutil/pom.xml b/srvutil/pom.xml index 543483fd9b..5ba70577bb 100644 --- a/srvutil/pom.xml +++ b/srvutil/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0 diff --git a/store/pom.xml b/store/pom.xml index ce040d82fa..09f3dba9f3 100644 --- a/store/pom.xml +++ b/store/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0 diff --git a/test/pom.xml b/test/pom.xml index 1f159469b4..83e0e33705 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -20,7 +20,7 @@ rocketmq-all org.apache.rocketmq - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0 diff --git a/tools/pom.xml b/tools/pom.xml index 85ce2c6c39..ffab7442e5 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -19,7 +19,7 @@ org.apache.rocketmq rocketmq-all - 4.9.1 + 4.9.2-SNAPSHOT 4.0.0

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.}%8=VT?#j4XZC}7uk@p!j5%+v4Csrdw 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 literal 89290 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%0DC*XO}bPka!nPY3Z|< z=<`NjkHtI$3Wh3`AmdKcm7r8flj<$%Ml_Zm)8BtGmCTND%DNx(tr*R0A3Zd3?9lZ1 zw|ru|!Jvrx6kjeQ`}X{e2}QmqPCkal=#;+FuNtWGVt!4#u?I^`AYtZvO*48V)@eS@ zp4AE_t~FV6GioG@@%bcvN^%KHuOD3v#R$n6emXSv|CX#8G6+bCZeeu?&zWeV+#n?P8i7=rEEqc>XHG-DqR*!_8r1= za#?%z`_bImvp12Q2)qzUg-?2y@2`Hdoqyfv~pS)IT3h-7?#~ z%%Um2MEa(3UC^h$bf+-wKA50t=#2ICd_kwm=@8MGSNgW{^Jn5xQRP&j*O~3l_Lg$~ z&vwF{9k9?onuJU%!;@p?ikH(UpKecfdAerLW*Wb~sgcpW-y?sk&$^xT2bv`uy#`gD zrA}Gfg!k|9CcEZ@WY%VF;R#IUdWa<(XN@~A3xDu#8MU{f~6s<)-W6_27`ce{Q5-}3jDI9h|}Qe+_*{VW(BF0g#m32yc!rlwqt2z0`l<;!Suu&sTIZ`E!`pg{MIpwN?Z}G{{R9PCrR=hOqM-D@9 ze;Wt?wt3Hkb6<3qHToZ!=)Xr7KyuOrv~7(tAZxU){=z50$1S=4^7uc^4c|f-yx*3T zG9Ucx!56_MH2;;R|NDvPL9j1yUI#7QHZ~(CziC_nJ0VH+66T+R)DMEBU(T=CMuC+= zTQ_?~6QQK3yO?yOl6$@TpEZ>wjr-vrdT56>=HVrF7be2~ZtfE~xxM5>U|XaG%dJ3I zFlKiHB&Gbf;RE3%pk1vwWk;r-FDZV*M2zfIc(PVopga>M&X=fG14TU7+Vo%Fho8TM zw<}>=9J%rcWg|7ygzktv%la>|!nr(uFS4)iEIj^|9i}HA45q=?nI3`{|9z92JQd= literal 106758 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