mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-15 00:13:30 +01:00
lib/backup/actions: store metadata(creation and completion time) in backup files (#4117)
This makes it easier to understand exact point in time which is included in this backup. Signed-off-by: Zakhar Bessarab <z.bessarab@victoriametrics.com>
This commit is contained in:
parent
61839d4807
commit
217eea6e15
@ -15,6 +15,8 @@ The following tip changes can be tested by building VictoriaMetrics components f
|
|||||||
|
|
||||||
## tip
|
## tip
|
||||||
|
|
||||||
|
* FEATURE: [vmbackup](https://docs.victoriametrics.com/vmbackup.html): store backup creation and completion time in `backup_complete.ignore` file of backup contents. This is useful to determine point in time when backup was created and completed.
|
||||||
|
|
||||||
## [v1.90.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.90.0)
|
## [v1.90.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.90.0)
|
||||||
|
|
||||||
Released at 2023-04-06
|
Released at 2023-04-06
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
package actions
|
package actions
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"strings"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -11,6 +13,7 @@ import (
|
|||||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/backup/fslocal"
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/backup/fslocal"
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/backup/fsnil"
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/backup/fsnil"
|
||||||
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
|
||||||
|
"github.com/VictoriaMetrics/VictoriaMetrics/lib/snapshot"
|
||||||
"github.com/VictoriaMetrics/metrics"
|
"github.com/VictoriaMetrics/metrics"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -46,6 +49,13 @@ type Backup struct {
|
|||||||
Origin common.OriginFS
|
Origin common.OriginFS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// BackupMetadata contains metadata about the backup.
|
||||||
|
// Note that CreatedAt and CompletedAt are in RFC3339 format.
|
||||||
|
type BackupMetadata struct {
|
||||||
|
CreatedAt string `json:"created_at"`
|
||||||
|
CompletedAt string `json:"completed_at"`
|
||||||
|
}
|
||||||
|
|
||||||
// Run runs b with the provided settings.
|
// Run runs b with the provided settings.
|
||||||
func (b *Backup) Run() error {
|
func (b *Backup) Run() error {
|
||||||
concurrency := b.Concurrency
|
concurrency := b.Concurrency
|
||||||
@ -66,9 +76,38 @@ func (b *Backup) Run() error {
|
|||||||
if err := runBackup(src, dst, origin, concurrency); err != nil {
|
if err := runBackup(src, dst, origin, concurrency); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := dst.CreateFile(fscommon.BackupCompleteFilename, []byte("ok")); err != nil {
|
if err := storeMetadata(src, dst); err != nil {
|
||||||
|
return fmt.Errorf("cannot store backup metadata: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func storeMetadata(src *fslocal.FS, dst common.RemoteFS) error {
|
||||||
|
last := strings.LastIndex(src.Dir, "/")
|
||||||
|
if last < 0 {
|
||||||
|
return fmt.Errorf("cannot decode snapshot location %q", src.Dir)
|
||||||
|
}
|
||||||
|
|
||||||
|
snapshotName := src.Dir[last+1:]
|
||||||
|
snapshotTime, err := snapshot.Time(snapshotName)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("cannot decode snapshot name %q: %w", snapshotName, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
d := BackupMetadata{
|
||||||
|
CreatedAt: snapshotTime.Format(time.RFC3339),
|
||||||
|
CompletedAt: time.Now().Format(time.RFC3339),
|
||||||
|
}
|
||||||
|
|
||||||
|
metadata, err := json.Marshal(d)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("cannot marshal metadata: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := dst.CreateFile(fscommon.BackupCompleteFilename, metadata); err != nil {
|
||||||
return fmt.Errorf("cannot create `backup complete` file at %s: %w", dst, err)
|
return fmt.Errorf("cannot create `backup complete` file at %s: %w", dst, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user