diff --git a/conf.sample.yml b/conf.sample.yml index 673c9e9..ec3ec8b 100644 --- a/conf.sample.yml +++ b/conf.sample.yml @@ -35,7 +35,8 @@ ### flollowing config is only for some Driver # DataExpire: 604800 # Trans data will expire in 7 days. only for redis/boltdb. -# RedisPrefix: '{}' # default value is '{}'. Redis storage prefix. store data to only one slot in cluster +# SuccessDataExpire: 86400 # successful Trans data will expire in 1 days. only for redis. +# RedisPrefix: '{a}' # default value is '{a}'. Redis storage prefix. store data to only one slot in cluster # MicroService: # Driver: 'dtm-driver-gozero' # name of the driver to handle register/discover diff --git a/dtmcli/barrier.go b/dtmcli/barrier.go index 492296d..1fcf61f 100644 --- a/dtmcli/barrier.go +++ b/dtmcli/barrier.go @@ -38,7 +38,7 @@ func (bb *BranchBarrier) newBarrierID() string { // BarrierFromQuery construct transaction info from request func BarrierFromQuery(qs url.Values) (*BranchBarrier, error) { - return BarrierFrom(qs.Get("trans_type"), qs.Get("gid"), qs.Get("branch_id"), qs.Get("op")) + return BarrierFrom(dtmimp.EscapeGet(qs, "trans_type"), dtmimp.EscapeGet(qs, "gid"), dtmimp.EscapeGet(qs, "branch_id"), dtmimp.EscapeGet(qs, "op")) } // BarrierFrom construct transaction info from request @@ -55,17 +55,9 @@ func BarrierFrom(transType, gid, branchID, op string) (*BranchBarrier, error) { return ti, nil } -func insertBarrier(tx DB, transType string, gid string, branchID string, op string, barrierID string, reason string) (int64, error) { - if op == "" { - return 0, nil - } - sql := dtmimp.GetDBSpecial().GetInsertIgnoreTemplate(dtmimp.BarrierTableName+"(trans_type, gid, branch_id, op, barrier_id, reason) values(?,?,?,?,?,?)", "uniq_barrier") - return dtmimp.DBExec(tx, sql, transType, gid, branchID, op, barrierID, reason) -} - -// Call 子事务屏障,详细介绍见 https://zhuanlan.zhihu.com/p/388444465 -// tx: 本地数据库的事务对象,允许子事务屏障进行事务操作 -// busiCall: 业务函数,仅在必要时被调用 +// Call see detail description in https://en.dtm.pub/practice/barrier.html +// tx: local transaction connection +// busiCall: busi func func (bb *BranchBarrier) Call(tx *sql.Tx, busiCall BarrierBusiFunc) (rerr error) { bid := bb.newBarrierID() defer dtmimp.DeferDo(&rerr, func() error { @@ -74,12 +66,12 @@ func (bb *BranchBarrier) Call(tx *sql.Tx, busiCall BarrierBusiFunc) (rerr error) return tx.Rollback() }) originOp := map[string]string{ - BranchCancel: BranchTry, - BranchCompensate: BranchAction, + dtmimp.OpCancel: dtmimp.OpTry, + dtmimp.OpCompensate: dtmimp.OpAction, }[bb.Op] - originAffected, oerr := insertBarrier(tx, bb.TransType, bb.Gid, bb.BranchID, originOp, bid, bb.Op) - currentAffected, rerr := insertBarrier(tx, bb.TransType, bb.Gid, bb.BranchID, bb.Op, bid, bb.Op) + originAffected, oerr := dtmimp.InsertBarrier(tx, bb.TransType, bb.Gid, bb.BranchID, originOp, bid, bb.Op) + currentAffected, rerr := dtmimp.InsertBarrier(tx, bb.TransType, bb.Gid, bb.BranchID, bb.Op, bid, bb.Op) logger.Debugf("originAffected: %d currentAffected: %d", originAffected, currentAffected) if rerr == nil && bb.Op == dtmimp.MsgDoOp && currentAffected == 0 { // for msg's DoAndSubmit, repeated insert should be rejected. @@ -90,7 +82,7 @@ func (bb *BranchBarrier) Call(tx *sql.Tx, busiCall BarrierBusiFunc) (rerr error) rerr = oerr } - if (bb.Op == BranchCancel || bb.Op == BranchCompensate) && originAffected > 0 || // null compensate + if (bb.Op == dtmimp.OpCancel || bb.Op == dtmimp.OpCompensate) && originAffected > 0 || // null compensate currentAffected == 0 { // repeated request or dangled request return } @@ -111,13 +103,13 @@ func (bb *BranchBarrier) CallWithDB(db *sql.DB, busiCall BarrierBusiFunc) error // QueryPrepared queries prepared data func (bb *BranchBarrier) QueryPrepared(db *sql.DB) error { - _, err := insertBarrier(db, bb.TransType, bb.Gid, dtmimp.MsgDoBranch0, dtmimp.MsgDoOp, dtmimp.MsgDoBarrier1, "rollback") + _, err := dtmimp.InsertBarrier(db, bb.TransType, bb.Gid, dtmimp.MsgDoBranch0, dtmimp.MsgDoOp, dtmimp.MsgDoBarrier1, dtmimp.OpRollback) var reason string if err == nil { sql := fmt.Sprintf("select reason from %s where gid=? and branch_id=? and op=? and barrier_id=?", dtmimp.BarrierTableName) err = db.QueryRow(sql, bb.Gid, dtmimp.MsgDoBranch0, dtmimp.MsgDoOp, dtmimp.MsgDoBarrier1).Scan(&reason) } - if reason == "rollback" { + if reason == dtmimp.OpRollback { return ErrFailure } return err diff --git a/dtmcli/barrier_mongo.go b/dtmcli/barrier_mongo.go index 5604eeb..d6c7f9b 100644 --- a/dtmcli/barrier_mongo.go +++ b/dtmcli/barrier_mongo.go @@ -25,8 +25,8 @@ func (bb *BranchBarrier) MongoCall(mc *mongo.Client, busiCall func(mongo.Session return sc.AbortTransaction(sc) }) originOp := map[string]string{ - BranchCancel: BranchTry, - BranchCompensate: BranchAction, + dtmimp.OpCancel: dtmimp.OpTry, + dtmimp.OpCompensate: dtmimp.OpAction, }[bb.Op] originAffected, oerr := mongoInsertBarrier(sc, mc, bb.TransType, bb.Gid, bb.BranchID, originOp, bid, bb.Op) @@ -40,7 +40,7 @@ func (bb *BranchBarrier) MongoCall(mc *mongo.Client, busiCall func(mongo.Session if rerr == nil { rerr = oerr } - if (bb.Op == BranchCancel || bb.Op == BranchCompensate) && originAffected > 0 || // null compensate + if (bb.Op == dtmimp.OpCancel || bb.Op == dtmimp.OpCompensate) && originAffected > 0 || // null compensate currentAffected == 0 { // repeated request or dangled request return } @@ -54,7 +54,7 @@ func (bb *BranchBarrier) MongoCall(mc *mongo.Client, busiCall func(mongo.Session // MongoQueryPrepared query prepared for redis // experimental func (bb *BranchBarrier) MongoQueryPrepared(mc *mongo.Client) error { - _, err := mongoInsertBarrier(context.Background(), mc, bb.TransType, bb.Gid, dtmimp.MsgDoBranch0, dtmimp.MsgDoOp, dtmimp.MsgDoBarrier1, "rollback") + _, err := mongoInsertBarrier(context.Background(), mc, bb.TransType, bb.Gid, dtmimp.MsgDoBranch0, dtmimp.MsgDoOp, dtmimp.MsgDoBarrier1, dtmimp.OpRollback) var result bson.M if err == nil { fs := strings.Split(dtmimp.BarrierTableName, ".") @@ -70,7 +70,7 @@ func (bb *BranchBarrier) MongoQueryPrepared(mc *mongo.Client) error { if err == nil { reason, _ = result["reason"].(string) } - if err == nil && reason == "rollback" { + if err == nil && reason == dtmimp.OpRollback { return ErrFailure } return err diff --git a/dtmcli/barrier_redis.go b/dtmcli/barrier_redis.go index 1ff1591..cef1b39 100644 --- a/dtmcli/barrier_redis.go +++ b/dtmcli/barrier_redis.go @@ -13,8 +13,8 @@ func (bb *BranchBarrier) RedisCheckAdjustAmount(rd *redis.Client, key string, am bid := bb.newBarrierID() bkey1 := fmt.Sprintf("%s-%s-%s-%s", bb.Gid, bb.BranchID, bb.Op, bid) originOp := map[string]string{ - BranchCancel: BranchTry, - BranchCompensate: BranchAction, + dtmimp.OpCancel: dtmimp.OpTry, + dtmimp.OpCompensate: dtmimp.OpAction, }[bb.Op] bkey2 := fmt.Sprintf("%s-%s-%s-%s", bb.Gid, bb.BranchID, originOp, bid) v, err := rd.Eval(rd.Context(), ` -- RedisCheckAdjustAmount diff --git a/dtmcli/consts.go b/dtmcli/consts.go index 814f17f..fad9776 100644 --- a/dtmcli/consts.go +++ b/dtmcli/consts.go @@ -12,31 +12,18 @@ import ( const ( // StatusPrepared status for global/branch trans status. + // first step, tx preparation period StatusPrepared = "prepared" // StatusSubmitted status for global trans status. StatusSubmitted = "submitted" // StatusSucceed status for global/branch trans status. StatusSucceed = "succeed" // StatusFailed status for global/branch trans status. + // NOTE: change global status to failed can stop trigger (Not recommended in production env) StatusFailed = "failed" // StatusAborting status for global trans status. StatusAborting = "aborting" - // BranchTry branch type for TCC - BranchTry = "try" - // BranchConfirm branch type for TCC - BranchConfirm = "confirm" - // BranchCancel branch type for TCC - BranchCancel = "cancel" - // BranchAction branch type for message, SAGA, XA - BranchAction = "action" - // BranchCompensate branch type for SAGA - BranchCompensate = "compensate" - // BranchCommit branch type for XA - BranchCommit = "commit" - // BranchRollback branch type for XA - BranchRollback = "rollback" - // ResultSuccess for result of a trans/trans branch ResultSuccess = dtmimp.ResultSuccess // ResultFailure for result of a trans/trans branch diff --git a/dtmcli/dtmimp/README-cn.md b/dtmcli/dtmimp/README-cn.md new file mode 100644 index 0000000..ba4fb25 --- /dev/null +++ b/dtmcli/dtmimp/README-cn.md @@ -0,0 +1,2 @@ +## 注意 +此包带imp后缀,主要被dtm内部使用,相关接口可能会发生变更,请勿使用这里的接口 \ No newline at end of file diff --git a/dtmcli/dtmimp/README.md b/dtmcli/dtmimp/README.md index ba4fb25..06aa51e 100644 --- a/dtmcli/dtmimp/README.md +++ b/dtmcli/dtmimp/README.md @@ -1,2 +1,2 @@ -## 注意 -此包带imp后缀,主要被dtm内部使用,相关接口可能会发生变更,请勿使用这里的接口 \ No newline at end of file +## Notice +Please donot use this package, and this package should only be used in dtm internally. The interfaces are not stable, and package name has postfix "imp" \ No newline at end of file diff --git a/dtmcli/dtmimp/consts.go b/dtmcli/dtmimp/consts.go index f17bccb..95757ac 100644 --- a/dtmcli/dtmimp/consts.go +++ b/dtmcli/dtmimp/consts.go @@ -8,11 +8,30 @@ package dtmimp const ( // ResultFailure for result of a trans/trans branch + // Same as HTTP status 409 and GRPC code 10 ResultFailure = "FAILURE" // ResultSuccess for result of a trans/trans branch + // Same as HTTP status 200 and GRPC code 0 ResultSuccess = "SUCCESS" // ResultOngoing for result of a trans/trans branch + // Same as HTTP status 425 and GRPC code 9 ResultOngoing = "ONGOING" + + // OpTry branch type for TCC + OpTry = "try" + // OpConfirm branch type for TCC + OpConfirm = "confirm" + // OpCancel branch type for TCC + OpCancel = "cancel" + // OpAction branch type for message, SAGA, XA + OpAction = "action" + // OpCompensate branch type for SAGA + OpCompensate = "compensate" + // OpCommit branch type for XA + OpCommit = "commit" + // OpRollback branch type for XA + OpRollback = "rollback" + // DBTypeMysql const for driver mysql DBTypeMysql = "mysql" // DBTypePostgres const for driver postgres @@ -33,4 +52,7 @@ const ( MsgDoBarrier1 = "01" // MsgDoOp const for DoAndSubmit barrier op MsgDoOp = "msg" + + // XaBarrier1 const for xa barrier id + XaBarrier1 = "01" ) diff --git a/dtmcli/dtmimp/trans_base.go b/dtmcli/dtmimp/trans_base.go index fba19cc..ec30d6b 100644 --- a/dtmcli/dtmimp/trans_base.go +++ b/dtmcli/dtmimp/trans_base.go @@ -43,20 +43,20 @@ func (g *BranchIDGen) CurrentSubBranchID() string { // TransOptions transaction options type TransOptions struct { WaitResult bool `json:"wait_result,omitempty" gorm:"-"` - TimeoutToFail int64 `json:"timeout_to_fail,omitempty" gorm:"-"` // for trans type: xa, tcc - RequestTimeout int64 `json:"requestTimeout" gorm:"-"` // for global trans resets request timeout - RetryInterval int64 `json:"retry_interval,omitempty" gorm:"-"` // for trans type: msg saga xa tcc - PassthroughHeaders []string `json:"passthrough_headers,omitempty" gorm:"-"` - BranchHeaders map[string]string `json:"branch_headers,omitempty" gorm:"-"` - Concurrent bool `json:"concurrent" gorm:"-"` // for trans type: saga msg + TimeoutToFail int64 `json:"timeout_to_fail,omitempty" gorm:"-"` // for trans type: xa, tcc, unit: second + RequestTimeout int64 `json:"requestTimeout" gorm:"-"` // for global trans resets request timeout, unit: second + RetryInterval int64 `json:"retry_interval,omitempty" gorm:"-"` // for trans type: msg saga xa tcc, unit: second + PassthroughHeaders []string `json:"passthrough_headers,omitempty" gorm:"-"` // for inherit the specified gin context headers + BranchHeaders map[string]string `json:"branch_headers,omitempty" gorm:"-"` // custom branch headers, dtm server => service api + Concurrent bool `json:"concurrent" gorm:"-"` // for trans type: saga msg } // TransBase base for all trans type TransBase struct { - Gid string `json:"gid"` + Gid string `json:"gid"` // NOTE: unique in storage, can customize the generation rules instead of using server-side generation, it will help with the tracking TransType string `json:"trans_type"` Dtm string `json:"-"` - CustomData string `json:"custom_data,omitempty"` + CustomData string `json:"custom_data,omitempty"` // nosql data persistence TransOptions Steps []map[string]string `json:"steps,omitempty"` // use in MSG/SAGA @@ -87,7 +87,7 @@ func (t *TransBase) WithGlobalTransRequestTimeout(timeout int64) { // TransBaseFromQuery construct transaction info from request func TransBaseFromQuery(qs url.Values) *TransBase { - return NewTransBase(qs.Get("gid"), qs.Get("trans_type"), qs.Get("dtm"), qs.Get("branch_id")) + return NewTransBase(EscapeGet(qs, "gid"), EscapeGet(qs, "trans_type"), EscapeGet(qs, "dtm"), EscapeGet(qs, "branch_id")) } // TransCallDtm TransBase call dtm @@ -142,15 +142,19 @@ func TransRequestBranch(t *TransBase, method string, body interface{}, branchID if url == "" { return nil, nil } + query := map[string]string{ + "dtm": t.Dtm, + "gid": t.Gid, + "branch_id": branchID, + "trans_type": t.TransType, + "op": op, + } + if t.TransType == "xa" { // xa trans will add notify_url + query["phase2_url"] = url + } resp, err := RestyClient.R(). SetBody(body). - SetQueryParams(map[string]string{ - "dtm": t.Dtm, - "gid": t.Gid, - "branch_id": branchID, - "trans_type": t.TransType, - "op": op, - }). + SetQueryParams(query). SetHeaders(t.BranchHeaders). Execute(method, url) if err == nil { diff --git a/dtmcli/dtmimp/trans_xa_base.go b/dtmcli/dtmimp/trans_xa_base.go index d1eb352..6404c31 100644 --- a/dtmcli/dtmimp/trans_xa_base.go +++ b/dtmcli/dtmimp/trans_xa_base.go @@ -11,35 +11,29 @@ import ( "strings" ) -// XaClientBase XaClient/XaGrpcClient base. shared by http and grpc -type XaClientBase struct { - Server string - Conf DBConf - NotifyURL string -} - -// HandleCallback Handle the callback of commit/rollback -func (xc *XaClientBase) HandleCallback(gid string, branchID string, action string) error { - db, err := StandaloneDB(xc.Conf) +// XaHandlePhase2 Handle the callback of commit/rollback +func XaHandlePhase2(gid string, dbConf DBConf, branchID string, op string) error { + db, err := PooledDB(dbConf) if err != nil { return err } - defer func() { - _ = db.Close() - }() xaID := gid + "-" + branchID - _, err = DBExec(db, GetDBSpecial().GetXaSQL(action, xaID)) + _, err = DBExec(db, GetDBSpecial().GetXaSQL(op, xaID)) if err != nil && (strings.Contains(err.Error(), "XAER_NOTA") || strings.Contains(err.Error(), "does not exist")) { // Repeat commit/rollback with the same id, report this error, ignore err = nil } + if op == OpRollback && err == nil { + // rollback insert a row after prepare. no-error means prepare has finished. + _, err = InsertBarrier(db, "xa", gid, branchID, OpAction, XaBarrier1, op) + } return err } -// HandleLocalTrans public handler of LocalTransaction via http/grpc -func (xc *XaClientBase) HandleLocalTrans(xa *TransBase, cb func(*sql.DB) error) (rerr error) { +// XaHandleLocalTrans public handler of LocalTransaction via http/grpc +func XaHandleLocalTrans(xa *TransBase, dbConf DBConf, cb func(*sql.DB) error) (rerr error) { xaBranch := xa.Gid + "-" + xa.BranchID - db, rerr := StandaloneDB(xc.Conf) + db, rerr := StandaloneDB(dbConf) if rerr != nil { return } @@ -57,17 +51,20 @@ func (xc *XaClientBase) HandleLocalTrans(xa *TransBase, cb func(*sql.DB) error) defer func() { _, _ = DBExec(db, GetDBSpecial().GetXaSQL("end", xaBranch)) }() - rerr = cb(db) + // prepare and rollback both insert a row + _, rerr = InsertBarrier(db, xa.TransType, xa.Gid, xa.BranchID, OpAction, XaBarrier1, OpAction) + if rerr == nil { + rerr = cb(db) + } return } -// HandleGlobalTrans http/grpc GlobalTransaction的公共方法 -func (xc *XaClientBase) HandleGlobalTrans(xa *TransBase, callDtm func(string) error, callBusi func() error) (rerr error) { +// XaHandleGlobalTrans http/grpc GlobalTransaction shared func +func XaHandleGlobalTrans(xa *TransBase, callDtm func(string) error, callBusi func() error) (rerr error) { rerr = callDtm("prepare") if rerr != nil { return } - // 小概率情况下,prepare成功了,但是由于网络状况导致上面Failure,那么不执行下面defer的内容,等待超时后再回滚标记事务失败,也没有问题 defer DeferDo(&rerr, func() error { return callDtm("submit") }, func() error { diff --git a/dtmcli/dtmimp/utils.go b/dtmcli/dtmimp/utils.go index 285d186..1af1fd9 100644 --- a/dtmcli/dtmimp/utils.go +++ b/dtmcli/dtmimp/utils.go @@ -12,6 +12,7 @@ import ( "errors" "fmt" "net/http" + "net/url" "os" "runtime" "strconv" @@ -235,3 +236,26 @@ func DeferDo(rerr *error, success func() error, fail func() error) { } }() } + +// Escape solve CodeQL reported problem +func Escape(input string) string { + v := strings.Replace(input, "\n", "", -1) + v = strings.Replace(v, "\r", "", -1) + v = strings.Replace(v, ";", "", -1) + // v = strings.Replace(v, "'", "", -1) + return v +} + +// EscapeGet escape get +func EscapeGet(qs url.Values, key string) string { + return Escape(qs.Get(key)) +} + +// InsertBarrier insert a record to barrier +func InsertBarrier(tx DB, transType string, gid string, branchID string, op string, barrierID string, reason string) (int64, error) { + if op == "" { + return 0, nil + } + sql := GetDBSpecial().GetInsertIgnoreTemplate(BarrierTableName+"(trans_type, gid, branch_id, op, barrier_id, reason) values(?,?,?,?,?,?)", "uniq_barrier") + return DBExec(tx, sql, transType, gid, branchID, op, barrierID, reason) +} diff --git a/dtmcli/tcc.go b/dtmcli/tcc.go index 7d0c77d..1451427 100644 --- a/dtmcli/tcc.go +++ b/dtmcli/tcc.go @@ -25,7 +25,7 @@ type TccGlobalFunc func(tcc *Tcc) (*resty.Response, error) // TccGlobalTransaction begin a tcc global transaction // dtm dtm server address // gid global transaction ID -// tccFunc tcc事务函数,里面会定义全局事务的分支 +// tccFunc define the detail tcc busi func TccGlobalTransaction(dtm string, gid string, tccFunc TccGlobalFunc) (rerr error) { return TccGlobalTransaction2(dtm, gid, func(t *Tcc) {}, tccFunc) } @@ -38,7 +38,6 @@ func TccGlobalTransaction2(dtm string, gid string, custom func(*Tcc), tccFunc Tc if rerr != nil { return rerr } - // 小概率情况下,prepare成功了,但是由于网络状况导致上面Failure,那么不执行下面defer的内容,等待超时后再回滚标记事务失败,也没有问题 defer dtmimp.DeferDo(&rerr, func() error { return dtmimp.TransCallDtm(&tcc.TransBase, tcc, "submit") }, func() error { @@ -61,13 +60,13 @@ func TccFromQuery(qs url.Values) (*Tcc, error) { func (t *Tcc) CallBranch(body interface{}, tryURL string, confirmURL string, cancelURL string) (*resty.Response, error) { branchID := t.NewSubBranchID() err := dtmimp.TransRegisterBranch(&t.TransBase, map[string]string{ - "data": dtmimp.MustMarshalString(body), - "branch_id": branchID, - BranchConfirm: confirmURL, - BranchCancel: cancelURL, + "data": dtmimp.MustMarshalString(body), + "branch_id": branchID, + dtmimp.OpConfirm: confirmURL, + dtmimp.OpCancel: cancelURL, }, "registerBranch") if err != nil { return nil, err } - return dtmimp.TransRequestBranch(&t.TransBase, "POST", body, branchID, BranchTry, tryURL) + return dtmimp.TransRequestBranch(&t.TransBase, "POST", body, branchID, dtmimp.OpTry, tryURL) } diff --git a/dtmcli/trans_test.go b/dtmcli/trans_test.go index 05e6ab4..66a0459 100644 --- a/dtmcli/trans_test.go +++ b/dtmcli/trans_test.go @@ -23,8 +23,3 @@ func TestQuery(t *testing.T) { _, err = BarrierFromQuery(qs) assert.Error(t, err) } - -func TestXa(t *testing.T) { - _, err := NewXaClient("http://localhost:36789", DBConf{}, ":::::", nil) - assert.Error(t, err) -} diff --git a/dtmcli/xa.go b/dtmcli/xa.go index 505837d..662f8d6 100644 --- a/dtmcli/xa.go +++ b/dtmcli/xa.go @@ -21,76 +21,54 @@ type XaGlobalFunc func(xa *Xa) (*resty.Response, error) // XaLocalFunc type of xa local function type XaLocalFunc func(db *sql.DB, xa *Xa) error -// XaRegisterCallback type of xa register callback handler -type XaRegisterCallback func(path string, xa *XaClient) - -// XaClient xa client -type XaClient struct { - dtmimp.XaClientBase -} - // Xa xa transaction type Xa struct { dtmimp.TransBase + Phase2URL string } // XaFromQuery construct xa info from request func XaFromQuery(qs url.Values) (*Xa, error) { xa := &Xa{TransBase: *dtmimp.TransBaseFromQuery(qs)} - if xa.Gid == "" || xa.BranchID == "" { - return nil, fmt.Errorf("bad xa info: gid: %s branchid: %s", xa.Gid, xa.BranchID) + xa.Op = dtmimp.EscapeGet(qs, "op") + xa.Phase2URL = dtmimp.EscapeGet(qs, "phase2_url") + if xa.Gid == "" || xa.BranchID == "" || xa.Op == "" { + return nil, fmt.Errorf("bad xa info: gid: %s branchid: %s op: %s phase2_url: %s", xa.Gid, xa.BranchID, xa.Op, xa.Phase2URL) } return xa, nil } -// NewXaClient construct a xa client -func NewXaClient(server string, mysqlConf DBConf, notifyURL string, register XaRegisterCallback) (*XaClient, error) { - xa := &XaClient{XaClientBase: dtmimp.XaClientBase{ - Server: server, - Conf: mysqlConf, - NotifyURL: notifyURL, - }} - u, err := url.Parse(notifyURL) - if err != nil { - return nil, err - } - register(u.Path, xa) - return xa, nil -} - -// HandleCallback 处理commit/rollback的回调 -func (xc *XaClient) HandleCallback(gid string, branchID string, action string) interface{} { - return xc.XaClientBase.HandleCallback(gid, branchID, action) -} - // XaLocalTransaction start a xa local transaction -func (xc *XaClient) XaLocalTransaction(qs url.Values, xaFunc XaLocalFunc) error { +func XaLocalTransaction(qs url.Values, dbConf DBConf, xaFunc XaLocalFunc) error { xa, err := XaFromQuery(qs) if err != nil { return err } - return xc.HandleLocalTrans(&xa.TransBase, func(db *sql.DB) error { + if xa.Op == dtmimp.OpCommit || xa.Op == dtmimp.OpRollback { + return dtmimp.XaHandlePhase2(xa.Gid, dbConf, xa.BranchID, xa.Op) + } + return dtmimp.XaHandleLocalTrans(&xa.TransBase, dbConf, func(db *sql.DB) error { err := xaFunc(db, xa) if err != nil { return err } return dtmimp.TransRegisterBranch(&xa.TransBase, map[string]string{ - "url": xc.XaClientBase.NotifyURL, + "url": xa.Phase2URL, "branch_id": xa.BranchID, }, "registerBranch") }) } // XaGlobalTransaction start a xa global transaction -func (xc *XaClient) XaGlobalTransaction(gid string, xaFunc XaGlobalFunc) (rerr error) { - return xc.XaGlobalTransaction2(gid, func(x *Xa) {}, xaFunc) +func XaGlobalTransaction(server string, gid string, xaFunc XaGlobalFunc) error { + return XaGlobalTransaction2(server, gid, func(x *Xa) {}, xaFunc) } -// XaGlobalTransaction2 start a xa global transaction -func (xc *XaClient) XaGlobalTransaction2(gid string, custom func(*Xa), xaFunc XaGlobalFunc) (rerr error) { - xa := &Xa{TransBase: *dtmimp.NewTransBase(gid, "xa", xc.XaClientBase.Server, "")} +// XaGlobalTransaction2 start a xa global transaction with xa custom function +func XaGlobalTransaction2(server string, gid string, custom func(*Xa), xaFunc XaGlobalFunc) (rerr error) { + xa := &Xa{TransBase: *dtmimp.NewTransBase(gid, "xa", server, "")} custom(xa) - return xc.HandleGlobalTrans(&xa.TransBase, func(action string) error { + return dtmimp.XaHandleGlobalTrans(&xa.TransBase, func(action string) error { return dtmimp.TransCallDtm(&xa.TransBase, xa, action) }, func() error { _, rerr := xaFunc(xa) @@ -101,5 +79,5 @@ func (xc *XaClient) XaGlobalTransaction2(gid string, custom func(*Xa), xaFunc Xa // CallBranch call a xa branch func (x *Xa) CallBranch(body interface{}, url string) (*resty.Response, error) { branchID := x.NewSubBranchID() - return dtmimp.TransRequestBranch(&x.TransBase, "POST", body, branchID, BranchAction, url) + return dtmimp.TransRequestBranch(&x.TransBase, "POST", body, branchID, dtmimp.OpAction, url) } diff --git a/dtmgrpc/dtmgimp/README-cn.md b/dtmgrpc/dtmgimp/README-cn.md new file mode 100644 index 0000000..ba4fb25 --- /dev/null +++ b/dtmgrpc/dtmgimp/README-cn.md @@ -0,0 +1,2 @@ +## 注意 +此包带imp后缀,主要被dtm内部使用,相关接口可能会发生变更,请勿使用这里的接口 \ No newline at end of file diff --git a/dtmgrpc/dtmgimp/README.md b/dtmgrpc/dtmgimp/README.md index ba4fb25..06aa51e 100644 --- a/dtmgrpc/dtmgimp/README.md +++ b/dtmgrpc/dtmgimp/README.md @@ -1,2 +1,2 @@ -## 注意 -此包带imp后缀,主要被dtm内部使用,相关接口可能会发生变更,请勿使用这里的接口 \ No newline at end of file +## Notice +Please donot use this package, and this package should only be used in dtm internally. The interfaces are not stable, and package name has postfix "imp" \ No newline at end of file diff --git a/dtmgrpc/dtmgimp/types.go b/dtmgrpc/dtmgimp/types.go index d19cd69..7710665 100644 --- a/dtmgrpc/dtmgimp/types.go +++ b/dtmgrpc/dtmgimp/types.go @@ -19,7 +19,7 @@ import ( "google.golang.org/protobuf/proto" ) -// GrpcServerLog 打印grpc服务端的日志 +// GrpcServerLog middleware to print server-side grpc log func GrpcServerLog(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { began := time.Now() logger.Debugf("grpc server handling: %s %s", info.FullMethod, dtmimp.MustMarshalString(req)) @@ -35,7 +35,7 @@ func GrpcServerLog(ctx context.Context, req interface{}, info *grpc.UnaryServerI return m, err } -// GrpcClientLog 打印grpc调用的日志 +// GrpcClientLog middleware to print client-side grpc log func GrpcClientLog(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { logger.Debugf("grpc client calling: %s%s %v", cc.Target(), method, dtmimp.MustMarshalString(req)) LogDtmCtx(ctx) @@ -58,5 +58,8 @@ func InvokeBranch(t *dtmimp.TransBase, isRaw bool, msg proto.Message, url string } ctx := TransInfo2Ctx(t.Gid, t.TransType, branchID, op, t.Dtm) ctx = metadata.AppendToOutgoingContext(ctx, Map2Kvs(t.BranchHeaders)...) + if t.TransType == "xa" { // xa branch need additional phase2_url + ctx = metadata.AppendToOutgoingContext(ctx, Map2Kvs(map[string]string{dtmpre + "phase2_url": url})...) + } return MustGetGrpcConn(server, isRaw).Invoke(ctx, method, msg, reply) } diff --git a/dtmgrpc/dtmgimp/utils.go b/dtmgrpc/dtmgimp/utils.go index 17aaa11..b1e4b36 100644 --- a/dtmgrpc/dtmgimp/utils.go +++ b/dtmgrpc/dtmgimp/utils.go @@ -102,6 +102,12 @@ func GetMetaFromContext(ctx context.Context, name string) string { return mdGet(md, name) } +// GetDtmMetaFromContext get dtm header from context +func GetDtmMetaFromContext(ctx context.Context, name string) string { + md, _ := metadata.FromIncomingContext(ctx) + return dtmGet(md, name) +} + type requestTimeoutKey struct{} // RequestTimeoutFromContext returns requestTime of transOption option diff --git a/dtmgrpc/tcc.go b/dtmgrpc/tcc.go index bbbaef8..24a2f6a 100644 --- a/dtmgrpc/tcc.go +++ b/dtmgrpc/tcc.go @@ -25,9 +25,9 @@ type TccGrpc struct { type TccGlobalFunc func(tcc *TccGrpc) error // TccGlobalTransaction begin a tcc global transaction -// dtm dtm服务器地址 -// gid 全局事务id -// tccFunc tcc事务函数,里面会定义全局事务的分支 +// dtm dtm server url +// gid global transaction id +// tccFunc tcc busi func, define the transaction logic func TccGlobalTransaction(dtm string, gid string, tccFunc TccGlobalFunc) (rerr error) { return TccGlobalTransaction2(dtm, gid, func(tg *TccGrpc) {}, tccFunc) } @@ -40,7 +40,6 @@ func TccGlobalTransaction2(dtm string, gid string, custom func(*TccGrpc), tccFun if rerr != nil { return rerr } - // 小概率情况下,prepare成功了,但是由于网络状况导致上面Failure,那么不执行下面defer的内容,等待超时后再回滚标记事务失败,也没有问题 defer dtmimp.DeferDo(&rerr, func() error { return dtmgimp.DtmGrpcCall(&tcc.TransBase, "Submit") }, func() error { diff --git a/dtmgrpc/xa.go b/dtmgrpc/xa.go index a7bbebb..7ab34d7 100644 --- a/dtmgrpc/xa.go +++ b/dtmgrpc/xa.go @@ -26,14 +26,10 @@ type XaGrpcGlobalFunc func(xa *XaGrpc) error // XaGrpcLocalFunc type of xa local function type XaGrpcLocalFunc func(db *sql.DB, xa *XaGrpc) error -// XaGrpcClient xa client -type XaGrpcClient struct { - dtmimp.XaClientBase -} - // XaGrpc xa transaction type XaGrpc struct { dtmimp.TransBase + Phase2URL string } // XaGrpcFromRequest construct xa info from request @@ -41,39 +37,23 @@ func XaGrpcFromRequest(ctx context.Context) (*XaGrpc, error) { xa := &XaGrpc{ TransBase: *dtmgimp.TransBaseFromGrpc(ctx), } - if xa.Gid == "" || xa.BranchID == "" { - return nil, fmt.Errorf("bad xa info: gid: %s branchid: %s", xa.Gid, xa.BranchID) + xa.Phase2URL = dtmgimp.GetDtmMetaFromContext(ctx, "phase2_url") + if xa.Gid == "" || xa.BranchID == "" || xa.Op == "" { + return nil, fmt.Errorf("bad xa info: gid: %s branchid: %s op: %s phase2_url: %s", xa.Gid, xa.BranchID, xa.Op, xa.Phase2URL) } return xa, nil } -// NewXaGrpcClient construct a xa client -func NewXaGrpcClient(server string, mysqlConf dtmcli.DBConf, notifyURL string) *XaGrpcClient { - xa := &XaGrpcClient{XaClientBase: dtmimp.XaClientBase{ - Server: server, - Conf: mysqlConf, - NotifyURL: notifyURL, - }} - return xa -} - -// HandleCallback 处理commit/rollback的回调 -func (xc *XaGrpcClient) HandleCallback(ctx context.Context) (*emptypb.Empty, error) { - tb := dtmgimp.TransBaseFromGrpc(ctx) - return &emptypb.Empty{}, xc.XaClientBase.HandleCallback(tb.Gid, tb.BranchID, tb.Op) -} - // XaLocalTransaction start a xa local transaction -func (xc *XaGrpcClient) XaLocalTransaction(ctx context.Context, msg proto.Message, xaFunc XaGrpcLocalFunc) error { +func XaLocalTransaction(ctx context.Context, dbConf dtmcli.DBConf, xaFunc XaGrpcLocalFunc) error { xa, err := XaGrpcFromRequest(ctx) if err != nil { return err } - data, err := proto.Marshal(msg) - if err != nil { - return err + if xa.Op == dtmimp.OpCommit || xa.Op == dtmimp.OpRollback { + return dtmimp.XaHandlePhase2(xa.Gid, dbConf, xa.BranchID, xa.Op) } - return xc.HandleLocalTrans(&xa.TransBase, func(db *sql.DB) error { + return dtmimp.XaHandleLocalTrans(&xa.TransBase, dbConf, func(db *sql.DB) error { err := xaFunc(db, xa) if err != nil { return err @@ -82,28 +62,28 @@ func (xc *XaGrpcClient) XaLocalTransaction(ctx context.Context, msg proto.Messag Gid: xa.Gid, BranchID: xa.BranchID, TransType: xa.TransType, - BusiPayload: data, - Data: map[string]string{"url": xc.NotifyURL}, + BusiPayload: nil, + Data: map[string]string{"url": xa.Phase2URL}, }) return err }) } // XaGlobalTransaction start a xa global transaction -func (xc *XaGrpcClient) XaGlobalTransaction(gid string, xaFunc XaGrpcGlobalFunc) error { - return xc.XaGlobalTransaction2(gid, func(xg *XaGrpc) {}, xaFunc) +func XaGlobalTransaction(server string, gid string, xaFunc XaGrpcGlobalFunc) error { + return XaGlobalTransaction2(server, gid, func(xg *XaGrpc) {}, xaFunc) } // XaGlobalTransaction2 new version of XaGlobalTransaction. support custom -func (xc *XaGrpcClient) XaGlobalTransaction2(gid string, custom func(*XaGrpc), xaFunc XaGrpcGlobalFunc) error { - xa := &XaGrpc{TransBase: *dtmimp.NewTransBase(gid, "xa", xc.Server, "")} +func XaGlobalTransaction2(server string, gid string, custom func(*XaGrpc), xaFunc XaGrpcGlobalFunc) error { + xa := &XaGrpc{TransBase: *dtmimp.NewTransBase(gid, "xa", server, "")} custom(xa) dc := dtmgimp.MustGetDtmClient(xa.Dtm) req := &dtmgpb.DtmRequest{ Gid: gid, TransType: xa.TransType, } - return xc.HandleGlobalTrans(&xa.TransBase, func(action string) error { + return dtmimp.XaHandleGlobalTrans(&xa.TransBase, func(action string) error { f := map[string]func(context.Context, *dtmgpb.DtmRequest, ...grpc.CallOption) (*emptypb.Empty, error){ "prepare": dc.Prepare, "submit": dc.Submit, diff --git a/dtmsvr/api.go b/dtmsvr/api.go index f2855f9..809d2ee 100644 --- a/dtmsvr/api.go +++ b/dtmsvr/api.go @@ -58,17 +58,26 @@ func svcAbort(t *TransGlobal) interface{} { return dbt.Process(branches) } +func svcForceStop(t *TransGlobal) interface{} { + dbt := GetTransGlobal(t.Gid) + if dbt.Status == dtmcli.StatusSucceed || dbt.Status == dtmcli.StatusFailed { + return fmt.Errorf("global transaction force stop error. status: %s. error: %w", dbt.Status, dtmcli.ErrFailure) + } + dbt.changeStatus(dtmcli.StatusFailed) + return nil +} + func svcRegisterBranch(transType string, branch *TransBranch, data map[string]string) error { branches := []TransBranch{*branch, *branch} if transType == "tcc" { - for i, b := range []string{dtmcli.BranchCancel, dtmcli.BranchConfirm} { + for i, b := range []string{dtmimp.OpCancel, dtmimp.OpConfirm} { branches[i].Op = b branches[i].URL = data[b] } } else if transType == "xa" { - branches[0].Op = dtmcli.BranchRollback + branches[0].Op = dtmimp.OpRollback branches[0].URL = data["url"] - branches[1].Op = dtmcli.BranchCommit + branches[1].Op = dtmimp.OpCommit branches[1].URL = data["url"] } else { return fmt.Errorf("unknow trans type: %s", transType) diff --git a/dtmsvr/api_http.go b/dtmsvr/api_http.go index 2d8dea0..2ca1da0 100644 --- a/dtmsvr/api_http.go +++ b/dtmsvr/api_http.go @@ -23,6 +23,7 @@ func addRoute(engine *gin.Engine) { engine.POST("/api/dtmsvr/prepare", dtmutil.WrapHandler2(prepare)) engine.POST("/api/dtmsvr/submit", dtmutil.WrapHandler2(submit)) engine.POST("/api/dtmsvr/abort", dtmutil.WrapHandler2(abort)) + engine.POST("/api/dtmsvr/forceStop", dtmutil.WrapHandler2(forceStop)) // change global status to failed can stop trigger (Use with caution in production environment) engine.POST("/api/dtmsvr/registerBranch", dtmutil.WrapHandler2(registerBranch)) engine.POST("/api/dtmsvr/registerXaBranch", dtmutil.WrapHandler2(registerBranch)) // compatible for old sdk engine.POST("/api/dtmsvr/registerTccBranch", dtmutil.WrapHandler2(registerBranch)) // compatible for old sdk @@ -37,6 +38,7 @@ func addRoute(engine *gin.Engine) { }) } +// NOTE: unique in storage, can customize the generation rules instead of using server-side generation, it will help with the tracking func newGid(c *gin.Context) interface{} { return map[string]interface{}{"gid": GenGid(), "dtm_result": dtmcli.ResultSuccess} } @@ -53,12 +55,16 @@ func abort(c *gin.Context) interface{} { return svcAbort(TransFromContext(c)) } +func forceStop(c *gin.Context) interface{} { + return svcForceStop(TransFromContext(c)) +} + func registerBranch(c *gin.Context) interface{} { data := map[string]string{} err := c.BindJSON(&data) e2p(err) branch := TransBranch{ - Gid: data["gid"], + Gid: dtmimp.Escape(data["gid"]), BranchID: data["branch_id"], Status: dtmcli.StatusPrepared, BinData: []byte(data["data"]), diff --git a/dtmsvr/config/config.go b/dtmsvr/config/config.go index 750af5e..f64fa32 100644 --- a/dtmsvr/config/config.go +++ b/dtmsvr/config/config.go @@ -46,8 +46,9 @@ type Store struct { MaxOpenConns int64 `yaml:"MaxOpenConns" default:"500"` MaxIdleConns int64 `yaml:"MaxIdleConns" default:"500"` ConnMaxLifeTime int64 `yaml:"ConnMaxLifeTime" default:"5"` - DataExpire int64 `yaml:"DataExpire" default:"604800"` // Trans data will expire in 7 days. only for redis/boltdb. - RedisPrefix string `yaml:"RedisPrefix" default:"{a}"` // Redis storage prefix. store data to only one slot in cluster + DataExpire int64 `yaml:"DataExpire" default:"604800"` // Trans data will expire in 7 days. only for redis/boltdb. + SuccessDataExpire int64 `yaml:"SuccessDataExpire" default:"86400"` // successful Trans data will expire in 1 days. only for redis. + RedisPrefix string `yaml:"RedisPrefix" default:"{a}"` // Redis storage prefix. store data to only one slot in cluster TransGlobalTable string `yaml:"TransGlobalTable" default:"dtm.trans_global"` TransBranchOpTable string `yaml:"TransBranchOpTable" default:"dtm.trans_branch_op"` } @@ -84,7 +85,7 @@ type configType struct { Log Log `yaml:"Log"` } -// Config 配置 +// Config config var Config = configType{} // MustLoadConfig load config from env and file diff --git a/dtmsvr/storage/redis/redis.go b/dtmsvr/storage/redis/redis.go index 7e6bbfa..c3015be 100644 --- a/dtmsvr/storage/redis/redis.go +++ b/dtmsvr/storage/redis/redis.go @@ -1,3 +1,9 @@ +/* + * Copyright (c) 2022 yedf. All rights reserved. + * Use of this source code is governed by a BSD-style + * license that can be found in the LICENSE file. + */ + package redis import ( @@ -99,8 +105,8 @@ func (s *Store) UpdateBranches(branches []storage.TransBranchStore, updates []st } type argList struct { - Keys []string - List []interface{} + Keys []string // 1 global trans, 2 branches, 3 indices, 4 status + List []interface{} // 1 redis prefix, 2 data expire } func newArgList() *argList { @@ -214,7 +220,8 @@ func (s *Store) ChangeGlobalStatus(global *storage.TransGlobalStore, newStatus s AppendRaw(old). AppendRaw(finished). AppendRaw(global.Gid). - AppendRaw(newStatus) + AppendRaw(newStatus). + AppendObject(conf.Store.SuccessDataExpire) _, err := callLua(args, `-- ChangeGlobalStatus local old = redis.call('GET', KEYS[4]) if old ~= ARGV[4] then @@ -224,6 +231,9 @@ redis.call('SET', KEYS[1], ARGV[3], 'EX', ARGV[2]) redis.call('SET', KEYS[4], ARGV[7], 'EX', ARGV[2]) if ARGV[5] == '1' then redis.call('ZREM', KEYS[3], ARGV[6]) + redis.call('EXPIRE', KEYS[1], ARGV[8]) + redis.call('EXPIRE', KEYS[2], ARGV[8]) + redis.call('EXPIRE', KEYS[4], ARGV[8]) end `) dtmimp.E2P(err) diff --git a/dtmsvr/storage/sql/sql.go b/dtmsvr/storage/sql/sql.go index d87297a..c15c7fc 100644 --- a/dtmsvr/storage/sql/sql.go +++ b/dtmsvr/storage/sql/sql.go @@ -103,7 +103,7 @@ func (s *Store) MaySaveNewTrans(global *storage.TransGlobalStore, branches []sto dbr := db.Must().Clauses(clause.OnConflict{ DoNothing: true, }).Create(global) - if dbr.RowsAffected <= 0 { // 如果这个不是新事务,返回错误 + if dbr.RowsAffected <= 0 { // not a new trans, return return storage.ErrUniqueConflict } if len(branches) > 0 { diff --git a/dtmsvr/svr.go b/dtmsvr/svr.go index 4fafd89..a9f266f 100644 --- a/dtmsvr/svr.go +++ b/dtmsvr/svr.go @@ -70,6 +70,7 @@ func StartSvr() { time.Sleep(100 * time.Millisecond) err = dtmdriver.Use(conf.MicroService.Driver) logger.FatalIfError(err) + logger.Infof("RegisterGrpcService: %s", conf.MicroService.Driver) err = dtmdriver.GetDriver().RegisterGrpcService(conf.MicroService.Target, conf.MicroService.EndPoint) logger.FatalIfError(err) } diff --git a/dtmsvr/trans_class.go b/dtmsvr/trans_class.go index 2eae58c..be60ac8 100644 --- a/dtmsvr/trans_class.go +++ b/dtmsvr/trans_class.go @@ -76,6 +76,8 @@ func TransFromContext(c *gin.Context) *TransGlobal { e2p(err) m := TransGlobal{} dtmimp.MustUnmarshal(b, &m) + m.Status = dtmimp.Escape(m.Status) + m.Gid = dtmimp.Escape(m.Gid) logger.Debugf("creating trans in prepare") m.setupPayloads() m.Ext.Headers = map[string]string{} diff --git a/dtmsvr/trans_status.go b/dtmsvr/trans_status.go index 2c1c16a..3e8495e 100644 --- a/dtmsvr/trans_status.go +++ b/dtmsvr/trans_status.go @@ -67,7 +67,7 @@ func (t *TransGlobal) changeBranchStatus(b *TransBranch, status string, branchPo GetStore().LockGlobalSaveBranches(t.Gid, t.Status, []TransBranch{*b}, branchPos) logger.Infof("LockGlobalSaveBranches ok: gid: %s old status: %s branches: %s", b.Gid, dtmcli.StatusPrepared, b.String()) - } else { // 为了性能优化,把branch的status更新异步化 + } else { // for better performance, batch the updates of branch status updateBranchAsyncChan <- branchStatus{id: b.ID, gid: t.Gid, status: status, finishTime: &now} } } @@ -176,7 +176,7 @@ func (t *TransGlobal) getBranchResult(branch *TransBranch) (string, error) { err := t.getURLResult(branch.URL, branch.BranchID, branch.Op, branch.BinData) if err == nil { return dtmcli.StatusSucceed, nil - } else if t.TransType == "saga" && branch.Op == dtmcli.BranchAction && errors.Is(err, dtmcli.ErrFailure) { + } else if t.TransType == "saga" && branch.Op == dtmimp.OpAction && errors.Is(err, dtmcli.ErrFailure) { return dtmcli.StatusFailed, nil } else if errors.Is(err, dtmcli.ErrOngoing) { return "", dtmcli.ErrOngoing diff --git a/dtmsvr/trans_type_msg.go b/dtmsvr/trans_type_msg.go index 5315e36..da3c80e 100644 --- a/dtmsvr/trans_type_msg.go +++ b/dtmsvr/trans_type_msg.go @@ -30,8 +30,8 @@ func (t *transMsgProcessor) GenBranches() []TransBranch { Gid: t.Gid, BranchID: fmt.Sprintf("%02d", i+1), BinData: t.BinPayloads[i], - URL: step[dtmcli.BranchAction], - Op: dtmcli.BranchAction, + URL: step[dtmimp.OpAction], + Op: dtmimp.OpAction, Status: dtmcli.StatusPrepared, } branches = append(branches, *b) @@ -79,7 +79,7 @@ func (t *transMsgProcessor) ProcessOnce(branches []TransBranch) error { var err error for i := range branches { b := &branches[i] - if b.Op != dtmcli.BranchAction || b.Status != dtmcli.StatusPrepared { + if b.Op != dtmimp.OpAction || b.Status != dtmcli.StatusPrepared { continue } if t.Concurrent { diff --git a/dtmsvr/trans_type_saga.go b/dtmsvr/trans_type_saga.go index 0c2da0d..a285e63 100644 --- a/dtmsvr/trans_type_saga.go +++ b/dtmsvr/trans_type_saga.go @@ -30,7 +30,7 @@ func (t *transSagaProcessor) GenBranches() []TransBranch { branches := []TransBranch{} for i, step := range t.Steps { branch := fmt.Sprintf("%02d", i+1) - for _, op := range []string{dtmcli.BranchCompensate, dtmcli.BranchAction} { + for _, op := range []string{dtmimp.OpCompensate, dtmimp.OpAction} { branches = append(branches, TransBranch{ Gid: t.Gid, BranchID: branch, @@ -82,7 +82,7 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { branchResults := make([]branchResult, n) // save the branch result for i := 0; i < n; i++ { b := branches[i] - if b.Op == dtmcli.BranchAction { + if b.Op == dtmimp.OpAction { if b.Status == dtmcli.StatusPrepared { rsAToStart++ } else if b.Status == dtmcli.StatusFailed { @@ -163,7 +163,7 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { runBranches := func(toRun []int) { for _, b := range toRun { branchResults[b].started = true - if branchResults[b].op == dtmcli.BranchAction { + if branchResults[b].op == dtmimp.OpAction { rsAStarted++ } go asyncExecBranch(b) @@ -174,7 +174,7 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { case r := <-resultChan: br := &branchResults[r.index] br.status = r.status - if r.op == dtmcli.BranchAction { + if r.op == dtmimp.OpAction { rsADone++ if r.status == dtmcli.StatusFailed { rsAFailed++ @@ -202,7 +202,7 @@ func (t *transSagaProcessor) ProcessOnce(branches []TransBranch) error { } } for i, b := range branchResults { - if b.op == dtmcli.BranchCompensate && b.status != dtmcli.StatusSucceed && + if b.op == dtmimp.OpCompensate && b.status != dtmcli.StatusSucceed && branchResults[i+1].status != dtmcli.StatusPrepared { rsCToStart++ } diff --git a/dtmsvr/trans_type_tcc.go b/dtmsvr/trans_type_tcc.go index 31ae557..5898d97 100644 --- a/dtmsvr/trans_type_tcc.go +++ b/dtmsvr/trans_type_tcc.go @@ -31,7 +31,7 @@ func (t *transTccProcessor) ProcessOnce(branches []TransBranch) error { if t.Status == dtmcli.StatusPrepared && t.isTimeout() { t.changeStatus(dtmcli.StatusAborting) } - op := dtmimp.If(t.Status == dtmcli.StatusSubmitted, dtmcli.BranchConfirm, dtmcli.BranchCancel).(string) + op := dtmimp.If(t.Status == dtmcli.StatusSubmitted, dtmimp.OpConfirm, dtmimp.OpCancel).(string) for current := len(branches) - 1; current >= 0; current-- { if branches[current].Op == op && branches[current].Status == dtmcli.StatusPrepared { logger.Debugf("branch info: current: %d ID: %d", current, branches[current].ID) diff --git a/dtmsvr/trans_type_xa.go b/dtmsvr/trans_type_xa.go index 4f45205..173b9ed 100644 --- a/dtmsvr/trans_type_xa.go +++ b/dtmsvr/trans_type_xa.go @@ -30,7 +30,7 @@ func (t *transXaProcessor) ProcessOnce(branches []TransBranch) error { if t.Status == dtmcli.StatusPrepared && t.isTimeout() { t.changeStatus(dtmcli.StatusAborting) } - currentType := dtmimp.If(t.Status == dtmcli.StatusSubmitted, dtmcli.BranchCommit, dtmcli.BranchRollback).(string) + currentType := dtmimp.If(t.Status == dtmcli.StatusSubmitted, dtmimp.OpCommit, dtmimp.OpRollback).(string) for i, branch := range branches { if branch.Op == currentType && branch.Status != dtmcli.StatusSucceed { err := t.execBranch(&branch, i) diff --git a/dtmutil/db.go b/dtmutil/db.go index 86973b2..1862870 100644 --- a/dtmutil/db.go +++ b/dtmutil/db.go @@ -3,7 +3,6 @@ package dtmutil import ( "database/sql" "fmt" - "strings" "sync" "time" @@ -78,7 +77,7 @@ func (op *tracePlugin) Initialize(db *gorm.DB) (err error) { afterName := "cb_after" logger.Debugf("installing db plugin: %s", op.Name()) - // 开始前 + // before _ = db.Callback().Create().Before("gorm:before_create").Register(beforeName, before) _ = db.Callback().Query().Before("gorm:query").Register(beforeName, before) _ = db.Callback().Delete().Before("gorm:before_delete").Register(beforeName, before) @@ -86,7 +85,7 @@ func (op *tracePlugin) Initialize(db *gorm.DB) (err error) { _ = db.Callback().Row().Before("gorm:row").Register(beforeName, before) _ = db.Callback().Raw().Before("gorm:raw").Register(beforeName, before) - // 结束后 + // after _ = db.Callback().Create().After("gorm:after_create").Register(afterName, after) _ = db.Callback().Query().After("gorm:after_query").Register(afterName, after) _ = db.Callback().Delete().After("gorm:after_delete").Register(afterName, after) @@ -101,7 +100,7 @@ func DbGet(conf dtmcli.DBConf, ops ...func(*gorm.DB)) *DB { dsn := dtmimp.GetDsn(conf) db, ok := dbs.Load(dsn) if !ok { - logger.Debugf("connecting %s", strings.Replace(dsn, conf.Password, "****", 1)) + logger.Infof("connecting '%s' '%s' '%s' '%d'", conf.Driver, conf.Host, conf.User, conf.Port) db1, err := gorm.Open(getGormDialetor(conf.Driver, dsn), &gorm.Config{ SkipDefaultTransaction: true, }) diff --git a/dtmutil/utils.go b/dtmutil/utils.go index 849b539..9c78bb2 100644 --- a/dtmutil/utils.go +++ b/dtmutil/utils.go @@ -112,7 +112,7 @@ func MustGetwd() string { return wd } -// GetSQLDir 获取调用该函数的caller源代码的目录,主要用于测试时,查找相关文件 +// GetSQLDir get sql scripts dir, used in test func GetSQLDir() string { wd := MustGetwd() if filepath.Base(wd) == "test" { diff --git a/go.mod b/go.mod index 657f60a..5d9206a 100644 --- a/go.mod +++ b/go.mod @@ -4,11 +4,13 @@ go 1.16 require ( bou.ke/monkey v1.0.2 + github.com/BurntSushi/toml v0.4.1 // indirect github.com/dtm-labs/dtmdriver v0.0.1 github.com/dtm-labs/dtmdriver-gozero v0.0.2 - github.com/dtm-labs/dtmdriver-polaris v0.0.3 + github.com/dtm-labs/dtmdriver-kratos v0.0.4 + github.com/dtm-labs/dtmdriver-polaris v0.0.4 github.com/dtm-labs/dtmdriver-protocol1 v0.0.1 - github.com/gin-gonic/gin v1.7.0 + github.com/gin-gonic/gin v1.7.7 github.com/go-redis/redis/v8 v8.11.4 github.com/go-resty/resty/v2 v2.7.0 github.com/go-sql-driver/mysql v1.6.0 @@ -21,10 +23,8 @@ require ( github.com/stretchr/testify v1.7.0 go.etcd.io/bbolt v1.3.6 go.mongodb.org/mongo-driver v1.8.3 - go.uber.org/atomic v1.9.0 // indirect go.uber.org/automaxprocs v1.4.1-0.20210525221652-0180b04c18a7 - go.uber.org/multierr v1.7.0 // indirect - go.uber.org/zap v1.19.1 + go.uber.org/zap v1.21.0 golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa // indirect google.golang.org/grpc v1.44.0 google.golang.org/protobuf v1.27.1 diff --git a/go.sum b/go.sum index 2564071..c67d3e1 100644 --- a/go.sum +++ b/go.sum @@ -44,22 +44,19 @@ github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb0 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/sarama v1.30.0/go.mod h1:zujlQQx1kzHsh4jfV1USnptCQrHAEZ2Hk8fTKCulPVs= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/Shopify/toxiproxy/v2 v2.1.6-0.20210914104332-15ea381dcdae/go.mod h1:/cvHQkZ1fst0EmZnA5dFtiQdWCNCFYzb+uE2vqVgvx0= -github.com/agiledragon/gomonkey v0.0.0-20190517145658-8fa491f7b918 h1:a88Ln+jbIokfi6xoKtq10dbgp4VMg1CmHF1J42p8EyE= -github.com/agiledragon/gomonkey v0.0.0-20190517145658-8fa491f7b918/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw= +github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= +github.com/agiledragon/gomonkey v2.0.2+incompatible h1:eXKi9/piiC3cjJD1658mEE2o3NjkJ5vDLgYjCQu0Xlw= +github.com/agiledragon/gomonkey v2.0.2+incompatible/go.mod h1:2NGfXu1a80LLr2cmWXGBDaHEjb1idR6+FVlX5T3D9hw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= -github.com/alicebob/miniredis/v2 v2.16.0/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODVXVpYDRaGhWaL6I= github.com/alicebob/miniredis/v2 v2.17.0/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODVXVpYDRaGhWaL6I= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210521184019-c5ad59b459ec/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -96,7 +93,6 @@ github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7 github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -109,24 +105,20 @@ github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZ github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dtm-labs/dtmdriver v0.0.1 h1:dHUZQ6g2ZN6eRUqds9kKq/3K7u9bcUGatUlbthD92fA= github.com/dtm-labs/dtmdriver v0.0.1/go.mod h1:fLiEeD2BPwM9Yq96TfcP9KpbTwFsn5nTxa/PP0jmFuk= -github.com/dtm-labs/dtmdriver-gozero v0.0.1 h1:ExDhMsn3MJCd+psSmIJVDgGUqbFrQGP0IpKL8x900AE= -github.com/dtm-labs/dtmdriver-gozero v0.0.1/go.mod h1:uIiAMkG/Vp4jvINk5XfVMT0mSCzRqIYyXgpmqAQfqbA= github.com/dtm-labs/dtmdriver-gozero v0.0.2 h1:T+JH9kwVNMmISPU1BNviiTrvPdMA7UMFD+nfTqGPSyA= github.com/dtm-labs/dtmdriver-gozero v0.0.2/go.mod h1:5AAKwYok5f56e0kATOXvc+DAsfu4elISDuCV+G3+fYE= -github.com/dtm-labs/dtmdriver-polaris v0.0.2 h1:bh8u7bLWhairwpiA688dZMAX/OWcRoQk7a5bVcGzsjo= -github.com/dtm-labs/dtmdriver-polaris v0.0.2/go.mod h1:vyXDTRj3CpROiRnI0dqM/lHFfZaKY9JAS1MSey2azIQ= -github.com/dtm-labs/dtmdriver-polaris v0.0.3 h1:oqvYq7X6iDUCECjSE82gsGP1Du0vhcpHNmxM8Uo7470= -github.com/dtm-labs/dtmdriver-polaris v0.0.3/go.mod h1:yGdzgar7r8SmzTDeEn0CuVq9xo1NX7x327MhxuU9sxM= +github.com/dtm-labs/dtmdriver-kratos v0.0.4 h1:jDVvrwiw8GwVrampIxhoXZ9TewwQKHFpcDcQXyU2Qyc= +github.com/dtm-labs/dtmdriver-kratos v0.0.4/go.mod h1:MjrFIa2A191ATVb/xy2vnA2ZKqMK9zC/1m3pjxXwkac= +github.com/dtm-labs/dtmdriver-polaris v0.0.4 h1:yli0YmAsEgl47ymJHTxIzULeNe5dnmfN2ixLJRWm2Ok= +github.com/dtm-labs/dtmdriver-polaris v0.0.4/go.mod h1:zwNFE3z0B7Ky35W2Ks9LkpMGiuIt9YFuocy4qaedCLE= github.com/dtm-labs/dtmdriver-protocol1 v0.0.1 h1:nwGpGWi7XlUAcDhEw1qZ3TheBskqCvfE96n1uVjmDf4= github.com/dtm-labs/dtmdriver-protocol1 v0.0.1/go.mod h1:x3bRe8x7pAfHIIQBTK+LibVq96gBSzMzsgRYe85zxAc= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/proto v1.9.1/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -136,22 +128,21 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU= -github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/gin-gonic/gin v1.7.7 h1:3DoBmSbJbZAWqXJC3SLjAPfutPJJRN1U5pALB7EeTTs= +github.com/gin-gonic/gin v1.7.7/go.mod h1:axIBovoeJpVj8S3BwE0uPMTeReE4+AfFtqpqaZ1qq1U= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -159,18 +150,24 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kratos/aegis v0.1.1/go.mod h1:jYeSQ3Gesba478zEnujOiG5QdsyF3Xk/8owFUeKcHxw= +github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20220301040457-03ad2b663624 h1:IvBtHmRYmHsB13TP21F1FgEtJuIXIASnucaUZKlvp4E= +github.com/go-kratos/kratos/contrib/registry/etcd/v2 v2.0.0-20220301040457-03ad2b663624/go.mod h1:wHDbj1lp8hvAg7Eq7iNFM4vh5Fl8kWIiH4E1YY+fixs= +github.com/go-kratos/kratos/v2 v2.2.0 h1:swSCoOdXD5F/L4eUfhapxSXe1I846hZz1wMLLixz9SA= +github.com/go-kratos/kratos/v2 v2.2.0/go.mod h1:yebXu5KMayLjXZzMTY5HWIPRDwcBehHpiNF/Ot8A2pA= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= -github.com/go-logr/logr v0.2.0 h1:QvGt2nLcHH0WK9orKa+ppBPAxREcH364nPUedEpK0TY= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2 h1:ahHml/yUpnlb96Rp8HCvtYVPY8ZYpxq3g7UYchIYwbs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= @@ -180,6 +177,7 @@ github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/form/v4 v4.2.0/go.mod h1:q1a2BY+AQUUzhl6xA/6hBetay6dEIhMHjgvJiGo6K7U= github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q= github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no= @@ -205,7 +203,6 @@ github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -235,7 +232,6 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -279,8 +275,6 @@ github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyyc github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= @@ -290,16 +284,16 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= @@ -396,25 +390,19 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.3 h1:v9QZf2Sn6AmjXtQeFpdoq/eaNtYP6IN+7lcrygsIAtg= -github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lithammer/shortuuid v2.0.3+incompatible h1:ao1r3cQ9AUX+c6dZXwbCM/ELGf10EoO4SyqqxBXTyHc= github.com/lithammer/shortuuid v2.0.3+incompatible/go.mod h1:FR74pbAuElzOUuenUHTK2Tciko1/vKuIKS9dSkDrA4w= github.com/lithammer/shortuuid/v3 v3.0.7 h1:trX0KTHy4Pbwo/6ia8fscyHoGA+mf1jWbPJVuvyJQQ8= github.com/lithammer/shortuuid/v3 v3.0.7/go.mod h1:vMk8ke37EmiewwolSO1NLW8vP4ZaKlRuDIi8tWWmAts= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -429,8 +417,9 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -445,39 +434,32 @@ github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+ github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.16.0 h1:6gjqkI8iiRHMvdccRJM8rVKjCWk6ZIm6FTm3ddIe4/c= github.com/onsi/gomega v1.16.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= -github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/openzipkin/zipkin-go v0.3.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ= github.com/openzipkin/zipkin-go v0.4.0/go.mod h1:4c3sLeE8xjNqehmF5RpAFLPLJxXscc0R4l6Zg0P1tTQ= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/polarismesh/grpc-go-polaris v0.0.0-20211128162137-1a59cd7b5733 h1:ViknokN0Hsv8OubVEMllicKWxuhyZ0ELY0fOIRecKrI= -github.com/polarismesh/grpc-go-polaris v0.0.0-20211128162137-1a59cd7b5733/go.mod h1:remwVvDJRLPTpZjIiOkaD8ck2/1hFE1Fo5xxZ7AY5jY= -github.com/polarismesh/grpc-go-polaris v1.2.0 h1:dcQyyGy1TwUDEehx4xvpKIl6RM/Mcp9N02qZmeH8OSQ= -github.com/polarismesh/grpc-go-polaris v1.2.0/go.mod h1:bQ591/6rNXmo+tKTy7tc0PLgAro/3U+IJOpmubqcHDw= -github.com/polarismesh/polaris-go v1.0.0 h1:JIBANM5nfhu5knbg269kldQ58bSSV7a6AzTQk1OZwt8= -github.com/polarismesh/polaris-go v1.0.0/go.mod h1:uzNFDShCN+UhBncwwNqNVhPpI1ZXYwPlb9N/aE+/vE0= +github.com/polarismesh/grpc-go-polaris v1.2.1-0.20220306155244-f0b83ba62878 h1:IhlY8X1AZT33oB920PES1L/SPURx+tjb62nWHZ7s0Ss= +github.com/polarismesh/grpc-go-polaris v1.2.1-0.20220306155244-f0b83ba62878/go.mod h1:DxKBmYOXsLNqbrMqJgwnGwu9RkqWl005kXosGaVxbTg= +github.com/polarismesh/polaris-go v1.0.1 h1:Zqr8ZtxsJQsxt0MGyC/fFsF861ogoJCz16yWFJ/t54Q= +github.com/polarismesh/polaris-go v1.0.1/go.mod h1:3NOqn3QquPdEdY6YhPrsWGvBVCpKhPBGt0Hspq3yEqY= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= @@ -498,7 +480,6 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/rabbitmq/amqp091-go v1.1.0/go.mod h1:ogQDLSOACsLPsIq0NpbtiifNZi2YOz0VTJ0kHRghqbM= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -507,9 +488,9 @@ github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/shirou/gopsutil/v3 v3.21.8/go.mod h1:YWp/H8Qs5fVmf17v7JNZzA0mPJ+mS2e9JdiUF9LlKzQ= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= @@ -521,8 +502,8 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 h1:WN9BUFbdyOsSH/XohnWpXOlq9NBD5sGAB2FciQMUEe8= -github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -530,7 +511,6 @@ github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTd github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -543,11 +523,12 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= +github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli v1.22.5/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= @@ -562,37 +543,34 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -github.com/zeromicro/antlr v0.0.1/go.mod h1:nfpjEwFR6Q4xGDJMcZnCL9tEfQRgszMwu3rDz2Z+p5M= -github.com/zeromicro/ddl-parser v0.0.0-20210712021150-63520aca7348/go.mod h1:ISU/8NuPyEpl9pa17Py9TBPetMjtsiHrb9f5XGiYbo8= github.com/zeromicro/go-zero v1.3.0 h1:Eyn36yBtR043sm4YKmxR6eS3UA/GtZDktQ+UqIJ3Lm0= github.com/zeromicro/go-zero v1.3.0/go.mod h1:Hy4o1VFAt32lXaQMbaBhoFeZjA/rJqJ4PTGNdGsURcc= go.etcd.io/bbolt v1.3.6 h1:/ecaJf0sk1l4l6V4awd65v2C3ILy7MSj+s/x1ADCIMU= go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd/api/v3 v3.5.1 h1:v28cktvBq+7vGyJXF8G+rWJmj+1XUmMtqcLnH8hDocM= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= -go.etcd.io/etcd/client/pkg/v3 v3.5.1 h1:XIQcHCFSG53bJETYeRJtIxdLv2EWRGxcfzR8lSnTH4E= +go.etcd.io/etcd/api/v3 v3.5.2 h1:tXok5yLlKyuQ/SXSjtqHc4uzNaMqZi2XsoSPr/LlJXI= +go.etcd.io/etcd/api/v3 v3.5.2/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/v3 v3.5.1 h1:oImGuV5LGKjCqXdjkMHCyWa5OO1gYKCnC/1sgdfj1Uk= +go.etcd.io/etcd/client/pkg/v3 v3.5.2 h1:4hzqQ6hIb3blLyQ8usCU4h3NghkqcsohEQ3o3VetYxE= +go.etcd.io/etcd/client/pkg/v3 v3.5.2/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.etcd.io/etcd/client/v3 v3.5.1/go.mod h1:OnjH4M8OnAotwaB2l9bVgZzRFKru7/ZMoS46OtKyd3Q= +go.etcd.io/etcd/client/v3 v3.5.2 h1:WdnejrUtQC4nCxK0/dLTMqKOB+U5TP/2Ya0BJL+1otA= +go.etcd.io/etcd/client/v3 v3.5.2/go.mod h1:kOOaWFFgHygyT0WlSmL8TJiXmMysO/nNUlEsSsN6W4o= go.mongodb.org/mongo-driver v1.8.3 h1:TDKlTkGDKm9kkJVUOAXDK5/fkqKHJVwYQSpoRfB43R4= go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/otel v1.1.0 h1:8p0uMLcyyIx0KHNTgO8o3CW8A1aA+dJZJW6PvnMz0Wc= -go.opentelemetry.io/otel v1.1.0/go.mod h1:7cww0OW51jQ8IaZChIEdqLwgh+44+7uiTdWsAL0wQpA= go.opentelemetry.io/otel v1.3.0 h1:APxLf0eiBwLl+SOXiJJCVYzA1OOJNyAoV8C5RNRyy7Y= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel/exporters/jaeger v1.1.0/go.mod h1:D/GIBwAdrFTTqCy1iITpC9nh5rgJpIbFVgkhlz2vCXk= go.opentelemetry.io/otel/exporters/jaeger v1.3.0/go.mod h1:KoYHi1BtkUPncGSRtCe/eh1ijsnePhSkxwzz07vU0Fc= -go.opentelemetry.io/otel/exporters/zipkin v1.1.0/go.mod h1:LZwDnf1mVGTPMq9hdRUHfFBH30SuQvZ1BJaVywpg0VI= go.opentelemetry.io/otel/exporters/zipkin v1.3.0/go.mod h1:LxGGfHIYbvsFnrJtBcazb0yG24xHdDGrT/H6RB9r3+8= -go.opentelemetry.io/otel/sdk v1.1.0 h1:j/1PngUJIDOddkCILQYTevrTIbWd494djgGkSsMit+U= -go.opentelemetry.io/otel/sdk v1.1.0/go.mod h1:3aQvM6uLm6C4wJpHtT8Od3vNzeZ34Pqc6bps8MywWzo= +go.opentelemetry.io/otel/sdk v1.3.0 h1:3278edCoH89MEJ0Ky8WQXVmDQv3FX4ZJ3Pp+9fJreAI= go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= -go.opentelemetry.io/otel/trace v1.1.0 h1:N25T9qCL0+7IpOT8RrRy0WYlL7y6U0WiUJzXcVdXY/o= -go.opentelemetry.io/otel/trace v1.1.0/go.mod h1:i47XtdcBQiktu5IsrPqOHe8w+sBmnLwwHt8wiUsWGTI= go.opentelemetry.io/otel/trace v1.3.0 h1:doy8Hzb1RJ+I3yFhtDmwNc7tIyw1tNMOIsyPzp1NOGY= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= @@ -606,24 +584,24 @@ go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= go.uber.org/automaxprocs v1.4.1-0.20210525221652-0180b04c18a7 h1:dRxPYqUfp41vIUNfZhZRtI0TZf08Wf5BAwamC5H/DMI= go.uber.org/automaxprocs v1.4.1-0.20210525221652-0180b04c18a7/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.2.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec= -go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= +go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= -go.uber.org/zap v1.19.1 h1:ue41HOKd1vGURxrmeKIgELGb3jPW9DMUDGtsinblHwI= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= +go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= +go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= @@ -697,7 +675,6 @@ golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -708,11 +685,10 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211029224645-99673261e6eb h1:pirldcYWx7rx7kE5r+9WsOXPXK0+WH5+uZ7uPmJ44uM= golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d h1:1n1fc535VhN8SYtD4cDUyNlfpAF2ROMM9+11equK3hs= golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -748,6 +724,7 @@ golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -778,13 +755,16 @@ golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211106132015-ebca88c72f68 h1:Ywe/f3fNleF8I6F6qv3MeFoSZ6CTf2zBMMa/7qVML8M= -golang.org/x/sys v0.0.0-20211106132015-ebca88c72f68/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220111092808-5a964db01320 h1:0jf+tOCoZ3LyutmCOWpVni1chK4VfFLhRsDK7MhqGRY= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220111092808-5a964db01320/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 h1:nhht2DYV/Sn3qOayu8lM+cU1ii9sTLUeBQwQQfUHtrs= +golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -799,8 +779,6 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 h1:GZokNIeuVkl3aZHJchRrr13WCsols02MLUcz1U9is6M= golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -891,14 +869,13 @@ google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210928142010-c7af6a1a74c9 h1:XTH066D35LyHehRwlYhoK3qA+Hcgvg5xREG4kFQEW1Y= -google.golang.org/genproto v0.0.0-20210928142010-c7af6a1a74c9/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20220112215332-a9c7c0acf9f2 h1:z+R4M/SuyaRsj1zu3WC+nIQyfSrSIpuDcY01/R3uCtg= google.golang.org/genproto v0.0.0-20220112215332-a9c7c0acf9f2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20220228195345-15d65a4533f7 h1:ntPPoHzFW6Xp09ueznmahONZufyoSakK/piXnr2BU3I= +google.golang.org/genproto v0.0.0-20220228195345-15d65a4533f7/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -906,7 +883,6 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= @@ -977,7 +953,6 @@ k8s.io/client-go v0.20.12 h1:U75SxTC31BHT9i7CbX/hL4v+U1Wkzy/E1vt5ClDPp3I= k8s.io/client-go v0.20.12/go.mod h1:NBJj6Evp73Xy/4v/O/RDRaH0+3JoxNfjRxkyRgrdbsA= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= -k8s.io/klog/v2 v2.4.0 h1:7+X0fUguPyrKEC4WjH8iGDg3laWgMo5tMnRTIGTTxGQ= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.40.1 h1:P4RRucWk/lFOlDdkAr3mc7iWFkgKrZY9qZMAgek06S4= k8s.io/klog/v2 v2.40.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= diff --git a/helper/Makefile b/helper/Makefile new file mode 100644 index 0000000..f9d7353 --- /dev/null +++ b/helper/Makefile @@ -0,0 +1,26 @@ +# dev env https://www.dtm.pub/other/develop.html +all: fmt lint test_redis +.PHONY: all + +fmt: + @gofmt -s -w ./ + +lint: + @golangci-lint run + +.PHONY: test +test: + @go test ./... + +test_redis: + TEST_STORE=redis go test ./... + +test_all: + TEST_STORE=redis go test ./... + TEST_STORE=boltdb go test ./... + TEST_STORE=mysql go test ./... + TEST_STORE=postgres go test ./... + +cover_test: + ./helper/test-cover.sh + diff --git a/helper/README-cn.md b/helper/README-cn.md index 1d98278..282bf6e 100644 --- a/helper/README-cn.md +++ b/helper/README-cn.md @@ -69,6 +69,7 @@ DTM是一款变革性的分布式事务框架,提供了傻瓜式的使用方 ## 微服务框架支持 - [go-zero](https://github.com/zeromicro/go-zero):一开源就非常火爆的微服务框架,首家接入dtm的微服务框架。感谢go-zero作者[kevwan](https://github.com/kevwan)的大力支持 +- [kratos](https://github.com/go-kratos/kratos):这是bilibili开源的一个微服务框架。感谢[lei liu](https://github.com/Leizhengzi)的贡献 - [polaris](https://github.com/polarismesh/polaris): 腾讯开源的注册发现组件,以及在其上构建的微服务框架。感谢腾讯同学[ychensha](https://github.com/ychensha)的PR - 其他:看用户需求量,择机接入,参见[微服务支持](https://dtm.pub/ref/proto.html) diff --git a/helper/bench/Makefile b/helper/bench/Makefile index e819a4b..72c8094 100644 --- a/helper/bench/Makefile +++ b/helper/bench/Makefile @@ -1,6 +1,7 @@ # All targets. default: bench +# configure these paths according to you system bench: /usr/local/bin/go /etc/redis/redis.conf /usr/local/bin/docker-compose main.go rm -f ../conf.sample.yml go build -o bench diff --git a/helper/bench/main.go b/helper/bench/main.go index e8cb94c..058db3e 100644 --- a/helper/bench/main.go +++ b/helper/bench/main.go @@ -47,8 +47,8 @@ func main() { } else { hintAndExit() } - dtmsvr.StartSvr() // 启动dtmsvr的api服务 - go dtmsvr.CronExpiredTrans(-1) // 启动dtmsvr的定时过期查询 - svr.StartSvr() // 启动bench服务 + dtmsvr.StartSvr() + go dtmsvr.CronExpiredTrans(-1) + svr.StartSvr() select {} } diff --git a/helper/bench/prepare.sh b/helper/bench/prepare.sh index 2ec3ad1..b78f0d5 100755 --- a/helper/bench/prepare.sh +++ b/helper/bench/prepare.sh @@ -6,5 +6,5 @@ git clone https://github.com/dtm-labs/dtm.git && cd dtm && git checkout alpha && echo 'all prepared. you shoud run following commands to test in different terminal' echo -echo 'cd dtm && go run bench/main.go redis|boltdb|db' -echo 'cd dtm && bench/run-redis|boltdb|mysql.sh' +echo 'cd dtf && go run helper/bench/main.go redis|boltdb|db' +echo 'cd dtf && ./helper/bench/test-redis|boltdb|mysql.sh' diff --git a/helper/bench/svr/http.go b/helper/bench/svr/http.go index 76844d6..0c61c5a 100644 --- a/helper/bench/svr/http.go +++ b/helper/bench/svr/http.go @@ -73,7 +73,9 @@ var sqls = 1 // PrepareBenchDB prepares db data for bench func PrepareBenchDB() { db := pdbGet() - _, err := dtmimp.DBExec(db, "drop table if exists dtm_busi.user_account_log") + _, err := dtmimp.DBExec(db, "CREATE DATABASE if not exists dtm_busi") + logger.FatalIfError(err) + _, err = dtmimp.DBExec(db, "drop table if exists dtm_busi.user_account_log") logger.FatalIfError(err) _, err = dtmimp.DBExec(db, `create table if not exists dtm_busi.user_account_log ( id INT(11) AUTO_INCREMENT PRIMARY KEY, @@ -96,7 +98,7 @@ func PrepareBenchDB() { func StartSvr() { app := dtmutil.GetGinApp() benchAddRoute(app) - logger.Debugf("bench listening at %d", benchPort) + logger.Infof("bench listening at %s", benchPort) go func() { _ = app.Run(fmt.Sprintf(":%s", benchPort)) }() diff --git a/helper/test-cover.sh b/helper/test-cover.sh old mode 100644 new mode 100755 index 13bd654..d1a3d26 --- a/helper/test-cover.sh +++ b/helper/test-cover.sh @@ -1,7 +1,7 @@ set -x echo "" > coverage.txt for store in redis mysql boltdb; do - for d in $(go list ./... | grep -v vendor); do + for d in $(go list ./... | grep -v vendor | grep -v test); do TEST_STORE=$store go test -covermode count -coverprofile=profile.out -coverpkg=github.com/dtm-labs/dtm/dtmcli,github.com/dtm-labs/dtm/dtmcli/dtmimp,github.com/dtm-labs/dtm/dtmcli/logger,github.com/dtm-labs/dtm/dtmgrpc,github.com/dtm-labs/dtm/dtmgrpc/dtmgimp,github.com/dtm-labs/dtm/dtmsvr,github.com/dtm-labs/dtm/dtmsvr/config,github.com/dtm-labs/dtm/dtmsvr/storage,github.com/dtm-labs/dtm/dtmsvr/storage/boltdb,github.com/dtm-labs/dtm/dtmsvr/storage/redis,github.com/dtm-labs/dtm/dtmsvr/storage/registry,github.com/dtm-labs/dtm/dtmsvr/storage/sql,github.com/dtm-labs/dtm/dtmutil -gcflags=-l $d || exit 1 if [ -f profile.out ]; then cat profile.out >> coverage.txt diff --git a/main.go b/main.go index bc7e2df..dd5c791 100644 --- a/main.go +++ b/main.go @@ -21,6 +21,7 @@ import ( // load the microserver driver _ "github.com/dtm-labs/dtmdriver-gozero" + _ "github.com/dtm-labs/dtmdriver-kratos" _ "github.com/dtm-labs/dtmdriver-polaris" _ "github.com/dtm-labs/dtmdriver-protocol1" ) @@ -44,7 +45,7 @@ func usage() { var isVersion = flag.Bool("v", false, "Show the version of dtm.") var isDebug = flag.Bool("d", false, "Set log level to debug.") -var isHelp = flag.Bool("h", false, "Show the help information about etcd.") +var isHelp = flag.Bool("h", false, "Show the help information about dtm.") var isReset = flag.Bool("r", false, "Reset dtm server data.") var confFile = flag.String("c", "", "Path to the server configuration file.") @@ -69,7 +70,7 @@ func main() { } _, _ = maxprocs.Set(maxprocs.Logger(logger.Infof)) registry.WaitStoreUp() - dtmsvr.StartSvr() // 启动dtmsvr的api服务 - go dtmsvr.CronExpiredTrans(-1) // 启动dtmsvr的定时过期查询 + dtmsvr.StartSvr() // start dtmsvr api + go dtmsvr.CronExpiredTrans(-1) // start dtmsvr cron job select {} } diff --git a/sqls/dtmsvr.storage.mysql.sql b/sqls/dtmsvr.storage.mysql.sql index 09c82f5..0aadf98 100644 --- a/sqls/dtmsvr.storage.mysql.sql +++ b/sqls/dtmsvr.storage.mysql.sql @@ -4,37 +4,36 @@ CREATE DATABASE IF NOT EXISTS dtm drop table IF EXISTS dtm.trans_global; CREATE TABLE if not EXISTS dtm.trans_global ( `id` bigint(22) NOT NULL AUTO_INCREMENT, - `gid` varchar(128) NOT NULL COMMENT '事务全局id', - `trans_type` varchar(45) not null COMMENT '事务类型: saga | xa | tcc | msg', - -- `data` TEXT COMMENT '事务携带的数据', -- 影响性能,不必要存储 - `status` varchar(12) NOT NULL COMMENT '全局事务的状态 prepared | submitted | aborting | finished | rollbacked', - `query_prepared` varchar(128) NOT NULL COMMENT 'prepared状态事务的查询api', - `protocol` varchar(45) not null comment '通信协议 http | grpc', + `gid` varchar(128) NOT NULL COMMENT 'global transaction id', + `trans_type` varchar(45) not null COMMENT 'transaction type: saga | xa | tcc | msg', + `status` varchar(12) NOT NULL COMMENT 'tranaction status: prepared | submitted | aborting | finished | rollbacked', + `query_prepared` varchar(128) NOT NULL COMMENT 'url to check for 2-phase message', + `protocol` varchar(45) not null comment 'protocol: http | grpc | json-rpc', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, `finish_time` datetime DEFAULT NULL, `rollback_time` datetime DEFAULT NULL, - `options` varchar(1024) DEFAULT '', - `custom_data` varchar(256) DEFAULT '', - `next_cron_interval` int(11) default null comment '下次定时处理的间隔', - `next_cron_time` datetime default null comment '下次定时处理的时间', - `owner` varchar(128) not null default '' comment '正在处理全局事务的锁定者', - `ext_data` TEXT comment 'global扩展字段的数据', + `options` varchar(1024) DEFAULT 'options for transaction like: TimeoutToFail, RequestTimeout', + `custom_data` varchar(256) DEFAULT '' COMMENT 'custom data for transaction', + `next_cron_interval` int(11) default null comment 'next cron interval. for use of cron job', + `next_cron_time` datetime default null comment 'next time to process this trans. for use of cron job', + `owner` varchar(128) not null default '' comment 'who is locking this trans', + `ext_data` TEXT comment 'extended data for this trans', PRIMARY KEY (`id`), UNIQUE KEY `gid` (`gid`), key `owner`(`owner`), - key `status_next_cron_time` (`status`, `next_cron_time`) comment '这个索引用于查询超时的全局事务,能够合理的走索引' + key `status_next_cron_time` (`status`, `next_cron_time`) comment 'cron job will use this index to query trans' ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4; drop table IF EXISTS dtm.trans_branch_op; CREATE TABLE IF NOT EXISTS dtm.trans_branch_op ( `id` bigint(22) NOT NULL AUTO_INCREMENT, - `gid` varchar(128) NOT NULL COMMENT '事务全局id', - `url` varchar(128) NOT NULL COMMENT '动作关联的url', - `data` TEXT COMMENT '请求所携带的数据', - `bin_data` BLOB COMMENT 'grpc的二进制数据', - `branch_id` VARCHAR(128) NOT NULL COMMENT '事务分支ID', - `op` varchar(45) NOT NULL COMMENT '事务分支类型 saga_action | saga_compensate | xa', - `status` varchar(45) NOT NULL COMMENT '步骤的状态 submitted | finished | rollbacked', + `gid` varchar(128) NOT NULL COMMENT 'global transaction id', + `url` varchar(128) NOT NULL COMMENT 'the url of this op', + `data` TEXT COMMENT 'request body, depreceated', + `bin_data` BLOB COMMENT 'request body', + `branch_id` VARCHAR(128) NOT NULL COMMENT 'transaction branch ID', + `op` varchar(45) NOT NULL COMMENT 'transaction operation type like: action | compensate | try | confirm | cancel', + `status` varchar(45) NOT NULL COMMENT 'transaction op status: prepared | succeed | failed', `finish_time` datetime DEFAULT NULL, `rollback_time` datetime DEFAULT NULL, `create_time` datetime DEFAULT NULL, diff --git a/sqls/dtmsvr.storage.tdsql.sql b/sqls/dtmsvr.storage.tdsql.sql index 09cf816..2f6e42d 100644 --- a/sqls/dtmsvr.storage.tdsql.sql +++ b/sqls/dtmsvr.storage.tdsql.sql @@ -4,38 +4,37 @@ CREATE DATABASE IF NOT EXISTS dtm drop table IF EXISTS dtm.trans_global; CREATE TABLE if not EXISTS dtm.trans_global ( `id` bigint(22) NOT NULL AUTO_INCREMENT, - `gid` varchar(128) NOT NULL COMMENT '事务全局id', - `trans_type` varchar(45) not null COMMENT '事务类型: saga | xa | tcc | msg', - -- `data` TEXT COMMENT '事务携带的数据', -- 影响性能,不必要存储 - `status` varchar(12) NOT NULL COMMENT '全局事务的状态 prepared | submitted | aborting | finished | rollbacked', - `query_prepared` varchar(128) NOT NULL COMMENT 'prepared状态事务的查询api', - `protocol` varchar(45) not null comment '通信协议 http | grpc', + `gid` varchar(128) NOT NULL COMMENT 'global transaction id', + `trans_type` varchar(45) not null COMMENT 'transaction type: saga | xa | tcc | msg', + `status` varchar(12) NOT NULL COMMENT 'tranaction status: prepared | submitted | aborting | finished | rollbacked', + `query_prepared` varchar(128) NOT NULL COMMENT 'url to check for 2-phase message', + `protocol` varchar(45) not null comment 'protocol: http | grpc | json-rpc', `create_time` datetime DEFAULT NULL, `update_time` datetime DEFAULT NULL, - `commit_time` datetime DEFAULT NULL, `finish_time` datetime DEFAULT NULL, `rollback_time` datetime DEFAULT NULL, - `options` varchar(256) DEFAULT '', - `custom_data` varchar(256) DEFAULT '', - `next_cron_interval` int(11) default null comment '下次定时处理的间隔', - `next_cron_time` datetime default null comment '下次定时处理的时间', - `owner` varchar(128) not null default '' comment '正在处理全局事务的锁定者', + `options` varchar(1024) DEFAULT 'options for transaction like: TimeoutToFail, RequestTimeout', + `custom_data` varchar(256) DEFAULT '' COMMENT 'custom data for transaction', + `next_cron_interval` int(11) default null comment 'next cron interval. for use of cron job', + `next_cron_time` datetime default null comment 'next time to process this trans. for use of cron job', + `owner` varchar(128) not null default '' comment 'who is locking this trans', + `ext_data` TEXT comment 'extended data for this trans', PRIMARY KEY (`id`,`gid`), UNIQUE KEY `id` (`id`,`gid`), UNIQUE KEY `gid` (`gid`), key `owner`(`owner`), - key `status_next_cron_time` (`status`, `next_cron_time`) comment '这个索引用于查询超时的全局事务,能够合理的走索引' + key `status_next_cron_time` (`status`, `next_cron_time`) comment 'cron job will use this index to query trans' ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 shardkey=gid; drop table IF EXISTS dtm.trans_branch_op; CREATE TABLE IF NOT EXISTS dtm.trans_branch_op ( `id` bigint(22) NOT NULL AUTO_INCREMENT, - `gid` varchar(128) NOT NULL COMMENT '事务全局id', - `url` varchar(128) NOT NULL COMMENT '动作关联的url', - `data` TEXT COMMENT '请求所携带的数据', - `bin_data` BLOB COMMENT 'grpc的二进制数据', - `branch_id` VARCHAR(128) NOT NULL COMMENT '事务分支ID', - `op` varchar(45) NOT NULL COMMENT '事务分支类型 saga_action | saga_compensate | xa', - `status` varchar(45) NOT NULL COMMENT '步骤的状态 submitted | finished | rollbacked', + `gid` varchar(128) NOT NULL COMMENT 'global transaction id', + `url` varchar(128) NOT NULL COMMENT 'the url of this op', + `data` TEXT COMMENT 'request body, depreceated', + `bin_data` BLOB COMMENT 'request body', + `branch_id` VARCHAR(128) NOT NULL COMMENT 'transaction branch ID', + `op` varchar(45) NOT NULL COMMENT 'transaction operation type like: action | compensate | try | confirm | cancel', + `status` varchar(45) NOT NULL COMMENT 'transaction op status: prepared | succeed | failed', `finish_time` datetime DEFAULT NULL, `rollback_time` datetime DEFAULT NULL, `create_time` datetime DEFAULT NULL, diff --git a/test/api_test.go b/test/api_test.go index 54e869d..ff3d5d6 100644 --- a/test/api_test.go +++ b/test/api_test.go @@ -8,11 +8,13 @@ package test import ( "fmt" + "net/http" "strconv" "testing" "github.com/dtm-labs/dtm/dtmcli/dtmimp" "github.com/dtm-labs/dtm/dtmutil" + "github.com/dtm-labs/dtm/test/busi" "github.com/stretchr/testify/assert" ) @@ -100,3 +102,32 @@ func TestAPIResetCronTime(t *testing.T) { return int64(succeedCount), hasRemaining, err }) } + +func TestAPIForceStoppedNormal(t *testing.T) { + saga := genSaga(dtmimp.GetFuncName(), false, false) + busi.MainSwitch.TransOutResult.SetOnce("ONGOING") + saga.Submit() + waitTransProcessed(saga.Gid) + assert.Equal(t, StatusSubmitted, getTransStatus(saga.Gid)) + + resp, err := dtmimp.RestyClient.R().SetBody(map[string]string{ + "gid": saga.Gid, + }).Post(dtmutil.DefaultHTTPServer + "/forceStop") + assert.Nil(t, err) + assert.Equal(t, resp.StatusCode(), http.StatusOK) + assert.Equal(t, StatusFailed, getTransStatus(saga.Gid)) +} + +func TestAPIForceStoppedAbnormal(t *testing.T) { + saga := genSaga(dtmimp.GetFuncName(), false, false) + saga.Submit() + waitTransProcessed(saga.Gid) + assert.Equal(t, []string{StatusPrepared, StatusSucceed, StatusPrepared, StatusSucceed}, getBranchesStatus(saga.Gid)) + assert.Equal(t, StatusSucceed, getTransStatus(saga.Gid)) + + resp, err := dtmimp.RestyClient.R().SetBody(map[string]string{ + "gid": saga.Gid, + }).Post(dtmutil.DefaultHTTPServer + "/forceStop") + assert.Nil(t, err) + assert.Equal(t, resp.StatusCode(), http.StatusConflict) +} diff --git a/test/base_test.go b/test/base_test.go index 31ef17d..68ea359 100644 --- a/test/base_test.go +++ b/test/base_test.go @@ -35,7 +35,7 @@ func TestBaseSqlDB(t *testing.T) { TransType: "saga", Gid: "gid2", BranchID: "branch_id2", - Op: dtmcli.BranchAction, + Op: dtmimp.OpAction, BarrierID: 1, } db.Must().Exec("insert into dtm_barrier.barrier(trans_type, gid, branch_id, op, barrier_id, reason) values('saga', 'gid1', 'branch_id1', 'action', '01', 'saga')") diff --git a/test/busi/base_grpc.go b/test/busi/base_grpc.go index cb1032f..ff7daf1 100644 --- a/test/busi/base_grpc.go +++ b/test/busi/base_grpc.go @@ -18,7 +18,6 @@ import ( "github.com/dtm-labs/dtm/dtmcli/logger" "github.com/dtm-labs/dtm/dtmgrpc" "github.com/dtm-labs/dtm/dtmutil" - "github.com/gin-gonic/gin" "github.com/dtm-labs/dtm/dtmgrpc/dtmgimp" "github.com/dtm-labs/dtm/dtmgrpc/dtmgpb" @@ -33,15 +32,6 @@ var BusiGrpc = fmt.Sprintf("localhost:%d", BusiGrpcPort) // DtmClient grpc client for dtm var DtmClient dtmgpb.DtmClient -// XaGrpcClient XA client connection -var XaGrpcClient *dtmgrpc.XaGrpcClient - -func init() { - setupFuncs["XaGrpcSetup"] = func(app *gin.Engine) { - XaGrpcClient = dtmgrpc.NewXaGrpcClient(dtmutil.DefaultGrpcServer, BusiConf, BusiGrpc+"/busi.Busi/XaNotify") - } -} - // GrpcStartup for grpc func GrpcStartup() { conn, err := grpc.Dial(dtmutil.DefaultGrpcServer, grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithUnaryInterceptor(dtmgimp.GrpcClientLog)) @@ -105,13 +95,13 @@ func (s *busiServer) TransOutTcc(ctx context.Context, in *BusiReq) (*emptypb.Emp } func (s *busiServer) TransInXa(ctx context.Context, in *BusiReq) (*emptypb.Empty, error) { - return &emptypb.Empty{}, XaGrpcClient.XaLocalTransaction(ctx, in, func(db *sql.DB, xa *dtmgrpc.XaGrpc) error { + return &emptypb.Empty{}, dtmgrpc.XaLocalTransaction(ctx, BusiConf, func(db *sql.DB, xa *dtmgrpc.XaGrpc) error { return sagaGrpcAdjustBalance(db, TransInUID, in.Amount, in.TransInResult) }) } func (s *busiServer) TransOutXa(ctx context.Context, in *BusiReq) (*emptypb.Empty, error) { - return &emptypb.Empty{}, XaGrpcClient.XaLocalTransaction(ctx, in, func(db *sql.DB, xa *dtmgrpc.XaGrpc) error { + return &emptypb.Empty{}, dtmgrpc.XaLocalTransaction(ctx, BusiConf, func(db *sql.DB, xa *dtmgrpc.XaGrpc) error { return sagaGrpcAdjustBalance(db, TransOutUID, in.Amount, in.TransOutResult) }) } @@ -125,10 +115,6 @@ func (s *busiServer) TransInTccNested(ctx context.Context, in *BusiReq) (*emptyp return r, handleGrpcBusiness(in, MainSwitch.TransInResult.Fetch(), in.TransInResult, dtmimp.GetFuncName()) } -func (s *busiServer) XaNotify(ctx context.Context, in *emptypb.Empty) (*emptypb.Empty, error) { - return XaGrpcClient.HandleCallback(ctx) -} - func (s *busiServer) TransOutHeaderYes(ctx context.Context, in *BusiReq) (*emptypb.Empty, error) { meta := dtmgimp.GetMetaFromContext(ctx, "test_header") if meta == "" { diff --git a/test/busi/base_http.go b/test/busi/base_http.go index 44bb262..6018e69 100644 --- a/test/busi/base_http.go +++ b/test/busi/base_http.go @@ -37,9 +37,6 @@ var setupFuncs = map[string]setupFunc{} // Busi busi service url prefix var Busi = fmt.Sprintf("http://localhost:%d%s", BusiPort, BusiAPI) -// XaClient 1 -var XaClient *dtmcli.XaClient - // SleepCancelHandler 1 type SleepCancelHandler func(c *gin.Context) interface{} @@ -63,13 +60,6 @@ func BaseAppStartup() *gin.Engine { } c.Next() }) - var err error - XaClient, err = dtmcli.NewXaClient(dtmutil.DefaultHTTPServer, BusiConf, Busi+"/xa", func(path string, xa *dtmcli.XaClient) { - app.POST(path, dtmutil.WrapHandler2(func(c *gin.Context) interface{} { - return xa.HandleCallback(c.Query("gid"), c.Query("branch_id"), c.Query("op")) - })) - }) - logger.FatalIfError(err) BaseAddRoute(app) addJrpcRoute(app) @@ -144,12 +134,12 @@ func BaseAddRoute(app *gin.Engine) { return bb.MongoQueryPrepared(MongoGet()) })) app.POST(BusiAPI+"/TransInXa", dtmutil.WrapHandler2(func(c *gin.Context) interface{} { - return XaClient.XaLocalTransaction(c.Request.URL.Query(), func(db *sql.DB, xa *dtmcli.Xa) error { + return dtmcli.XaLocalTransaction(c.Request.URL.Query(), BusiConf, func(db *sql.DB, xa *dtmcli.Xa) error { return SagaAdjustBalance(db, TransInUID, reqFrom(c).Amount, reqFrom(c).TransInResult) }) })) app.POST(BusiAPI+"/TransOutXa", dtmutil.WrapHandler2(func(c *gin.Context) interface{} { - return XaClient.XaLocalTransaction(c.Request.URL.Query(), func(db *sql.DB, xa *dtmcli.Xa) error { + return dtmcli.XaLocalTransaction(c.Request.URL.Query(), BusiConf, func(db *sql.DB, xa *dtmcli.Xa) error { return SagaAdjustBalance(db, TransOutUID, reqFrom(c).Amount, reqFrom(c).TransOutResult) }) })) @@ -167,7 +157,7 @@ func BaseAddRoute(app *gin.Engine) { return resp })) app.POST(BusiAPI+"/TransOutXaGorm", dtmutil.WrapHandler2(func(c *gin.Context) interface{} { - return XaClient.XaLocalTransaction(c.Request.URL.Query(), func(db *sql.DB, xa *dtmcli.Xa) error { + return dtmcli.XaLocalTransaction(c.Request.URL.Query(), BusiConf, func(db *sql.DB, xa *dtmcli.Xa) error { if reqFrom(c).TransOutResult == dtmcli.ResultFailure { return dtmcli.ErrFailure } @@ -194,7 +184,7 @@ func BaseAddRoute(app *gin.Engine) { } return nil })) - app.POST(BusiAPI+"/TccBSleepCancel", dtmutil.WrapHandler2(func(c *gin.Context) interface{} { + app.POST(BusiAPI+"/SleepCancel", dtmutil.WrapHandler2(func(c *gin.Context) interface{} { return sleepCancelHandler(c) })) app.POST(BusiAPI+"/TransOutHeaderYes", dtmutil.WrapHandler2(func(c *gin.Context) interface{} { diff --git a/test/busi/quick_start.go b/test/busi/quick_start.go index 09d84ce..6d57af5 100644 --- a/test/busi/quick_start.go +++ b/test/busi/quick_start.go @@ -9,7 +9,7 @@ import ( "github.com/gin-gonic/gin" ) -// 事务参与者的服务地址 +// busi address const qsBusiAPI = "/api/busi_start" const qsBusiPort = 8082 @@ -57,14 +57,14 @@ const dtmServer = "http://localhost:36789/api/dtmsvr" // QsFireRequest quick start: fire request func QsFireRequest() string { - req := &gin.H{"amount": 30} // 微服务的载荷 - // DtmServer为DTM服务的地址 + req := &gin.H{"amount": 30} // load of micro-service + // DtmServer is the url of dtm saga := dtmcli.NewSaga(dtmServer, dtmcli.MustGenGid(dtmServer)). - // 添加一个TransOut的子事务,正向操作为url: qsBusi+"/TransOut", 逆向操作为url: qsBusi+"/TransOutCompensate" + // add a TransOut subtraction,forward operation with url: qsBusi+"/TransOut", reverse compensation operation with url: qsBusi+"/TransOutCompensate" Add(qsBusi+"/TransOut", qsBusi+"/TransOutCompensate", req). - // 添加一个TransIn的子事务,正向操作为url: qsBusi+"/TransOut", 逆向操作为url: qsBusi+"/TransInCompensate" + // add a TransIn subtraction, forward operation with url: qsBusi+"/TransIn", reverse compensation operation with url: qsBusi+"/TransInCompensate" Add(qsBusi+"/TransIn", qsBusi+"/TransInCompensate", req) - // 提交saga事务,dtm会完成所有的子事务/回滚所有的子事务 + // submit the created saga transaction,dtm ensures all subtractions either complete or get revoked err := saga.Submit() if err != nil { diff --git a/test/busi/startup.go b/test/busi/startup.go index 3181787..08de468 100644 --- a/test/busi/startup.go +++ b/test/busi/startup.go @@ -22,6 +22,8 @@ func PopulateDB(skipDrop bool) { dtmutil.RunSQLScript(BusiConf, file, skipDrop) file = fmt.Sprintf("%s/dtmcli.barrier.%s.sql", dtmutil.GetSQLDir(), BusiConf.Driver) dtmutil.RunSQLScript(BusiConf, file, skipDrop) + file = fmt.Sprintf("%s/dtmsvr.storage.%s.sql", dtmutil.GetSQLDir(), BusiConf.Driver) + dtmutil.RunSQLScript(BusiConf, file, skipDrop) _, err := RedisGet().FlushAll(context.Background()).Result() // redis barrier need clear dtmimp.E2P(err) SetRedisBothAccount(10000, 10000) diff --git a/test/busi/utils.go b/test/busi/utils.go index 8f68373..de5a490 100644 --- a/test/busi/utils.go +++ b/test/busi/utils.go @@ -100,7 +100,7 @@ func oldWrapHandler(fn func(*gin.Context) (interface{}, error)) gin.HandlerFunc return fn(c) }() var b = []byte{} - if resp, ok := r.(*resty.Response); ok { // 如果是response,则取出body直接处理 + if resp, ok := r.(*resty.Response); ok { // if it is a response,the get the body b = resp.Body() } else if err == nil { b, err = json.Marshal(r) diff --git a/test/tcc_barrier_test.go b/test/tcc_barrier_test.go index c55308d..bbafb2a 100644 --- a/test/tcc_barrier_test.go +++ b/test/tcc_barrier_test.go @@ -73,8 +73,8 @@ func runTestTccBarrierDisorder(t *testing.T, store string) { body := &busi.TransReq{Amount: 30, Store: store} tryURL := Busi + "/TccBTransOutTry" confirmURL := Busi + "/TccBTransOutConfirm" - cancelURL := Busi + "/TccBSleepCancel" - // 请参见子事务屏障里的时序图,这里为了模拟该时序图,手动拆解了callbranch + cancelURL := Busi + "/SleepCancel" + // refer to time diagram for barrier, here we simulate it branchID := tcc.NewSubBranchID() busi.SetSleepCancelHandler(func(c *gin.Context) interface{} { res := busi.TccBarrierTransOutCancel(c) @@ -85,16 +85,16 @@ func runTestTccBarrierDisorder(t *testing.T, store string) { logger.Debugf("disorderHandler after cancel return read") return res }) - // 注册子事务 + // register tcc branch resp, err := dtmimp.RestyClient.R(). SetBody(map[string]interface{}{ - "gid": tcc.Gid, - "branch_id": branchID, - "trans_type": "tcc", - "status": StatusPrepared, - "data": string(dtmimp.MustMarshal(body)), - dtmcli.BranchConfirm: confirmURL, - dtmcli.BranchCancel: cancelURL, + "gid": tcc.Gid, + "branch_id": branchID, + "trans_type": "tcc", + "status": StatusPrepared, + "data": string(dtmimp.MustMarshal(body)), + dtmimp.OpConfirm: confirmURL, + dtmimp.OpCancel: cancelURL, }).Post(fmt.Sprintf("%s/%s", tcc.Dtm, "registerBranch")) assert.Nil(t, err) assert.Contains(t, resp.String(), dtmcli.ResultSuccess) @@ -121,10 +121,10 @@ func runTestTccBarrierDisorder(t *testing.T, store string) { "gid": tcc.Gid, "branch_id": branchID, "trans_type": "tcc", - "op": dtmcli.BranchTry, + "op": dtmimp.OpTry, }). Post(tryURL) - assert.True(t, strings.Contains(r.String(), dtmcli.ResultSuccess)) // 这个是悬挂操作,为了简单起见,依旧让他返回成功 + assert.True(t, strings.Contains(r.String(), dtmcli.ResultSuccess)) // dangle op, return success logger.Debugf("cronFinished read") <-cronFinished <-cronFinished diff --git a/test/xa_cover_test.go b/test/xa_cover_test.go index 673a58b..6836582 100644 --- a/test/xa_cover_test.go +++ b/test/xa_cover_test.go @@ -11,39 +11,36 @@ import ( ) func TestXaCoverDBError(t *testing.T) { - oldDriver := getXc().Conf.Driver + oldDriver := busi.BusiConf.Driver gid := dtmimp.GetFuncName() - err := getXc().XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) { + err := dtmcli.XaGlobalTransaction(DtmServer, gid, func(xa *dtmcli.Xa) (*resty.Response, error) { req := busi.GenTransReq(30, false, false) _, err := xa.CallBranch(req, busi.Busi+"/TransOutXa") assert.Nil(t, err) - getXc().Conf.Driver = "no-driver" + busi.BusiConf.Driver = "no-driver" _, err = xa.CallBranch(req, busi.Busi+"/TransInXa") assert.Error(t, err) return nil, err }) assert.Error(t, err) waitTransProcessed(gid) - getXc().Conf.Driver = oldDriver + busi.BusiConf.Driver = oldDriver cronTransOnceForwardNow(t, gid, 500) // rollback succeeded here assert.Equal(t, StatusFailed, getTransStatus(gid)) assert.Equal(t, []string{StatusSucceed, StatusPrepared}, getBranchesStatus(gid)) } func TestXaCoverDTMError(t *testing.T) { - oldServer := getXc().Server - getXc().Server = "localhost:01" gid := dtmimp.GetFuncName() - err := getXc().XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) { + err := dtmcli.XaGlobalTransaction("localhost:01", gid, func(xa *dtmcli.Xa) (*resty.Response, error) { return nil, nil }) assert.Error(t, err) - getXc().Server = oldServer } func TestXaCoverGidError(t *testing.T) { gid := dtmimp.GetFuncName() + "-' '" - err := getXc().XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) { + err := dtmcli.XaGlobalTransaction(DtmServer, gid, func(xa *dtmcli.Xa) (*resty.Response, error) { req := busi.GenTransReq(30, false, false) _, err := xa.CallBranch(req, busi.Busi+"/TransOutXa") assert.Error(t, err) diff --git a/test/xa_grpc_test.go b/test/xa_grpc_test.go index 890d129..678dac6 100644 --- a/test/xa_grpc_test.go +++ b/test/xa_grpc_test.go @@ -18,12 +18,9 @@ import ( "google.golang.org/protobuf/types/known/emptypb" ) -func getXcg() *dtmgrpc.XaGrpcClient { - return busi.XaGrpcClient -} func TestXaGrpcNormal(t *testing.T) { gid := dtmimp.GetFuncName() - err := getXcg().XaGlobalTransaction(gid, func(xa *dtmgrpc.XaGrpc) error { + err := dtmgrpc.XaGlobalTransaction(DtmGrpcServer, gid, func(xa *dtmgrpc.XaGrpc) error { req := busi.GenBusiReq(30, false, false) r := &emptypb.Empty{} err := xa.CallBranch(req, busi.BusiGrpc+"/busi.Busi/TransOutXa", r) @@ -40,7 +37,7 @@ func TestXaGrpcNormal(t *testing.T) { func TestXaGrpcRollback(t *testing.T) { gid := dtmimp.GetFuncName() - err := getXcg().XaGlobalTransaction(gid, func(xa *dtmgrpc.XaGrpc) error { + err := dtmgrpc.XaGlobalTransaction(DtmGrpcServer, gid, func(xa *dtmgrpc.XaGrpc) error { req := busi.GenBusiReq(30, false, true) r := &emptypb.Empty{} err := xa.CallBranch(req, busi.BusiGrpc+"/busi.Busi/TransOutXa", r) @@ -60,11 +57,11 @@ func TestXaGrpcType(t *testing.T) { _, err := dtmgrpc.XaGrpcFromRequest(context.Background()) assert.Error(t, err) - err = busi.XaGrpcClient.XaLocalTransaction(context.Background(), nil, nil) + err = dtmgrpc.XaLocalTransaction(context.Background(), busi.BusiConf, nil) assert.Error(t, err) err = dtmimp.CatchP(func() { - busi.XaGrpcClient.XaGlobalTransaction(gid, func(xa *dtmgrpc.XaGrpc) error { panic(fmt.Errorf("hello")) }) + dtmgrpc.XaGlobalTransaction(DtmGrpcServer, gid, func(xa *dtmgrpc.XaGrpc) error { panic(fmt.Errorf("hello")) }) }) assert.Error(t, err) waitTransProcessed(gid) @@ -72,8 +69,7 @@ func TestXaGrpcType(t *testing.T) { func TestXaGrpcLocalError(t *testing.T) { gid := dtmimp.GetFuncName() - xc := busi.XaGrpcClient - err := xc.XaGlobalTransaction(gid, func(xa *dtmgrpc.XaGrpc) error { + err := dtmgrpc.XaGlobalTransaction(DtmGrpcServer, gid, func(xa *dtmgrpc.XaGrpc) error { return fmt.Errorf("an error") }) assert.Error(t, err, fmt.Errorf("an error")) diff --git a/test/xa_test.go b/test/xa_test.go index b276340..4980a0a 100644 --- a/test/xa_test.go +++ b/test/xa_test.go @@ -12,18 +12,15 @@ import ( "github.com/dtm-labs/dtm/dtmcli" "github.com/dtm-labs/dtm/dtmcli/dtmimp" + "github.com/dtm-labs/dtm/dtmutil" "github.com/dtm-labs/dtm/test/busi" "github.com/go-resty/resty/v2" "github.com/stretchr/testify/assert" ) -func getXc() *dtmcli.XaClient { - return busi.XaClient -} - func TestXaNormal(t *testing.T) { gid := dtmimp.GetFuncName() - err := getXc().XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) { + err := dtmcli.XaGlobalTransaction(dtmutil.DefaultHTTPServer, gid, func(xa *dtmcli.Xa) (*resty.Response, error) { req := busi.GenTransReq(30, false, false) resp, err := xa.CallBranch(req, busi.Busi+"/TransOutXa") if err != nil { @@ -39,7 +36,7 @@ func TestXaNormal(t *testing.T) { func TestXaDuplicate(t *testing.T) { gid := dtmimp.GetFuncName() - err := getXc().XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) { + err := dtmcli.XaGlobalTransaction(DtmServer, gid, func(xa *dtmcli.Xa) (*resty.Response, error) { req := busi.GenTransReq(30, false, false) _, err := xa.CallBranch(req, busi.Busi+"/TransOutXa") assert.Nil(t, err) @@ -49,7 +46,7 @@ func TestXaDuplicate(t *testing.T) { _, err = dtmimp.DBExec(sdb, "xa recover") assert.Nil(t, err) } - _, err = dtmimp.DBExec(sdb, dtmimp.GetDBSpecial().GetXaSQL("commit", gid+"-01")) // 先把某一个事务提交,模拟重复请求 + _, err = dtmimp.DBExec(sdb, dtmimp.GetDBSpecial().GetXaSQL("commit", gid+"-01")) // simulate repeated request assert.Nil(t, err) return xa.CallBranch(req, busi.Busi+"/TransInXa") }) @@ -61,7 +58,7 @@ func TestXaDuplicate(t *testing.T) { func TestXaRollback(t *testing.T) { gid := dtmimp.GetFuncName() - err := getXc().XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) { + err := dtmcli.XaGlobalTransaction(DtmServer, gid, func(xa *dtmcli.Xa) (*resty.Response, error) { req := busi.GenTransReq(30, false, true) resp, err := xa.CallBranch(req, busi.Busi+"/TransOutXa") if err != nil { @@ -77,7 +74,7 @@ func TestXaRollback(t *testing.T) { func TestXaLocalError(t *testing.T) { gid := dtmimp.GetFuncName() - err := getXc().XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) { + err := dtmcli.XaGlobalTransaction(DtmServer, gid, func(xa *dtmcli.Xa) (*resty.Response, error) { return nil, fmt.Errorf("an error") }) assert.Error(t, err, fmt.Errorf("an error")) @@ -87,7 +84,7 @@ func TestXaLocalError(t *testing.T) { func TestXaTimeout(t *testing.T) { gid := dtmimp.GetFuncName() timeoutChan := make(chan int, 1) - err := getXc().XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) { + err := dtmcli.XaGlobalTransaction(DtmServer, gid, func(xa *dtmcli.Xa) (*resty.Response, error) { go func() { cronTransOnceForwardNow(t, gid, 300) timeoutChan <- 0 @@ -103,7 +100,7 @@ func TestXaTimeout(t *testing.T) { func TestXaNotTimeout(t *testing.T) { gid := dtmimp.GetFuncName() timeoutChan := make(chan int, 1) - err := getXc().XaGlobalTransaction(gid, func(xa *dtmcli.Xa) (*resty.Response, error) { + err := dtmcli.XaGlobalTransaction(DtmServer, gid, func(xa *dtmcli.Xa) (*resty.Response, error) { go func() { cronTransOnceForwardNow(t, gid, 0) // not timeout, timeoutChan <- 0