Skip to content

Commit 3d74cda

Browse files
committed
firewalldb: move generic DB setup code to the DB.Start method
In this commit, a new `DeleteTempKVStores` method is added to the `RulesDB` interface and this is called in the `DB`'s `Start` method. This is done because regardless of the backend that we use for the RulesDB, we want this clean-up code to run at start time. It also makes more sense to have this call in a Start method rather than in a constructor.
1 parent 261c547 commit 3d74cda

File tree

4 files changed

+41
-27
lines changed

4 files changed

+41
-27
lines changed

firewalldb/db.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func (db *DB) Start(ctx context.Context) error {
3939
db.cancel = fn.Some(cancel)
4040
})
4141

42-
return nil
42+
return db.DeleteTempKVStores(ctx)
4343
}
4444

4545
// Stop stops the firewall database operations.

firewalldb/kvdb_store.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package firewalldb
33
import (
44
"context"
55
"encoding/binary"
6-
"errors"
76
"fmt"
87
"os"
98
"path/filepath"
@@ -112,18 +111,11 @@ func initDB(filepath string, firstInit bool) (*bbolt.DB, error) {
112111
}
113112
}
114113

115-
rulesBucket, err := tx.CreateBucketIfNotExists(rulesBucketKey)
114+
_, err := tx.CreateBucketIfNotExists(rulesBucketKey)
116115
if err != nil {
117116
return err
118117
}
119118

120-
// Delete everything under the "temp" key if such a bucket
121-
// exists.
122-
err = rulesBucket.DeleteBucket(tempBucketKey)
123-
if err != nil && !errors.Is(err, bbolt.ErrBucketNotFound) {
124-
return err
125-
}
126-
127119
actionsBucket, err := tx.CreateBucketIfNotExists(
128120
actionsBucketKey,
129121
)

firewalldb/kvstores.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package firewalldb
22

33
import (
44
"context"
5+
"errors"
56

67
"github.com/lightninglabs/lightning-terminal/session"
78
"go.etcd.io/bbolt"
@@ -103,6 +104,9 @@ type RulesDB interface {
103104
// GetKVStores constructs a new rules.KVStores in a namespace defined
104105
// by the rule name, group ID and feature name.
105106
GetKVStores(rule string, groupID session.ID, feature string) KVStores
107+
108+
// DeleteTempKVStores deletes all temporary kv stores.
109+
DeleteTempKVStores(ctx context.Context) error
106110
}
107111

108112
// GetKVStores constructs a new rules.KVStores backed by a bbolt db.
@@ -124,6 +128,25 @@ func (db *BoltDB) GetKVStores(rule string, groupID session.ID,
124128
}
125129
}
126130

131+
// DeleteTempKVStores deletes all kv-stores in the temporary namespace.
132+
func (db *BoltDB) DeleteTempKVStores(_ context.Context) error {
133+
return db.Update(func(tx *bbolt.Tx) error {
134+
rulesBucket, err := tx.CreateBucketIfNotExists(rulesBucketKey)
135+
if err != nil {
136+
return err
137+
}
138+
139+
// Delete everything under the "temp" key if such a bucket
140+
// exists.
141+
err = rulesBucket.DeleteBucket(tempBucketKey)
142+
if err != nil && !errors.Is(err, bbolt.ErrBucketNotFound) {
143+
return err
144+
}
145+
146+
return nil
147+
})
148+
}
149+
127150
// kvStores implements the rules.KVStores interface.
128151
type kvStores struct {
129152
ruleName string

firewalldb/kvstores_test.go

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"bytes"
55
"context"
66
"fmt"
7-
"os"
87
"testing"
98

109
"github.com/lightninglabs/lightning-terminal/session"
@@ -86,15 +85,21 @@ func testTempAndPermStores(t *testing.T, featureSpecificStore bool) {
8685
featureName = "auto-fees"
8786
}
8887

89-
db, err := NewBoltDB(tmpDir, "test.db", nil)
88+
store, err := NewBoltDB(tmpDir, "test.db", nil)
9089
require.NoError(t, err)
9190
t.Cleanup(func() {
92-
_ = db.Close()
91+
_ = store.Close()
9392
})
93+
db := NewDB(store)
94+
require.NoError(t, db.Start(ctx))
95+
96+
kvstores := db.GetKVStores(
97+
"test-rule", [4]byte{1, 1, 1, 1}, featureName,
98+
)
9499

95-
store := db.GetKVStores("test-rule", [4]byte{1, 1, 1, 1}, featureName)
100+
err = kvstores.Update(ctx, func(ctx context.Context,
101+
tx KVStoreTx) error {
96102

97-
err = store.Update(ctx, func(ctx context.Context, tx KVStoreTx) error {
98103
// Set an item in the temp store.
99104
err := tx.LocalTemp().Set(ctx, "test", []byte{4, 3, 2})
100105
if err != nil {
@@ -112,7 +117,7 @@ func testTempAndPermStores(t *testing.T, featureSpecificStore bool) {
112117
v1 []byte
113118
v2 []byte
114119
)
115-
err = store.View(ctx, func(ctx context.Context, tx KVStoreTx) error {
120+
err = kvstores.View(ctx, func(ctx context.Context, tx KVStoreTx) error {
116121
b, err := tx.LocalTemp().Get(ctx, "test")
117122
if err != nil {
118123
return err
@@ -130,21 +135,15 @@ func testTempAndPermStores(t *testing.T, featureSpecificStore bool) {
130135
require.True(t, bytes.Equal(v1, []byte{4, 3, 2}))
131136
require.True(t, bytes.Equal(v2, []byte{6, 5, 4}))
132137

133-
// Close the db.
134-
require.NoError(t, db.Close())
138+
// Re-init the DB.
139+
db = NewDB(store)
140+
require.NoError(t, db.Start(ctx))
135141

136-
// Restart it.
137-
db, err = NewBoltDB(tmpDir, "test.db", nil)
138-
require.NoError(t, err)
139-
t.Cleanup(func() {
140-
_ = db.Close()
141-
_ = os.RemoveAll(tmpDir)
142-
})
143-
store = db.GetKVStores("test-rule", [4]byte{1, 1, 1, 1}, featureName)
142+
kvstores = db.GetKVStores("test-rule", [4]byte{1, 1, 1, 1}, featureName)
144143

145144
// The temp store should no longer have the stored value but the perm
146145
// store should .
147-
err = store.View(ctx, func(ctx context.Context, tx KVStoreTx) error {
146+
err = kvstores.View(ctx, func(ctx context.Context, tx KVStoreTx) error {
148147
b, err := tx.LocalTemp().Get(ctx, "test")
149148
if err != nil {
150149
return err

0 commit comments

Comments
 (0)