From 52381ccb83e8f0ae5a70cf21b7b4c0a1bdec8ae5 Mon Sep 17 00:00:00 2001 From: rjl493456442 Date: Mon, 25 Jun 2018 19:34:02 +0800 Subject: [PATCH] ethdb: track compaction progress data in write pause status --- ethdb/database.go | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/ethdb/database.go b/ethdb/database.go index f4a5ce2c8d..fb0c85879e 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -279,6 +279,12 @@ func (db *LDBDatabase) meter(refresh time.Duration) { delayDuration string duration time.Duration paused bool + + // Cumulative compaction statistic for write pause stage. + wpStart string + start time.Time + count int32 + total, processed float64 ) if n, err := fmt.Sscanf(writedelay, "DelayN:%d Delay:%s Paused:%t", &delayN, &delayDuration, &paused); n != 3 || err != nil { db.log.Error("Write delay statistic not found") @@ -291,6 +297,19 @@ func (db *LDBDatabase) meter(refresh time.Duration) { merr = err continue } + if paused { + if n, err := fmt.Sscanf(writedelay, "DelayN:%d Delay:%s Paused:%t Start:%s Count:%d Total(MB):%f Processed(MB):%f", + &delayN, &delayDuration, &paused, &wpStart, &count, &total, &processed); n != 7 || err != nil { + db.log.Error("Failed to parse write pause compaction statistic", "err", err) + merr = err + continue + } + if start, err = time.Parse(time.RFC3339, wpStart); err != nil { + db.log.Error("Failed to parse write pause status start time", "err", err) + merr = err + continue + } + } if db.writeDelayNMeter != nil { db.writeDelayNMeter.Mark(delayN - delaystats[0]) // If the write delay number been collected in the last minute exceeds the predefined threshold, @@ -317,12 +336,12 @@ func (db *LDBDatabase) meter(refresh time.Duration) { } // If a warning that db is performing compaction has been displayed, any subsequent // warnings will be withheld for one minute not to overwhelm the user. - if paused && delayN-delaystats[0] == 0 && duration.Nanoseconds()-delaystats[1] == 0 && + if paused && count > 0 && delayN-delaystats[0] == 0 && duration.Nanoseconds()-delaystats[1] == 0 && time.Now().After(lastWritePaused.Add(writeDelayWarningThrottler)) { - db.log.Warn("Database compacting, degraded performance") + log.Warn("Database compacting", "elapsed", time.Since(start), "count", count, "total(MB)", total, + "processed(MB)", processed) lastWritePaused = time.Now() } - delaystats[0], delaystats[1] = delayN, duration.Nanoseconds() // Retrieve the database iostats.