mirror of https://github.com/etcd-io/bbolt.git
Open db file in readonly mode for commands which shouldn't update db file
Signed-off-by: Benjamin Wang <wachao@vmware.com>pull/365/head
parent
d4831e6217
commit
329eba7818
|
@ -202,7 +202,7 @@ func (cmd *CheckCommand) Run(args ...string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open database.
|
// Open database.
|
||||||
db, err := bolt.Open(path, 0666, nil)
|
db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -279,7 +279,7 @@ func (cmd *InfoCommand) Run(args ...string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open the database.
|
// Open the database.
|
||||||
db, err := bolt.Open(path, 0666, nil)
|
db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -651,7 +651,7 @@ func (cmd *PagesCommand) Run(args ...string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open database.
|
// Open database.
|
||||||
db, err := bolt.Open(path, 0666, nil)
|
db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -745,7 +745,7 @@ func (cmd *StatsCommand) Run(args ...string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open database.
|
// Open database.
|
||||||
db, err := bolt.Open(path, 0666, nil)
|
db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -880,7 +880,7 @@ func (cmd *BucketsCommand) Run(args ...string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open database.
|
// Open database.
|
||||||
db, err := bolt.Open(path, 0666, nil)
|
db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -945,7 +945,7 @@ func (cmd *KeysCommand) Run(args ...string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open database.
|
// Open database.
|
||||||
db, err := bolt.Open(path, 0666, nil)
|
db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1040,7 +1040,7 @@ func (cmd *GetCommand) Run(args ...string) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Open database.
|
// Open database.
|
||||||
db, err := bolt.Open(path, 0666, nil)
|
db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
bolt "go.etcd.io/bbolt"
|
bolt "go.etcd.io/bbolt"
|
||||||
main "go.etcd.io/bbolt/cmd/bbolt"
|
main "go.etcd.io/bbolt/cmd/bbolt"
|
||||||
)
|
)
|
||||||
|
@ -21,6 +22,8 @@ func TestInfoCommand_Run(t *testing.T) {
|
||||||
db.DB.Close()
|
db.DB.Close()
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
|
|
||||||
|
defer requireDBNoChange(t, dbData(t, db.Path), db.Path)
|
||||||
|
|
||||||
// Run the info command.
|
// Run the info command.
|
||||||
m := NewMain()
|
m := NewMain()
|
||||||
if err := m.Run("info", db.Path); err != nil {
|
if err := m.Run("info", db.Path); err != nil {
|
||||||
|
@ -39,6 +42,8 @@ func TestStatsCommand_Run_EmptyDatabase(t *testing.T) {
|
||||||
defer db.Close()
|
defer db.Close()
|
||||||
db.DB.Close()
|
db.DB.Close()
|
||||||
|
|
||||||
|
defer requireDBNoChange(t, dbData(t, db.Path), db.Path)
|
||||||
|
|
||||||
// Generate expected result.
|
// Generate expected result.
|
||||||
exp := "Aggregate statistics for 0 buckets\n\n" +
|
exp := "Aggregate statistics for 0 buckets\n\n" +
|
||||||
"Page count statistics\n" +
|
"Page count statistics\n" +
|
||||||
|
@ -116,6 +121,8 @@ func TestStatsCommand_Run(t *testing.T) {
|
||||||
}
|
}
|
||||||
db.DB.Close()
|
db.DB.Close()
|
||||||
|
|
||||||
|
defer requireDBNoChange(t, dbData(t, db.Path), db.Path)
|
||||||
|
|
||||||
// Generate expected result.
|
// Generate expected result.
|
||||||
exp := "Aggregate statistics for 3 buckets\n\n" +
|
exp := "Aggregate statistics for 3 buckets\n\n" +
|
||||||
"Page count statistics\n" +
|
"Page count statistics\n" +
|
||||||
|
@ -163,6 +170,8 @@ func TestBucketsCommand_Run(t *testing.T) {
|
||||||
}
|
}
|
||||||
db.DB.Close()
|
db.DB.Close()
|
||||||
|
|
||||||
|
defer requireDBNoChange(t, dbData(t, db.Path), db.Path)
|
||||||
|
|
||||||
expected := "bar\nbaz\nfoo\n"
|
expected := "bar\nbaz\nfoo\n"
|
||||||
|
|
||||||
// Run the command.
|
// Run the command.
|
||||||
|
@ -198,6 +207,8 @@ func TestKeysCommand_Run(t *testing.T) {
|
||||||
}
|
}
|
||||||
db.DB.Close()
|
db.DB.Close()
|
||||||
|
|
||||||
|
defer requireDBNoChange(t, dbData(t, db.Path), db.Path)
|
||||||
|
|
||||||
expected := "foo-0\nfoo-1\nfoo-2\n"
|
expected := "foo-0\nfoo-1\nfoo-2\n"
|
||||||
|
|
||||||
// Run the command.
|
// Run the command.
|
||||||
|
@ -234,6 +245,8 @@ func TestGetCommand_Run(t *testing.T) {
|
||||||
}
|
}
|
||||||
db.DB.Close()
|
db.DB.Close()
|
||||||
|
|
||||||
|
defer requireDBNoChange(t, dbData(t, db.Path), db.Path)
|
||||||
|
|
||||||
expected := "val-foo-1\n"
|
expected := "val-foo-1\n"
|
||||||
|
|
||||||
// Run the command.
|
// Run the command.
|
||||||
|
@ -420,7 +433,7 @@ func fillBucket(b *bolt.Bucket, prefix []byte) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func chkdb(path string) ([]byte, error) {
|
func chkdb(path string) ([]byte, error) {
|
||||||
db, err := bolt.Open(path, 0666, nil)
|
db, err := bolt.Open(path, 0666, &bolt.Options{ReadOnly: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -453,3 +466,17 @@ func walkBucket(parent *bolt.Bucket, k []byte, v []byte, w io.Writer) error {
|
||||||
return walkBucket(parent, k, v, w)
|
return walkBucket(parent, k, v, w)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func dbData(t *testing.T, filePath string) []byte {
|
||||||
|
data, err := os.ReadFile(filePath)
|
||||||
|
require.NoError(t, err)
|
||||||
|
return data
|
||||||
|
}
|
||||||
|
|
||||||
|
func requireDBNoChange(t *testing.T, oldData []byte, filePath string) {
|
||||||
|
newData, err := os.ReadFile(filePath)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
noChange := bytes.Equal(oldData, newData)
|
||||||
|
require.True(t, noChange)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue