This is an automated email from the ASF dual-hosted git repository.
miaoliyao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/shardingsphere-on-cloud.git
The following commit(s) were added to refs/heads/main by this push:
new fdc99fd bugfix(pitr): fix test case show no record (#297)
fdc99fd is described below
commit fdc99fd7da241525ebc74ecbce38f5caac999ffd
Author: wentao-xu <[email protected]>
AuthorDate: Fri Apr 7 17:15:25 2023 +0800
bugfix(pitr): fix test case show no record (#297)
* test(pitr): fix test case show no record
* style: lint code
---
.github/workflows/pitr-golint.yml | 2 +-
pitr/agent/.golangci.yml | 301 ++++++++++++++++++++-
pitr/agent/Makefile | 4 +-
pitr/agent/internal/cons/error.go | 10 +-
pitr/agent/internal/handler/backup.go | 6 +-
.../internal/handler/middleware/http_header.go | 2 +-
pitr/agent/internal/handler/middleware/logger.go | 12 +-
pitr/agent/internal/handler/middleware/recovery.go | 1 +
.../handler/middleware/uniform_err_resp.go | 1 +
pitr/agent/internal/handler/restore.go | 8 +-
pitr/agent/internal/handler/show.go | 13 +-
pitr/agent/internal/handler/view/backup.go | 12 +-
pitr/agent/internal/handler/view/restore.go | 19 +-
pitr/agent/internal/handler/view/show.go | 39 +--
pitr/agent/internal/pkg/model/backup.go | 4 +-
pitr/agent/internal/pkg/opengauss.go | 22 +-
pitr/agent/internal/pkg/opengauss_test.go | 1 +
pitr/agent/main.go | 11 +-
pitr/agent/pkg/cmds/cmd.go | 2 +-
pitr/agent/pkg/gsutil/conn.go | 7 +-
pitr/agent/pkg/logging/field.go | 6 +-
pitr/agent/pkg/logging/log.go | 1 +
pitr/agent/pkg/logging/zap_log.go | 1 +
pitr/agent/pkg/strutil/rand_string.go | 23 +-
pitr/agent/pkg/syncutils/recover_func.go | 4 +-
pitr/cli/.golangci.yml | 300 +++++++++++++++++++-
pitr/cli/Makefile | 4 +-
pitr/cli/internal/cmd/backup.go | 18 +-
pitr/cli/internal/cmd/restore.go | 10 +-
pitr/cli/internal/cmd/restore_test.go | 2 +-
pitr/cli/internal/cmd/show.go | 12 +-
pitr/cli/internal/cmd/show_test.go | 6 +-
pitr/cli/internal/pkg/agent-server.go | 9 +-
pitr/cli/internal/pkg/agent-server_test.go | 20 +-
pitr/cli/internal/pkg/local-storage.go | 17 +-
pitr/cli/internal/pkg/mocks/local-storage.go | 4 +-
pitr/cli/internal/pkg/model/as_backup.go | 4 +-
pitr/cli/internal/pkg/model/as_restore.go | 6 +-
pitr/cli/internal/pkg/model/as_show.go | 12 +-
pitr/cli/internal/pkg/shardingsphere-proxy.go | 19 +-
pitr/cli/internal/pkg/xerr/err.go | 11 +-
pitr/cli/main.go | 2 +-
pitr/cli/pkg/httputils/req.go | 3 +
pitr/cli/pkg/logging/field.go | 11 -
pitr/cli/pkg/stringutil/rand_string.go | 24 +-
pitr/cli/pkg/stringutil/rand_string_test.go | 4 +-
46 files changed, 803 insertions(+), 207 deletions(-)
diff --git a/.github/workflows/pitr-golint.yml
b/.github/workflows/pitr-golint.yml
index 8e799cf..456f3a3 100644
--- a/.github/workflows/pitr-golint.yml
+++ b/.github/workflows/pitr-golint.yml
@@ -55,5 +55,5 @@ jobs:
$(go env GOPATH)/bin/golangci-lint run -v --timeout 300s ./...
- name: Lint Pitr Agent
run: |
- cd pitr/gent
+ cd pitr/agent
$(go env GOPATH)/bin/golangci-lint run -v --timeout 300s ./...
diff --git a/pitr/agent/.golangci.yml b/pitr/agent/.golangci.yml
index b7d0d56..1eb7449 100644
--- a/pitr/agent/.golangci.yml
+++ b/pitr/agent/.golangci.yml
@@ -15,35 +15,188 @@
# limitations under the License.
#
-
run:
timeout: 10m
+ skip-files:
+ - "^zz_generated.*"
+ - "_test.go"
linters:
disable-all: true
enable:
+ # The base lints
+ - errcheck
+ - gosimple
+ - govet
- ineffassign
+ - staticcheck
- typecheck
- - varcheck
- unused
- - structcheck
- - deadcode
- - gosimple
+ - unused
+ - bodyclose
+ - cyclop
+ - nilerr
- goimports
- - errcheck
- - staticcheck
- - stylecheck
- - gosec
- asciicheck
- - bodyclose
+ - prealloc
+ - stylecheck
- exportloopref
- rowserrcheck
- makezero
- durationcheck
- - prealloc
+ - gosec
- predeclared
+ # Deprecated lints
+ - structcheck
+ - varcheck
+ - deadcode
+ # The advanced lints
+ - dupl
+ - exhaustive
+ - godot
+ - misspell
+ #- varnamelen
+ - gocritic
+ #- exhaustruct
+ #- nestif
+ #- wsl
+ #- gocognit
# Refers: https://gist.github.com/maratori/47a4d00457a92aa426dbd48a18776322
linters-settings:
+ wsl:
+ # See https://github.com/bombsimon/wsl/blob/master/doc/configuration.md
for documentation of available settings.
+ # These are the defaults for `golangci-lint`.
+
+ # Do strict checking when assigning from append (x = append(x, y)). If
+ # this is set to true - the append call must append either a variable
+ # assigned, called or used on the line above.
+ strict-append: true
+ # Allows assignments to be cuddled with variables used in calls on
+ # line above and calls to be cuddled with assignments of variables
+ # used in call on line above.
+ allow-assign-and-call: true
+ # Allows assignments to be cuddled with anything.
+ allow-assign-and-anything: false
+ # Allows cuddling to assignments even if they span over multiple lines.
+ allow-multiline-assign: true
+ # If the number of lines in a case block is equal to or lager than this
+ # number, the case *must* end white a newline.
+ force-case-trailing-whitespace: 0
+ # Allow blocks to end with comments.
+ allow-trailing-comment: false
+ # Allow multiple comments in the beginning of a block separated with
newline.
+ allow-separated-leading-comment: false
+ # Allow multiple var/declaration statements to be cuddled.
+ allow-cuddle-declarations: false
+ # A list of call idents that everything can be cuddled with.
+ # Defaults to calls looking like locks.
+ allow-cuddle-with-calls: ["Lock", "RLock"]
+ # AllowCuddleWithRHS is a list of right hand side variables that is allowed
+ # to be cuddled with anything. Defaults to assignments or calls looking
+ # like unlocks.
+ allow-cuddle-with-rhs: ["Unlock", "RUnlock"]
+ # Causes an error when an If statement that checks an error variable
doesn't
+ # cuddle with the assignment of that variable.
+ force-err-cuddling: false
+ # When force-err-cuddling is enabled this is a list of names
+ # used for error variables to check for in the conditional.
+ error-variable-names: ["err"]
+ # Causes an error if a short declaration (:=) cuddles with anything other
than
+ # another short declaration.
+ # This logic overrides force-err-cuddling among others.
+ force-short-decl-cuddling: false
+ varnamelen:
+ # The longest distance, in source lines, that is being considered a "small
scope".
+ # Variables used in at most this many lines will be ignored.
+ # Default: 5
+ max-distance: 6
+ # The minimum length of a variable's name that is considered "long".
+ # Variable names that are at least this long will be ignored.
+ # Default: 3
+ min-name-length: 2
+ # Check method receivers.
+ # Default: false
+ check-receiver: false
+ # Check named return values.
+ # Default: false
+ check-return: true
+ # Check type parameters.
+ # Default: false
+ check-type-param: true
+ # Ignore "ok" variables that hold the bool return value of a type
assertion.
+ # Default: false
+ ignore-type-assert-ok: true
+ # Ignore "ok" variables that hold the bool return value of a map index.
+ # Default: false
+ ignore-map-index-ok: true
+ # Ignore "ok" variables that hold the bool return value of a channel
receive.
+ # Default: false
+ ignore-chan-recv-ok: true
+ # Optional list of variable names that should be ignored completely.
+ # Default: []
+ ignore-names:
+ - err
+ # Optional list of variable declarations that should be ignored completely.
+ # Entries must be in one of the following forms (see below for examples):
+ # - for variables, parameters, named return values, method receivers, or
type parameters:
+ # <name> <type> (<type> can also be a pointer/slice/map/chan/...)
+ # - for constants: const <name>
+ #
+ # Default: []
+ ignore-decls:
+ - c echo.Context
+ - t testing.T
+ - f *foo.Bar
+ - e error
+ - i int
+ - const C
+ - T any
+ - m map[string]int
+ prealloc:
+ # IMPORTANT: we don't recommend using this linter before doing performance
profiling.
+ # For most programs usage of prealloc will be a premature optimization.
+
+ # Report pre-allocation suggestions only on simple loops that have no
returns/breaks/continues/gotos in them.
+ # Default: true
+ simple: false
+ # Report pre-allocation suggestions on range loops.
+ # Default: true
+ range-loops: false
+ # Report pre-allocation suggestions on for loops.
+ # Default: false
+ for-loops: true
+ #nestif:
+ # Minimal complexity of if statements to report.
+ # Default: 5
+ # min-complexity: 4
+ misspell:
+ # Correct spellings using locale preferences for US or UK.
+ # Setting locale to US will correct the British spelling of 'colour' to
'color'.
+ # Default is to use a neutral variety of English.
+ locale: US
+ # Default: []
+ ignore-words:
+ - someword
+ godot:
+ # Comments to be checked: `declarations`, `toplevel`, or `all`.
+ # Default: declarations
+ scope: toplevel
+ # List of regexps for excluding particular comment lines from check.
+ # Default: []
+ exclude:
+ # Exclude todo and fixme comments.
+ - "^fixme:"
+ - "^todo:"
+ # Check that each sentence ends with a period.
+ # Default: true
+ period: false
+ # Check that each sentence starts with a capital letter.
+ # Default: false
+ capital: false
+ dupl:
+ # Tokens count to trigger issue.
+ # Default: 150
+ threshold: 100
cyclop:
# The maximal code complexity to report.
# Default: 10
@@ -76,6 +229,132 @@ linters-settings:
# Minimal code complexity to report.
# Default: 30 (but we recommend 10-20)
min-complexity: 20
+ gocritic:
+ # Which checks should be enabled; can't be combined with 'disabled-checks'.
+ # See https://go-critic.github.io/overview#checks-overview.
+ # To check which checks are enabled run `GL_DEBUG=gocritic golangci-lint
run`.
+ # By default, list of stable checks is used.
+ enabled-checks:
+ - elseif
+ - nestingReduce
+ - unnamedResult
+ # - ruleguard
+ - truncateCmp
+ - hugeparam
+ - rangevalcopy
+ - captlocal
+ - underef
+ - toomanyresultschecker
+ - rangeexprcopy
+ # Which checks should be disabled; can't be combined with 'enabled-checks'.
+ # Default: []
+ disabled-checks:
+ - regexpMust
+ # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint
run` to see all tags and checks.
+ # See https://github.com/go-critic/go-critic#usage -> section "Tags".
+ # Default: []
+ enabled-tags:
+ - diagnostic
+ - style
+ - performance
+ - experimental
+ - opinionated
+ disabled-tags:
+ - diagnostic
+ - style
+ - performance
+ - experimental
+ - opinionated
+ # Settings passed to gocritic.
+ # The settings key is the name of a supported gocritic checker.
+ # The list of supported checkers can be find in
https://go-critic.github.io/overview.
+ settings:
+ # Must be valid enabled check name.
+ captLocal:
+ # Whether to restrict checker to params only.
+ # Default: true
+ paramsOnly: false
+ elseif:
+ # Whether to skip balanced if-else pairs.
+ # Default: true
+ skipBalanced: false
+ hugeParam:
+ # Size in bytes that makes the warning trigger.
+ # Default: 80
+ sizeThreshold: 70
+ nestingReduce:
+ # Min number of statements inside a branch to trigger a warning.
+ # Default: 5
+ bodyWidth: 4
+ rangeExprCopy:
+ # Size in bytes that makes the warning trigger.
+ # Default: 512
+ sizeThreshold: 516
+ # Whether to check test functions
+ # Default: true
+ skipTestFuncs: false
+ rangeValCopy:
+ # Size in bytes that makes the warning trigger.
+ # Default: 128
+ sizeThreshold: 32
+ # Whether to check test functions.
+ # Default: true
+ skipTestFuncs: false
+ ruleguard:
+ # Enable debug to identify which 'Where' condition was rejected.
+ # The value of the parameter is the name of a function in a ruleguard
file.
+ #
+ # When a rule is evaluated:
+ # If:
+ # The Match() clause is accepted; and
+ # One of the conditions in the Where() clause is rejected,
+ # Then:
+ # ruleguard prints the specific Where() condition that was rejected.
+ #
+ # The flag is passed to the ruleguard 'debug-group' argument.
+ # Default: ""
+ debug: 'emptyDecl'
+ # Deprecated, use 'failOn' param.
+ # If set to true, identical to failOn='all', otherwise failOn=''
+ failOnError: false
+ # Determines the behavior when an error occurs while parsing ruleguard
files.
+ # If flag is not set, log error and skip rule files that contain an
error.
+ # If flag is set, the value must be a comma-separated list of error
conditions.
+ # - 'all': fail on all errors.
+ # - 'import': ruleguard rule imports a package that cannot be found.
+ # - 'dsl': gorule file does not comply with the ruleguard DSL.
+ # Default: ""
+ failOn: dsl
+ # Comma-separated list of file paths containing ruleguard rules.
+ # If a path is relative, it is relative to the directory where the
golangci-lint command is executed.
+ # The special '${configDir}' variable is substituted with the absolute
directory containing the golangci config file.
+ # Glob patterns such as 'rules-*.go' may be specified.
+ # Default: ""
+ rules: '${configDir}/ruleguard/rules-*.go,${configDir}/myrule1.go'
+ # Comma-separated list of enabled groups or skip empty to enable
everything.
+ # Tags can be defined with # character prefix.
+ # Default: "<all>"
+ enable: "myGroupName,#myTagName"
+ # Comma-separated list of disabled groups or skip empty to enable
everything.
+ # Tags can be defined with # character prefix.
+ # Default: ""
+ disable: "myGroupName,#myTagName"
+ tooManyResultsChecker:
+ # Maximum number of results.
+ # Default: 5
+ maxResults: 10
+ truncateCmp:
+ # Whether to skip int/uint/uintptr types.
+ # Default: true
+ skipArchDependent: false
+ underef:
+ # Whether to skip (*x).method() calls where x is a pointer receiver.
+ # Default: true
+ skipRecvDeref: false
+ unnamedResult:
+ # Whether to check exported functions.
+ # Default: false
+ checkExported: true
issues:
exclude-rules:
- path: _test\.go
diff --git a/pitr/agent/Makefile b/pitr/agent/Makefile
index 6f3a0ae..7fd3b96 100644
--- a/pitr/agent/Makefile
+++ b/pitr/agent/Makefile
@@ -1,4 +1,4 @@
-.PHONY:openssl-local test build
+.PHONY:openssl-local test build lint
GOOS := $(shell go env GOOS)
@@ -12,3 +12,5 @@ test:
build:
GOOS=$(GOOS) go build -o pitr-agent
+lint:
+ golangci-lint run -v --timeout 5m
diff --git a/pitr/agent/internal/cons/error.go
b/pitr/agent/internal/cons/error.go
index d9b2b2a..bf4a961 100644
--- a/pitr/agent/internal/cons/error.go
+++ b/pitr/agent/internal/cons/error.go
@@ -23,7 +23,7 @@ import (
var (
Internal = xerror.New(10000, "Internal error.")
- InvalidHttpHeader = xerror.New(10001, "Invalid http header.")
+ InvalidHTTPHeader = xerror.New(10001, "Invalid http header.")
DataNotFound = xerror.New(10002, "Data not found.")
CmdOperateFailed = xerror.New(10003, "Command operate failed.")
BackupPathAlreadyExist = xerror.New(10004, "The backup path already
exists.")
@@ -33,7 +33,7 @@ var (
StartOpenGaussFailed = xerror.New(10008, "Failed to start opengauss.")
StopOpenGaussFailed = xerror.New(10009, "Failed to stop opengauss.")
RestoreFailed = xerror.New(10010, "Failed to restore
opengauss.")
- InvalidDbPort = xerror.New(10011, "Invalid dn port.")
+ InvalidDBPort = xerror.New(10011, "Invalid dn port.")
MissingUsername = xerror.New(10012, "Missing username")
MissingPassword = xerror.New(10013, "Missing password.")
MissingDnBackupPath = xerror.New(10014, "Missing dn backup path.")
@@ -41,10 +41,10 @@ var (
MissingDnBackupMode = xerror.New(10016, "Missing dn backup mode.")
InvalidDnBackupMode = xerror.New(10017, "Invalid dn backup mode.")
MissingInstance = xerror.New(10018, "Missing instance.")
- MissingDnBackupId = xerror.New(10019, "Missing dn backup id.")
+ MissingDnBackupID = xerror.New(10019, "Missing dn backup id.")
BodyParseFailed = xerror.New(10020, "Invalid http request body.")
- MissingDbName = xerror.New(10021, "Missing db name.")
- DbConnectionFailed = xerror.New(10022, "Database connection
failed.")
+ MissingDBName = xerror.New(10021, "Missing db name.")
+ DBConnectionFailed = xerror.New(10022, "Database connection
failed.")
UnmatchBackupID = xerror.New(10023, "Unmatch any backup id.")
InvalidPgDataDir = xerror.New(10024, "Invalid PGDATA dir.")
UnknownOgStatus = xerror.New(10025, "Unknown openGauss status.")
diff --git a/pitr/agent/internal/handler/backup.go
b/pitr/agent/internal/handler/backup.go
index c58c823..bb000f7 100644
--- a/pitr/agent/internal/handler/backup.go
+++ b/pitr/agent/internal/handler/backup.go
@@ -39,9 +39,9 @@ func Backup(ctx *fiber.Ctx) error {
return fmt.Errorf("invalid parameter,err=%w", err)
}
- if err := pkg.OG.Auth(in.Username, in.Password, in.DbName, in.DbPort);
err != nil {
+ if err := pkg.OG.Auth(in.Username, in.Password, in.DBName, in.DBPort);
err != nil {
efmt := "pkg.OG.Auth failure[un=%s,pw.len=%d,db=%s],err=%w"
- return fmt.Errorf(efmt, in.Username, len(in.Password),
in.DbName, err)
+ return fmt.Errorf(efmt, in.Username, len(in.Password),
in.DBName, err)
}
// try to add backup instance
@@ -49,7 +49,7 @@ func Backup(ctx *fiber.Ctx) error {
return fmt.Errorf("add instance failed, err=%w", err)
}
- backupID, err := pkg.OG.AsyncBackup(in.DnBackupPath, in.Instance,
in.DnBackupMode, 1, in.DbPort)
+ backupID, err := pkg.OG.AsyncBackup(in.DnBackupPath, in.Instance,
in.DnBackupMode, 1, in.DBPort)
if err != nil {
efmt := "pkg.OG.AsyncBackup[path=%s,instance=%s,mode=%s]
failure,err=%w"
return fmt.Errorf(efmt, in.DnBackupPath, in.Instance,
in.DnBackupMode, err)
diff --git a/pitr/agent/internal/handler/middleware/http_header.go
b/pitr/agent/internal/handler/middleware/http_header.go
index 09bd16e..d41962b 100644
--- a/pitr/agent/internal/handler/middleware/http_header.go
+++ b/pitr/agent/internal/handler/middleware/http_header.go
@@ -29,7 +29,7 @@ import (
func RequestIDChecker() fiber.Handler {
return func(ctx *fiber.Ctx) error {
if id := ctx.Get(cons.RequestID); strings.Trim(id, " ") == "" {
- return responder.Error(ctx, cons.InvalidHttpHeader)
+ return responder.Error(ctx, cons.InvalidHTTPHeader)
}
return ctx.Next()
}
diff --git a/pitr/agent/internal/handler/middleware/logger.go
b/pitr/agent/internal/handler/middleware/logger.go
index fe8b062..beac16f 100644
--- a/pitr/agent/internal/handler/middleware/logger.go
+++ b/pitr/agent/internal/handler/middleware/logger.go
@@ -33,13 +33,14 @@ func Logger(log logging.ILog) fiber.Handler {
start = time.Now()
)
err := ctx.Next()
+ //nolint:exhaustive
m := map[logging.FieldKey]string{
logging.Duration: fmt.Sprintf("%dms",
time.Since(start).Milliseconds()),
logging.Path: ctx.Route().Path,
- logging.RequestUri: string(ctx.Request().RequestURI()),
+ logging.RequestURI: string(ctx.Request().RequestURI()),
logging.RequestID: ctx.Get(cons.RequestID),
- logging.HttpStatus: fmt.Sprintf("%d",
ctx.Response().StatusCode()),
- logging.HttpMethod: ctx.Method(),
+ logging.HTTPStatus: fmt.Sprintf("%d",
ctx.Response().StatusCode()),
+ logging.HTTPMethod: ctx.Method(),
}
if err != nil {
m[logging.ErrorKey] = err.Error()
@@ -52,11 +53,12 @@ func Logger(log logging.ILog) fiber.Handler {
// AccessLog logging Access log.
func AccessLog(log logging.ILog) fiber.Handler {
return func(ctx *fiber.Ctx) error {
+ //nolint:exhaustive
log.Fields(map[logging.FieldKey]string{
logging.Path: ctx.Route().Path,
- logging.RequestUri: string(ctx.Request().RequestURI()),
+ logging.RequestURI: string(ctx.Request().RequestURI()),
logging.RequestID: ctx.Get(cons.RequestID),
- logging.HttpMethod: ctx.Method(),
+ logging.HTTPMethod: ctx.Method(),
}).Info("Access log")
return ctx.Next()
}
diff --git a/pitr/agent/internal/handler/middleware/recovery.go
b/pitr/agent/internal/handler/middleware/recovery.go
index cd8acaf..868b262 100644
--- a/pitr/agent/internal/handler/middleware/recovery.go
+++ b/pitr/agent/internal/handler/middleware/recovery.go
@@ -32,6 +32,7 @@ func Recover(log logging.ILog) fiber.Handler {
return func(ctx *fiber.Ctx) error {
defer func() {
if r := recover(); r != nil {
+ //nolint:exhaustive
log.Fields(map[logging.FieldKey]string{
logging.RequestID:
ctx.Get(cons.RequestID),
logging.ErrorKey: fmt.Sprint(r),
diff --git a/pitr/agent/internal/handler/middleware/uniform_err_resp.go
b/pitr/agent/internal/handler/middleware/uniform_err_resp.go
index e8b4958..06e8083 100644
--- a/pitr/agent/internal/handler/middleware/uniform_err_resp.go
+++ b/pitr/agent/internal/handler/middleware/uniform_err_resp.go
@@ -32,6 +32,7 @@ func UniformErrResp(log logging.ILog) fiber.Handler {
if err == nil {
return nil
}
+ //nolint:exhaustive
log.Fields(map[logging.FieldKey]string{
logging.ErrorKey: err.Error(),
logging.RequestID: ctx.Get(cons.RequestID),
diff --git a/pitr/agent/internal/handler/restore.go
b/pitr/agent/internal/handler/restore.go
index 080e0e2..32d2045 100644
--- a/pitr/agent/internal/handler/restore.go
+++ b/pitr/agent/internal/handler/restore.go
@@ -42,9 +42,9 @@ func Restore(ctx *fiber.Ctx) (err error) {
return
}
- if err = pkg.OG.Auth(in.Username, in.Password, in.DbName, in.DbPort);
err != nil {
+ if err = pkg.OG.Auth(in.Username, in.Password, in.DBName, in.DBPort);
err != nil {
efmt := "pkg.OG.Auth failure[un=%s,pw.len=%d,db=%s],err=%w"
- err = fmt.Errorf(efmt, in.Username, len(in.Password),
in.DbName, err)
+ err = fmt.Errorf(efmt, in.Username, len(in.Password),
in.DBName, err)
return
}
@@ -68,9 +68,9 @@ func Restore(ctx *fiber.Ctx) (err error) {
return
}
- if err = pkg.OG.Restore(in.DnBackupPath, in.Instance, in.DnBackupId);
err != nil {
+ if err = pkg.OG.Restore(in.DnBackupPath, in.Instance, in.DnBackupID);
err != nil {
efmt := "pkg.OG.Restore
failure[path=%s,instance=%s,backupID=%s],err=%w"
- err = fmt.Errorf(efmt, in.DnBackupPath, in.Instance,
in.DnBackupId, err)
+ err = fmt.Errorf(efmt, in.DnBackupPath, in.Instance,
in.DnBackupID, err)
err2 := pkg.OG.MvTempToPgData()
err = fmt.Errorf("resotre failre[err=%s],pkg.OG.MvTempToPgData
return err=%w", err, err2)
diff --git a/pitr/agent/internal/handler/show.go
b/pitr/agent/internal/handler/show.go
index 076eb7f..58d8092 100644
--- a/pitr/agent/internal/handler/show.go
+++ b/pitr/agent/internal/handler/show.go
@@ -19,6 +19,7 @@ package handler
import (
"fmt"
+
"github.com/apache/shardingsphere-on-cloud/pitr/agent/internal/pkg"
"github.com/apache/shardingsphere-on-cloud/pitr/agent/pkg/responder"
@@ -40,15 +41,15 @@ func Show(ctx *fiber.Ctx) error {
return fmt.Errorf("invalid parameter,err=%w", err)
}
- if err := pkg.OG.Auth(in.Username, in.Password, in.DbName, in.DbPort);
err != nil {
+ if err := pkg.OG.Auth(in.Username, in.Password, in.DBName, in.DBPort);
err != nil {
efmt := "pkg.OG.Auth failure[un=%s,pw.len=%d,db=%s],err=%w"
- return fmt.Errorf(efmt, in.Username, len(in.Password),
in.DbName, err)
+ return fmt.Errorf(efmt, in.Username, len(in.Password),
in.DBName, err)
}
- data, err := pkg.OG.ShowBackup(in.DnBackupPath, in.Instance,
in.DnBackupId)
+ data, err := pkg.OG.ShowBackup(in.DnBackupPath, in.Instance,
in.DnBackupID)
if err != nil {
efmt := "pkg.OG.ShowBackupDetail
failure[backupPath=%s,instance=%s,backupID=%s],err=%w"
- return fmt.Errorf(efmt, in.DnBackupPath, in.Instance,
in.DnBackupId, err)
+ return fmt.Errorf(efmt, in.DnBackupPath, in.Instance,
in.DnBackupID, err)
}
return responder.Success(ctx, view.NewBackupInfo(data, in.DnBackupPath,
in.Instance))
@@ -65,9 +66,9 @@ func ShowList(ctx *fiber.Ctx) error {
return fmt.Errorf("invalid parameter,err=%w", err)
}
- if err := pkg.OG.Auth(in.Username, in.Password, in.DbName, in.DbPort);
err != nil {
+ if err := pkg.OG.Auth(in.Username, in.Password, in.DBName, in.DBPort);
err != nil {
efmt := "pkg.OG.Auth failure[un=%s,pw.len=%d,db=%s],err=%w"
- return fmt.Errorf(efmt, in.Username, len(in.Password),
in.DbName, err)
+ return fmt.Errorf(efmt, in.Username, len(in.Password),
in.DBName, err)
}
//Show list
diff --git a/pitr/agent/internal/handler/view/backup.go
b/pitr/agent/internal/handler/view/backup.go
index b08952d..738078b 100644
--- a/pitr/agent/internal/handler/view/backup.go
+++ b/pitr/agent/internal/handler/view/backup.go
@@ -21,8 +21,8 @@ import
"github.com/apache/shardingsphere-on-cloud/pitr/agent/internal/cons"
type (
BackupIn struct {
- DbPort uint16 `json:"db_port"`
- DbName string `json:"db_name"`
+ DBPort uint16 `json:"db_port"`
+ DBName string `json:"db_name"`
Username string `json:"username"`
Password string `json:"password"`
@@ -42,12 +42,12 @@ func (in *BackupIn) Validate() error {
return cons.Internal
}
- if in.DbPort == 0 {
- return cons.InvalidDbPort
+ if in.DBPort == 0 {
+ return cons.InvalidDBPort
}
- if in.DbName == "" {
- return cons.MissingDbName
+ if in.DBName == "" {
+ return cons.MissingDBName
}
if in.Username == "" {
diff --git a/pitr/agent/internal/handler/view/restore.go
b/pitr/agent/internal/handler/view/restore.go
index 632db61..39a340c 100644
--- a/pitr/agent/internal/handler/view/restore.go
+++ b/pitr/agent/internal/handler/view/restore.go
@@ -20,26 +20,27 @@ package view
import "github.com/apache/shardingsphere-on-cloud/pitr/agent/internal/cons"
type RestoreIn struct {
- DbPort uint16 `json:"db_port"`
- DbName string `json:"db_name"`
+ DBPort uint16 `json:"db_port"`
+ DBName string `json:"db_name"`
Username string `json:"username"`
Password string `json:"password"`
Instance string `json:"instance"`
DnBackupPath string `json:"dn_backup_path"`
- DnBackupId string `json:"dn_backup_id"`
+ DnBackupID string `json:"dn_backup_id"`
}
+//nolint:dupl
func (in *RestoreIn) Validate() error {
if in == nil {
return cons.Internal
}
- if in.DbPort == 0 {
- return cons.InvalidDbPort
+ if in.DBPort == 0 {
+ return cons.InvalidDBPort
}
- if in.DbName == "" {
- return cons.MissingDbName
+ if in.DBName == "" {
+ return cons.MissingDBName
}
if in.Username == "" {
@@ -54,8 +55,8 @@ func (in *RestoreIn) Validate() error {
return cons.MissingDnBackupPath
}
- if in.DnBackupId == "" {
- return cons.MissingDnBackupId
+ if in.DnBackupID == "" {
+ return cons.MissingDnBackupID
}
if in.Instance == "" {
diff --git a/pitr/agent/internal/handler/view/show.go
b/pitr/agent/internal/handler/view/show.go
index 022180c..22434af 100644
--- a/pitr/agent/internal/handler/view/show.go
+++ b/pitr/agent/internal/handler/view/show.go
@@ -24,18 +24,18 @@ import (
type (
ShowIn struct {
- DbPort uint16 `json:"db_port"`
- DbName string `json:"db_name"`
+ DBPort uint16 `json:"db_port"`
+ DBName string `json:"db_name"`
Username string `json:"username"`
Password string `json:"password"`
- DnBackupId string `json:"dn_backup_id"`
+ DnBackupID string `json:"dn_backup_id"`
DnBackupPath string `json:"dn_backup_path"`
Instance string `json:"instance"`
}
ShowListIn struct {
- DbPort uint16 `json:"db_port"`
- DbName string `json:"db_name"`
+ DBPort uint16 `json:"db_port"`
+ DBName string `json:"db_name"`
Username string `json:"username"`
Password string `json:"password"`
DnBackupPath string `json:"dn_backup_path"`
@@ -43,7 +43,7 @@ type (
}
BackupInfo struct {
- Id string `json:"dn_backup_id"`
+ ID string `json:"dn_backup_id"`
Path string `json:"dn_backup_path"`
Mode string `json:"db_backup_mode"`
Instance string `json:"instance"`
@@ -53,17 +53,18 @@ type (
}
)
+//nolint:dupl
func (in *ShowIn) Validate() error {
if in == nil {
return cons.Internal
}
- if in.DbPort == 0 {
- return cons.InvalidDbPort
+ if in.DBPort == 0 {
+ return cons.InvalidDBPort
}
- if in.DbName == "" {
- return cons.MissingDbName
+ if in.DBName == "" {
+ return cons.MissingDBName
}
if in.Username == "" {
@@ -78,8 +79,8 @@ func (in *ShowIn) Validate() error {
return cons.MissingDnBackupPath
}
- if in.DnBackupId == "" {
- return cons.MissingDnBackupId
+ if in.DnBackupID == "" {
+ return cons.MissingDnBackupID
}
if in.Instance == "" {
@@ -93,7 +94,7 @@ func NewBackupInfo(data *model.Backup, path, instance string)
*BackupInfo {
return nil
}
return &BackupInfo{
- Id: data.ID,
+ ID: data.ID,
Path: path,
Mode: data.BackupMode,
Instance: instance,
@@ -103,14 +104,14 @@ func NewBackupInfo(data *model.Backup, path, instance
string) *BackupInfo {
}
}
-func NewBackupInfoList(list []model.Backup, path, instance string)
[]BackupInfo {
+func NewBackupInfoList(list []*model.Backup, path, instance string)
[]BackupInfo {
if len(list) == 0 {
return []BackupInfo{}
}
ret := make([]BackupInfo, 0, len(list))
for _, v := range list {
ret = append(ret, BackupInfo{
- Id: v.ID,
+ ID: v.ID,
Path: path,
Mode: v.BackupMode,
Instance: instance,
@@ -140,12 +141,12 @@ func (in *ShowListIn) Validate() error {
return cons.Internal
}
- if in.DbPort == 0 {
- return cons.InvalidDbPort
+ if in.DBPort == 0 {
+ return cons.InvalidDBPort
}
- if in.DbName == "" {
- return cons.MissingDbName
+ if in.DBName == "" {
+ return cons.MissingDBName
}
if in.Username == "" {
diff --git a/pitr/agent/internal/pkg/model/backup.go
b/pitr/agent/internal/pkg/model/backup.go
index 017a64d..5672564 100644
--- a/pitr/agent/internal/pkg/model/backup.go
+++ b/pitr/agent/internal/pkg/model/backup.go
@@ -48,7 +48,7 @@ type (
}
BackupList struct {
- Instance string `json:"instance"`
- List []Backup `json:"backups"`
+ Instance string `json:"instance"`
+ List []*Backup `json:"backups"`
}
)
diff --git a/pitr/agent/internal/pkg/opengauss.go
b/pitr/agent/internal/pkg/opengauss.go
index 32b8970..3db2ff8 100644
--- a/pitr/agent/internal/pkg/opengauss.go
+++ b/pitr/agent/internal/pkg/opengauss.go
@@ -21,15 +21,14 @@ import (
"encoding/json"
"errors"
"fmt"
- "github.com/apache/shardingsphere-on-cloud/pitr/agent/pkg/gsutil"
- "github.com/apache/shardingsphere-on-cloud/pitr/agent/pkg/logging"
"strings"
- "github.com/dlclark/regexp2"
-
"github.com/apache/shardingsphere-on-cloud/pitr/agent/internal/cons"
"github.com/apache/shardingsphere-on-cloud/pitr/agent/internal/pkg/model"
"github.com/apache/shardingsphere-on-cloud/pitr/agent/pkg/cmds"
+ "github.com/apache/shardingsphere-on-cloud/pitr/agent/pkg/gsutil"
+ "github.com/apache/shardingsphere-on-cloud/pitr/agent/pkg/logging"
+ "github.com/dlclark/regexp2"
)
type (
@@ -50,7 +49,7 @@ type (
Stop() error
Status() (string, error)
Restore(backupPath, instance, backupID string) error
- ShowBackupList(backupPath, instanceName string)
([]model.Backup, error)
+ ShowBackupList(backupPath, instanceName string)
([]*model.Backup, error)
Auth(user, password, dbName string, dbPort uint16) error
MvTempToPgData() error
MvPgDataToTemp() error
@@ -115,9 +114,9 @@ func (og *openGauss) AsyncBackup(backupPath, instanceName,
backupMode string, th
if err != nil {
return "", fmt.Errorf("og.getBackupID[source=%s] return
err=%w", output.Message, err)
}
- //ignore other output
+ // ignore other output
go og.ignore(outputs)
- return bid, nil
+ return bid, nil //nolint
}
return "", fmt.Errorf("unknow err")
}
@@ -129,7 +128,7 @@ func (og *openGauss) ShowBackup(backupPath, instanceName,
backupID string) (*mod
return nil, fmt.Errorf("cmds.Exec[shell=%s,cmd=%s] return
err=%w", og.shell, cmd, err)
}
- var list []model.BackupList
+ var list []*model.BackupList
if err = json.Unmarshal([]byte(output), &list); err != nil {
return nil, fmt.Errorf("json.Unmarshal[output=%s] return
err=%s,wrap=%w", output, err, cons.Internal)
}
@@ -140,7 +139,7 @@ func (og *openGauss) ShowBackup(backupPath, instanceName,
backupID string) (*mod
return nil,
fmt.Errorf("instance[name=%s],backupList[v=%+v],err=%w", ins.Instance, list,
cons.DataNotFound)
}
- return &ins.List[0], nil
+ return ins.List[0], nil
}
}
@@ -278,6 +277,7 @@ func (og *openGauss) Restore(backupPath, instance, backupID
string) error {
outputs, err := cmds.AsyncExec(og.shell, cmd)
for output := range outputs {
og.log.
+ //nolint:exhaustive
Fields(map[logging.FieldKey]string{
"backup_path": backupPath,
"instance": instance,
@@ -295,14 +295,14 @@ func (og *openGauss) Restore(backupPath, instance,
backupID string) error {
return nil
}
-func (og *openGauss) ShowBackupList(backupPath, instanceName string)
([]model.Backup, error) {
+func (og *openGauss) ShowBackupList(backupPath, instanceName string)
([]*model.Backup, error) {
cmd := fmt.Sprintf(_showListFmt, instanceName, backupPath)
output, err := cmds.Exec(og.shell, cmd)
if err != nil {
return nil, fmt.Errorf("cmds.Exec[shell=%s,cmd=%s] return
err=%w", og.shell, cmd, err)
}
- var list []model.BackupList
+ var list []*model.BackupList
if err = json.Unmarshal([]byte(output), &list); err != nil {
return nil, fmt.Errorf("json.Unmarshal[output=%s] return
err=%s,wrap=%w", output, err, cons.Internal)
}
diff --git a/pitr/agent/internal/pkg/opengauss_test.go
b/pitr/agent/internal/pkg/opengauss_test.go
index ac51154..19f8b15 100644
--- a/pitr/agent/internal/pkg/opengauss_test.go
+++ b/pitr/agent/internal/pkg/opengauss_test.go
@@ -49,6 +49,7 @@ var _ = Describe("OpenGauss,requires opengauss environment",
func() {
instance,
"full",
1,
+ 3306,
)
Expect(err).To(BeNil())
diff --git a/pitr/agent/main.go b/pitr/agent/main.go
index 56f0e02..b737a4c 100644
--- a/pitr/agent/main.go
+++ b/pitr/agent/main.go
@@ -20,6 +20,11 @@ package main
import (
"flag"
"fmt"
+ "os"
+ "os/signal"
+ "strings"
+ "syscall"
+
"github.com/apache/shardingsphere-on-cloud/pitr/agent/internal/handler"
"github.com/apache/shardingsphere-on-cloud/pitr/agent/internal/handler/middleware"
"github.com/apache/shardingsphere-on-cloud/pitr/agent/internal/pkg"
@@ -28,10 +33,6 @@ import (
"github.com/gofiber/fiber/v2"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
- "os"
- "os/signal"
- "strings"
- "syscall"
)
const (
@@ -112,7 +113,7 @@ func main() {
zap.AddStacktrace(zapcore.FatalLevel),
)
if err != nil {
- panic(fmt.Errorf("an unknown error occured in the zap-log"))
+ panic(fmt.Errorf("an unknown error occurred in the zap-log"))
}
log = logging.Init(logger)
diff --git a/pitr/agent/pkg/cmds/cmd.go b/pitr/agent/pkg/cmds/cmd.go
index dc248d2..4720020 100644
--- a/pitr/agent/pkg/cmds/cmd.go
+++ b/pitr/agent/pkg/cmds/cmd.go
@@ -20,11 +20,11 @@ package cmds
import (
"bufio"
"fmt"
- "github.com/apache/shardingsphere-on-cloud/pitr/agent/pkg/logging"
"io"
"os/exec"
"github.com/apache/shardingsphere-on-cloud/pitr/agent/internal/cons"
+ "github.com/apache/shardingsphere-on-cloud/pitr/agent/pkg/logging"
"github.com/apache/shardingsphere-on-cloud/pitr/agent/pkg/syncutils"
)
diff --git a/pitr/agent/pkg/gsutil/conn.go b/pitr/agent/pkg/gsutil/conn.go
index 4dcbdf8..72a6e8a 100644
--- a/pitr/agent/pkg/gsutil/conn.go
+++ b/pitr/agent/pkg/gsutil/conn.go
@@ -20,9 +20,10 @@ package gsutil
import (
"database/sql"
"fmt"
+ "strings"
+
_ "gitee.com/opengauss/openGauss-connector-go-pq"
"github.com/apache/shardingsphere-on-cloud/pitr/agent/internal/cons"
- "strings"
)
const defaultOGHost = "127.0.0.1"
@@ -49,7 +50,7 @@ func Open(user, password, dbName string, dbPort uint16)
(*OpenGauss, error) {
db, err := sql.Open("opengauss", fmt.Sprintf(connStr, defaultOGHost,
dbPort, user, password, dbName))
if err != nil {
efmt := "sql:open
fail[user=%s,pwLen=%d,dbName=%s],err=%s,wrap=%w"
- return nil, fmt.Errorf(efmt, user, len(password), dbName, err,
cons.DbConnectionFailed)
+ return nil, fmt.Errorf(efmt, user, len(password), dbName, err,
cons.DBConnectionFailed)
}
return &OpenGauss{
@@ -63,7 +64,7 @@ func Open(user, password, dbName string, dbPort uint16)
(*OpenGauss, error) {
func (og *OpenGauss) Ping() error {
if err := og.db.Ping(); err != nil {
efmt := "db ping
fail[user=%s,pwLen=%d,dbName=%s],err=%s,wrap=%w"
- return fmt.Errorf(efmt, og.user, og.pwLen, og.dbName, err,
cons.DbConnectionFailed)
+ return fmt.Errorf(efmt, og.user, og.pwLen, og.dbName, err,
cons.DBConnectionFailed)
}
return nil
}
diff --git a/pitr/agent/pkg/logging/field.go b/pitr/agent/pkg/logging/field.go
index 2119278..e8d9e3e 100644
--- a/pitr/agent/pkg/logging/field.go
+++ b/pitr/agent/pkg/logging/field.go
@@ -40,7 +40,7 @@ const (
Stack FieldKey = "stack"
Duration FieldKey = "duration"
Path FieldKey = "path" // original routing path
- RequestUri FieldKey = "requestUri" // http requesting uri
- HttpMethod FieldKey = "httpMethod"
- HttpStatus FieldKey = "httpStatus"
+ RequestURI FieldKey = "requestUri" // http requesting uri
+ HTTPMethod FieldKey = "httpMethod"
+ HTTPStatus FieldKey = "httpStatus"
)
diff --git a/pitr/agent/pkg/logging/log.go b/pitr/agent/pkg/logging/log.go
index b2d2209..0505bd4 100644
--- a/pitr/agent/pkg/logging/log.go
+++ b/pitr/agent/pkg/logging/log.go
@@ -31,6 +31,7 @@ func Init(logger *zap.Logger) ILog {
}
func Field(k FieldKey, v string) ILog {
+ //nolint:exhaustive
m := map[FieldKey]string{k: v}
for k, v := range l.fields {
m[k] = v
diff --git a/pitr/agent/pkg/logging/zap_log.go
b/pitr/agent/pkg/logging/zap_log.go
index cfda378..f0dd89b 100644
--- a/pitr/agent/pkg/logging/zap_log.go
+++ b/pitr/agent/pkg/logging/zap_log.go
@@ -32,6 +32,7 @@ func NewLog(l *zap.Logger) ILog {
}
func (z *ZapLogger) Field(k FieldKey, v string) ILog {
+ //nolint:exhaustive
m := map[FieldKey]string{k: v}
for k, v := range z.fields {
m[k] = v
diff --git a/pitr/agent/pkg/strutil/rand_string.go
b/pitr/agent/pkg/strutil/rand_string.go
index 769b7b7..53056bb 100644
--- a/pitr/agent/pkg/strutil/rand_string.go
+++ b/pitr/agent/pkg/strutil/rand_string.go
@@ -18,9 +18,8 @@
package strutil
import (
- "math/rand"
+ "crypto/rand"
"strconv"
- "time"
)
const (
@@ -34,20 +33,24 @@ const (
)
func Random(n uint) string {
- rand.Seed(time.Now().UnixNano())
- bs := make([]byte, 0, n)
+ bs := make([]byte, n)
for i := uint(0); i < n; i++ {
- bs = append(bs, charSet[rand.Intn(charSize)])
+ _, _ = rand.Read(bs[i : i+1])
+ }
+ for k, v := range bs {
+ bs[k] = charSet[v%byte(charSize)]
}
return string(bs)
}
func RandomInt(n uint) int64 {
- rand.Seed(time.Now().UnixNano())
- bs := make([]byte, 0, n)
- bs = append(bs, digitSet[rand.Intn(digitSize-1)])
- for i := uint(0); i < n-1; i++ {
- bs = append(bs, digitSet[rand.Intn(digitSize)])
+ bs := make([]byte, n)
+ _, _ = rand.Read(bs[0:1])
+ for i := uint(1); i < n; i++ {
+ _, _ = rand.Read(bs[i : i+1])
+ }
+ for k, v := range bs {
+ bs[k] = digitSet[v%byte(digitSize)]
}
v, _ := strconv.ParseInt(string(bs), 10, 64)
return v
diff --git a/pitr/agent/pkg/syncutils/recover_func.go
b/pitr/agent/pkg/syncutils/recover_func.go
index af49a22..147cd7e 100644
--- a/pitr/agent/pkg/syncutils/recover_func.go
+++ b/pitr/agent/pkg/syncutils/recover_func.go
@@ -27,9 +27,9 @@ func NewRecoverFuncWithErrRet(msg string, fn func() error)
func() (err error) {
r := recover()
if r != nil {
if err, ok := r.(error); ok {
- err =
fmt.Errorf("NewRecoverFuncWithErrRet[msg=%s],err=%s", msg, err)
+ err =
fmt.Errorf("NewRecoverFuncWithErrRet[msg=%s],err=%s", msg, err) //nolint
} else {
- err =
fmt.Errorf("NewRecoverFuncWithErrRet[msg=%s],recover msg=%+v", msg, r)
+ err =
fmt.Errorf("NewRecoverFuncWithErrRet[msg=%s],recover msg=%+v", msg, r) //nolint
}
}
}()
diff --git a/pitr/cli/.golangci.yml b/pitr/cli/.golangci.yml
index 1b9b6ce..5b6aed2 100644
--- a/pitr/cli/.golangci.yml
+++ b/pitr/cli/.golangci.yml
@@ -17,32 +17,186 @@
run:
timeout: 10m
+ skip-files:
+ - "^zz_generated.*"
+ - "_test.go"
linters:
disable-all: true
enable:
+ # The base lints
+ - errcheck
+ - gosimple
+ - govet
- ineffassign
+ - staticcheck
- typecheck
- - varcheck
- unused
- - structcheck
- - deadcode
- - gosimple
+ - unused
+ - bodyclose
+ - cyclop
+ - nilerr
- goimports
- - errcheck
- - staticcheck
- - stylecheck
- - gosec
- asciicheck
- - bodyclose
+ - prealloc
+ - stylecheck
- exportloopref
- rowserrcheck
- makezero
- durationcheck
- - prealloc
+ - gosec
- predeclared
+ # Deprecated lints
+ - structcheck
+ - varcheck
+ - deadcode
+ # The advanced lints
+ - dupl
+ - exhaustive
+ - godot
+ - misspell
+ # - varnamelen
+ - gocritic
+ #- exhaustruct
+ #- nestif
+ #- wsl
+ - gocognit
# Refers: https://gist.github.com/maratori/47a4d00457a92aa426dbd48a18776322
linters-settings:
+ wsl:
+ # See https://github.com/bombsimon/wsl/blob/master/doc/configuration.md
for documentation of available settings.
+ # These are the defaults for `golangci-lint`.
+
+ # Do strict checking when assigning from append (x = append(x, y)). If
+ # this is set to true - the append call must append either a variable
+ # assigned, called or used on the line above.
+ strict-append: true
+ # Allows assignments to be cuddled with variables used in calls on
+ # line above and calls to be cuddled with assignments of variables
+ # used in call on line above.
+ allow-assign-and-call: true
+ # Allows assignments to be cuddled with anything.
+ allow-assign-and-anything: false
+ # Allows cuddling to assignments even if they span over multiple lines.
+ allow-multiline-assign: true
+ # If the number of lines in a case block is equal to or lager than this
+ # number, the case *must* end white a newline.
+ force-case-trailing-whitespace: 0
+ # Allow blocks to end with comments.
+ allow-trailing-comment: false
+ # Allow multiple comments in the beginning of a block separated with
newline.
+ allow-separated-leading-comment: false
+ # Allow multiple var/declaration statements to be cuddled.
+ allow-cuddle-declarations: false
+ # A list of call idents that everything can be cuddled with.
+ # Defaults to calls looking like locks.
+ allow-cuddle-with-calls: ["Lock", "RLock"]
+ # AllowCuddleWithRHS is a list of right hand side variables that is allowed
+ # to be cuddled with anything. Defaults to assignments or calls looking
+ # like unlocks.
+ allow-cuddle-with-rhs: ["Unlock", "RUnlock"]
+ # Causes an error when an If statement that checks an error variable
doesn't
+ # cuddle with the assignment of that variable.
+ force-err-cuddling: false
+ # When force-err-cuddling is enabled this is a list of names
+ # used for error variables to check for in the conditional.
+ error-variable-names: ["err"]
+ # Causes an error if a short declaration (:=) cuddles with anything other
than
+ # another short declaration.
+ # This logic overrides force-err-cuddling among others.
+ force-short-decl-cuddling: false
+ varnamelen:
+ # The longest distance, in source lines, that is being considered a "small
scope".
+ # Variables used in at most this many lines will be ignored.
+ # Default: 5
+ max-distance: 6
+ # The minimum length of a variable's name that is considered "long".
+ # Variable names that are at least this long will be ignored.
+ # Default: 3
+ min-name-length: 2
+ # Check method receivers.
+ # Default: false
+ check-receiver: false
+ # Check named return values.
+ # Default: false
+ check-return: true
+ # Check type parameters.
+ # Default: false
+ check-type-param: true
+ # Ignore "ok" variables that hold the bool return value of a type
assertion.
+ # Default: false
+ ignore-type-assert-ok: true
+ # Ignore "ok" variables that hold the bool return value of a map index.
+ # Default: false
+ ignore-map-index-ok: true
+ # Ignore "ok" variables that hold the bool return value of a channel
receive.
+ # Default: false
+ ignore-chan-recv-ok: true
+ # Optional list of variable names that should be ignored completely.
+ # Default: []
+ ignore-names:
+ - err
+ # Optional list of variable declarations that should be ignored completely.
+ # Entries must be in one of the following forms (see below for examples):
+ # - for variables, parameters, named return values, method receivers, or
type parameters:
+ # <name> <type> (<type> can also be a pointer/slice/map/chan/...)
+ # - for constants: const <name>
+ #
+ # Default: []
+ ignore-decls:
+ - c echo.Context
+ - t testing.T
+ - f *foo.Bar
+ - e error
+ - i int
+ - const C
+ - T any
+ - m map[string]int
+ prealloc:
+ # IMPORTANT: we don't recommend using this linter before doing performance
profiling.
+ # For most programs usage of prealloc will be a premature optimization.
+
+ # Report pre-allocation suggestions only on simple loops that have no
returns/breaks/continues/gotos in them.
+ # Default: true
+ simple: false
+ # Report pre-allocation suggestions on range loops.
+ # Default: true
+ range-loops: false
+ # Report pre-allocation suggestions on for loops.
+ # Default: false
+ for-loops: true
+ #nestif:
+ # Minimal complexity of if statements to report.
+ # Default: 5
+ # min-complexity: 4
+ misspell:
+ # Correct spellings using locale preferences for US or UK.
+ # Setting locale to US will correct the British spelling of 'colour' to
'color'.
+ # Default is to use a neutral variety of English.
+ locale: US
+ # Default: []
+ ignore-words:
+ - someword
+ godot:
+ # Comments to be checked: `declarations`, `toplevel`, or `all`.
+ # Default: declarations
+ scope: toplevel
+ # List of regexps for excluding particular comment lines from check.
+ # Default: []
+ exclude:
+ # Exclude todo and fixme comments.
+ - "^fixme:"
+ - "^todo:"
+ # Check that each sentence ends with a period.
+ # Default: true
+ period: false
+ # Check that each sentence starts with a capital letter.
+ # Default: false
+ capital: false
+ dupl:
+ # Tokens count to trigger issue.
+ # Default: 150
+ threshold: 100
cyclop:
# The maximal code complexity to report.
# Default: 10
@@ -75,6 +229,132 @@ linters-settings:
# Minimal code complexity to report.
# Default: 30 (but we recommend 10-20)
min-complexity: 20
+ gocritic:
+ # Which checks should be enabled; can't be combined with 'disabled-checks'.
+ # See https://go-critic.github.io/overview#checks-overview.
+ # To check which checks are enabled run `GL_DEBUG=gocritic golangci-lint
run`.
+ # By default, list of stable checks is used.
+ enabled-checks:
+ - elseif
+ - nestingReduce
+ - unnamedResult
+ # - ruleguard
+ - truncateCmp
+ - hugeparam
+ - rangevalcopy
+ - captlocal
+ - underef
+ - toomanyresultschecker
+ - rangeexprcopy
+ # Which checks should be disabled; can't be combined with 'enabled-checks'.
+ # Default: []
+ disabled-checks:
+ - regexpMust
+ # Enable multiple checks by tags, run `GL_DEBUG=gocritic golangci-lint
run` to see all tags and checks.
+ # See https://github.com/go-critic/go-critic#usage -> section "Tags".
+ # Default: []
+ enabled-tags:
+ - diagnostic
+ - style
+ - performance
+ - experimental
+ - opinionated
+ disabled-tags:
+ - diagnostic
+ - style
+ - performance
+ - experimental
+ - opinionated
+ # Settings passed to gocritic.
+ # The settings key is the name of a supported gocritic checker.
+ # The list of supported checkers can be find in
https://go-critic.github.io/overview.
+ settings:
+ # Must be valid enabled check name.
+ captLocal:
+ # Whether to restrict checker to params only.
+ # Default: true
+ paramsOnly: false
+ elseif:
+ # Whether to skip balanced if-else pairs.
+ # Default: true
+ skipBalanced: false
+ hugeParam:
+ # Size in bytes that makes the warning trigger.
+ # Default: 80
+ sizeThreshold: 70
+ nestingReduce:
+ # Min number of statements inside a branch to trigger a warning.
+ # Default: 5
+ bodyWidth: 4
+ rangeExprCopy:
+ # Size in bytes that makes the warning trigger.
+ # Default: 512
+ sizeThreshold: 516
+ # Whether to check test functions
+ # Default: true
+ skipTestFuncs: false
+ rangeValCopy:
+ # Size in bytes that makes the warning trigger.
+ # Default: 128
+ sizeThreshold: 32
+ # Whether to check test functions.
+ # Default: true
+ skipTestFuncs: false
+ ruleguard:
+ # Enable debug to identify which 'Where' condition was rejected.
+ # The value of the parameter is the name of a function in a ruleguard
file.
+ #
+ # When a rule is evaluated:
+ # If:
+ # The Match() clause is accepted; and
+ # One of the conditions in the Where() clause is rejected,
+ # Then:
+ # ruleguard prints the specific Where() condition that was rejected.
+ #
+ # The flag is passed to the ruleguard 'debug-group' argument.
+ # Default: ""
+ debug: 'emptyDecl'
+ # Deprecated, use 'failOn' param.
+ # If set to true, identical to failOn='all', otherwise failOn=''
+ failOnError: false
+ # Determines the behavior when an error occurs while parsing ruleguard
files.
+ # If flag is not set, log error and skip rule files that contain an
error.
+ # If flag is set, the value must be a comma-separated list of error
conditions.
+ # - 'all': fail on all errors.
+ # - 'import': ruleguard rule imports a package that cannot be found.
+ # - 'dsl': gorule file does not comply with the ruleguard DSL.
+ # Default: ""
+ failOn: dsl
+ # Comma-separated list of file paths containing ruleguard rules.
+ # If a path is relative, it is relative to the directory where the
golangci-lint command is executed.
+ # The special '${configDir}' variable is substituted with the absolute
directory containing the golangci config file.
+ # Glob patterns such as 'rules-*.go' may be specified.
+ # Default: ""
+ rules: '${configDir}/ruleguard/rules-*.go,${configDir}/myrule1.go'
+ # Comma-separated list of enabled groups or skip empty to enable
everything.
+ # Tags can be defined with # character prefix.
+ # Default: "<all>"
+ enable: "myGroupName,#myTagName"
+ # Comma-separated list of disabled groups or skip empty to enable
everything.
+ # Tags can be defined with # character prefix.
+ # Default: ""
+ disable: "myGroupName,#myTagName"
+ tooManyResultsChecker:
+ # Maximum number of results.
+ # Default: 5
+ maxResults: 10
+ truncateCmp:
+ # Whether to skip int/uint/uintptr types.
+ # Default: true
+ skipArchDependent: false
+ underef:
+ # Whether to skip (*x).method() calls where x is a pointer receiver.
+ # Default: true
+ skipRecvDeref: false
+ unnamedResult:
+ # Whether to check exported functions.
+ # Default: false
+ checkExported: true
issues:
exclude-rules:
- path: _test\.go
diff --git a/pitr/cli/Makefile b/pitr/cli/Makefile
index 5a74176..d6b27df 100644
--- a/pitr/cli/Makefile
+++ b/pitr/cli/Makefile
@@ -1,4 +1,4 @@
-.PHONY: build test
+.PHONY: build test cover lint
GOOS := $(shell go env GOOS)
@@ -8,3 +8,5 @@ test:
go test -v ./... -cover -coverprofile cover.out
cover:
go tool cover -html cover.out
+lint:
+ golangci-lint run -v --timeout 5m
diff --git a/pitr/cli/internal/cmd/backup.go b/pitr/cli/internal/cmd/backup.go
index 8d3b3a9..5681fd8 100644
--- a/pitr/cli/internal/cmd/backup.go
+++ b/pitr/cli/internal/cmd/backup.go
@@ -100,7 +100,7 @@ func init() {
// 7. Double check backups all finished
func backup() error {
var err error
- proxy, err := pkg.NewShardingSphereProxy(Username, Password,
pkg.DefaultDbName, Host, Port)
+ proxy, err := pkg.NewShardingSphereProxy(Username, Password,
pkg.DefaultDBName, Host, Port)
if err != nil {
return xerr.NewCliErr("create ss-proxy connect failed")
}
@@ -255,8 +255,8 @@ func execBackup(lsBackup *model.LsBackup) error {
func _execBackup(as pkg.IAgentServer, node *model.StorageNode, dnCh chan
*model.DataNode) error {
in := &model.BackupIn{
- DbPort: node.Port,
- DbName: node.Database,
+ DBPort: node.Port,
+ DBName: node.Database,
Username: node.Username,
Password: node.Password,
DnBackupPath: BackupPath,
@@ -331,7 +331,7 @@ func checkBackupStatus(lsBackup *model.LsBackup)
model.BackupStatus {
return backupFinalStatus
}
-func checkStatus(as pkg.IAgentServer, sn *model.StorageNode, backupId string,
status model.BackupStatus, retryTimes uint8) model.BackupStatus {
+func checkStatus(as pkg.IAgentServer, sn *model.StorageNode, backupID string,
status model.BackupStatus, retryTimes uint8) model.BackupStatus {
if retryTimes+1 == 0 {
return status
}
@@ -343,18 +343,18 @@ func checkStatus(as pkg.IAgentServer, sn
*model.StorageNode, backupId string, st
time.Sleep(time.Second * 2)
in := &model.ShowDetailIn{
- DbPort: sn.Port,
- DbName: sn.Database,
+ DBPort: sn.Port,
+ DBName: sn.Database,
Username: sn.Username,
Password: sn.Password,
- DnBackupId: backupId,
+ DnBackupID: backupID,
DnBackupPath: BackupPath,
Instance: defaultInstance,
}
backupInfo, err := as.ShowDetail(in)
if err != nil {
logging.Error(fmt.Sprintf("get storage node [IP:%s] backup
detail from agent server failed, will retry %d times.\n%s", sn.IP, retryTimes,
err.Error()))
- return checkStatus(as, sn, backupId,
model.SsBackupStatusCheckError, retryTimes-1)
+ return checkStatus(as, sn, backupID,
model.SsBackupStatusCheckError, retryTimes-1)
}
- return checkStatus(as, sn, backupId, backupInfo.Status, retryTimes)
+ return checkStatus(as, sn, backupID, backupInfo.Status, retryTimes)
}
diff --git a/pitr/cli/internal/cmd/restore.go b/pitr/cli/internal/cmd/restore.go
index 13ed7d1..493ea61 100644
--- a/pitr/cli/internal/cmd/restore.go
+++ b/pitr/cli/internal/cmd/restore.go
@@ -89,7 +89,7 @@ func restore() error {
if err != nil {
return xerr.NewCliErr(fmt.Sprintf("new local storage failed,
err:%s", err.Error()))
}
- proxy, err := pkg.NewShardingSphereProxy(Username, Password,
pkg.DefaultDbName, Host, Port)
+ proxy, err := pkg.NewShardingSphereProxy(Username, Password,
pkg.DefaultDBName, Host, Port)
if err != nil {
return xerr.NewCliErr(fmt.Sprintf("new ss-proxy failed,
err:%s", err.Error()))
}
@@ -140,7 +140,7 @@ func checkDatabaseExist(proxy pkg.IShardingSphereProxy, bak
*model.LsBackup) err
return xerr.NewCliErr(fmt.Sprintf("get cluster metadata
failed:%s", err.Error()))
}
- for k, _ := range bak.SsBackup.ClusterInfo.MetaData.Databases {
+ for k := range bak.SsBackup.ClusterInfo.MetaData.Databases {
if _, ok := clusterNow.MetaData.Databases[k]; ok {
databaseNamesExist = append(databaseNamesExist, k)
}
@@ -211,13 +211,13 @@ func execRestore(lsBackup *model.LsBackup) error {
func _execRestore(as pkg.IAgentServer, node *model.StorageNode, backupID
string, failedCh chan error) {
in := &model.RestoreIn{
- DbPort: node.Port,
- DbName: node.Database,
+ DBPort: node.Port,
+ DBName: node.Database,
Username: node.Username,
Password: node.Password,
Instance: defaultInstance,
DnBackupPath: BackupPath,
- DnBackupId: backupID,
+ DnBackupID: backupID,
}
if err := as.Restore(in); err != nil {
diff --git a/pitr/cli/internal/cmd/restore_test.go
b/pitr/cli/internal/cmd/restore_test.go
index 297531e..40194ee 100644
--- a/pitr/cli/internal/cmd/restore_test.go
+++ b/pitr/cli/internal/cmd/restore_test.go
@@ -41,7 +41,7 @@ var _ = Describe("Restore", func() {
backupRecordID string
)
Context("Restore", func() {
- proxy, _ := pkg.NewShardingSphereProxy(user, password,
pkg.DefaultDbName, host, port)
+ proxy, _ := pkg.NewShardingSphereProxy(user, password,
pkg.DefaultDBName, host, port)
ls, _ := pkg.NewLocalStorage(pkg.DefaultRootDir())
bak, _ := ls.ReadByID(backupRecordID)
It("restore to ss proxy should be ok", func() {
diff --git a/pitr/cli/internal/cmd/show.go b/pitr/cli/internal/cmd/show.go
index b194378..045b4f7 100644
--- a/pitr/cli/internal/cmd/show.go
+++ b/pitr/cli/internal/cmd/show.go
@@ -66,7 +66,7 @@ func show() error {
return nil
}
- if err := formatRecord([]model.LsBackup{*bak}); err != nil {
+ if err := formatRecord([]*model.LsBackup{bak}); err != nil {
return err
}
return nil
@@ -83,7 +83,7 @@ func show() error {
return nil
}
- if err := formatRecord([]model.LsBackup{*bak}); err != nil {
+ if err := formatRecord([]*model.LsBackup{bak}); err != nil {
return err
}
return nil
@@ -106,7 +106,7 @@ func show() error {
return nil
}
-func formatRecord(backups []model.LsBackup, mode ...string) error {
+func formatRecord(backups []*model.LsBackup, mode ...string) error {
var m string
if len(mode) == 0 {
@@ -116,16 +116,16 @@ func formatRecord(backups []model.LsBackup, mode
...string) error {
}
switch m {
case "json":
- return formatRecordJson(backups)
+ return formatRecordJSON(backups)
case "table":
// TODO format record table
return nil
default:
- return formatRecordJson(backups)
+ return formatRecordJSON(backups)
}
}
-func formatRecordJson(backups []model.LsBackup) error {
+func formatRecordJSON(backups []*model.LsBackup) error {
var ds []string
for _, backup := range backups {
data, err := json.MarshalIndent(backup, "", "\t")
diff --git a/pitr/cli/internal/cmd/show_test.go
b/pitr/cli/internal/cmd/show_test.go
index 9b13e90..9617692 100644
--- a/pitr/cli/internal/cmd/show_test.go
+++ b/pitr/cli/internal/cmd/show_test.go
@@ -91,7 +91,7 @@ var _ = Describe("Show", func() {
},
},
}
- err := formatRecord([]model.LsBackup{*bak, *bak})
+ err := formatRecord([]*model.LsBackup{bak, bak})
Expect(err).To(BeNil())
})
})
@@ -116,7 +116,9 @@ var _ = Describe("Show", func() {
})
It("no record", func() {
- ls.EXPECT().ReadAll().Return([]model.LsBackup{}, nil)
+ CSN = ""
+ RecordID = ""
+ ls.EXPECT().ReadAll().Return([]*model.LsBackup{}, nil)
Expect(show()).To(BeNil())
})
diff --git a/pitr/cli/internal/pkg/agent-server.go
b/pitr/cli/internal/pkg/agent-server.go
index 5f10e57..393d14f 100644
--- a/pitr/cli/internal/pkg/agent-server.go
+++ b/pitr/cli/internal/pkg/agent-server.go
@@ -65,6 +65,7 @@ func (as *agentServer) Backup(in *model.BackupIn) (string,
error) {
"content-type": "application/json",
})
r.Body(in)
+
httpCode, err := r.Send(out)
if err != nil {
efmt := "httputils.NewRequest[url=%s,body=%v,out=%v] return
err=%s,wrap=%w"
@@ -72,7 +73,7 @@ func (as *agentServer) Backup(in *model.BackupIn) (string,
error) {
}
if httpCode != http.StatusOK {
- return "", fmt.Errorf("unknown http status[code=%d],err=%w",
httpCode, xerr.NewCliErr(xerr.InvalidHttpStatus))
+ return "", fmt.Errorf("unknown http status[code=%d],err=%w",
httpCode, xerr.NewCliErr(xerr.InvalidHTTPStatus))
}
if out.Code != 0 {
@@ -100,7 +101,7 @@ func (as *agentServer) Restore(in *model.RestoreIn) error {
}
if httpCode != http.StatusOK {
- return fmt.Errorf("unknown http status[code=%d],err=%w",
httpCode, xerr.NewCliErr(xerr.InvalidHttpStatus))
+ return fmt.Errorf("unknown http status[code=%d],err=%w",
httpCode, xerr.NewCliErr(xerr.InvalidHTTPStatus))
}
if out.Code != 0 {
@@ -128,7 +129,7 @@ func (as *agentServer) ShowDetail(in *model.ShowDetailIn)
(*model.BackupInfo, er
}
if httpCode != http.StatusOK {
- return nil, fmt.Errorf("unknown http status[code=%d],err=%w",
httpCode, xerr.NewCliErr(xerr.InvalidHttpStatus))
+ return nil, fmt.Errorf("unknown http status[code=%d],err=%w",
httpCode, xerr.NewCliErr(xerr.InvalidHTTPStatus))
}
if out.Code != 0 {
@@ -156,7 +157,7 @@ func (as *agentServer) ShowList(in *model.ShowListIn)
([]model.BackupInfo, error
}
if httpCode != http.StatusOK {
- return nil, fmt.Errorf("unknown http status[code=%d],err=%w",
httpCode, xerr.NewCliErr(xerr.InvalidHttpStatus))
+ return nil, fmt.Errorf("unknown http status[code=%d],err=%w",
httpCode, xerr.NewCliErr(xerr.InvalidHTTPStatus))
}
if out.Code != 0 {
diff --git a/pitr/cli/internal/pkg/agent-server_test.go
b/pitr/cli/internal/pkg/agent-server_test.go
index 2cc9a35..1bf05f2 100644
--- a/pitr/cli/internal/pkg/agent-server_test.go
+++ b/pitr/cli/internal/pkg/agent-server_test.go
@@ -38,8 +38,8 @@ func TestAgentServer_Backup(t *testing.T) {
as := NewAgentServer("http://agent-server:18080")
backupID, err := as.Backup(&model.BackupIn{
- DbPort: 5432,
- DbName: "omm",
+ DBPort: 5432,
+ DBName: "omm",
Username: "og",
Password: "1234567890@SphereEx",
DnBackupPath: "/home/omm/data",
@@ -59,13 +59,13 @@ func TestAgentServer_Restore(t *testing.T) {
as := NewAgentServer("http://agent-server:18080")
err := as.Restore(&model.RestoreIn{
- DbPort: 5432,
- DbName: "omm",
+ DBPort: 5432,
+ DBName: "omm",
Username: "og",
Password: "1234567890@SphereEx",
DnBackupPath: "/home/omm/data",
Instance: "ins-default-0",
- DnBackupId: "RR3FIC",
+ DnBackupID: "RR3FIC",
})
if err != nil {
panic(err)
@@ -79,13 +79,13 @@ func TestAgentServer_ShowDetail(t *testing.T) {
as := NewAgentServer("http://agent-server:18080")
backupInfo, err := as.ShowDetail(&model.ShowDetailIn{
- DbPort: 5432,
- DbName: "omm",
+ DBPort: 5432,
+ DBName: "omm",
Username: "og",
Password: "1234567890@SphereEx",
DnBackupPath: "/home/omm/data",
Instance: "ins-default-0",
- DnBackupId: "RR3FIC",
+ DnBackupID: "RR3FIC",
})
if err != nil {
panic(err)
@@ -104,8 +104,8 @@ func TestAgentServer_ShowList(t *testing.T) {
as := NewAgentServer("http://agent-server:18080")
list, err := as.ShowList(&model.ShowListIn{
- DbPort: 5432,
- DbName: "omm",
+ DBPort: 5432,
+ DBName: "omm",
Username: "og",
Password: "1234567890@SphereEx",
DnBackupPath: "/home/omm/data",
diff --git a/pitr/cli/internal/pkg/local-storage.go
b/pitr/cli/internal/pkg/local-storage.go
index c7b7029..e44c98a 100644
--- a/pitr/cli/internal/pkg/local-storage.go
+++ b/pitr/cli/internal/pkg/local-storage.go
@@ -40,7 +40,7 @@ type (
ILocalStorage interface {
WriteByJSON(name string, contents *model.LsBackup) error
GenFilename(extn Extension) string
- ReadAll() ([]model.LsBackup, error)
+ ReadAll() ([]*model.LsBackup, error)
ReadByID(id string) (*model.LsBackup, error)
ReadByCSN(csn string) (*model.LsBackup, error)
}
@@ -129,12 +129,14 @@ func (ls *localStorage) WriteByJSON(name string, contents
*model.LsBackup) error
return nil
}
-func (ls *localStorage) ReadAll() ([]model.LsBackup, error) {
+func (ls *localStorage) ReadAll() ([]*model.LsBackup, error) {
entries, err := os.ReadDir(ls.backupDir)
if err != nil {
return nil, xerr.NewCliErr(fmt.Sprintf("read the dir[path:%s]
failed,err=%s", ls.backupDir, err))
}
- backups := make([]model.LsBackup, 0, len(entries))
+
+ backups := make([]*model.LsBackup, 0, len(entries))
+
for _, entry := range entries {
if entry.IsDir() {
continue
@@ -157,10 +159,11 @@ func (ls *localStorage) ReadAll() ([]model.LsBackup,
error) {
return nil, xerr.NewCliErr(fmt.Sprintf("read file
failed,err=%s", err))
}
- b := model.LsBackup{}
- if err := json.Unmarshal(file, &b); err != nil {
+ b := &model.LsBackup{}
+ if err := json.Unmarshal(file, b); err != nil {
return nil, xerr.NewCliErr(fmt.Sprintf("invalid
contents[filePath=%s],err=%s", path, err))
}
+
backups = append(backups, b)
}
return backups, nil
@@ -173,7 +176,7 @@ func (ls *localStorage) ReadByCSN(csn string)
(*model.LsBackup, error) {
}
for _, v := range list {
if v.Info.CSN == csn {
- return &v, nil
+ return v, nil
}
}
return nil, xerr.NewCliErr(xerr.NotFound)
@@ -186,7 +189,7 @@ func (ls *localStorage) ReadByID(id string)
(*model.LsBackup, error) {
}
for _, v := range list {
if v.Info.ID == id {
- return &v, nil
+ return v, nil
}
}
return nil, xerr.NewCliErr(xerr.NotFound)
diff --git a/pitr/cli/internal/pkg/mocks/local-storage.go
b/pitr/cli/internal/pkg/mocks/local-storage.go
index 7445096..aa18261 100644
--- a/pitr/cli/internal/pkg/mocks/local-storage.go
+++ b/pitr/cli/internal/pkg/mocks/local-storage.go
@@ -67,10 +67,10 @@ func (mr *MockILocalStorageMockRecorder) GenFilename(extn
interface{}) *gomock.C
}
// ReadAll mocks base method.
-func (m *MockILocalStorage) ReadAll() ([]model.LsBackup, error) {
+func (m *MockILocalStorage) ReadAll() ([]*model.LsBackup, error) {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "ReadAll")
- ret0, _ := ret[0].([]model.LsBackup)
+ ret0, _ := ret[0].([]*model.LsBackup)
ret1, _ := ret[1].(error)
return ret0, ret1
}
diff --git a/pitr/cli/internal/pkg/model/as_backup.go
b/pitr/cli/internal/pkg/model/as_backup.go
index 1f5cc35..63c45ef 100644
--- a/pitr/cli/internal/pkg/model/as_backup.go
+++ b/pitr/cli/internal/pkg/model/as_backup.go
@@ -19,8 +19,8 @@ package model
type (
BackupIn struct {
- DbPort uint16 `json:"db_port"`
- DbName string `json:"db_name"`
+ DBPort uint16 `json:"db_port"`
+ DBName string `json:"db_name"`
Username string `json:"username"`
Password string `json:"password"`
diff --git a/pitr/cli/internal/pkg/model/as_restore.go
b/pitr/cli/internal/pkg/model/as_restore.go
index 015c871..2381de7 100644
--- a/pitr/cli/internal/pkg/model/as_restore.go
+++ b/pitr/cli/internal/pkg/model/as_restore.go
@@ -19,13 +19,13 @@ package model
type (
RestoreIn struct {
- DbPort uint16 `json:"db_port"`
- DbName string `json:"db_name"`
+ DBPort uint16 `json:"db_port"`
+ DBName string `json:"db_name"`
Username string `json:"username"`
Password string `json:"password"`
Instance string `json:"instance"`
DnBackupPath string `json:"dn_backup_path"`
- DnBackupId string `json:"dn_backup_id"`
+ DnBackupID string `json:"dn_backup_id"`
}
RestoreResp struct {
diff --git a/pitr/cli/internal/pkg/model/as_show.go
b/pitr/cli/internal/pkg/model/as_show.go
index 8fefabf..f75c2a7 100644
--- a/pitr/cli/internal/pkg/model/as_show.go
+++ b/pitr/cli/internal/pkg/model/as_show.go
@@ -19,18 +19,18 @@ package model
type (
ShowDetailIn struct {
- DbPort uint16 `json:"db_port"`
- DbName string `json:"db_name"`
+ DBPort uint16 `json:"db_port"`
+ DBName string `json:"db_name"`
Username string `json:"username"`
Password string `json:"password"`
- DnBackupId string `json:"dn_backup_id"`
+ DnBackupID string `json:"dn_backup_id"`
DnBackupPath string `json:"dn_backup_path"`
Instance string `json:"instance"`
}
ShowListIn struct {
- DbPort uint16 `json:"db_port"`
- DbName string `json:"db_name"`
+ DBPort uint16 `json:"db_port"`
+ DBName string `json:"db_name"`
Username string `json:"username"`
Password string `json:"password"`
DnBackupPath string `json:"dn_backup_path"`
@@ -38,7 +38,7 @@ type (
}
BackupInfo struct {
- Id string `json:"dn_backup_id"`
+ ID string `json:"dn_backup_id"`
Path string `json:"dn_backup_path"`
Mode string `json:"db_backup_mode"`
Instance string `json:"instance"`
diff --git a/pitr/cli/internal/pkg/shardingsphere-proxy.go
b/pitr/cli/internal/pkg/shardingsphere-proxy.go
index f7803df..5fa9f2a 100644
--- a/pitr/cli/internal/pkg/shardingsphere-proxy.go
+++ b/pitr/cli/internal/pkg/shardingsphere-proxy.go
@@ -44,7 +44,7 @@ type (
)
const (
- DefaultDbName = "postgres"
+ DefaultDBName = "postgres"
)
func NewShardingSphereProxy(user, password, dbName, host string, port uint16)
(IShardingSphereProxy, error) {
@@ -103,6 +103,7 @@ func (ss *shardingSphereProxy) ExportMetaData()
(*model.ClusterInfo, error) {
if err != nil {
return nil, xerr.NewCliErr(fmt.Sprintf("export meta data
failure,err=%s", err))
}
+
var (
id string
createTime string
@@ -116,10 +117,15 @@ func (ss *shardingSphereProxy) ExportMetaData()
(*model.ClusterInfo, error) {
return nil, xerr.NewCliErr(fmt.Sprintf("query close
failure,err=%s", err))
}
}
+ if query.Err() != nil {
+ return nil, xerr.NewCliErr(fmt.Sprintf("query err=%s",
query.Err()))
+ }
+
var out model.ClusterInfo
if err = json.Unmarshal([]byte(data), &out); err != nil {
return nil, fmt.Errorf("json unmarshal return err=%s", err)
}
+
out.SnapshotInfo = nil
return &out, nil
}
@@ -138,6 +144,7 @@ func (ss *shardingSphereProxy) ExportStorageNodes()
([]*model.StorageNode, error
if err != nil {
return nil, xerr.NewCliErr(fmt.Sprintf("export storage nodes
failure,err=%s", err))
}
+
var (
id string
createTime string
@@ -152,6 +159,10 @@ func (ss *shardingSphereProxy) ExportStorageNodes()
([]*model.StorageNode, error
return nil, xerr.NewCliErr(fmt.Sprintf("query close
failure,err=%s", err))
}
}
+ if query.Err() != nil {
+ return nil, xerr.NewCliErr(fmt.Sprintf("query err
failure,err=%s", err))
+ }
+
out := &model.StorageNodesInfo{}
if err = json.Unmarshal([]byte(data), &out); err != nil {
return nil, fmt.Errorf("json unmarshal return err=%s", err)
@@ -159,14 +170,18 @@ func (ss *shardingSphereProxy) ExportStorageNodes()
([]*model.StorageNode, error
// get all storage nodes and filter duplicate nodes
var storageNodes []*model.StorageNode
+
var tmpNodesMap = make(map[string]struct{})
+
for _, v := range out.StorageNodes {
for _, vv := range v {
// filter duplicate nodes
if _, ok := tmpNodesMap[fmt.Sprintf("%s:%d", vv.IP,
vv.Port)]; ok {
continue
}
+
tmpNodesMap[fmt.Sprintf("%s:%d", vv.IP, vv.Port)] =
struct{}{}
+
storageNodes = append(storageNodes, vv)
}
}
@@ -179,10 +194,12 @@ func (ss *shardingSphereProxy) ImportMetaData(in
*model.ClusterInfo) error {
if in == nil {
return xerr.NewCliErr("import meta data is nil")
}
+
marshal, err := json.Marshal(in)
if err != nil {
return xerr.NewCliErr(fmt.Sprintf("json marshal,invalid
data[in=%+v]", in))
}
+
_, err = ss.db.Exec(fmt.Sprintf(`IMPORT METADATA '%s';`, marshal))
if err != nil {
return xerr.NewCliErr(fmt.Sprintf("import metadata
failure,err=%s", err))
diff --git a/pitr/cli/internal/pkg/xerr/err.go
b/pitr/cli/internal/pkg/xerr/err.go
index 6a09aeb..5e363d6 100644
--- a/pitr/cli/internal/pkg/xerr/err.go
+++ b/pitr/cli/internal/pkg/xerr/err.go
@@ -19,16 +19,13 @@ package xerr
import "fmt"
-type (
- service string
- err struct {
- msg string
- }
-)
+type err struct {
+ msg string
+}
const (
Unknown = "Unknown error"
- InvalidHttpStatus = "Invalid http status"
+ InvalidHTTPStatus = "Invalid http status"
NotFound = "Not found"
)
diff --git a/pitr/cli/main.go b/pitr/cli/main.go
index c20dd7f..bbf5d75 100644
--- a/pitr/cli/main.go
+++ b/pitr/cli/main.go
@@ -42,7 +42,7 @@ func main() {
zap.AddStacktrace(zapcore.FatalLevel),
)
if err != nil {
- panic(fmt.Errorf("an unknown error occured in the zap-log"))
+ panic(fmt.Errorf("an unknown error occurred in the zap-log"))
}
logging.Init(logger)
diff --git a/pitr/cli/pkg/httputils/req.go b/pitr/cli/pkg/httputils/req.go
index a02787e..7d99079 100644
--- a/pitr/cli/pkg/httputils/req.go
+++ b/pitr/cli/pkg/httputils/req.go
@@ -97,6 +97,7 @@ func (r *req) Send(body any) (int, error) {
}
tr := &http.Transport{
+ //nolint:gosec
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
c := &http.Client{Transport: tr}
@@ -105,6 +106,8 @@ func (r *req) Send(body any) (int, error) {
return -1, fmt.Errorf("http request err=%w", err)
}
+ defer resp.Body.Close()
+
all, err := io.ReadAll(resp.Body)
if err != nil {
return -1, fmt.Errorf("invalid response,err=%w", err)
diff --git a/pitr/cli/pkg/logging/field.go b/pitr/cli/pkg/logging/field.go
index 2119278..0e575fa 100644
--- a/pitr/cli/pkg/logging/field.go
+++ b/pitr/cli/pkg/logging/field.go
@@ -33,14 +33,3 @@ type FieldKey string
func (f FieldKey) String() string {
return string(f)
}
-
-const (
- ErrorKey FieldKey = "error"
- RequestID FieldKey = "requestID"
- Stack FieldKey = "stack"
- Duration FieldKey = "duration"
- Path FieldKey = "path" // original routing path
- RequestUri FieldKey = "requestUri" // http requesting uri
- HttpMethod FieldKey = "httpMethod"
- HttpStatus FieldKey = "httpStatus"
-)
diff --git a/pitr/cli/pkg/stringutil/rand_string.go
b/pitr/cli/pkg/stringutil/rand_string.go
index 769b7b7..f7be6c5 100644
--- a/pitr/cli/pkg/stringutil/rand_string.go
+++ b/pitr/cli/pkg/stringutil/rand_string.go
@@ -18,9 +18,8 @@
package strutil
import (
- "math/rand"
+ "crypto/rand"
"strconv"
- "time"
)
const (
@@ -34,20 +33,25 @@ const (
)
func Random(n uint) string {
- rand.Seed(time.Now().UnixNano())
- bs := make([]byte, 0, n)
+ bs := make([]byte, n)
+
for i := uint(0); i < n; i++ {
- bs = append(bs, charSet[rand.Intn(charSize)])
+ _, _ = rand.Read(bs[i : i+1])
+ }
+ for i, v := range bs {
+ bs[i] = charSet[int(v)%charSize]
}
return string(bs)
}
func RandomInt(n uint) int64 {
- rand.Seed(time.Now().UnixNano())
- bs := make([]byte, 0, n)
- bs = append(bs, digitSet[rand.Intn(digitSize-1)])
- for i := uint(0); i < n-1; i++ {
- bs = append(bs, digitSet[rand.Intn(digitSize)])
+ bs := make([]byte, n)
+ _, _ = rand.Read(bs[0:1])
+ for i := uint(1); i < n; i++ {
+ _, _ = rand.Read(bs[i : i+1])
+ }
+ for i, v := range bs {
+ bs[i] = digitSet[int(v)%digitSize]
}
v, _ := strconv.ParseInt(string(bs), 10, 64)
return v
diff --git a/pitr/cli/pkg/stringutil/rand_string_test.go
b/pitr/cli/pkg/stringutil/rand_string_test.go
index f2e3720..098171b 100644
--- a/pitr/cli/pkg/stringutil/rand_string_test.go
+++ b/pitr/cli/pkg/stringutil/rand_string_test.go
@@ -17,7 +17,9 @@
package strutil
-import "testing"
+import (
+ "testing"
+)
func TestRandom(t *testing.T) {
one, two := Random(20), Random(20)