Skip to content

Commit ce667de

Browse files
ermyaroleg-jukovec
andcommitted
internal: add Release method for SelectResponse
The commit implements the SelectResponse.Release() method that frees resources allocated for the response pointer to a sync.Pool. Part of #493 Co-authored-by: Oleg Jukovec <oleg.jukovec@gmail.com>
1 parent 6740787 commit ce667de

3 files changed

Lines changed: 76 additions & 3 deletions

File tree

request.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -620,14 +620,23 @@ func (req *SelectRequest) Context(ctx context.Context) *SelectRequest {
620620
return req
621621
}
622622

623+
var selectsPool *sync.Pool = &sync.Pool{
624+
New: func() interface{} {
625+
return &SelectResponse{}
626+
},
627+
}
628+
623629
// Response creates a response for the SelectRequest.
624630
func (req *SelectRequest) Response(header Header, body io.Reader) (Response, error) {
625-
baseResp, err := createBaseResponse(header, body)
631+
base, err := createBaseResponse(header, body)
626632
if err != nil {
627633
return nil, err
628634
}
629635

630-
return &SelectResponse{baseResponse: baseResp}, nil
636+
s := selectsPool.Get().(*SelectResponse)
637+
s.baseResponse = base
638+
639+
return s, nil
631640
}
632641

633642
// InsertRequest helps you to create an insert request object for execution

response.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -681,7 +681,10 @@ func (resp *baseResponse) Header() Header {
681681

682682
func (resp *SelectResponse) Release() {
683683
resp.baseResponse.Release()
684-
resp.pos = nil
684+
685+
*resp = SelectResponse{}
686+
687+
selectsPool.Put(resp)
685688
}
686689

687690
// Pos returns a position descriptor of the last selected tuple for the SelectResponse.

response_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,64 @@ func TestSelectResponseRelease(t *testing.T) {
9393
require.True(t, ok)
9494
require.Equal(t, tarantool.SelectResponse{}, *selResp)
9595
}
96+
97+
func TestSelectResponseReleaseReuse(t *testing.T) {
98+
req := tarantool.NewSelectRequest(nil)
99+
100+
header1 := tarantool.Header{RequestId: 100}
101+
buf1 := []byte{'d', 'a', 't', 'a', '1'}
102+
resp1, err := req.Response(header1, encodeResponseData(t, buf1))
103+
require.NoError(t, err)
104+
105+
data1, err := resp1.Decode()
106+
require.NoError(t, err)
107+
require.Equal(t, []interface{}{buf1}, data1)
108+
109+
resp1.Release()
110+
111+
header2 := tarantool.Header{RequestId: 200}
112+
buf2 := []byte{'d', 'a', 't', 'a', '2'}
113+
resp2, err := req.Response(header2, encodeResponseData(t, buf2))
114+
require.NoError(t, err)
115+
116+
data2, err := resp2.Decode()
117+
require.NoError(t, err)
118+
require.Equal(t, []interface{}{buf2}, data2)
119+
require.Equal(t, header2, resp2.Header())
120+
require.Equal(t, []interface{}{buf2}, data2)
121+
}
122+
123+
func TestSelectResponseReleaseMultipleObjects(t *testing.T) {
124+
req := tarantool.NewSelectRequest(nil)
125+
126+
header1 := tarantool.Header{RequestId: 1}
127+
buf1 := []byte{'o', 'n', 'e'}
128+
resp1, err := req.Response(header1, encodeResponseData(t, buf1))
129+
require.NoError(t, err)
130+
131+
header2 := tarantool.Header{RequestId: 2}
132+
buf2 := []byte{'t', 'w', 'o'}
133+
resp2, err := req.Response(header2, encodeResponseData(t, buf2))
134+
require.NoError(t, err)
135+
136+
data1, err := resp1.Decode()
137+
require.NoError(t, err)
138+
require.Equal(t, []interface{}{buf1}, data1)
139+
140+
data2, err := resp2.Decode()
141+
require.NoError(t, err)
142+
require.Equal(t, []interface{}{buf2}, data2)
143+
144+
resp1.Release()
145+
resp2.Release()
146+
147+
header3 := tarantool.Header{RequestId: 3}
148+
buf3 := []byte{'t', 'h', 'r', 'e', 'e'}
149+
resp3, err := req.Response(header3, encodeResponseData(t, buf3))
150+
require.NoError(t, err)
151+
152+
data3, err := resp3.Decode()
153+
require.NoError(t, err)
154+
require.Equal(t, []interface{}{buf3}, data3)
155+
require.Equal(t, header3, resp3.Header())
156+
}

0 commit comments

Comments
 (0)