summaryrefslogtreecommitdiff
path: root/plugins/kv/drivers/boltdb/driver.go
diff options
context:
space:
mode:
authorValery Piashchynski <[email protected]>2021-06-24 17:40:49 +0300
committerGitHub <[email protected]>2021-06-24 17:40:49 +0300
commite9249c7896331bab97a18a7ee0db17803fdd31fb (patch)
tree99512001f757eb88614acb9b20dada3200008a5d /plugins/kv/drivers/boltdb/driver.go
parentce53a8e149b76f15e8a5dd88ac3b953798d57e8b (diff)
parent60001dbe15b5ff0fec32239ad18b3d308a4150b5 (diff)
#736 feat(kv): `clear` RPC method which completely cleans storagev2.3.1-beta.6
#736 feat(kv): `clear` RPC method which completely cleans storage
Diffstat (limited to 'plugins/kv/drivers/boltdb/driver.go')
-rw-r--r--plugins/kv/drivers/boltdb/driver.go34
1 files changed, 34 insertions, 0 deletions
diff --git a/plugins/kv/drivers/boltdb/driver.go b/plugins/kv/drivers/boltdb/driver.go
index 4b675271..47d37cc2 100644
--- a/plugins/kv/drivers/boltdb/driver.go
+++ b/plugins/kv/drivers/boltdb/driver.go
@@ -18,6 +18,7 @@ import (
)
type Driver struct {
+ clearMu sync.RWMutex
// db instance
DB *bolt.DB
// name should be UTF-8
@@ -373,6 +374,35 @@ func (d *Driver) TTL(keys ...string) (map[string]string, error) {
return m, nil
}
+func (d *Driver) Clear() error {
+ err := d.DB.Update(func(tx *bolt.Tx) error {
+ err := tx.DeleteBucket(d.bucket)
+ if err != nil {
+ d.log.Error("boltdb delete bucket", "error", err)
+ return err
+ }
+
+ _, err = tx.CreateBucket(d.bucket)
+ if err != nil {
+ d.log.Error("boltdb create bucket", "error", err)
+ return err
+ }
+
+ return nil
+ })
+
+ if err != nil {
+ d.log.Error("clear transaction failed", "error", err)
+ return err
+ }
+
+ d.clearMu.Lock()
+ d.gc = sync.Map{}
+ d.clearMu.Unlock()
+
+ return nil
+}
+
// ========================= PRIVATE =================================
func (d *Driver) startGCLoop() { //nolint:gocognit
@@ -382,6 +412,8 @@ func (d *Driver) startGCLoop() { //nolint:gocognit
for {
select {
case <-t.C:
+ d.clearMu.RLock()
+
// calculate current time before loop started to be fair
now := time.Now()
d.gc.Range(func(key, value interface{}) bool {
@@ -414,6 +446,8 @@ func (d *Driver) startGCLoop() { //nolint:gocognit
}
return true
})
+
+ d.clearMu.RUnlock()
case <-d.stop:
err := d.DB.Close()
if err != nil {