Skip to content
This repository has been archived by the owner on Dec 23, 2024. It is now read-only.

Commit

Permalink
feature/suguar: implement go-tarantool like faces for sharded taranto…
Browse files Browse the repository at this point in the history
…ol request
  • Loading branch information
Maksim Konovalov committed Sep 9, 2024
1 parent 384bd3b commit f460444
Show file tree
Hide file tree
Showing 3 changed files with 114 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
FEATURES:

* Support new Sprintf-like logging interface (#48)
* Added call interfaces backwards compatible with go-tarantool (#31).

REFACTOR:

Expand Down
104 changes: 104 additions & 0 deletions suguar.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package vshard_router //nolint:revive

import (
"context"
"fmt"

"github.com/tarantool/go-tarantool/v2/pool"
)

// CallRequest helps you to create a call request object for execution
// by a Connection.
type CallRequest struct {
ctx context.Context
fnc string
args interface{}
bucketID uint64
}

// CallResponse is a backwards-compatible structure with go-tarantool for easier replacement.
type CallResponse struct {
rawResp interface{}
getTypedFnc StorageResultTypedFunc
err error
}

// NewCallRequest returns a new empty CallRequest.
func (r *Router) NewCallRequest(function string) *CallRequest {
req := new(CallRequest)
req.fnc = function
return req
}

// Do perform a request asynchronously on the connection.
func (r *Router) Do(req *CallRequest, userMode pool.Mode) *CallResponse {
ctx := req.ctx
bucketID := req.bucketID
resp := new(CallResponse)

if req.bucketID == 0 {
if r.cfg.BucketGetter == nil {
resp.err = fmt.Errorf("bucket id for request is not set")
return resp
}

bucketID = r.cfg.BucketGetter(ctx)
}

vshardMode := ReadMode

if userMode == pool.RW {
vshardMode = WriteMode
}

resp.rawResp, resp.getTypedFnc, resp.err = r.RouterCallImpl(ctx,
bucketID,
CallOpts{
Timeout: r.cfg.RequestTimeout,
PoolMode: userMode,
VshardMode: vshardMode,
},
req.fnc,
req.args)

return resp
}

// Args sets the args for the eval request.
// Note: default value is empty.
func (req *CallRequest) Args(args interface{}) *CallRequest {
req.args = args
return req
}

// Context sets a passed context to the request.
func (req *CallRequest) Context(ctx context.Context) *CallRequest {
req.ctx = ctx
return req
}

// BucketID method that sets the bucketID for your request.
// You can ignore this parameter if you have a bucketGetter.
// However, this method has a higher priority.
func (req *CallRequest) BucketID(bucketID uint64) *CallRequest {
req.bucketID = bucketID
return req
}

// GetTyped waits for Future and calls msgpack.Decoder.Decode(result) if no error happens.
func (resp *CallResponse) GetTyped(result interface{}) error {
if resp.err != nil {
return resp.err
}

return resp.getTypedFnc(result)
}

// Get waits for Future to be filled and returns the data of the Response and error.
func (resp *CallResponse) Get() ([]interface{}, error) {
if resp.err != nil {
return nil, resp.err
}

return []interface{}{resp.rawResp}, nil
}
10 changes: 9 additions & 1 deletion vshard.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,13 +92,21 @@ type Config struct {
TopologyProvider TopologyProvider // TopologyProvider is required provider

// Discovery
DiscoveryTimeout time.Duration // DiscoveryTimeout is timeout between cron discovery job; by default there is no timeout
// DiscoveryTimeout is timeout between cron discovery job; by default there is no timeout.
DiscoveryTimeout time.Duration
DiscoveryMode DiscoveryMode

TotalBucketCount uint64
User string
Password string
PoolOpts tarantool.Opts

// BucketGetter is an optional argument.
// You can specify a function that will receive the bucket id from the context.
// This is useful if you use middleware that inserts the calculated bucket id into the request context.
BucketGetter func(ctx context.Context) uint64
// RequestTimeout timeout for requests to Tarantool.
RequestTimeout time.Duration
}

type BucketStatInfo struct {
Expand Down

0 comments on commit f460444

Please sign in to comment.