Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
valyala committed May 4, 2022
1 parent 5fd22c8 commit db1e2b9
Show file tree
Hide file tree
Showing 7 changed files with 31 additions and 114 deletions.
5 changes: 2 additions & 3 deletions app/vmbackup/main.go
Expand Up @@ -74,9 +74,8 @@ func main() {
} else if len(*snapshotName) == 0 {
logger.Fatalf("`-snapshotName` or `-snapshot.createURL` must be provided")
}

if !snapshot.Validate(*snapshotName) {
logger.Fatalf("-snapshotName not valid. it should have correct format")
if err := snapshot.Validate(*snapshotName); err != nil {
logger.Fatalf("invalid -snapshotName=%q: %s", *snapshotName, err)
}

go httpserver.Serve(*httpListenAddr, nil)
Expand Down
4 changes: 0 additions & 4 deletions lib/backup/actions/backup.go
Expand Up @@ -89,10 +89,6 @@ func runBackup(src *fslocal.FS, dst common.RemoteFS, origin common.OriginFS, con
}
logger.Infof("obtained %d parts from origin %s", len(originParts), origin)

// we should remove backup_complete.ignore file because it is just help file
// which indicates that we complete backup
srcParts = removeIgnoreFile(srcParts)

backupSize := getPartsSize(srcParts)

partsToDelete := common.PartsDifference(dstParts, srcParts)
Expand Down
10 changes: 0 additions & 10 deletions lib/backup/actions/util.go
Expand Up @@ -8,7 +8,6 @@ import (
"time"

"github.com/VictoriaMetrics/VictoriaMetrics/lib/backup/common"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/backup/fscommon"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/backup/fsremote"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/backup/gcsremote"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/backup/s3remote"
Expand Down Expand Up @@ -177,15 +176,6 @@ func getPartsSize(parts []common.Part) uint64 {
return n
}

func removeIgnoreFile(parts []common.Part) []common.Part {
for i, part := range parts {
if strings.HasSuffix(part.Path, fscommon.BackupCompleteFilename) {
return append(parts[:i], parts[i+1:]...)
}
}
return parts
}

// NewRemoteFS returns new remote fs from the given path.
func NewRemoteFS(path string) (common.RemoteFS, error) {
if len(path) == 0 {
Expand Down
64 changes: 0 additions & 64 deletions lib/backup/actions/util_test.go

This file was deleted.

50 changes: 23 additions & 27 deletions lib/snapshot/snapshot.go
Expand Up @@ -15,19 +15,15 @@ import (
"github.com/VictoriaMetrics/VictoriaMetrics/lib/logger"
)

var (
snapshotNameRegexp = regexp.MustCompile(`^\d{14}-[\dA-Fa-f]+$`)
snapshotIdx = uint64(time.Now().UnixNano())
)
var snapshotNameRegexp = regexp.MustCompile(`^[0-9]{14}-[0-9A-Fa-f]+$`)

type snapshot struct {
Status string `json:"status"`
Snapshot string `json:"snapshot"`
Msg string `json:"msg"`
}

// Create creates a snapshot and the provided api endpoint and returns
// the snapshot name
// Create creates a snapshot via the provided api endpoint and returns the snapshot name
func Create(createSnapshotURL string) (string, error) {
logger.Infof("Creating snapshot")
u, err := url.Parse(createSnapshotURL)
Expand Down Expand Up @@ -62,7 +58,7 @@ func Create(createSnapshotURL string) (string, error) {
}
}

// Delete deletes a snapshot and the provided api endpoint returns any failure
// Delete deletes a snapshot via the provided api endpoint
func Delete(deleteSnapshotURL string, snapshotName string) error {
logger.Infof("Deleting snapshot %s", snapshotName)
formData := url.Values{
Expand Down Expand Up @@ -100,36 +96,36 @@ func Delete(deleteSnapshotURL string, snapshotName string) error {
}
}

// Validate checks snapshot name for using pattern
func Validate(snapshotName string) bool {
n := strings.IndexByte(snapshotName, '-')
if n < 0 {
return false
}
s := snapshotName[:n]
_, err := time.Parse("20060102150405", s)
return err == nil && snapshotNameRegexp.MatchString(snapshotName)
}

// Match checks whether snapshot matches using pattern
func Match(snapshotName string) bool {
return snapshotNameRegexp.MatchString(snapshotName)
// Validate validates the snapshotName
func Validate(snapshotName string) error {
_, err := Time(snapshotName)
return err
}

// Time returns snapshot time from snapshot name
// Time returns snapshot creation time from the given snapshotName
func Time(snapshotName string) (time.Time, error) {
if !snapshotNameRegexp.MatchString(snapshotName) {
return time.Time{}, fmt.Errorf("unexpected snapshotName must be in the format `YYYYMMDDhhmmss-idx`; got %q", snapshotName)
return time.Time{}, fmt.Errorf("unexpected snapshot name=%q; it must match %q regexp", snapshotName, snapshotNameRegexp.String())
}
n := strings.IndexByte(snapshotName, '-')
if n < 0 {
return time.Time{}, fmt.Errorf("cannot find `-` in snapshotName=%q", snapshotName)
logger.Panicf("BUG: cannot find `-` in snapshotName=%q", snapshotName)
}
s := snapshotName[:n]
return time.Parse("20060102150405", s)
t, err := time.Parse("20060102150405", s)
if err != nil {
return time.Time{}, fmt.Errorf("unexpected timestamp=%q in snapshot name: %w; it must match YYYYMMDDhhmmss pattern", s, err)
}
return t, nil
}

// NextSnapshotIdx generates next snapshot index
func NextSnapshotIdx() uint64 {
// NewName returns new name for new snapshot
func NewName() string {
return fmt.Sprintf("%s-%08X", time.Now().UTC().Format("20060102150405"), nextSnapshotIdx())
}

func nextSnapshotIdx() uint64 {
return atomic.AddUint64(&snapshotIdx, 1)
}

var snapshotIdx = uint64(time.Now().UnixNano())
4 changes: 2 additions & 2 deletions lib/snapshot/snapshot_test.go
Expand Up @@ -149,8 +149,8 @@ func Test_Validate(t *testing.T) {
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := Validate(tt.snapshotName); got != tt.want {
t.Errorf("checkSnapshotName() = %v, want %v", got, tt.want)
if err := Validate(tt.snapshotName); (err == nil) != tt.want {
t.Errorf("checkSnapshotName() = %v, want %v", err, tt.want)
}
})
}
Expand Down
8 changes: 4 additions & 4 deletions lib/storage/storage.go
Expand Up @@ -318,7 +318,7 @@ func (s *Storage) CreateSnapshot() (string, error) {
s.snapshotLock.Lock()
defer s.snapshotLock.Unlock()

snapshotName := fmt.Sprintf("%s-%08X", time.Now().UTC().Format("20060102150405"), snapshot.NextSnapshotIdx())
snapshotName := snapshot.NewName()
srcDir := s.path
dstDir := fmt.Sprintf("%s/snapshots/%s", srcDir, snapshotName)
if err := fs.MkdirAllFailIfExist(dstDir); err != nil {
Expand Down Expand Up @@ -388,7 +388,7 @@ func (s *Storage) ListSnapshots() ([]string, error) {
}
snapshotNames := make([]string, 0, len(fnames))
for _, fname := range fnames {
if !snapshot.Match(fname) {
if err := snapshot.Validate(fname); err != nil {
continue
}
snapshotNames = append(snapshotNames, fname)
Expand All @@ -399,8 +399,8 @@ func (s *Storage) ListSnapshots() ([]string, error) {

// DeleteSnapshot deletes the given snapshot.
func (s *Storage) DeleteSnapshot(snapshotName string) error {
if !snapshot.Match(snapshotName) {
return fmt.Errorf("invalid snapshotName %q", snapshotName)
if err := snapshot.Validate(snapshotName); err != nil {
return fmt.Errorf("invalid snapshotName %q: %w", snapshotName, err)
}
snapshotPath := s.path + "/snapshots/" + snapshotName

Expand Down

0 comments on commit db1e2b9

Please sign in to comment.