You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@rocketmq.apache.org by di...@apache.org on 2020/02/24 02:40:52 UTC

[rocketmq-client-go] branch native updated: feat: reuse bytes.Buffer (#408)

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

dinglei pushed a commit to branch native
in repository https://gitbox.apache.org/repos/asf/rocketmq-client-go.git


The following commit(s) were added to refs/heads/native by this push:
     new 2e05fc0  feat: reuse bytes.Buffer (#408)
2e05fc0 is described below

commit 2e05fc0598fd08e03d6f66f8dec98269d31042fe
Author: xujianhai666 <52...@users.noreply.github.com>
AuthorDate: Mon Feb 24 10:40:43 2020 +0800

    feat: reuse bytes.Buffer (#408)
    
    - use sync.pool of bytes.Buffer instead of new
    closes #407
---
 primitive/message.go     | 11 ++++++-----
 primitive/pool.go        | 16 ++++++++++++++++
 primitive/result_test.go | 15 +++++++++++++--
 3 files changed, 35 insertions(+), 7 deletions(-)

diff --git a/primitive/message.go b/primitive/message.go
index 12f41cc..7d12edb 100644
--- a/primitive/message.go
+++ b/primitive/message.go
@@ -364,7 +364,7 @@ func DecodeMessage(data []byte) []*MessageExt {
 		}
 		count += 2 + int(propertiesLength)
 
-		msg.MsgId = createMessageId(hostBytes, port, msg.CommitLogOffset)
+		msg.MsgId = CreateMessageId(hostBytes, port, msg.CommitLogOffset)
 		//count += 16
 		if msg.properties == nil {
 			msg.properties = make(map[string]string, 0)
@@ -436,11 +436,12 @@ type MessageID struct {
 	Offset int64
 }
 
-func createMessageId(addr []byte, port int32, offset int64) string {
-	buffer := new(bytes.Buffer)
+func CreateMessageId(addr []byte, port int32, offset int64) string {
+	buffer := GetBuffer()
+	defer BackBuffer(buffer)
 	buffer.Write(addr)
-	binary.Write(buffer, binary.BigEndian, port)
-	binary.Write(buffer, binary.BigEndian, offset)
+	_ = binary.Write(buffer, binary.BigEndian, port)
+	_ = binary.Write(buffer, binary.BigEndian, offset)
 	return strings.ToUpper(hex.EncodeToString(buffer.Bytes()))
 }
 
diff --git a/primitive/pool.go b/primitive/pool.go
index 5f729e7..946c18e 100644
--- a/primitive/pool.go
+++ b/primitive/pool.go
@@ -18,15 +18,20 @@ limitations under the License.
 package primitive
 
 import (
+	"bytes"
 	"sync"
 )
 
 var headerPool = sync.Pool{}
+var bufferPool = sync.Pool{}
 
 func init() {
 	headerPool.New = func() interface{} {
 		return make([]byte, 4)
 	}
+	bufferPool.New = func() interface{} {
+		return new(bytes.Buffer)
+	}
 }
 
 func GetHeader() []byte {
@@ -38,3 +43,14 @@ func GetHeader() []byte {
 func BackHeader(d []byte) {
 	headerPool.Put(d)
 }
+
+func GetBuffer() *bytes.Buffer {
+	b := bufferPool.Get().(*bytes.Buffer)
+	b.Reset()
+	return b
+}
+
+func BackBuffer(b *bytes.Buffer) {
+	b.Reset()
+	bufferPool.Put(b)
+}
diff --git a/primitive/result_test.go b/primitive/result_test.go
index c0dd97e..fcc03cf 100644
--- a/primitive/result_test.go
+++ b/primitive/result_test.go
@@ -41,11 +41,22 @@ func TestCreateMessageId(t *testing.T) {
 		b := []byte{10, 93, 233, 58}
 		port := int32(10911)
 		offset := int64(4391252)
-		id := createMessageId(b, port, offset)
-
+		id := CreateMessageId(b, port, offset)
 		Convey("generated messageId should be equal to expected", func() {
 			assert.Equal(t, "0A5DE93A00002A9F0000000000430154", id)
 		})
+
+		b2 := []byte("127.0.0.1")
+		port2 := int32(11)
+		offset2 := int64(12)
+		id2 := CreateMessageId(b2, port2, offset2)
+		Convey("new generated messageId should be equal to expected", func() {
+			assert.Equal(t, "3132372E302E302E310000000B000000000000000C", id2)
+		})
+
+		Convey("ex-generated messageId should not change", func() {
+			assert.Equal(t, "0A5DE93A00002A9F0000000000430154", id)
+		})
 	})
 
 }