Skip to content

Commit

Permalink
mvcc: use GaugeFunc metric to load db size when requested
Browse files Browse the repository at this point in the history
Relying on mvcc to set the db size metric can cause it to
miss size changes when a txn commits after the last write
completes before a quiescent period. Instead, load the
db size on demand.

Fixes etcd-io#8146
  • Loading branch information
Anthony Romano committed Jun 22, 2017
1 parent 4e6c771 commit fecfd15
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 5 deletions.
6 changes: 4 additions & 2 deletions mvcc/kvstore.go
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,10 @@ func NewStore(b backend.Backend, le lease.Lessor, ig ConsistentIndexGetter) *sto
tx.Unlock()
s.b.ForceCommit()

reportDbTotalSizeInBytesMu.Lock()
reportDbTotalSizeInBytes = func() float64 { return float64(s.b.Size()) }
reportDbTotalSizeInBytesMu.Unlock()

if err := s.restore(); err != nil {
// TODO: return the error instead of panic here?
panic("failed to recover store from backend")
Expand Down Expand Up @@ -261,8 +265,6 @@ func (s *store) restore() error {
tx := s.b.BatchTx()
tx.Lock()

dbTotalSize.Set(float64(s.b.Size()))

_, finishedCompactBytes := tx.UnsafeRange(metaBucketName, finishedCompactKeyName, nil, 0)
if len(finishedCompactBytes) != 0 {
s.compactMainRev = bytesToRev(finishedCompactBytes[0]).main
Expand Down
1 change: 0 additions & 1 deletion mvcc/kvstore_txn.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,6 @@ func (tw *storeTxnWrite) End() {
if len(tw.changes) != 0 {
tw.s.revMu.Unlock()
}
dbTotalSize.Set(float64(tw.s.b.Size()))
tw.s.mu.RUnlock()
}

Expand Down
15 changes: 13 additions & 2 deletions mvcc/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
package mvcc

import (
"sync"

"github.com/prometheus/client_golang/prometheus"
)

Expand Down Expand Up @@ -129,12 +131,21 @@ var (
Buckets: prometheus.ExponentialBuckets(100, 2, 14),
})

dbTotalSize = prometheus.NewGauge(prometheus.GaugeOpts{
dbTotalSize = prometheus.NewGaugeFunc(prometheus.GaugeOpts{
Namespace: "etcd_debugging",
Subsystem: "mvcc",
Name: "db_total_size_in_bytes",
Help: "Total size of the underlying database in bytes.",
})
},
func() float64 {
reportDbTotalSizeInBytesMu.RLock()
defer reportDbTotalSizeInBytesMu.RUnlock()
return reportDbTotalSizeInBytes()
},
)
// overridden by mvcc initialization
reportDbTotalSizeInBytesMu sync.RWMutex
reportDbTotalSizeInBytes func() float64 = func() float64 { return 0 }
)

func init() {
Expand Down

0 comments on commit fecfd15

Please sign in to comment.