Skip to content

Commit b5c7122

Browse files
committed
updated
1 parent eebf5c1 commit b5c7122

File tree

4 files changed

+30
-9
lines changed

4 files changed

+30
-9
lines changed

example_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1291,6 +1291,7 @@ func ExampleConnection_Do_failure() {
12911291

12921292
// We got a future, the request actually not performed yet.
12931293
future := conn.Do(req)
1294+
defer future.Release()
12941295

12951296
// When the future receives the response, the result of the Future is set
12961297
// and becomes available. We could wait for that moment with Future.Get(),
@@ -1305,7 +1306,7 @@ func ExampleConnection_Do_failure() {
13051306
fmt.Printf("Response error: %s\n", resp.Header().Error)
13061307
}
13071308

1308-
data, err := future.Get()
1309+
data, err := future.GetResult()
13091310
if err != nil {
13101311
fmt.Printf("Data: %v\n", data)
13111312
}

future.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,14 @@ func (fut *Future) Get() ([]interface{}, error) {
109109
return fut.resp.Decode()
110110
}
111111

112+
func (fut *Future) GetResult() ([]interface{}, error) {
113+
fut.wait()
114+
if fut.err != nil {
115+
return nil, fut.err
116+
}
117+
return fut.resp.Decode()
118+
}
119+
112120
// GetTyped waits for Future and calls msgpack.Decoder.Decode(result) if no error happens.
113121
// It is could be much faster than Get() function.
114122
//
@@ -122,6 +130,14 @@ func (fut *Future) GetTyped(result interface{}) error {
122130
return fut.resp.DecodeTyped(result)
123131
}
124132

133+
func (fut *Future) GetTypedResult(result interface{}) error {
134+
fut.wait()
135+
if fut.err != nil {
136+
return fut.err
137+
}
138+
return fut.resp.DecodeTyped(result)
139+
}
140+
125141
var closedChan = make(chan struct{})
126142

127143
func init() {

response.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,13 @@ func createBaseResponse(header Header, body io.Reader) (*baseResponse, error) {
6464
func (resp *baseResponse) clear() *[]byte {
6565
resp.header.RequestId, resp.header.Error = 0, 0
6666
resp.data = nil
67-
resp.buf.b = resp.buf.b[:0]
67+
ptr := resp.buf.b
68+
resp.buf.b = nil
6869
resp.buf.p = 0
6970
resp.decoded = false
7071
resp.decodedTyped = false
7172
resp.err = nil
72-
return &resp.buf.b
73+
return &ptr
7374
}
7475

7576
func (resp *baseResponse) Release() *[]byte {
@@ -719,7 +720,7 @@ func createSelectResponse(header Header, body io.Reader) (*SelectResponse, error
719720

720721
func (resp *SelectResponse) Release() *[]byte {
721722
ptr := resp.baseResponse.clear()
722-
resp.pos = resp.pos[:0]
723+
resp.pos = nil
723724

724725
selectResponsePool.Put(resp)
725726
return ptr

tarantool_test.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,7 @@ func TestFutureMultipleGetGetTyped(t *testing.T) {
529529
defer conn.Close()
530530

531531
fut := conn.Call17Async("simple_concat", []interface{}{"1"})
532+
defer fut.Release()
532533

533534
for i := 0; i < 30; i++ {
534535
// [0, 10) fut.Get()
@@ -540,7 +541,7 @@ func TestFutureMultipleGetGetTyped(t *testing.T) {
540541
}
541542

542543
if get {
543-
data, err := fut.Get()
544+
data, err := fut.GetResult()
544545
if err != nil {
545546
t.Errorf("Failed to call Get(): %s", err)
546547
}
@@ -551,7 +552,7 @@ func TestFutureMultipleGetGetTyped(t *testing.T) {
551552
tpl := struct {
552553
Val string
553554
}{}
554-
err := fut.GetTyped(&tpl)
555+
err := fut.GetTypedResult(&tpl)
555556
if err != nil {
556557
t.Errorf("Failed to call GetTyped(): %s", err)
557558
}
@@ -567,9 +568,10 @@ func TestFutureMultipleGetWithError(t *testing.T) {
567568
defer conn.Close()
568569

569570
fut := conn.Call17Async("non_exist", []interface{}{"1"})
571+
defer fut.Release()
570572

571573
for i := 0; i < 2; i++ {
572-
if _, err := fut.Get(); err == nil {
574+
if _, err := fut.GetResult(); err == nil {
573575
t.Fatalf("An error expected")
574576
}
575577
}
@@ -580,6 +582,7 @@ func TestFutureMultipleGetTypedWithError(t *testing.T) {
580582
defer conn.Close()
581583

582584
fut := conn.Call17Async("simple_concat", []interface{}{"1"})
585+
defer fut.Release()
583586

584587
wrongTpl := struct {
585588
Val int
@@ -588,10 +591,10 @@ func TestFutureMultipleGetTypedWithError(t *testing.T) {
588591
Val string
589592
}{}
590593

591-
if err := fut.GetTyped(&wrongTpl); err == nil {
594+
if err := fut.GetTypedResult(&wrongTpl); err == nil {
592595
t.Fatalf("An error expected")
593596
}
594-
if err := fut.GetTyped(&goodTpl); err != nil {
597+
if err := fut.GetTypedResult(&goodTpl); err != nil {
595598
t.Fatalf("Unexpected error: %s", err)
596599
}
597600
if goodTpl.Val != "11" {

0 commit comments

Comments
 (0)