lint: add staticcheck as a separate step (#3569)

This commit is contained in:
Egon Elbre 2019-11-14 10:31:30 +02:00 committed by Kaloyan Raev
parent d5963d81d0
commit 1e64006e32
31 changed files with 99 additions and 229 deletions

View File

@ -70,11 +70,14 @@ RUN yes | sdkmanager \
# Linters # Linters
RUN curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s -- -b ${GOPATH}/bin v1.21.0 RUN curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s -- -b ${GOPATH}/bin v1.21.0
RUN go get github.com/ckaznocha/protoc-gen-lint RUN go get github.com/ckaznocha/protoc-gen-lint
RUN go get github.com/nilslice/protolock/cmd/protolock RUN go get github.com/nilslice/protolock/cmd/protolock
RUN go get github.com/josephspurrier/goversioninfo RUN go get github.com/josephspurrier/goversioninfo
RUN go get github.com/loov/leakcheck RUN go get github.com/loov/leakcheck
RUN GO111MODULE=on go get honnef.co/go/tools/cmd/staticcheck@2019.2.2
# Output formatters # Output formatters
RUN go get github.com/mfridman/tparse RUN go get github.com/mfridman/tparse

View File

@ -46,6 +46,7 @@ pipeline {
sh 'go run ./scripts/atomicalign.go ./...' sh 'go run ./scripts/atomicalign.go ./...'
sh 'go run ./scripts/check-errs.go ./...' sh 'go run ./scripts/check-errs.go ./...'
sh 'bash ./scripts/check-dbx-version.sh' sh 'bash ./scripts/check-dbx-version.sh'
sh 'staticcheck ./...'
sh 'golangci-lint -j=2 run' sh 'golangci-lint -j=2 run'
sh 'go run scripts/check-mod-tidy.go -mod .build/go.mod.orig' sh 'go run scripts/check-mod-tidy.go -mod .build/go.mod.orig'
sh 'make check-satellite-config-lock' sh 'make check-satellite-config-lock'

View File

@ -23,8 +23,7 @@ import (
) )
var ( var (
idents = testidentity.NewPregeneratedIdentities(storj.LatestIDVersion()) t1 = Token{
t1 = Token{
UserID: "user@mail.test", UserID: "user@mail.test",
Data: [tokenDataLength]byte{1, 2, 3}, Data: [tokenDataLength]byte{1, 2, 3},
} }
@ -189,8 +188,7 @@ func TestNewClient(t *testing.T) {
ctx := testcontext.New(t) ctx := testcontext.New(t)
defer ctx.Cleanup() defer ctx.Cleanup()
ident, err := testidentity.PregeneratedIdentity(0, storj.LatestIDVersion())
ident, err := idents.NewIdentity()
require.NoError(t, err) require.NoError(t, err)
require.NotNil(t, ident) require.NotNil(t, ident)

View File

@ -43,7 +43,7 @@ func (scope *Scope) register(name string, val interface{}, pusher func(l *lua.St
defer scope.mu.Unlock() defer scope.mu.Unlock()
if _, exists := scope.registrations[name]; exists { if _, exists := scope.registrations[name]; exists {
return fmt.Errorf("Registration %#v already exists", name) return fmt.Errorf("registration %#v already exists", name)
} }
scope.registrations[name] = func(l *lua.State) error { scope.registrations[name] = func(l *lua.State) error {

View File

@ -29,7 +29,7 @@ func init() {
if interactive { if interactive {
return return
} }
// Check if the 'run' command is invoked // Check if the 'run' command is invoked
if len(os.Args) < 2 { if len(os.Args) < 2 {
return return
@ -61,28 +61,26 @@ func (m *service) Execute(args []string, r <-chan svc.ChangeRequest, changes cha
changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted}
for { for c := range r {
select { switch c.Cmd {
case c := <-r: case svc.Interrogate:
switch c.Cmd { log.Println("Interrogate request received.")
case svc.Interrogate: changes <- c.CurrentStatus
log.Println("Interrogate request received.") // Testing deadlock from https://code.google.com/p/winsvc/issues/detail?id=4
changes <- c.CurrentStatus time.Sleep(100 * time.Millisecond)
// Testing deadlock from https://code.google.com/p/winsvc/issues/detail?id=4 changes <- c.CurrentStatus
time.Sleep(100 * time.Millisecond) case svc.Stop, svc.Shutdown:
changes <- c.CurrentStatus log.Println("Stop/Shutdown request received.")
case svc.Stop, svc.Shutdown: changes <- svc.Status{State: svc.StopPending}
log.Println("Stop/Shutdown request received.")
changes <- svc.Status{State: svc.StopPending}
cancel() cancel()
// Sleep some time to give chance for goroutines finish cleanup after cancelling the context // Sleep some time to give chance for goroutines finish cleanup after cancelling the context
time.Sleep(3 * time.Second) time.Sleep(3 * time.Second)
// After returning the Windows Service is stopped and the process terminates // After returning the Windows Service is stopped and the process terminates
return return
default: default:
log.Println("Unexpected control request:", c) log.Println("Unexpected control request:", c)
}
} }
} }
return
} }

View File

@ -69,28 +69,26 @@ func (m *service) Execute(args []string, r <-chan svc.ChangeRequest, changes cha
changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted} changes <- svc.Status{State: svc.Running, Accepts: cmdsAccepted}
for { for c := range r {
select { switch c.Cmd {
case c := <-r: case svc.Interrogate:
switch c.Cmd { zap.S().Info("Interrogate request received.")
case svc.Interrogate: changes <- c.CurrentStatus
zap.S().Info("Interrogate request received.") // Testing deadlock from https://code.google.com/p/winsvc/issues/detail?id=4
changes <- c.CurrentStatus time.Sleep(100 * time.Millisecond)
// Testing deadlock from https://code.google.com/p/winsvc/issues/detail?id=4 changes <- c.CurrentStatus
time.Sleep(100 * time.Millisecond) case svc.Stop, svc.Shutdown:
changes <- c.CurrentStatus zap.S().Info("Stop/Shutdown request received.")
case svc.Stop, svc.Shutdown: changes <- svc.Status{State: svc.StopPending}
zap.S().Info("Stop/Shutdown request received.") // Cancel the command's root context to cleanup resources
changes <- svc.Status{State: svc.StopPending} _, cancel := process.Ctx(runCmd)
// Cancel the command's root context to cleanup resources cancel()
_, cancel := process.Ctx(runCmd) _ = group.Wait() // process.Exec does not return an error
cancel() // After returning the Windows Service is stopped and the process terminates
_ = group.Wait() // process.Exec does not return an error return
// After returning the Windows Service is stopped and the process terminates default:
return zap.S().Infof("Unexpected control request: %d\n", c)
default:
zap.S().Infof("Unexpected control request: %d\n", c)
}
} }
} }
return
} }

View File

@ -23,7 +23,7 @@ func init() {
// catMain is the function executed when catCmd is called // catMain is the function executed when catCmd is called
func catMain(cmd *cobra.Command, args []string) (err error) { func catMain(cmd *cobra.Command, args []string) (err error) {
if len(args) == 0 { if len(args) == 0 {
return fmt.Errorf("No object specified for copy") return fmt.Errorf("no object specified for copy")
} }
ctx, _ := process.Ctx(cmd) ctx, _ := process.Ctx(cmd)
@ -34,7 +34,7 @@ func catMain(cmd *cobra.Command, args []string) (err error) {
} }
if src.IsLocal() { if src.IsLocal() {
return fmt.Errorf("No bucket specified, use format sj://bucket/") return fmt.Errorf("no bucket specified, use format sj://bucket/")
} }
dst, err := fpath.New("-") dst, err := fpath.New("-")

View File

@ -57,7 +57,7 @@ func upload(ctx context.Context, src fpath.FPath, dst fpath.FPath, showProgress
return err return err
} }
if expiration.Before(time.Now()) { if expiration.Before(time.Now()) {
return fmt.Errorf("Invalid expiration date: (%s) has already passed", *expires) return fmt.Errorf("invalid expiration date: (%s) has already passed", *expires)
} }
} }
@ -270,10 +270,10 @@ func copyObject(ctx context.Context, src fpath.FPath, dst fpath.FPath) (err erro
// copyMain is the function executed when cpCmd is called. // copyMain is the function executed when cpCmd is called.
func copyMain(cmd *cobra.Command, args []string) (err error) { func copyMain(cmd *cobra.Command, args []string) (err error) {
if len(args) == 0 { if len(args) == 0 {
return fmt.Errorf("No object specified for copy") return fmt.Errorf("no object specified for copy")
} }
if len(args) == 1 { if len(args) == 1 {
return fmt.Errorf("No destination specified") return fmt.Errorf("no destination specified")
} }
ctx, _ := process.Ctx(cmd) ctx, _ := process.Ctx(cmd)
@ -290,7 +290,7 @@ func copyMain(cmd *cobra.Command, args []string) (err error) {
// if both local // if both local
if src.IsLocal() && dst.IsLocal() { if src.IsLocal() && dst.IsLocal() {
return errors.New("At least one of the source or the desination must be a Storj URL") return errors.New("at least one of the source or the desination must be a Storj URL")
} }
// if uploading // if uploading

View File

@ -55,7 +55,7 @@ func list(cmd *cobra.Command, args []string) error {
} }
if src.IsLocal() { if src.IsLocal() {
return fmt.Errorf("No bucket specified, use format sj://bucket/") return fmt.Errorf("no bucket specified, use format sj://bucket/")
} }
bucket, err := project.OpenBucket(ctx, src.Bucket(), scope.EncryptionAccess) bucket, err := project.OpenBucket(ctx, src.Bucket(), scope.EncryptionAccess)

View File

@ -28,7 +28,7 @@ func makeBucket(cmd *cobra.Command, args []string) error {
ctx, _ := process.Ctx(cmd) ctx, _ := process.Ctx(cmd)
if len(args) == 0 { if len(args) == 0 {
return fmt.Errorf("No bucket specified for creation") return fmt.Errorf("no bucket specified for creation")
} }
dst, err := fpath.New(args[0]) dst, err := fpath.New(args[0])
@ -37,11 +37,11 @@ func makeBucket(cmd *cobra.Command, args []string) error {
} }
if dst.IsLocal() { if dst.IsLocal() {
return fmt.Errorf("No bucket specified, use format sj://bucket/") return fmt.Errorf("no bucket specified, use format sj://bucket/")
} }
if dst.Path() != "" { if dst.Path() != "" {
return fmt.Errorf("Nested buckets not supported, use format sj://bucket/") return fmt.Errorf("nested buckets not supported, use format sj://bucket/")
} }
project, err := cfg.GetProject(ctx) project, err := cfg.GetProject(ctx)

View File

@ -29,14 +29,14 @@ func metaGetMain(cmd *cobra.Command, args []string) (err error) {
switch len(args) { switch len(args) {
case 0: case 0:
return fmt.Errorf("No object specified") return fmt.Errorf("no object specified")
case 1: case 1:
path = args[0] path = args[0]
case 2: case 2:
key = &args[0] key = &args[0]
path = args[1] path = args[1]
default: default:
return fmt.Errorf("Too many arguments") return fmt.Errorf("too many arguments")
} }
ctx, _ := process.Ctx(cmd) ctx, _ := process.Ctx(cmd)
@ -46,7 +46,7 @@ func metaGetMain(cmd *cobra.Command, args []string) (err error) {
return err return err
} }
if src.IsLocal() { if src.IsLocal() {
return fmt.Errorf("The source destination must be a Storj URL") return fmt.Errorf("the source destination must be a Storj URL")
} }
project, bucket, err := cfg.GetProjectAndBucket(ctx, src.Bucket()) project, bucket, err := cfg.GetProjectAndBucket(ctx, src.Bucket())
@ -69,8 +69,8 @@ func metaGetMain(cmd *cobra.Command, args []string) (err error) {
} }
value, ok := object.Meta.Metadata[keyNorm] value, ok := object.Meta.Metadata[keyNorm]
if ok != true { if !ok {
return fmt.Errorf("Key does not exist") return fmt.Errorf("key does not exist")
} }
str, err := json.Marshal(value) str, err := json.Marshal(value)

View File

@ -23,7 +23,7 @@ func init() {
// putMain is the function executed when putCmd is called // putMain is the function executed when putCmd is called
func putMain(cmd *cobra.Command, args []string) (err error) { func putMain(cmd *cobra.Command, args []string) (err error) {
if len(args) == 0 { if len(args) == 0 {
return fmt.Errorf("No object specified for copy") return fmt.Errorf("no object specified for copy")
} }
ctx, _ := process.Ctx(cmd) ctx, _ := process.Ctx(cmd)
@ -34,7 +34,7 @@ func putMain(cmd *cobra.Command, args []string) (err error) {
} }
if dst.IsLocal() { if dst.IsLocal() {
return fmt.Errorf("No bucket specified, use format sj://bucket/") return fmt.Errorf("no bucket specified, use format sj://bucket/")
} }
src, err := fpath.New("-") src, err := fpath.New("-")

View File

@ -25,7 +25,7 @@ func deleteBucket(cmd *cobra.Command, args []string) error {
ctx, _ := process.Ctx(cmd) ctx, _ := process.Ctx(cmd)
if len(args) == 0 { if len(args) == 0 {
return fmt.Errorf("No bucket specified for deletion") return fmt.Errorf("no bucket specified for deletion")
} }
dst, err := fpath.New(args[0]) dst, err := fpath.New(args[0])
@ -34,11 +34,11 @@ func deleteBucket(cmd *cobra.Command, args []string) error {
} }
if dst.IsLocal() { if dst.IsLocal() {
return fmt.Errorf("No bucket specified, use format sj://bucket/") return fmt.Errorf("no bucket specified, use format sj://bucket/")
} }
if dst.Path() != "" { if dst.Path() != "" {
return fmt.Errorf("Nested buckets not supported, use format sj://bucket/") return fmt.Errorf("nested buckets not supported, use format sj://bucket/")
} }
project, bucket, err := cfg.GetProjectAndBucket(ctx, dst.Bucket()) project, bucket, err := cfg.GetProjectAndBucket(ctx, dst.Bucket())
@ -53,7 +53,7 @@ func deleteBucket(cmd *cobra.Command, args []string) error {
} }
if len(list.Items) > 0 { if len(list.Items) > 0 {
return fmt.Errorf("Bucket not empty: %s", dst.Bucket()) return fmt.Errorf("bucket not empty: %s", dst.Bucket())
} }
err = project.DeleteBucket(ctx, dst.Bucket()) err = project.DeleteBucket(ctx, dst.Bucket())

View File

@ -24,7 +24,7 @@ func deleteObject(cmd *cobra.Command, args []string) error {
ctx, _ := process.Ctx(cmd) ctx, _ := process.Ctx(cmd)
if len(args) == 0 { if len(args) == 0 {
return fmt.Errorf("No object specified for deletion") return fmt.Errorf("no object specified for deletion")
} }
dst, err := fpath.New(args[0]) dst, err := fpath.New(args[0])
@ -33,7 +33,7 @@ func deleteObject(cmd *cobra.Command, args []string) error {
} }
if dst.IsLocal() { if dst.IsLocal() {
return fmt.Errorf("No bucket specified, use format sj://bucket/") return fmt.Errorf("no bucket specified, use format sj://bucket/")
} }
project, bucket, err := cfg.GetProjectAndBucket(ctx, dst.Bucket()) project, bucket, err := cfg.GetProjectAndBucket(ctx, dst.Bucket())

View File

@ -158,11 +158,11 @@ func closeProjectAndBucket(project *libuplink.Project, bucket *libuplink.Bucket)
func convertError(err error, path fpath.FPath) error { func convertError(err error, path fpath.FPath) error {
if storj.ErrBucketNotFound.Has(err) { if storj.ErrBucketNotFound.Has(err) {
return fmt.Errorf("Bucket not found: %s", path.Bucket()) return fmt.Errorf("bucket not found: %s", path.Bucket())
} }
if storj.ErrObjectNotFound.Has(err) { if storj.ErrObjectNotFound.Has(err) {
return fmt.Errorf("Object not found: %s", path.String()) return fmt.Errorf("object not found: %s", path.String())
} }
return err return err

View File

@ -13,7 +13,7 @@ func SplitConnstr(s string) (string, string, error) {
// consider https://github.com/xo/dburl if this ends up lacking // consider https://github.com/xo/dburl if this ends up lacking
parts := strings.SplitN(s, "://", 2) parts := strings.SplitN(s, "://", 2)
if len(parts) != 2 { if len(parts) != 2 {
return "", "", fmt.Errorf("Could not parse DB URL %s", s) return "", "", fmt.Errorf("could not parse DB URL %s", s)
} }
if parts[0] == "postgres" { if parts[0] == "postgres" {
parts[1] = s // postgres wants full URLS for its DSN parts[1] = s // postgres wants full URLS for its DSN

View File

@ -14,7 +14,7 @@ import (
func EditFile(fileToEdit string) error { func EditFile(fileToEdit string) error {
editorPath := getEditorPath() editorPath := getEditorPath()
if editorPath == "" { if editorPath == "" {
return fmt.Errorf("Unable to find suitable editor for file %s", fileToEdit) return fmt.Errorf("unable to find suitable editor for file %s", fileToEdit)
} }
cmd := exec.Command(editorPath, fileToEdit) cmd := exec.Command(editorPath, fileToEdit)
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout

View File

@ -107,12 +107,12 @@ func IsWritable(filepath string) (bool, error) {
} }
if !info.IsDir() { if !info.IsDir() {
return false, fmt.Errorf("Path %s is not a directory", filepath) return false, fmt.Errorf("path %s is not a directory", filepath)
} }
// Check if the user bit is enabled in file permission // Check if the user bit is enabled in file permission
if info.Mode().Perm()&0200 == 0 { if info.Mode().Perm()&0200 == 0 {
return false, fmt.Errorf("Write permission bit is not set on this file for user") return false, fmt.Errorf("write permission bit is not set on this file for user")
} }
// Test if user can create file // Test if user can create file
@ -122,7 +122,7 @@ func IsWritable(filepath string) (bool, error) {
testFile := path.Join(filepath, ".perm") testFile := path.Join(filepath, ".perm")
file, err := os.Create(testFile) // For read access. file, err := os.Create(testFile) // For read access.
if err != nil { if err != nil {
return false, fmt.Errorf("Write permission bit is not set on this file for user") return false, fmt.Errorf("write permission bit is not set on this file for user")
} }
_ = file.Close() _ = file.Close()

View File

@ -82,10 +82,8 @@ func (ctx *Context) CompileWithLDFlagsX(pkg string, ldFlagsX map[string]string)
ctx.test.Helper() ctx.test.Helper()
var ldFlags = "-s -w" var ldFlags = "-s -w"
if ldFlagsX != nil { for key, value := range ldFlagsX {
for key, value := range ldFlagsX { ldFlags += (" -X " + key + "=" + value)
ldFlags += (" -X " + key + "=" + value)
}
} }
return ctx.Compile(pkg, "-ldflags", ldFlags) return ctx.Compile(pkg, "-ldflags", ldFlags)

View File

@ -13,7 +13,6 @@ import (
"storj.io/storj/internal/testcontext" "storj.io/storj/internal/testcontext"
"storj.io/storj/internal/testplanet" "storj.io/storj/internal/testplanet"
"storj.io/storj/lib/uplink" "storj.io/storj/lib/uplink"
libuplink "storj.io/storj/lib/uplink"
"storj.io/storj/pkg/storj" "storj.io/storj/pkg/storj"
) )
@ -70,8 +69,8 @@ func TestProjectListBuckets(t *testing.T) {
// List with restrictions // List with restrictions
scope.APIKey, scope.EncryptionAccess, err = scope.APIKey, scope.EncryptionAccess, err =
scope.EncryptionAccess.Restrict(scope.APIKey, scope.EncryptionAccess.Restrict(scope.APIKey,
libuplink.EncryptionRestriction{Bucket: "test0"}, uplink.EncryptionRestriction{Bucket: "test0"},
libuplink.EncryptionRestriction{Bucket: "test1"}) uplink.EncryptionRestriction{Bucket: "test1"})
require.NoError(t, err) require.NoError(t, err)
p, err = ul.OpenProject(ctx, scope.SatelliteAddr, scope.APIKey) p, err = ul.OpenProject(ctx, scope.SatelliteAddr, scope.APIKey)

View File

@ -28,7 +28,7 @@ type memoryLiveAccounting struct {
func newMemoryLiveAccounting(log *zap.Logger) (*memoryLiveAccounting, error) { func newMemoryLiveAccounting(log *zap.Logger) (*memoryLiveAccounting, error) {
pmac := &memoryLiveAccounting{log: log} pmac := &memoryLiveAccounting{log: log}
pmac.spaceDeltas = make(map[uuid.UUID]int64, 0) pmac.spaceDeltas = make(map[uuid.UUID]int64)
return pmac, nil return pmac, nil
} }

View File

@ -441,22 +441,6 @@ func (server *Server) serveError(w http.ResponseWriter, status int) {
} }
} }
// serveJSONError writes JSON error to response output stream.
func (server *Server) serveJSONError(w http.ResponseWriter, status int, err error) {
w.WriteHeader(status)
var response struct {
Error string `json:"error"`
}
response.Error = err.Error()
err = json.NewEncoder(w).Encode(response)
if err != nil {
server.log.Error("failed to write json error response", zap.Error(err))
}
}
// grapqlHandler is graphql endpoint http handler function // grapqlHandler is graphql endpoint http handler function
func (server *Server) grapqlHandler(w http.ResponseWriter, r *http.Request) { func (server *Server) grapqlHandler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context() ctx := r.Context()

View File

@ -67,8 +67,7 @@ func TestUserEmailCase(t *testing.T) {
ctx := testcontext.New(t) ctx := testcontext.New(t)
defer ctx.Cleanup() defer ctx.Cleanup()
for _, testCase := range []struct { for _, testCase := range []struct {
email string email string
expected string
}{ }{
{email: "prettyandsimple@example.com"}, {email: "prettyandsimple@example.com"},
{email: "firstname.lastname@domain.com "}, {email: "firstname.lastname@domain.com "},

View File

@ -159,22 +159,6 @@ func (endpoint *Endpoint) validateAuth(ctx context.Context, header *pb.RequestHe
return keyInfo, nil return keyInfo, nil
} }
func (endpoint *Endpoint) validateCreateSegment(ctx context.Context, req *pb.SegmentWriteRequestOld) (err error) {
defer mon.Task()(&ctx)(&err)
err = endpoint.validateBucket(ctx, req.Bucket)
if err != nil {
return err
}
err = endpoint.validateRedundancy(ctx, req.Redundancy)
if err != nil {
return err
}
return nil
}
func (endpoint *Endpoint) validateCommitSegment(ctx context.Context, req *pb.SegmentCommitRequestOld) (err error) { func (endpoint *Endpoint) validateCommitSegment(ctx context.Context, req *pb.SegmentCommitRequestOld) (err error) {
defer mon.Task()(&ctx)(&err) defer mon.Task()(&ctx)(&err)
@ -304,8 +288,8 @@ func (endpoint *Endpoint) validatePointer(ctx context.Context, pointer *pb.Point
return Error.New("segment size %v is out of range, maximum allowed is %v", pointer.SegmentSize, maxAllowed) return Error.New("segment size %v is out of range, maximum allowed is %v", pointer.SegmentSize, maxAllowed)
} }
pieceNums := make(map[int32]struct{}, 0) pieceNums := make(map[int32]struct{})
nodeIds := make(map[storj.NodeID]struct{}, 0) nodeIds := make(map[storj.NodeID]struct{})
for _, piece := range remote.RemotePieces { for _, piece := range remote.RemotePieces {
if piece.PieceNum >= int32(len(originalLimits)) { if piece.PieceNum >= int32(len(originalLimits)) {
return Error.New("invalid piece number") return Error.New("invalid piece number")

View File

@ -425,7 +425,6 @@ func testDistinctIPs(t *testing.T, ctx *testcontext.Context, planet *testplanet.
service := satellite.Overlay.Service service := satellite.Overlay.Service
tests := []struct { tests := []struct {
nodeCount int
duplicateCount int duplicateCount int
requestCount int requestCount int
preferences overlay.NodeSelectionConfig preferences overlay.NodeSelectionConfig

View File

@ -12,6 +12,7 @@ import (
//go:generate dbx.v1 schema -d postgres satellitedb.dbx . //go:generate dbx.v1 schema -d postgres satellitedb.dbx .
//go:generate dbx.v1 golang -d postgres satellitedb.dbx . //go:generate dbx.v1 golang -d postgres satellitedb.dbx .
//go:generate sed -i '1i //lint:file-ignore * generated file\n' satellitedb.dbx.go
func init() { func init() {
// catch dbx errors // catch dbx errors

View File

@ -1,3 +1,5 @@
//lint:file-ignore * generated file
// AUTOGENERATED BY gopkg.in/spacemonkeygo/dbx.v1 // AUTOGENERATED BY gopkg.in/spacemonkeygo/dbx.v1
// DO NOT EDIT. // DO NOT EDIT.

View File

@ -1,3 +1,5 @@
//lint:file-ignore * generated file
// Code generated for package schema by go-bindata DO NOT EDIT. (@generated) // Code generated for package schema by go-bindata DO NOT EDIT. (@generated)
// sources: // sources:
// 2018092201_initial-tables.down.sql // 2018092201_initial-tables.down.sql

View File

@ -2,6 +2,7 @@
// See LICENSE for copying information. // See LICENSE for copying information.
//go:generate go-bindata -o data.go -pkg schema -ignore ".*go" . //go:generate go-bindata -o data.go -pkg schema -ignore ".*go" .
//go:generate sed -i '1i //lint:file-ignore * generated file\n' data.go
package schema package schema

View File

@ -277,41 +277,6 @@ func (cursor *forward) Advance() (*storage.ListItem, bool) {
return cursor.next() return cursor.next()
} }
type backward struct{ cursor }
func (cursor *backward) PositionToFirst(prefix, first storage.Key) {
if prefix.IsZero() {
// there's no prefix
if first.IsZero() {
// and no first item, so start from the end
cursor.positionLast()
} else {
// theres a first item, so try to position on that or one before that
cursor.positionBackward(first)
}
} else {
// there's a prefix
if first.IsZero() || storage.AfterPrefix(prefix).Less(first) {
// there's no first, or it's after our prefix
// storage.AfterPrefix("axxx/") is the next item after prefixes
// so we position to the item before
cursor.positionBefore(storage.AfterPrefix(prefix))
} else {
// otherwise try to position on first or one before that
cursor.positionBackward(first)
}
}
}
func (cursor *backward) SkipPrefix(prefix storage.Key) (*storage.ListItem, bool) {
cursor.positionBefore(prefix)
return cursor.prev()
}
func (cursor *backward) Advance() (*storage.ListItem, bool) {
return cursor.prev()
}
// cursor implements iterating over items with basic repositioning when the items change // cursor implements iterating over items with basic repositioning when the items change
type cursor struct { type cursor struct {
store *Client store *Client
@ -336,35 +301,6 @@ func (cursor *cursor) positionForward(key storage.Key) {
cursor.lastKey = storage.CloneKey(key) cursor.lastKey = storage.CloneKey(key)
} }
// positionLast positions at the last item
func (cursor *cursor) positionLast() {
store := cursor.store
cursor.version = store.version
cursor.nextIndex = len(store.Items) - 1
cursor.lastKey = storage.NextKey(store.Items[cursor.nextIndex].Key)
}
// positionBefore positions before key
func (cursor *cursor) positionBefore(key storage.Key) {
store := cursor.store
cursor.version = store.version
cursor.nextIndex, _ = store.indexOf(key)
cursor.nextIndex--
cursor.lastKey = storage.CloneKey(key) // TODO: probably not the right
}
// positionBackward positions at key or before key
func (cursor *cursor) positionBackward(key storage.Key) {
store := cursor.store
cursor.version = store.version
var ok bool
cursor.nextIndex, ok = store.indexOf(key)
if !ok {
cursor.nextIndex--
}
cursor.lastKey = storage.CloneKey(key)
}
func (cursor *cursor) next() (*storage.ListItem, bool) { func (cursor *cursor) next() (*storage.ListItem, bool) {
store := cursor.store store := cursor.store
if cursor.done { if cursor.done {
@ -391,34 +327,6 @@ func (cursor *cursor) next() (*storage.ListItem, bool) {
return item, true return item, true
} }
func (cursor *cursor) prev() (*storage.ListItem, bool) {
store := cursor.store
if cursor.done {
return nil, false
}
if cursor.version != store.version {
cursor.version = store.version
var ok bool
cursor.nextIndex, ok = store.indexOf(cursor.lastKey)
if !ok {
cursor.nextIndex--
}
}
if cursor.nextIndex >= len(store.Items) {
cursor.nextIndex = len(store.Items) - 1
}
if cursor.nextIndex < 0 {
cursor.close()
return nil, false
}
item := &store.Items[cursor.nextIndex]
cursor.lastKey = item.Key
cursor.nextIndex--
return item, true
}
// CompareAndSwap atomically compares and swaps oldValue with newValue // CompareAndSwap atomically compares and swaps oldValue with newValue
func (store *Client) CompareAndSwap(ctx context.Context, key storage.Key, oldValue, newValue storage.Value) (err error) { func (store *Client) CompareAndSwap(ctx context.Context, key storage.Key, oldValue, newValue storage.Value) (err error) {
defer mon.Task()(&ctx)(&err) defer mon.Task()(&ctx)(&err)

View File

@ -82,7 +82,7 @@ func (worker *Worker) Run(ctx context.Context, done func()) (err error) {
response, err := c.Recv() response, err := c.Recv()
if errs.Is(err, io.EOF) { if errs.Is(err, io.EOF) {
// Done // Done
break return nil
} }
if err != nil { if err != nil {
// TODO what happened // TODO what happened
@ -91,7 +91,8 @@ func (worker *Worker) Run(ctx context.Context, done func()) (err error) {
switch msg := response.GetMessage().(type) { switch msg := response.GetMessage().(type) {
case *pb.SatelliteMessage_NotReady: case *pb.SatelliteMessage_NotReady:
break // wait until next worker execution return nil
case *pb.SatelliteMessage_TransferPiece: case *pb.SatelliteMessage_TransferPiece:
transferPieceMsg := msg.TransferPiece transferPieceMsg := msg.TransferPiece
worker.limiter.Go(ctx, func() { worker.limiter.Go(ctx, func() {
@ -100,6 +101,7 @@ func (worker *Worker) Run(ctx context.Context, done func()) (err error) {
worker.log.Error("failed to transfer piece.", zap.Stringer("Satellite ID", worker.satelliteID), zap.Error(errs.Wrap(err))) worker.log.Error("failed to transfer piece.", zap.Stringer("Satellite ID", worker.satelliteID), zap.Error(errs.Wrap(err)))
} }
}) })
case *pb.SatelliteMessage_DeletePiece: case *pb.SatelliteMessage_DeletePiece:
deletePieceMsg := msg.DeletePiece deletePieceMsg := msg.DeletePiece
worker.limiter.Go(ctx, func() { worker.limiter.Go(ctx, func() {
@ -119,10 +121,8 @@ func (worker *Worker) Run(ctx context.Context, done func()) (err error) {
zap.Stringer("reason", msg.ExitFailed.Reason)) zap.Stringer("reason", msg.ExitFailed.Reason))
err = worker.satelliteDB.CompleteGracefulExit(ctx, worker.satelliteID, time.Now(), satellites.ExitFailed, msg.ExitFailed.GetExitFailureSignature()) err = worker.satelliteDB.CompleteGracefulExit(ctx, worker.satelliteID, time.Now(), satellites.ExitFailed, msg.ExitFailed.GetExitFailureSignature())
if err != nil { return errs.Wrap(err)
return errs.Wrap(err)
}
break
case *pb.SatelliteMessage_ExitCompleted: case *pb.SatelliteMessage_ExitCompleted:
worker.log.Info("graceful exit completed.", zap.Stringer("Satellite ID", worker.satelliteID)) worker.log.Info("graceful exit completed.", zap.Stringer("Satellite ID", worker.satelliteID))
@ -132,18 +132,13 @@ func (worker *Worker) Run(ctx context.Context, done func()) (err error) {
} }
// delete all remaining pieces // delete all remaining pieces
err = worker.deleteOnePieceOrAll(ctx, nil) err = worker.deleteOnePieceOrAll(ctx, nil)
if err != nil { return errs.Wrap(err)
return errs.Wrap(err)
}
break
default: default:
// TODO handle err // TODO handle err
worker.log.Error("unknown graceful exit message.", zap.Stringer("Satellite ID", worker.satelliteID)) worker.log.Error("unknown graceful exit message.", zap.Stringer("Satellite ID", worker.satelliteID))
} }
} }
return errs.Wrap(err)
} }
type gracefulExitStream interface { type gracefulExitStream interface {