소스 검색

Merge pull request #12274 from xapon/11607-cleanup

#11607 Cleanup time of temporary files is now configurable
Carl Bergquist 7 년 전
부모
커밋
764a4247f5
6개의 변경된 파일67개의 추가작업 그리고 1개의 파일을 삭제
  1. 3 0
      conf/defaults.ini
  2. 3 0
      conf/sample.ini
  3. 5 0
      docs/sources/installation/configuration.md
  4. 11 1
      pkg/services/cleanup/cleanup.go
  5. 41 0
      pkg/services/cleanup/cleanup_test.go
  6. 4 0
      pkg/setting/setting.go

+ 3 - 0
conf/defaults.ini

@@ -14,6 +14,9 @@ instance_name = ${HOSTNAME}
 # Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used)
 data = data
 
+# Temporary files in `data` directory older than given duration will be removed
+temp_data_lifetime = 24h
+
 # Directory where grafana can store logs
 logs = data/log
 

+ 3 - 0
conf/sample.ini

@@ -14,6 +14,9 @@
 # Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used)
 ;data = /var/lib/grafana
 
+# Temporary files in `data` directory older than given duration will be removed
+;temp_data_lifetime = 24h
+
 # Directory where grafana can store logs
 ;logs = /var/log/grafana
 

+ 5 - 0
docs/sources/installation/configuration.md

@@ -80,6 +80,11 @@ Path to where Grafana stores the sqlite3 database (if used), file based
 sessions (if used), and other data.  This path is usually specified via
 command line in the init.d script or the systemd service file.
 
+### temp_data_lifetime
+
+How long temporary images in `data` directory should be kept. Defaults to: `24h`. Supported modifiers: `h` (hours), 
+`m` (minutes), for example: `168h`, `30m`, `10h30m`. Use `0` to never clean up temporary files.
+
 ### logs
 
 Path to where Grafana will store logs. This path is usually specified via

+ 11 - 1
pkg/services/cleanup/cleanup.go

@@ -57,8 +57,10 @@ func (srv *CleanUpService) cleanUpTmpFiles() {
 	}
 
 	var toDelete []os.FileInfo
+	var now = time.Now()
+
 	for _, file := range files {
-		if file.ModTime().AddDate(0, 0, 1).Before(time.Now()) {
+		if srv.shouldCleanupTempFile(file.ModTime(), now) {
 			toDelete = append(toDelete, file)
 		}
 	}
@@ -74,6 +76,14 @@ func (srv *CleanUpService) cleanUpTmpFiles() {
 	srv.log.Debug("Found old rendered image to delete", "deleted", len(toDelete), "keept", len(files))
 }
 
+func (srv *CleanUpService) shouldCleanupTempFile(filemtime time.Time, now time.Time) bool {
+	if srv.Cfg.TempDataLifetime == 0 {
+		return false
+	}
+
+	return filemtime.Add(srv.Cfg.TempDataLifetime).Before(now)
+}
+
 func (srv *CleanUpService) deleteExpiredSnapshots() {
 	cmd := m.DeleteExpiredSnapshotsCommand{}
 	if err := bus.Dispatch(&cmd); err != nil {

+ 41 - 0
pkg/services/cleanup/cleanup_test.go

@@ -0,0 +1,41 @@
+package cleanup
+
+import (
+	"github.com/grafana/grafana/pkg/setting"
+	. "github.com/smartystreets/goconvey/convey"
+	"testing"
+	"time"
+)
+
+func TestCleanUpTmpFiles(t *testing.T) {
+	Convey("Cleanup service tests", t, func() {
+		cfg := setting.Cfg{}
+		cfg.TempDataLifetime, _ = time.ParseDuration("24h")
+		service := CleanUpService{
+			Cfg: &cfg,
+		}
+		now := time.Now()
+		secondAgo := now.Add(-time.Second)
+		twoDaysAgo := now.Add(-time.Second * 3600 * 24 * 2)
+		weekAgo := now.Add(-time.Second * 3600 * 24 * 7)
+
+		Convey("Should not cleanup recent files", func() {
+			So(service.shouldCleanupTempFile(secondAgo, now), ShouldBeFalse)
+		})
+
+		Convey("Should cleanup older files", func() {
+			So(service.shouldCleanupTempFile(twoDaysAgo, now), ShouldBeTrue)
+		})
+
+		Convey("After increasing temporary files lifetime, older files should be kept", func() {
+			cfg.TempDataLifetime, _ = time.ParseDuration("1000h")
+			So(service.shouldCleanupTempFile(weekAgo, now), ShouldBeFalse)
+		})
+
+		Convey("If lifetime is 0, files should never be cleaned up", func() {
+			cfg.TempDataLifetime = 0
+			So(service.shouldCleanupTempFile(weekAgo, now), ShouldBeFalse)
+		})
+	})
+
+}

+ 4 - 0
pkg/setting/setting.go

@@ -20,6 +20,7 @@ import (
 
 	"github.com/grafana/grafana/pkg/log"
 	"github.com/grafana/grafana/pkg/util"
+	"time"
 )
 
 type Scheme string
@@ -195,6 +196,8 @@ type Cfg struct {
 	PhantomDir                       string
 	RendererUrl                      string
 	DisableBruteForceLoginProtection bool
+
+	TempDataLifetime time.Duration
 }
 
 type CommandLineArgs struct {
@@ -637,6 +640,7 @@ func (cfg *Cfg) Load(args *CommandLineArgs) error {
 	cfg.RendererUrl = renderSec.Key("server_url").String()
 	cfg.ImagesDir = filepath.Join(DataPath, "png")
 	cfg.PhantomDir = filepath.Join(HomePath, "tools/phantomjs")
+	cfg.TempDataLifetime = iniFile.Section("paths").Key("temp_data_lifetime").MustDuration(time.Second * 3600 * 24)
 
 	analytics := iniFile.Section("analytics")
 	ReportingEnabled = analytics.Key("reporting_enabled").MustBool(true)