Browse Source

Merge pull request #9857 from gyuho/quota-log

etcdserver: log quota only once
Gyuho Lee 7 years ago
parent
commit
bd8ab3df93
1 changed files with 50 additions and 34 deletions
  1. 50 34
      etcdserver/quota.go

+ 50 - 34
etcdserver/quota.go

@@ -15,6 +15,8 @@
 package etcdserver
 
 import (
+	"sync"
+
 	pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
 
 	humanize "github.com/dustin/go-humanize"
@@ -60,61 +62,75 @@ const (
 	kvOverhead = 256
 )
 
+var (
+	// only log once
+	quotaLogOnce sync.Once
+
+	defaultQuotaSize = humanize.Bytes(uint64(DefaultQuotaBytes))
+	maxQuotaSize     = humanize.Bytes(uint64(MaxQuotaBytes))
+)
+
+// NewBackendQuota creates a quota layer with the given storage limit.
 func NewBackendQuota(s *EtcdServer, name string) Quota {
 	lg := s.getLogger()
 	quotaBackendBytes.Set(float64(s.Cfg.QuotaBackendBytes))
 
 	if s.Cfg.QuotaBackendBytes < 0 {
 		// disable quotas if negative
-		if lg != nil {
-			lg.Info(
-				"disabled backend quota",
-				zap.String("quota-name", name),
-				zap.Int64("quota-size-bytes", s.Cfg.QuotaBackendBytes),
-			)
-		} else {
-			plog.Warningf("disabling backend quota")
-		}
+		quotaLogOnce.Do(func() {
+			if lg != nil {
+				lg.Info(
+					"disabled backend quota",
+					zap.String("quota-name", name),
+					zap.Int64("quota-size-bytes", s.Cfg.QuotaBackendBytes),
+				)
+			} else {
+				plog.Warningf("disabling backend quota")
+			}
+		})
 		return &passthroughQuota{}
 	}
 
 	if s.Cfg.QuotaBackendBytes == 0 {
 		// use default size if no quota size given
-		if lg != nil {
-			lg.Info(
-				"enabled backend quota with default value",
-				zap.String("quota-name", name),
-				zap.Int64("quota-size-bytes", DefaultQuotaBytes),
-				zap.String("quota-size", humanize.Bytes(uint64(DefaultQuotaBytes))),
-			)
-		}
+		quotaLogOnce.Do(func() {
+			if lg != nil {
+				lg.Info(
+					"enabled backend quota with default value",
+					zap.String("quota-name", name),
+					zap.Int64("quota-size-bytes", DefaultQuotaBytes),
+					zap.String("quota-size", defaultQuotaSize),
+				)
+			}
+		})
 		quotaBackendBytes.Set(float64(DefaultQuotaBytes))
 		return &backendQuota{s, DefaultQuotaBytes}
 	}
 
-	if s.Cfg.QuotaBackendBytes > MaxQuotaBytes {
+	quotaLogOnce.Do(func() {
+		if s.Cfg.QuotaBackendBytes > MaxQuotaBytes {
+			if lg != nil {
+				lg.Warn(
+					"quota exceeds the maximum value",
+					zap.String("quota-name", name),
+					zap.Int64("quota-size-bytes", s.Cfg.QuotaBackendBytes),
+					zap.String("quota-size", humanize.Bytes(uint64(s.Cfg.QuotaBackendBytes))),
+					zap.Int64("quota-maximum-size-bytes", MaxQuotaBytes),
+					zap.String("quota-maximum-size", maxQuotaSize),
+				)
+			} else {
+				plog.Warningf("backend quota %v exceeds maximum recommended quota %v", s.Cfg.QuotaBackendBytes, MaxQuotaBytes)
+			}
+		}
 		if lg != nil {
-			lg.Warn(
-				"quota exceeds the maximum value",
+			lg.Info(
+				"enabled backend quota",
 				zap.String("quota-name", name),
 				zap.Int64("quota-size-bytes", s.Cfg.QuotaBackendBytes),
 				zap.String("quota-size", humanize.Bytes(uint64(s.Cfg.QuotaBackendBytes))),
-				zap.Int64("quota-maximum-size-bytes", MaxQuotaBytes),
-				zap.String("quota-maximum-size", humanize.Bytes(uint64(MaxQuotaBytes))),
 			)
-		} else {
-			plog.Warningf("backend quota %v exceeds maximum recommended quota %v", s.Cfg.QuotaBackendBytes, MaxQuotaBytes)
 		}
-	}
-
-	if lg != nil {
-		lg.Info(
-			"enabled backend quota",
-			zap.String("quota-name", name),
-			zap.Int64("quota-size-bytes", s.Cfg.QuotaBackendBytes),
-			zap.String("quota-size", humanize.Bytes(uint64(s.Cfg.QuotaBackendBytes))),
-		)
-	}
+	})
 	return &backendQuota{s, s.Cfg.QuotaBackendBytes}
 }