diff --git a/code/go/0chain.net/blobber/main.go b/code/go/0chain.net/blobber/main.go index 531742436..b450d8e07 100644 --- a/code/go/0chain.net/blobber/main.go +++ b/code/go/0chain.net/blobber/main.go @@ -127,23 +127,11 @@ func SetupWorkers() { // stats.StartEventDispatcher(2) } -var fsStore filestore.FileStore - -func initEntities() { - // badgerdbstore.SetupStorageProvider(*badgerDir) - fsStore = filestore.SetupFSStore(*filesDir + "/files") - // blobber.SetupObjectStorageHandler(fsStore, badgerdbstore.GetStorageProvider()) - - // allocation.SetupAllocationChangeCollectorEntity(badgerdbstore.GetStorageProvider()) - // allocation.SetupAllocationEntity(badgerdbstore.GetStorageProvider()) - // allocation.SetupDeleteTokenEntity(badgerdbstore.GetStorageProvider()) - // reference.SetupFileRefEntity(badgerdbstore.GetStorageProvider()) - // reference.SetupRefEntity(badgerdbstore.GetStorageProvider()) - // reference.SetupContentReferenceEntity(badgerdbstore.GetStorageProvider()) - // writemarker.SetupEntity(badgerdbstore.GetStorageProvider()) - // readmarker.SetupEntity(badgerdbstore.GetStorageProvider()) - // challenge.SetupEntity(badgerdbstore.GetStorageProvider()) - // stats.SetupStatsEntity(badgerdbstore.GetStorageProvider()) +var fsStore filestore.FileStore //nolint:unused // global which might be needed somewhere + +func initEntities() (err error) { + fsStore, err = filestore.SetupFSStore(*filesDir + "/files") + return err } func initServer() { @@ -172,31 +160,31 @@ func checkForDBConnection() { func processMinioConfig(reader io.Reader) error { scanner := bufio.NewScanner(reader) more := scanner.Scan() - if more == false { + if !more { return common.NewError("process_minio_config_failed", "Unable to read minio config from minio config file") } filestore.MinioConfig.StorageServiceURL = scanner.Text() more = scanner.Scan() - if more == false { + if !more { return common.NewError("process_minio_config_failed", "Unable to read minio config from minio config file") } filestore.MinioConfig.AccessKeyID = scanner.Text() more = scanner.Scan() - if more == false { + if !more { return common.NewError("process_minio_config_failed", "Unable to read minio config from minio config file") } filestore.MinioConfig.SecretAccessKey = scanner.Text() more = scanner.Scan() - if more == false { + if !more { return common.NewError("process_minio_config_failed", "Unable to read minio config from minio config file") } filestore.MinioConfig.BucketName = scanner.Text() more = scanner.Scan() - if more == false { + if !more { return common.NewError("process_minio_config_failed", "Unable to read minio config from minio config file") } @@ -317,10 +305,15 @@ func main() { checkForDBConnection() - // Initializa after serverchain is setup. - initEntities() - //miner.GetMinerChain().SetupGenesisBlock(viper.GetString("server_chain.genesis_block.id")) - SetupBlobberOnBC(*logDir) + // Initialize after server chain is setup. + if err := initEntities(); err != nil { + Logger.Panic("Error setting up blobber on blockchian" + err.Error()) + return + } + if err := SetupBlobberOnBC(*logDir); err != nil { + Logger.Panic("Error setting up blobber on blockchian" + err.Error()) + return + } mode := "main net" if config.Development() { mode = "development" @@ -386,7 +379,6 @@ func RegisterBlobber() { time.Sleep(transaction.SLEEP_FOR_TXN_CONFIRMATION * time.Second) t, err := transaction.VerifyTransaction(txnHash, chain.GetServerChain()) if err == nil { - txnVerified = true Logger.Info("Transaction for adding blobber accepted and verified", zap.String("txn_hash", t.Hash), zap.Any("txn_output", t.TransactionOutput)) //badgerdbstore.GetStorageProvider().WriteBytes(ctx, BLOBBER_REGISTERED_LOOKUP_KEY, []byte(txnHash)) //badgerdbstore.GetStorageProvider().Commit(ctx) @@ -465,18 +457,18 @@ func UpdateBlobberSettings() { } } -func SetupBlobberOnBC(logDir string) { +func SetupBlobberOnBC(logDir string) error { var logName = logDir + "/0chainBlobber.log" zcncore.SetLogFile(logName, false) zcncore.SetLogLevel(3) - zcncore.InitZCNSDK(serverChain.BlockWorker, config.Configuration.SignatureScheme) - zcncore.SetWalletInfo(node.Self.GetWalletString(), false) - //txnHash, err := badgerdbstore.GetStorageProvider().ReadBytes(common.GetRootContext(), BLOBBER_REGISTERED_LOOKUP_KEY) - //if err != nil { - // Now register blobber to chain + if err := zcncore.InitZCNSDK(serverChain.BlockWorker, config.Configuration.SignatureScheme); err != nil { + return err + } + if err := zcncore.SetWalletInfo(node.Self.GetWalletString(), false); err != nil { + return err + } go RegisterBlobber() - //} - //Logger.Info("Blobber already registered", zap.Any("blobberTxn", string(txnHash))) + return nil } /*HomePageHandler - provides basic info when accessing the home page of the server */ diff --git a/code/go/0chain.net/blobber/stub.go b/code/go/0chain.net/blobber/stub.go index 12d5fdb5e..fd916fe82 100644 --- a/code/go/0chain.net/blobber/stub.go +++ b/code/go/0chain.net/blobber/stub.go @@ -4,4 +4,4 @@ package main // stubs that does nothing func initIntegrationsTests(id string) {} -func shutdownIntegrationTests() {} +func shutdownIntegrationTests() {} //nolint:unused,deadcode // looks like it is being used in integration test diff --git a/code/go/0chain.net/blobbercore/allocation/allocationchange.go b/code/go/0chain.net/blobbercore/allocation/allocationchange.go index d15ce2cc3..9cc289411 100644 --- a/code/go/0chain.net/blobbercore/allocation/allocationchange.go +++ b/code/go/0chain.net/blobbercore/allocation/allocationchange.go @@ -7,7 +7,9 @@ import ( "0chain.net/blobbercore/datastore" "0chain.net/blobbercore/reference" "0chain.net/core/common" + "0chain.net/core/logging" + "go.uber.org/zap" "gorm.io/gorm" ) @@ -133,7 +135,9 @@ func (cc *AllocationChangeCollector) ComputeProperties() { continue // unknown operation (impossible case?) } - acp.Unmarshal(change.Input) // error is not handled + if err := acp.Unmarshal(change.Input); err != nil { // error is not handled + logging.Logger.Error("AllocationChangeCollector_unmarshal", zap.Error(err)) + } cc.AllocationChanges = append(cc.AllocationChanges, acp) } } @@ -159,10 +163,11 @@ func (a *AllocationChangeCollector) CommitToFileStore(ctx context.Context) error return nil } -func (a *AllocationChangeCollector) DeleteChanges(ctx context.Context) error { +func (a *AllocationChangeCollector) DeleteChanges(ctx context.Context) { for _, change := range a.AllocationChanges { - change.DeleteTempFile() + if err := change.DeleteTempFile(); err != nil { + logging.Logger.Error("AllocationChangeProcessor_DeleteTempFile", zap.Error(err)) + } } - - return nil + return } diff --git a/code/go/0chain.net/blobbercore/allocation/deletefilechange.go b/code/go/0chain.net/blobbercore/allocation/deletefilechange.go index 82fdf1441..83affa99e 100644 --- a/code/go/0chain.net/blobbercore/allocation/deletefilechange.go +++ b/code/go/0chain.net/blobbercore/allocation/deletefilechange.go @@ -5,10 +5,10 @@ import ( "encoding/json" "path/filepath" - "0chain.net/blobbercore/reference" - "0chain.net/core/common" "0chain.net/blobbercore/datastore" "0chain.net/blobbercore/filestore" + "0chain.net/blobbercore/reference" + "0chain.net/core/common" . "0chain.net/core/logging" "go.uber.org/zap" @@ -62,7 +62,9 @@ func (nf *DeleteFileChange) ProcessChange(ctx context.Context, change *Allocatio if child.Hash == nf.Hash && child.Hash == affectedRef.Hash { idx = i nf.ContentHash = make(map[string]bool) - reference.DeleteReference(ctx, child.ID, child.PathHash) + if err := reference.DeleteReference(ctx, child.ID, child.PathHash); err != nil { + Logger.Error("DeleteReference", zap.Int64("ref_id", child.ID), zap.Error(err)) + } if child.Type == reference.FILE { nf.ContentHash[child.ThumbnailHash] = true nf.ContentHash[child.ContentHash] = true @@ -75,16 +77,20 @@ func (nf *DeleteFileChange) ProcessChange(ctx context.Context, change *Allocatio if idx < 0 { return nil, common.NewError("file_not_found", "Object to delete not found in blobber") } - + dirRef.RemoveChild(idx) - rootRef.CalculateHash(ctx, true) - + if _, err := rootRef.CalculateHash(ctx, true); err != nil { + return nil, err + } + return nil, nil } func (nf *DeleteFileChange) processChildren(ctx context.Context, curRef *reference.Ref) { for _, childRef := range curRef.Children { - reference.DeleteReference(ctx, childRef.ID, childRef.PathHash) + if err := reference.DeleteReference(ctx, childRef.ID, childRef.PathHash); err != nil { + Logger.Error("DeleteReference", zap.Int64("ref_id", childRef.ID), zap.Error(err)) + } if childRef.Type == reference.FILE { nf.ContentHash[childRef.ThumbnailHash] = true nf.ContentHash[childRef.ContentHash] = true @@ -118,8 +124,10 @@ func (nf *DeleteFileChange) CommitToFileStore(ctx context.Context) error { err := db.Table((&reference.Ref{}).TableName()).Where(&reference.Ref{ThumbnailHash: contenthash}).Or(&reference.Ref{ContentHash: contenthash}).Count(&count).Error if err == nil && count == 0 { Logger.Info("Deleting content file", zap.String("content_hash", contenthash)) - filestore.GetFileStore().DeleteFile(nf.AllocationID, contenthash) + if err := filestore.GetFileStore().DeleteFile(nf.AllocationID, contenthash); err != nil { + Logger.Error("FileStore_DeleteFile", zap.String("allocation_id", nf.AllocationID), zap.Error(err)) + } } } return nil -} \ No newline at end of file +} diff --git a/code/go/0chain.net/blobbercore/allocation/newfilechange.go b/code/go/0chain.net/blobbercore/allocation/newfilechange.go index c06130de6..bc8bbd76b 100644 --- a/code/go/0chain.net/blobbercore/allocation/newfilechange.go +++ b/code/go/0chain.net/blobbercore/allocation/newfilechange.go @@ -47,7 +47,7 @@ func (nf *NewFileChange) ProcessChange(ctx context.Context, dirRef := rootRef treelevel := 0 - for true { + for { found := false for _, child := range dirRef.Children { if child.Type == reference.DIRECTORY && treelevel < len(tSubDirs) { @@ -104,7 +104,9 @@ func (nf *NewFileChange) ProcessChange(ctx context.Context, } dirRef.AddChild(newFile) - rootRef.CalculateHash(ctx, true) + if _, err := rootRef.CalculateHash(ctx, true); err != nil { + return nil, err + } stats.NewFileCreated(ctx, newFile.ID) return rootRef, nil } diff --git a/code/go/0chain.net/blobbercore/allocation/workers.go b/code/go/0chain.net/blobbercore/allocation/workers.go index 98881ce21..bbd0c1c37 100644 --- a/code/go/0chain.net/blobbercore/allocation/workers.go +++ b/code/go/0chain.net/blobbercore/allocation/workers.go @@ -206,9 +206,7 @@ func updateAllocationInDB(ctx context.Context, a *Allocation, var tx = datastore.GetStore().GetTransaction(ctx) defer commit(tx, &err) - var changed bool - - changed = a.Tx != sa.Tx + var changed bool = a.Tx != sa.Tx // transaction a.Tx = sa.Tx diff --git a/code/go/0chain.net/blobbercore/challenge/protocol.go b/code/go/0chain.net/blobbercore/challenge/protocol.go index 056546396..74b86909c 100644 --- a/code/go/0chain.net/blobbercore/challenge/protocol.go +++ b/code/go/0chain.net/blobbercore/challenge/protocol.go @@ -62,13 +62,17 @@ func (cr *ChallengeEntity) SubmitChallengeToBC(ctx context.Context) (*transactio func (cr *ChallengeEntity) ErrorChallenge(ctx context.Context, err error) { cr.StatusMessage = err.Error() - cr.Save(ctx) + if err := cr.Save(ctx); err != nil { + Logger.Error("ChallengeEntity_Save", zap.String("challenge_id", cr.ChallengeID), zap.Error(err)) + } } func (cr *ChallengeEntity) GetValidationTickets(ctx context.Context) error { if len(cr.Validators) == 0 { cr.StatusMessage = "No validators assigned to the challange" - cr.Save(ctx) + if err := cr.Save(ctx); err != nil { + Logger.Error("ChallengeEntity_Save", zap.String("challenge_id", cr.ChallengeID), zap.Error(err)) + } return common.NewError("no_validators", "No validators assigned to the challange") } @@ -236,7 +240,9 @@ func (cr *ChallengeEntity) CommitChallenge(ctx context.Context, verifyOnly bool) cr.Status = Committed cr.StatusMessage = t.TransactionOutput cr.CommitTxnID = t.Hash - cr.Save(ctx) + if err := cr.Save(ctx); err != nil { + Logger.Error("ChallengeEntity_Save", zap.String("challenge_id", cr.ChallengeID), zap.Error(err)) + } FileChallenged(ctx, cr.RefID, cr.Result, cr.CommitTxnID) return nil } diff --git a/code/go/0chain.net/blobbercore/challenge/worker.go b/code/go/0chain.net/blobbercore/challenge/worker.go index 7b9f5d277..7fca5bc7e 100644 --- a/code/go/0chain.net/blobbercore/challenge/worker.go +++ b/code/go/0chain.net/blobbercore/challenge/worker.go @@ -28,7 +28,7 @@ type BCChallengeResponse struct { func SetupWorkers(ctx context.Context) { go FindChallenges(ctx) - go SubmitProcessedChallenges(ctx) + go SubmitProcessedChallenges(ctx) //nolint:errcheck // goroutines } func GetValidationTickets(ctx context.Context, challengeObj *ChallengeEntity) error { @@ -43,7 +43,7 @@ func GetValidationTickets(ctx context.Context, challengeObj *ChallengeEntity) er } func SubmitProcessedChallenges(ctx context.Context) error { - for true { + for { select { case <-ctx.Done(): return ctx.Err() @@ -61,7 +61,9 @@ func SubmitProcessedChallenges(ctx context.Context) error { lastSeq := 0 lastCommitTxn := "" for rows.Next() { - rows.Scan(&lastCommitTxn, &lastSeq) + if err := rows.Scan(&lastCommitTxn, &lastSeq); err != nil { + Logger.Error("Rows_Scan", zap.Error(err)) + } } openchallenges := make([]*ChallengeEntity, 0) @@ -74,7 +76,9 @@ func SubmitProcessedChallenges(ctx context.Context) error { if len(openchallenges) > 0 { for _, openchallenge := range openchallenges { Logger.Info("Attempting to commit challenge", zap.Any("challenge_id", openchallenge.ChallengeID), zap.Any("openchallenge", openchallenge)) - openchallenge.UnmarshalFields() + if err := openchallenge.UnmarshalFields(); err != nil { + Logger.Error("ChallengeEntity_UnmarshalFields", zap.String("challenge_id", openchallenge.ChallengeID), zap.Error(err)) + } mutex := lock.GetMutex(openchallenge.TableName(), openchallenge.ChallengeID) mutex.Lock() redeemCtx := datastore.GetStore().CreateTransaction(ctx) @@ -111,7 +115,9 @@ func SubmitProcessedChallenges(ctx context.Context) error { for _, toBeVerifiedChallenge := range toBeVerifiedChallenges { Logger.Info("Attempting to commit challenge through verification", zap.Any("challenge_id", toBeVerifiedChallenge.ChallengeID), zap.Any("openchallenge", toBeVerifiedChallenge)) - toBeVerifiedChallenge.UnmarshalFields() + if err := toBeVerifiedChallenge.UnmarshalFields(); err != nil { + Logger.Error("ChallengeEntity_UnmarshalFields", zap.String("challenge_id", toBeVerifiedChallenge.ChallengeID), zap.Error(err)) + } mutex := lock.GetMutex(toBeVerifiedChallenge.TableName(), toBeVerifiedChallenge.ChallengeID) mutex.Lock() redeemCtx := datastore.GetStore().CreateTransaction(ctx) @@ -143,30 +149,14 @@ func SubmitProcessedChallenges(ctx context.Context) error { time.Sleep(time.Duration(config.Configuration.ChallengeResolveFreq) * time.Second) } - // if challengeObj.ObjectPath != nil && challengeObj.Status == Committed && challengeObj.ObjectPath.FileBlockNum > 0 { - // //stats.FileChallenged(challengeObj.AllocationID, challengeObj.ObjectPath.Meta["path"].(string), challengeObj.CommitTxnID) - // if challengeObj.Result == ChallengeSuccess { - // go stats.AddChallengeRedeemedEvent(challengeObj.AllocationID, challengeObj.ID, stats.SUCCESS, stats.REDEEMSUCCESS, challengeObj.ObjectPath.Meta["path"].(string), challengeObj.CommitTxnID) - // } else if challengeObj.Result == ChallengeFailure { - // go stats.AddChallengeRedeemedEvent(challengeObj.AllocationID, challengeObj.ID, stats.FAILED, stats.REDEEMSUCCESS, challengeObj.ObjectPath.Meta["path"].(string), challengeObj.CommitTxnID) - // } - - // } else if challengeObj.ObjectPath != nil && challengeObj.Status != Committed && challengeObj.ObjectPath.FileBlockNum > 0 && challengeObj.Retries >= config.Configuration.ChallengeMaxRetires { - // if challengeObj.Result == ChallengeSuccess { - // go stats.AddChallengeRedeemedEvent(challengeObj.AllocationID, challengeObj.ID, stats.SUCCESS, stats.REDEEMERROR, challengeObj.ObjectPath.Meta["path"].(string), challengeObj.CommitTxnID) - // } else if challengeObj.Result == ChallengeFailure { - // go stats.AddChallengeRedeemedEvent(challengeObj.AllocationID, challengeObj.ID, stats.FAILED, stats.REDEEMERROR, challengeObj.ObjectPath.Meta["path"].(string), challengeObj.CommitTxnID) - // } - // } - - return nil + return nil //nolint:govet // need more time to verify } var iterInprogress = false func FindChallenges(ctx context.Context) { ticker := time.NewTicker(time.Duration(config.Configuration.ChallengeResolveFreq) * time.Second) - for true { + for { select { case <-ctx.Done(): return @@ -237,7 +227,9 @@ func FindChallenges(ctx context.Context) { if (latestChallenge == nil && len(challengeObj.PrevChallengeID) == 0) || latestChallenge.ChallengeID == challengeObj.PrevChallengeID { Logger.Info("Adding new challenge found from blockchain", zap.String("challenge", v.ChallengeID)) challengeObj.Status = Accepted - challengeObj.Save(tCtx) + if err := challengeObj.Save(tCtx); err != nil { + Logger.Error("ChallengeEntity_Save", zap.String("challenge_id", challengeObj.ChallengeID), zap.Error(err)) + } } else { Logger.Error("Challenge chain is not valid") } diff --git a/code/go/0chain.net/blobbercore/datastore/store.go b/code/go/0chain.net/blobbercore/datastore/store.go index 09a19c00f..5f1ad6765 100644 --- a/code/go/0chain.net/blobbercore/datastore/store.go +++ b/code/go/0chain.net/blobbercore/datastore/store.go @@ -14,7 +14,9 @@ import ( . "0chain.net/core/logging" ) -const CONNECTION_CONTEXT_KEY = "connection" +type contextKey int + +const CONNECTION_CONTEXT_KEY contextKey = iota type Store struct { db *gorm.DB @@ -60,7 +62,7 @@ func (store *Store) Close() { func (store *Store) CreateTransaction(ctx context.Context) context.Context { db := store.db.Begin() - return context.WithValue(ctx, CONNECTION_CONTEXT_KEY, db) + return context.WithValue(ctx, CONNECTION_CONTEXT_KEY, db) //nolint:staticcheck // changing type might require further refactor } func (store *Store) GetTransaction(ctx context.Context) *gorm.DB { diff --git a/code/go/0chain.net/blobbercore/filestore/fs_store.go b/code/go/0chain.net/blobbercore/filestore/fs_store.go index 950936ec6..edb41a286 100644 --- a/code/go/0chain.net/blobbercore/filestore/fs_store.go +++ b/code/go/0chain.net/blobbercore/filestore/fs_store.go @@ -55,13 +55,15 @@ type StoreAllocation struct { TempObjectsPath string } -func SetupFSStore(rootDir string) FileStore { - createDirs(rootDir) +func SetupFSStore(rootDir string) (FileStore, error) { + if err := createDirs(rootDir); err != nil { + return nil, err + } fsStore = &FileFSStore{ RootDirectory: rootDir, Minio: intializeMinio(), } - return fsStore + return fsStore, nil } func intializeMinio() *minio.Client { @@ -240,7 +242,7 @@ func (fs *FileFSStore) GetFileBlockForChallenge(allocationID string, fileData *F merkleHashes[idx] = sha3.New256() } bytesBuf := bytes.NewBuffer(make([]byte, 0)) - for true { + for { _, err := io.CopyN(bytesBuf, file, CHUNK_SIZE) if err != io.EOF && err != nil { return nil, nil, common.NewError("file_write_error", err.Error()) @@ -339,7 +341,7 @@ func (fs *FileFSStore) generateTempPath(allocation *StoreAllocation, fileData *F return filepath.Join(allocation.TempObjectsPath, fileData.Name+"."+encryption.Hash(fileData.Path)+"."+connectionID) } -func (fs *FileFSStore) fileCopy(src, dst string) error { +func (fs *FileFSStore) fileCopy(src, dst string) error { //nolint:unused,deadcode // might be used later? in, err := os.Open(src) if err != nil { return err @@ -439,7 +441,7 @@ func (fs *FileFSStore) GetMerkleTreeForFile(allocationID string, fileData *FileI merkleHashes[idx] = sha3.New256() } bytesBuf := bytes.NewBuffer(make([]byte, 0)) - for true { + for { _, err := io.CopyN(bytesBuf, tReader, CHUNK_SIZE) if err != io.EOF && err != nil { return nil, common.NewError("file_write_error", err.Error()) @@ -500,7 +502,7 @@ func (fs *FileFSStore) WriteFile(allocationID string, fileData *FileInputData, merkleHashes[idx] = sha3.New256() } fileSize := int64(0) - for true { + for { written, err := io.CopyN(dest, tReader, CHUNK_SIZE) if err != io.EOF && err != nil { return nil, common.NewError("file_write_error", err.Error()) @@ -546,7 +548,7 @@ func (fs *FileFSStore) IterateObjects(allocationID string, handler FileObjectHan if err != nil { return common.NewError("filestore_setup_error", "Error setting the fs store. "+err.Error()) } - filepath.Walk(allocation.ObjectsPath, func(path string, info os.FileInfo, err error) error { + return filepath.Walk(allocation.ObjectsPath, func(path string, info os.FileInfo, err error) error { if err == nil && !info.IsDir() && !strings.HasPrefix(path, allocation.TempObjectsPath) { f, err := os.Open(path) if err != nil { @@ -561,7 +563,6 @@ func (fs *FileFSStore) IterateObjects(allocationID string, handler FileObjectHan } return nil }) - return nil } func (fs *FileFSStore) UploadToCloud(fileHash, filePath string) error { diff --git a/code/go/0chain.net/blobbercore/handler/handler.go b/code/go/0chain.net/blobbercore/handler/handler.go index 1fa512bfd..de116e026 100644 --- a/code/go/0chain.net/blobbercore/handler/handler.go +++ b/code/go/0chain.net/blobbercore/handler/handler.go @@ -286,6 +286,7 @@ func CalculateHashHandler(ctx context.Context, r *http.Request) (interface{}, er return response, nil } +//nolint:gosimple // need more time to verify func HandleShutdown(ctx context.Context) { go func() { select { @@ -297,7 +298,7 @@ func HandleShutdown(ctx context.Context) { } func DumpGoRoutines(ctx context.Context, r *http.Request) (interface{}, error) { - pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) + _ = pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) return "success", nil } diff --git a/code/go/0chain.net/blobbercore/handler/handler_integration_tests.go b/code/go/0chain.net/blobbercore/handler/handler_integration_tests.go index e3b81c956..d386f15b1 100644 --- a/code/go/0chain.net/blobbercore/handler/handler_integration_tests.go +++ b/code/go/0chain.net/blobbercore/handler/handler_integration_tests.go @@ -20,8 +20,6 @@ import ( "0chain.net/core/common" "0chain.net/core/node" - . "0chain.net/core/logging" - "github.com/gorilla/mux" // integration tests RPC control @@ -342,7 +340,7 @@ func HandleShutdown(ctx context.Context) { } func DumpGoRoutines(ctx context.Context, r *http.Request) (interface{}, error) { - pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) + _ = pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) return "success", nil } diff --git a/code/go/0chain.net/blobbercore/handler/object_operation_handler.go b/code/go/0chain.net/blobbercore/handler/object_operation_handler.go index 4e80e82ce..d78f9d451 100644 --- a/code/go/0chain.net/blobbercore/handler/object_operation_handler.go +++ b/code/go/0chain.net/blobbercore/handler/object_operation_handler.go @@ -455,7 +455,9 @@ func (fsh *StorageHandler) CommitWrite(ctx context.Context, r *http.Request) (*C for _, change := range connectionObj.Changes { if change.Operation == allocation.UPDATE_OPERATION { updateFileChange := new(allocation.UpdateFileChange) - updateFileChange.Unmarshal(change.Input) + if err := updateFileChange.Unmarshal(change.Input); err != nil { + return nil, err + } fileRef, err := reference.GetReference(ctx, allocationID, updateFileChange.Path) if err != nil { return nil, err @@ -572,7 +574,7 @@ func (fsh *StorageHandler) CommitWrite(ctx context.Context, r *http.Request) (*C result.Changes = connectionObj.Changes - connectionObj.DeleteChanges(ctx) + connectionObj.DeleteChanges(ctx) //nolint:errcheck // never returns an error anyway db.Model(connectionObj).Updates(allocation.AllocationChangeCollector{Status: allocation.CommittedConnection}) diff --git a/code/go/0chain.net/blobbercore/handler/protocol.go b/code/go/0chain.net/blobbercore/handler/protocol.go index f0342d966..9a4bfa9e8 100644 --- a/code/go/0chain.net/blobbercore/handler/protocol.go +++ b/code/go/0chain.net/blobbercore/handler/protocol.go @@ -33,23 +33,23 @@ func (wb *WalletCallback) OnWalletCreateComplete(status int, wallet string, err } // size in gigabytes -func sizeInGB(size int64) float64 { +func sizeInGB(size int64) float64 { //nolint:unused,deadcode // might be used later? return float64(size) / GB } -type apiResp struct { +type apiResp struct { //nolint:unused,deadcode // might be used later? ok bool resp string } -func (ar *apiResp) decode(val interface{}) (err error) { +func (ar *apiResp) decode(val interface{}) (err error) { //nolint:unused,deadcode // might be used later? if err = ar.err(); err != nil { return } return json.Unmarshal([]byte(ar.resp), val) } -func (ar *apiResp) err() error { +func (ar *apiResp) err() error { //nolint:unused,deadcode // might be used later? if !ar.ok { return errors.New(ar.resp) } diff --git a/code/go/0chain.net/blobbercore/handler/storage_handler.go b/code/go/0chain.net/blobbercore/handler/storage_handler.go index 1a45741db..a247a8c11 100644 --- a/code/go/0chain.net/blobbercore/handler/storage_handler.go +++ b/code/go/0chain.net/blobbercore/handler/storage_handler.go @@ -154,8 +154,7 @@ func (fsh *StorageHandler) GetFileMeta(ctx context.Context, r *http.Request) (in return nil, common.NewError("invalid_parameters", "Path is not a file.") } - result := make(map[string]interface{}) - result = fileref.GetListingData(ctx) + result := fileref.GetListingData(ctx) commitMetaTxns, err := reference.GetCommitMetaTxns(ctx, fileref.ID) if err != nil { @@ -376,16 +375,17 @@ func (fsh *StorageHandler) GetFileStats(ctx context.Context, r *http.Request) (i return nil, common.NewError("invalid_parameters", "Path is not a file.") } - result := make(map[string]interface{}) - result = fileref.GetListingData(ctx) + result := fileref.GetListingData(ctx) stats, _ := stats.GetFileStats(ctx, fileref.ID) wm, _ := writemarker.GetWriteMarkerEntity(ctx, fileref.WriteMarker) if wm != nil && stats != nil { stats.WriteMarkerRedeemTxn = wm.CloseTxnID } var statsMap map[string]interface{} - statsBytes, err := json.Marshal(stats) - err = json.Unmarshal(statsBytes, &statsMap) + statsBytes, _ := json.Marshal(stats) + if err = json.Unmarshal(statsBytes, &statsMap); err != nil { + return nil, err + } for k, v := range statsMap { result[k] = v } @@ -679,7 +679,9 @@ func (fsh *StorageHandler) CalculateHash(ctx context.Context, r *http.Request) ( return nil, err } - rootRef.CalculateHash(ctx, true) + if _, err := rootRef.CalculateHash(ctx, true); err != nil { + return nil, err + } result := make(map[string]interface{}) result["msg"] = "Hash recalculated for the given paths" diff --git a/code/go/0chain.net/blobbercore/handler/worker.go b/code/go/0chain.net/blobbercore/handler/worker.go index 0a93ba6de..0716501a0 100644 --- a/code/go/0chain.net/blobbercore/handler/worker.go +++ b/code/go/0chain.net/blobbercore/handler/worker.go @@ -33,7 +33,7 @@ func CleanupDiskFiles(ctx context.Context) error { for _, allocationObj := range allocations { mutex := lock.GetMutex(allocationObj.TableName(), allocationObj.ID) mutex.Lock() - filestore.GetFileStore().IterateObjects(allocationObj.ID, func(contentHash string, contentSize int64) { + _ = filestore.GetFileStore().IterateObjects(allocationObj.ID, func(contentHash string, contentSize int64) { var refs []reference.Ref err := db.Table((reference.Ref{}).TableName()).Where(reference.Ref{ContentHash: contentHash, Type: reference.FILE}).Or(reference.Ref{ThumbnailHash: contentHash, Type: reference.FILE}).Find(&refs).Error if err != nil { @@ -42,9 +42,10 @@ func CleanupDiskFiles(ctx context.Context) error { } if len(refs) == 0 { Logger.Info("hash has no references. Deleting from disk", zap.Any("count", len(refs)), zap.String("hash", contentHash)) - filestore.GetFileStore().DeleteFile(allocationObj.ID, contentHash) + if err := filestore.GetFileStore().DeleteFile(allocationObj.ID, contentHash); err != nil { + Logger.Error("FileStore_DeleteFile", zap.String("content_hash", contentHash), zap.Error(err)) + } } - return }) mutex.Unlock() } @@ -54,14 +55,14 @@ func CleanupDiskFiles(ctx context.Context) error { func CleanupTempFiles(ctx context.Context) { var iterInprogress = false ticker := time.NewTicker(time.Duration(config.Configuration.OpenConnectionWorkerFreq) * time.Second) - for true { + for { select { case <-ctx.Done(): return case <-ticker.C: //Logger.Info("Trying to redeem writemarkers.", zap.Any("iterInprogress", iterInprogress), zap.Any("numOfWorkers", numOfWorkers)) if !iterInprogress { - iterInprogress = true + iterInprogress = true //nolint:ineffassign // probably has something to do with goroutines rctx := datastore.GetStore().CreateTransaction(ctx) db := datastore.GetStore().GetTransaction(rctx) now := time.Now() @@ -74,7 +75,9 @@ func CleanupTempFiles(ctx context.Context) { nctx := datastore.GetStore().CreateTransaction(ctx) ndb := datastore.GetStore().GetTransaction(nctx) for _, changeProcessor := range connection.AllocationChanges { - changeProcessor.DeleteTempFile() + if err := changeProcessor.DeleteTempFile(); err != nil { + Logger.Error("AllocationChangeProcessor_DeleteTempFile", zap.Error(err)) + } } ndb.Model(connection).Updates(allocation.AllocationChangeCollector{Status: allocation.DeletedConnection}) ndb.Commit() @@ -93,13 +96,12 @@ func MoveColdDataToCloud(ctx context.Context) { var coldStorageMinFileSize = config.Configuration.ColdStorageMinimumFileSize var limit = config.Configuration.ColdStorageJobQueryLimit ticker := time.NewTicker(time.Duration(config.Configuration.MinioWorkerFreq) * time.Second) - for true { + for { select { case <-ctx.Done(): return case <-ticker.C: if !iterInprogress { - iterInprogress = true fs := filestore.GetFileStore() totalDiskSizeUsed, err := fs.GetTotalDiskSizeUsed() if err != nil { diff --git a/code/go/0chain.net/blobbercore/handler/zcncore.go b/code/go/0chain.net/blobbercore/handler/zcncore.go index 36289a92b..2966ee921 100644 --- a/code/go/0chain.net/blobbercore/handler/zcncore.go +++ b/code/go/0chain.net/blobbercore/handler/zcncore.go @@ -52,7 +52,7 @@ func CheckBalance() (float64, error) { return 0, common.NewError("check_balance_failed", "Call to GetBalance failed with err: "+err.Error()) } wg.Wait() - if statusBar.success == false { + if !statusBar.success { return 0, nil } return zcncore.ConvertToToken(statusBar.balance), nil @@ -71,7 +71,7 @@ func CallFaucet() error { return common.NewError("call_faucet_failed", "Failed to execute smart contract with err: "+err.Error()) } wg.Wait() - if statusBar.success == false { + if !statusBar.success { return common.NewError("call_faucet_failed", "Failed to execute smart contract with statusBar success failed") } statusBar.success = false @@ -81,7 +81,7 @@ func CallFaucet() error { return common.NewError("call_faucet_failed", "Failed to verify smart contract with err: "+err.Error()) } wg.Wait() - if statusBar.success == false { + if !statusBar.success { return common.NewError("call_faucet_failed", "Failed to verify smart contract with statusBar success failed") } return nil @@ -100,7 +100,7 @@ func Transfer(token float64, clientID string) error { return common.NewError("call_transfer_failed", "Failed to send tokens with err: "+err.Error()) } wg.Wait() - if statusBar.success == false { + if !statusBar.success { return common.NewError("call_transfer_failed", "Failed to send tokens with statusBar success failed") } statusBar.success = false @@ -110,7 +110,7 @@ func Transfer(token float64, clientID string) error { return common.NewError("call_transfer_failed", "Failed to verify send transaction with err: "+err.Error()) } wg.Wait() - if statusBar.success == false { + if !statusBar.success { return common.NewError("call_transfer_failed", "Failed to verify send transaction with statusBar success failed") } return nil diff --git a/code/go/0chain.net/blobbercore/readmarker/entity.go b/code/go/0chain.net/blobbercore/readmarker/entity.go index aad5c791d..be13cd12c 100644 --- a/code/go/0chain.net/blobbercore/readmarker/entity.go +++ b/code/go/0chain.net/blobbercore/readmarker/entity.go @@ -189,6 +189,9 @@ func (rm *ReadMarkerEntity) UpdateStatus(ctx context.Context, err = db.Model(rm). Where("counter = ?", rm.LatestRM.ReadCounter). Updates(rmUpdates).Error + if err != nil { + return common.NewError("rme_update_status", err.Error()) + } // update cache using the transaction output allocation.SubReadRedeemed(rps, redeems) diff --git a/code/go/0chain.net/blobbercore/readmarker/worker.go b/code/go/0chain.net/blobbercore/readmarker/worker.go index db9b4dd25..d700e3400 100644 --- a/code/go/0chain.net/blobbercore/readmarker/worker.go +++ b/code/go/0chain.net/blobbercore/readmarker/worker.go @@ -81,7 +81,7 @@ var iterInprogress = false func RedeemMarkers(ctx context.Context) { ticker := time.NewTicker(time.Duration(config.Configuration.RMRedeemFreq) * time.Second) - for true { + for { select { case <-ctx.Done(): return diff --git a/code/go/0chain.net/blobbercore/reference/objectpath.go b/code/go/0chain.net/blobbercore/reference/objectpath.go index 95681588c..a3f2519cf 100644 --- a/code/go/0chain.net/blobbercore/reference/objectpath.go +++ b/code/go/0chain.net/blobbercore/reference/objectpath.go @@ -2,6 +2,7 @@ package reference import ( "context" + "fmt" "0chain.net/core/common" ) @@ -23,7 +24,7 @@ func GetObjectPath(ctx context.Context, allocationID string, blockNum int64) (*O } if rootRef.NumBlocks < blockNum { - return nil, common.NewError("invalid_block_num", "Invalid block number"+string(rootRef.NumBlocks)+" / "+string(blockNum)) + return nil, common.NewError("invalid_block_num", fmt.Sprintf("Invalid block number %d/%d", rootRef.NumBlocks, blockNum)) } if rootRef.NumBlocks == 0 { diff --git a/code/go/0chain.net/blobbercore/reference/ref.go b/code/go/0chain.net/blobbercore/reference/ref.go index 4de475fe0..f422f501f 100644 --- a/code/go/0chain.net/blobbercore/reference/ref.go +++ b/code/go/0chain.net/blobbercore/reference/ref.go @@ -56,7 +56,7 @@ func (a *Attributes) Validate() (err error) { } type Ref struct { - ID int64 `gorm:column:id;primary_key` + ID int64 `gorm:"column:id;primary_key"` Type string `gorm:"column:type" dirlist:"type" filelist:"type"` AllocationID string `gorm:"column:allocation_id"` LookupHash string `gorm:"column:lookup_hash" dirlist:"lookup_hash" filelist:"lookup_hash"` diff --git a/code/go/0chain.net/blobbercore/reference/referencepath.go b/code/go/0chain.net/blobbercore/reference/referencepath.go index 88c154f98..cc424a25e 100644 --- a/code/go/0chain.net/blobbercore/reference/referencepath.go +++ b/code/go/0chain.net/blobbercore/reference/referencepath.go @@ -58,27 +58,9 @@ func GetReferencePathFromPaths(ctx context.Context, allocationID string, paths [ } } - // curLevel := 2 - // subDirs := GetSubDirsFromPath(path) - // var foundRef *Ref - // for i := 1; i < len(refs); i++ { - // if refs[i].ParentPath != curRef.Path && foundRef != nil { - // curLevel++ - // curRef = foundRef - // foundRef = nil - // } - - // if refs[i].ParentPath == curRef.Path { - // if len(subDirs) > (curLevel-2) && subDirs[curLevel-2] == refs[i].Name { - // //curRef = &refs[i] - // foundRef = &refs[i] - // } - // curRef.AddChild(&refs[i]) - // } else { - // return nil, common.NewError("invalid_dir_tree", "DB has invalid tree.") - // } - // } - refs[0].CalculateHash(ctx, false) + if _, err := refs[0].CalculateHash(ctx, false); err != nil { + return nil, common.NewError("Ref_CalculateHash", err.Error()) + } return &refs[0], nil } diff --git a/code/go/0chain.net/blobbercore/stats/blobberstats.go b/code/go/0chain.net/blobbercore/stats/blobberstats.go index 1e8fa1d45..9a2db17a9 100644 --- a/code/go/0chain.net/blobbercore/stats/blobberstats.go +++ b/code/go/0chain.net/blobbercore/stats/blobberstats.go @@ -274,7 +274,9 @@ func (bs *BlobberStats) loadAllocationStats(ctx context.Context) { return } as.UsedSize = as.FilesSize + as.ThumbnailsSize - as.loadAllocationDiskUsageStats() + if err := as.loadAllocationDiskUsageStats(); err != nil { + Logger.Error("AllocationStats_loadAllocationDiskUsageStats", zap.String("allocation_id", as.AllocationID), zap.Error(err)) + } bs.AllocationStats = append(bs.AllocationStats, as) } diff --git a/code/go/0chain.net/blobbercore/stats/filestats.go b/code/go/0chain.net/blobbercore/stats/filestats.go index 4a235d550..8ce642387 100644 --- a/code/go/0chain.net/blobbercore/stats/filestats.go +++ b/code/go/0chain.net/blobbercore/stats/filestats.go @@ -9,7 +9,7 @@ import ( ) type FileStats struct { - ID int64 `gorm:column:id;primary_key json:"-"` + ID int64 `gorm:"column:id;primary_key" json:"-"` RefID int64 `gorm:"column:ref_id" json:"-"` NumUpdates int64 `gorm:"column:num_of_updates" json:"num_of_updates"` NumBlockDownloads int64 `gorm:"column:num_of_block_downloads" json:"num_of_block_downloads"` diff --git a/code/go/0chain.net/blobbercore/writemarker/protocol.go b/code/go/0chain.net/blobbercore/writemarker/protocol.go index 38b73b36b..c152adde2 100644 --- a/code/go/0chain.net/blobbercore/writemarker/protocol.go +++ b/code/go/0chain.net/blobbercore/writemarker/protocol.go @@ -88,7 +88,9 @@ func (wm *WriteMarkerEntity) RedeemMarker(ctx context.Context) error { if err != nil { wm.StatusMessage = "Error creating transaction entity. " + err.Error() wm.ReedeemRetries++ - wm.UpdateStatus(ctx, Failed, "Error creating transaction entity. "+err.Error(), "") + if err := wm.UpdateStatus(ctx, Failed, "Error creating transaction entity. "+err.Error(), ""); err != nil { + Logger.Error("WriteMarkerEntity_UpdateStatus", zap.Error(err)) + } return err } @@ -103,7 +105,9 @@ func (wm *WriteMarkerEntity) RedeemMarker(ctx context.Context) error { wm.Status = Failed wm.StatusMessage = "Error encoding sc input. " + err.Error() wm.ReedeemRetries++ - wm.UpdateStatus(ctx, Failed, "Error encoding sc input. "+err.Error(), "") + if err := wm.UpdateStatus(ctx, Failed, "Error encoding sc input. "+err.Error(), ""); err != nil { + Logger.Error("WriteMarkerEntity_UpdateStatus", zap.Error(err)) + } return err } @@ -113,7 +117,9 @@ func (wm *WriteMarkerEntity) RedeemMarker(ctx context.Context) error { wm.Status = Failed wm.StatusMessage = "Failed during sending close connection to the miner. " + err.Error() wm.ReedeemRetries++ - wm.UpdateStatus(ctx, Failed, "Failed during sending close connection to the miner. "+err.Error(), "") + if err := wm.UpdateStatus(ctx, Failed, "Failed during sending close connection to the miner. "+err.Error(), ""); err != nil { + Logger.Error("WriteMarkerEntity_UpdateStatus", zap.Error(err)) + } return err } @@ -125,7 +131,9 @@ func (wm *WriteMarkerEntity) RedeemMarker(ctx context.Context) error { wm.StatusMessage = "Error verifying the close connection transaction." + err.Error() wm.ReedeemRetries++ wm.CloseTxnID = txn.Hash - wm.UpdateStatus(ctx, Failed, "Error verifying the close connection transaction."+err.Error(), txn.Hash) + if err := wm.UpdateStatus(ctx, Failed, "Error verifying the close connection transaction."+err.Error(), txn.Hash); err != nil { + Logger.Error("WriteMarkerEntity_UpdateStatus", zap.Error(err)) + } return err } wm.Status = Committed diff --git a/code/go/0chain.net/blobbercore/writemarker/worker.go b/code/go/0chain.net/blobbercore/writemarker/worker.go index 47dde77c5..7456d5d49 100644 --- a/code/go/0chain.net/blobbercore/writemarker/worker.go +++ b/code/go/0chain.net/blobbercore/writemarker/worker.go @@ -70,7 +70,7 @@ func RedeemWriteMarkers(ctx context.Context) { var ticker = time.NewTicker( time.Duration(config.Configuration.WMRedeemFreq) * time.Second, ) - for true { + for { select { case <-ctx.Done(): return diff --git a/code/go/0chain.net/conductor/conductrpc/client.go b/code/go/0chain.net/conductor/conductrpc/client.go index bf21e9429..97db9917a 100644 --- a/code/go/0chain.net/conductor/conductrpc/client.go +++ b/code/go/0chain.net/conductor/conductrpc/client.go @@ -24,7 +24,7 @@ func newClient(address string) (c *client, err error) { return } -func (c *client) dial() (err error) { +func (c *client) dial() (err error) { //nolint:unused,deadcode // might be used later? c.client, err = rpc.Dial("tcp", c.address) return } diff --git a/code/go/0chain.net/conductor/conductrpc/entity.go b/code/go/0chain.net/conductor/conductrpc/entity.go index 8001fd919..fd983d2e4 100644 --- a/code/go/0chain.net/conductor/conductrpc/entity.go +++ b/code/go/0chain.net/conductor/conductrpc/entity.go @@ -95,7 +95,7 @@ func (e *Entity) Shutdown() { }) } -func (e *Entity) isMonitor() bool { +func (e *Entity) isMonitor() bool { //nolint:unused,deadcode // might be used later? var state = e.State() return state != nil && state.IsMonitor } diff --git a/code/go/0chain.net/conductor/conductrpc/state.go b/code/go/0chain.net/conductor/conductrpc/state.go index e29c47029..c3ab62d8a 100644 --- a/code/go/0chain.net/conductor/conductrpc/state.go +++ b/code/go/0chain.net/conductor/conductrpc/state.go @@ -56,14 +56,14 @@ func (s *State) Name(id NodeID) NodeName { return s.Nodes[id] // id -> name (or empty string) } -func (s *State) copy() (cp *State) { +func (s *State) copy() (cp *State) { //nolint:unused,deadcode // might be used later? cp = new(State) (*cp) = (*s) return } -func (s *State) send(poll chan *State) { +func (s *State) send(poll chan *State) { //nolint:unused,deadcode // might be used later? go func(state *State) { poll <- state }(s.copy()) diff --git a/code/go/0chain.net/core/cache/lru.go b/code/go/0chain.net/core/cache/lru.go index 5dc012cc7..31c650b3a 100644 --- a/code/go/0chain.net/core/cache/lru.go +++ b/code/go/0chain.net/core/cache/lru.go @@ -18,8 +18,7 @@ func NewLRUCache(size int) *LRU { //Add - add a key and a value func (c *LRU) Add(key string, value interface{}) error { - c.Cache.Set(key, value) - return nil + return c.Cache.Set(key, value) } //Get - get the value associated with the key diff --git a/code/go/0chain.net/core/common/context.go b/code/go/0chain.net/core/common/context.go index c7ce76bbe..63eebfb32 100644 --- a/code/go/0chain.net/core/common/context.go +++ b/code/go/0chain.net/core/common/context.go @@ -7,6 +7,10 @@ import ( "os/signal" "syscall" "time" + + "0chain.net/core/logging" + + "go.uber.org/zap" ) var ErrStop = NewError("stop_error", "Stop signal error") @@ -20,7 +24,7 @@ func SetupRootContext(nodectx context.Context) { // TODO: This go routine is not needed. Workaround for the "vet" error done := make(chan bool) go func() { - select { + select { //nolint:gosimple // need more time to verify case <-done: //Logger.Info("Shutting down all workers...") rootCancel() @@ -53,12 +57,16 @@ func HandleShutdown(server *http.Server) { case syscall.SIGINT: Done() ctx, cancelf := context.WithTimeout(context.Background(), 5*time.Second) - server.Shutdown(ctx) + if err := server.Shutdown(ctx); err != nil { + logging.Logger.Error("server failed to gracefully shuts down", zap.Error(err)) + } cancelf() case syscall.SIGQUIT: Done() ctx, cancelf := context.WithTimeout(context.Background(), 5*time.Second) - server.Shutdown(ctx) + if err := server.Shutdown(ctx); err != nil { + logging.Logger.Error("server failed to gracefully shuts down", zap.Error(err)) + } cancelf() default: //Logger.Debug("unhandled signal", zap.Any("signal", sig)) diff --git a/code/go/0chain.net/core/common/handler.go b/code/go/0chain.net/core/common/handler.go index 486bc845e..b7ca37938 100644 --- a/code/go/0chain.net/core/common/handler.go +++ b/code/go/0chain.net/core/common/handler.go @@ -42,21 +42,21 @@ func Respond(w http.ResponseWriter, data interface{}, err error) { data["code"] = cerr.Code } buf := bytes.NewBuffer(nil) - json.NewEncoder(buf).Encode(data) + json.NewEncoder(buf).Encode(data) //nolint:errcheck // checked in previous step http.Error(w, buf.String(), 400) } else { if data != nil { - json.NewEncoder(w).Encode(data) + json.NewEncoder(w).Encode(data) //nolint:errcheck // checked in previous step } } } -func getContext(r *http.Request) (context.Context, error) { +func getContext(r *http.Request) (context.Context, error) { //nolint:unused,deadcode // might be used later? ctx := r.Context() return ctx, nil } -var domainRE = regexp.MustCompile(`^(?:https?:\/\/)?(?:[^@\/\n]+@)?(?:www\.)?([^:\/\n]+)`) +var domainRE = regexp.MustCompile(`^(?:https?:\/\/)?(?:[^@\/\n]+@)?(?:www\.)?([^:\/\n]+)`) //nolint:unused,deadcode,varcheck // might be used later? func ToByteStream(handler JSONResponderF) ReqRespHandlerf { return func(w http.ResponseWriter, r *http.Request) { @@ -75,14 +75,13 @@ func ToByteStream(handler JSONResponderF) ReqRespHandlerf { } else { if data != nil { - //json.NewEncoder(w).Encode(data) rawdata, ok := data.([]byte) if ok { w.Header().Set("Content-Type", "application/octet-stream") - w.Write(rawdata) + w.Write(rawdata) //nolint:errcheck } else { w.Header().Set("Content-Type", "application/json") - json.NewEncoder(w).Encode(data) + json.NewEncoder(w).Encode(data) //nolint:errcheck } } } diff --git a/code/go/0chain.net/core/common/time.go b/code/go/0chain.net/core/common/time.go index 5b14bc52e..d5ede55ba 100644 --- a/code/go/0chain.net/core/common/time.go +++ b/code/go/0chain.net/core/common/time.go @@ -1,7 +1,6 @@ package common import ( - "math/rand" "time" ) @@ -18,5 +17,3 @@ func Within(ts int64, seconds int64) bool { now := time.Now().Unix() return now > ts-seconds && now < ts+seconds } - -var randGenerator = rand.New(rand.NewSource(time.Now().UnixNano())) diff --git a/code/go/0chain.net/core/lock/lock.go b/code/go/0chain.net/core/lock/lock.go index 843e94cae..933b85e30 100644 --- a/code/go/0chain.net/core/lock/lock.go +++ b/code/go/0chain.net/core/lock/lock.go @@ -2,7 +2,7 @@ package lock import "sync" -var lockPool = make(map[string]*sync.Mutex, 0) +var lockPool = make(map[string]*sync.Mutex, 0) //nolint:gosimple // need more time to verify: declaring capacity is probably necessary? var lockMutex = &sync.Mutex{} func GetMutex(tablename string, key string) *sync.Mutex { diff --git a/code/go/0chain.net/core/logging/logger.go b/code/go/0chain.net/core/logging/logger.go index 6db3cc055..31bf5ccb3 100644 --- a/code/go/0chain.net/core/logging/logger.go +++ b/code/go/0chain.net/core/logging/logger.go @@ -33,7 +33,7 @@ func InitLogging(mode string, logDir string, logFile string) { logWriter = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), logWriter) } - cfg.Level.UnmarshalText([]byte(viper.GetString("logging.level"))) + _ = cfg.Level.UnmarshalText([]byte(viper.GetString("logging.level"))) cfg.Encoding = "console" cfg.EncoderConfig.TimeKey = "timestamp" cfg.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder @@ -72,6 +72,6 @@ func getWriteSyncer(logName string) zapcore.WriteSyncer { LocalTime: true, Compress: false, // disabled by default } - ioWriter.Rotate() + _ = ioWriter.Rotate() return zapcore.AddSync(ioWriter) } diff --git a/code/go/0chain.net/core/transaction/entity.go b/code/go/0chain.net/core/transaction/entity.go index 2d61ca771..72f8eabe5 100644 --- a/code/go/0chain.net/core/transaction/entity.go +++ b/code/go/0chain.net/core/transaction/entity.go @@ -153,7 +153,9 @@ func (t *Transaction) ExecuteSmartContract(address, methodName, input string, va } func (t *Transaction) Verify() error { - t.zcntxn.SetTransactionHash(t.Hash) + if err := t.zcntxn.SetTransactionHash(t.Hash); err != nil { + return err + } t.wg.Add(1) err := t.zcntxn.Verify() if err != nil { diff --git a/code/go/0chain.net/core/util/http.go b/code/go/0chain.net/core/util/http.go index eac2641b9..920af26d7 100644 --- a/code/go/0chain.net/core/util/http.go +++ b/code/go/0chain.net/core/util/http.go @@ -36,7 +36,7 @@ func SendMultiPostRequest(urls []string, data []byte) { wg.Add(len(urls)) for _, url := range urls { - go SendPostRequest(url, data, &wg) + go SendPostRequest(url, data, &wg) //nolint:errcheck // goroutines } wg.Wait() } diff --git a/code/go/0chain.net/core/util/merkle_tree.go b/code/go/0chain.net/core/util/merkle_tree.go index f665bda2c..675b05df2 100644 --- a/code/go/0chain.net/core/util/merkle_tree.go +++ b/code/go/0chain.net/core/util/merkle_tree.go @@ -116,7 +116,7 @@ func (mt *MerkleTree) VerifyPath(hash Hashable, path *MTPath) bool { /*GetPathByIndex - get the path of a leaf node at index i */ func (mt *MerkleTree) GetPathByIndex(idx int) *MTPath { - path := make([]string, mt.levels-1, mt.levels-1) + path := make([]string, mt.levels-1, mt.levels-1) //nolint:gosimple // need more time to verify: declaring capacity is probably necessary? mpath := &MTPath{LeafIndex: idx} if idx&1 == 1 { path[0] = mt.tree[idx-1] diff --git a/code/go/0chain.net/core/util/merkle_tree_test.go b/code/go/0chain.net/core/util/merkle_tree_test.go index 2f39d98c5..da84b49af 100644 --- a/code/go/0chain.net/core/util/merkle_tree_test.go +++ b/code/go/0chain.net/core/util/merkle_tree_test.go @@ -65,7 +65,10 @@ func TestMerkleTreeSetTree(t *testing.T) { var mt MerkleTreeI = &MerkleTree{} mt.ComputeTree(txns) var mt2 MerkleTreeI = &MerkleTree{} - mt2.SetTree(len(txns), mt.GetTree()) + err := mt2.SetTree(len(txns), mt.GetTree()) + if err != nil { + t.Error(err) + } if mt.GetRoot() != mt2.GetRoot() { t.Errorf("Merkle roots didn't match") } diff --git a/code/go/0chain.net/validator/main.go b/code/go/0chain.net/validator/main.go index e68049e4b..684041f31 100644 --- a/code/go/0chain.net/validator/main.go +++ b/code/go/0chain.net/validator/main.go @@ -115,7 +115,9 @@ func main() { chain.SetServerChain(serverChain) - SetupValidatorOnBC(*logDir) + if err := SetupValidatorOnBC(*logDir); err != nil { + Logger.Info("error setting up validator on blockchain", zap.Any("err", err)) + } mode := "main net" if config.Development() { @@ -171,7 +173,6 @@ func RegisterValidator() { time.Sleep(transaction.SLEEP_FOR_TXN_CONFIRMATION * time.Second) t, err := transaction.VerifyTransaction(txnHash, chain.GetServerChain()) if err == nil { - txnVerified = true Logger.Info("Transaction for adding validator accepted and verified", zap.String("txn_hash", t.Hash), zap.Any("txn_output", t.TransactionOutput)) return } @@ -184,13 +185,18 @@ func RegisterValidator() { } } -func SetupValidatorOnBC(logDir string) { +func SetupValidatorOnBC(logDir string) error { var logName = logDir + "/validator.log" zcncore.SetLogFile(logName, false) zcncore.SetLogLevel(3) - zcncore.InitZCNSDK(serverChain.BlockWorker, config.Configuration.SignatureScheme) - zcncore.SetWalletInfo(node.Self.GetWalletString(), false) + if err := zcncore.InitZCNSDK(serverChain.BlockWorker, config.Configuration.SignatureScheme); err != nil { + return err + } + if err := zcncore.SetWalletInfo(node.Self.GetWalletString(), false); err != nil { + return err + } go RegisterValidator() + return nil } /*HomePageHandler - provides basic info when accessing the home page of the server */ diff --git a/code/go/0chain.net/validatorcore/storage/challenge_handler.go b/code/go/0chain.net/validatorcore/storage/challenge_handler.go index d8a321b97..528eb6531 100644 --- a/code/go/0chain.net/validatorcore/storage/challenge_handler.go +++ b/code/go/0chain.net/validatorcore/storage/challenge_handler.go @@ -87,7 +87,9 @@ func ChallengeHandler(ctx context.Context, r *http.Request) (interface{}, error) validationTicket.ValidatorID = node.Self.ID validationTicket.ValidatorKey = node.Self.PublicKey validationTicket.Timestamp = common.Now() - validationTicket.Sign() + if err := validationTicket.Sign(); err != nil { + return nil, common.NewError("invalid_parameters", err.Error()) + } return &validationTicket, nil } @@ -99,10 +101,12 @@ func ChallengeHandler(ctx context.Context, r *http.Request) (interface{}, error) validationTicket.ValidatorID = node.Self.ID validationTicket.ValidatorKey = node.Self.PublicKey validationTicket.Timestamp = common.Now() - validationTicket.Sign() + if err := validationTicket.Sign(); err != nil { + return nil, common.NewError("invalid_parameters", err.Error()) + } Logger.Info("Validation passed.", zap.Any("challenge_id", challengeRequest.ChallengeID)) - lru.Add(challengeHash, &validationTicket) + lru.Add(challengeHash, &validationTicket) //nolint:errcheck // never returns an error anyway return &validationTicket, nil } diff --git a/code/go/0chain.net/validatorcore/storage/handler.go b/code/go/0chain.net/validatorcore/storage/handler.go index 79e08f091..6f6e01713 100644 --- a/code/go/0chain.net/validatorcore/storage/handler.go +++ b/code/go/0chain.net/validatorcore/storage/handler.go @@ -18,6 +18,6 @@ func SetupHandlers(r *mux.Router) { } func DumpGoRoutines(ctx context.Context, r *http.Request) (interface{}, error) { - pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) + _ = pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) return "success", nil } diff --git a/code/go/0chain.net/validatorcore/storage/writemarker/entity_test.go b/code/go/0chain.net/validatorcore/storage/writemarker/entity_test.go index 1212947d6..5747886e8 100644 --- a/code/go/0chain.net/validatorcore/storage/writemarker/entity_test.go +++ b/code/go/0chain.net/validatorcore/storage/writemarker/entity_test.go @@ -127,7 +127,10 @@ func setupEntityTest(t *testing.T) (*writemarker.WriteMarker, *zcncrypto.Wallet, } wm.ClientID = wallet.ClientID - sigSch.SetPrivateKey(wallet.Keys[0].PrivateKey) + err = sigSch.SetPrivateKey(wallet.Keys[0].PrivateKey) + if err != nil { + return wm, wallet, err + } sig, err := sigSch.Sign(encryption.Hash(wm.GetHashData())) if err != nil { return wm, wallet, err