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 1819b26
Show file tree
Hide file tree
Showing 2 changed files with 114 additions and 1 deletion.
105 changes: 105 additions & 0 deletions suguar.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package vshard_router

Check warning on line 1 in suguar.go

View workflow job for this annotation

GitHub Actions / lint

var-naming: don't use an underscore in package name (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
err error

Check failure on line 17 in suguar.go

View workflow job for this annotation

GitHub Actions / lint

field `err` is unused (unused)
}

// 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 1819b26

Please sign in to comment.