1
0
Fork 0
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
1.7 KiB
Go

package store
import (
"os"
"time"
"github.com/rqlite/rqlite/v8/command/proto"
"github.com/rqlite/rqlite/v8/db"
)
// Provider implements the uploader Provider interface, allowing the
// Store to be used as a DataProvider for an uploader.
type Provider struct {
str *Store
vacuum bool
nRetries int
retryInterval time.Duration
}
// NewProvider returns a new instance of Provider.
func NewProvider(s *Store, v bool) *Provider {
return &Provider{
str: s,
vacuum: v,
nRetries: 10,
retryInterval: 500 * time.Millisecond,
}
}
9 months ago
// LastModified returns the time the data managed by the Provider was
// last modified.
func (p *Provider) LastModified() (time.Time, error) {
stats.Add(numProviderChecks, 1)
9 months ago
return p.str.db.LastModified()
}
// Provider writes the SQLite database to the given path, ensuring the database
// is in DELETE mode. If path exists, it will be overwritten.
9 months ago
func (p *Provider) Provide(path string) (t time.Time, retErr error) {
stats.Add(numProviderProvides, 1)
defer func() {
if retErr != nil {
stats.Add(numProviderProvidesFail, 1)
}
}()
fd, err := os.Create(path)
if err != nil {
9 months ago
return time.Time{}, err
}
defer fd.Close()
br := &proto.BackupRequest{
Format: proto.BackupRequest_BACKUP_REQUEST_FORMAT_BINARY,
Vacuum: p.vacuum,
}
nRetries := 0
for {
err := p.str.Backup(br, fd)
if err == nil {
break
}
time.Sleep(p.retryInterval)
nRetries++
if nRetries > p.nRetries {
9 months ago
return time.Time{}, err
}
}
// Switch database to DELETE mode, to keep existing behaviour.
if err := fd.Close(); err != nil {
9 months ago
return time.Time{}, err
}
if db.EnsureDeleteMode(path) != nil {
9 months ago
return time.Time{}, err
}
9 months ago
return p.str.db.LastModified()
}