From 97112c69be6eda59963e994f5977892d0521c38f Mon Sep 17 00:00:00 2001 From: Harshavardhana Date: Wed, 12 Oct 2022 15:47:41 -0700 Subject: [PATCH] fix: replication stats() to not crash under any situation (#15851) Co-authored-by: Daniel Valdivia <18384552+dvaldivia@users.noreply.github.com> --- cmd/batch-handlers.go | 7 ++++--- cmd/bucket-replication.go | 34 ++++++++++++++++++++++++++++++---- go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 37 insertions(+), 10 deletions(-) diff --git a/cmd/batch-handlers.go b/cmd/batch-handlers.go index ff7e730d1..067853ef3 100644 --- a/cmd/batch-handlers.go +++ b/cmd/batch-handlers.go @@ -40,6 +40,7 @@ import ( xhttp "github.com/minio/minio/internal/http" "github.com/minio/minio/internal/logger" "github.com/minio/pkg/console" + iampolicy "github.com/minio/pkg/iam/policy" "github.com/minio/pkg/wildcard" "gopkg.in/yaml.v2" ) @@ -732,7 +733,7 @@ func (a adminAPIHandlers) ListBatchJobs(w http.ResponseWriter, r *http.Request) defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r)) - objectAPI, _ := validateAdminReq(ctx, w, r, "admin:ListBatchJobs") + objectAPI, _ := validateAdminReq(ctx, w, r, iampolicy.ListBatchJobsAction) if objectAPI == nil { return } @@ -784,7 +785,7 @@ func (a adminAPIHandlers) DescribeBatchJob(w http.ResponseWriter, r *http.Reques defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r)) - objectAPI, _ := validateAdminReq(ctx, w, r, "admin:DescribeBatchJob") + objectAPI, _ := validateAdminReq(ctx, w, r, iampolicy.DescribeBatchJobAction) if objectAPI == nil { return } @@ -821,7 +822,7 @@ func (a adminAPIHandlers) StartBatchJob(w http.ResponseWriter, r *http.Request) defer logger.AuditLog(ctx, w, r, mustGetClaimsFromToken(r)) - objectAPI, creds := validateAdminReq(ctx, w, r, "admin:StartBatchJob") + objectAPI, creds := validateAdminReq(ctx, w, r, iampolicy.StartBatchJobAction) if objectAPI == nil { return } diff --git a/cmd/bucket-replication.go b/cmd/bucket-replication.go index f34b236cd..42ad6b670 100644 --- a/cmd/bucket-replication.go +++ b/cmd/bucket-replication.go @@ -2654,6 +2654,10 @@ func queueReplicationHeal(ctx context.Context, bucket string, oi ObjectInfo, rcf const mrfTimeInterval = 5 * time.Minute func (p *ReplicationPool) persistMRF() { + if !p.initialized() { + return + } + var mu sync.Mutex entries := make(map[string]MRFReplicateEntry) mTimer := time.NewTimer(mrfTimeInterval) @@ -2706,7 +2710,7 @@ func (p *ReplicationPool) persistMRF() { } func (p *ReplicationPool) queueMRFSave(entry MRFReplicateEntry) { - if p == nil { + if !p.initialized() { return } select { @@ -2718,6 +2722,10 @@ func (p *ReplicationPool) queueMRFSave(entry MRFReplicateEntry) { // save mrf entries to mrf_.bin func (p *ReplicationPool) saveMRFEntries(ctx context.Context, entries map[string]MRFReplicateEntry) error { + if !p.initialized() { + return nil + } + if len(entries) == 0 { return nil } @@ -2743,6 +2751,10 @@ func (p *ReplicationPool) saveMRFEntries(ctx context.Context, entries map[string // load mrf entries from disk func (p *ReplicationPool) loadMRF(fileName string) (re MRFReplicateEntries, e error) { + if !p.initialized() { + return re, nil + } + data, err := readConfig(p.ctx, p.objLayer, fileName) if err != nil && err != errConfigNotFound { return re, err @@ -2779,7 +2791,7 @@ func (p *ReplicationPool) loadMRF(fileName string) (re MRFReplicateEntries, e er } func (p *ReplicationPool) processMRF() { - if p == nil || p.objLayer == nil { + if !p.initialized() { return } pTimer := time.NewTimer(mrfTimeInterval) @@ -2822,7 +2834,7 @@ func (p *ReplicationPool) processMRF() { // process sends error logs to the heal channel for an attempt to heal replication. func (p *ReplicationPool) queueMRFHeal(file string) error { - if p == nil || p.objLayer == nil { + if !p.initialized() { return errServerNotInitialized } @@ -2844,6 +2856,10 @@ func (p *ReplicationPool) queueMRFHeal(file string) error { // load replication stats from disk func (p *ReplicationPool) loadStatsFromDisk() (rs map[string]BucketReplicationStats, e error) { + if !p.initialized() { + return map[string]BucketReplicationStats{}, nil + } + data, err := readConfig(p.ctx, p.objLayer, getReplicationStatsPath(globalLocalNodeName)) if err != nil { if !errors.Is(err, errConfigNotFound) { @@ -2879,8 +2895,12 @@ func (p *ReplicationPool) loadStatsFromDisk() (rs map[string]BucketReplicationSt return rs, nil } +func (p *ReplicationPool) initialized() bool { + return !(p == nil || p.objLayer == nil) +} + func (p *ReplicationPool) saveStatsToDisk() { - if p == nil || p.objLayer == nil { + if !p.initialized() { return } sTimer := time.NewTimer(replStatsSaveInterval) @@ -2902,6 +2922,9 @@ func (p *ReplicationPool) saveStatsToDisk() { // save replication stats to .minio.sys/buckets/replication/node-name.stats func (p *ReplicationPool) saveStats(ctx context.Context) error { + if !p.initialized() { + return nil + } bsm := globalReplicationStats.getAllCachedLatest() if len(bsm.Stats) == 0 { return nil @@ -2920,6 +2943,9 @@ func (p *ReplicationPool) saveStats(ctx context.Context) error { // SaveState saves replication stats and mrf data before server restart func (p *ReplicationPool) SaveState(ctx context.Context) error { + if !p.initialized() { + return nil + } go func() { select { case p.saveStateCh <- struct{}{}: diff --git a/go.mod b/go.mod index 4afe4ed26..b41772db8 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( github.com/minio/kes v0.21.0 github.com/minio/madmin-go v1.6.2 github.com/minio/minio-go/v7 v7.0.40-0.20220928095841-8848d8affe8a - github.com/minio/pkg v1.5.1 + github.com/minio/pkg v1.5.2 github.com/minio/selfupdate v0.5.0 github.com/minio/sha256-simd v1.0.0 github.com/minio/simdjson-go v0.4.2 diff --git a/go.sum b/go.sum index 9a56bb383..69ee844fc 100644 --- a/go.sum +++ b/go.sum @@ -662,8 +662,8 @@ github.com/minio/minio-go/v7 v7.0.23/go.mod h1:ei5JjmxwHaMrgsMrn4U/+Nmg+d8MKS1U2 github.com/minio/minio-go/v7 v7.0.40-0.20220928095841-8848d8affe8a h1:COFh7S3tOKmJNYtKKFAuHQFH7MAaXxg4aAluXC9KQgc= github.com/minio/minio-go/v7 v7.0.40-0.20220928095841-8848d8affe8a/go.mod h1:nCrRzjoSUQh8hgKKtu3Y708OLvRLtuASMg2/nvmbarw= github.com/minio/pkg v1.1.20/go.mod h1:Xo7LQshlxGa9shKwJ7NzQbgW4s8T/Wc1cOStR/eUiMY= -github.com/minio/pkg v1.5.1 h1:XwuoZMqC+VXYGRFFALO5JGacQxut6iUTJP76UGPzsek= -github.com/minio/pkg v1.5.1/go.mod h1:koF2J2Ep/zpd//k+3UYdh6ySZKjqzy9C6RCZRX7uRY8= +github.com/minio/pkg v1.5.2 h1:vyEZ3TroiRGS/qb1XgP9RpK2zhjSWpBPjhNEbIo0pY8= +github.com/minio/pkg v1.5.2/go.mod h1:koF2J2Ep/zpd//k+3UYdh6ySZKjqzy9C6RCZRX7uRY8= github.com/minio/selfupdate v0.5.0 h1:0UH1HlL49+2XByhovKl5FpYTjKfvrQ2sgL1zEXK6mfI= github.com/minio/selfupdate v0.5.0/go.mod h1:mcDkzMgq8PRcpCRJo/NlPY7U45O5dfYl2Y0Rg7IustY= github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=