From d36cd7b9979bcdd730630f3c304c1c4f663c8d58 Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Tue, 10 Sep 2024 10:56:20 +0200 Subject: [PATCH 01/14] badger constraint config --- go.mod | 28 +++++++++++----------- go.sum | 53 +++++++++++++++++++++--------------------- store/badger.go | 55 +++++++++++++++++++++++++++++++++++++++++++- store/badger_test.go | 2 +- 4 files changed, 96 insertions(+), 42 deletions(-) diff --git a/go.mod b/go.mod index 4aeaf50df..29e6460cd 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( github.com/celestiaorg/go-cnc v0.4.2 github.com/centrifuge/go-substrate-rpc-client/v4 v4.0.12 github.com/cosmos/cosmos-sdk v0.46.16 - github.com/dgraph-io/badger/v3 v3.2103.3 + github.com/dgraph-io/badger/v4 v4.3.0 github.com/dymensionxyz/cosmosclient v0.4.2-beta.0.20240821081230-b4018b2bac13 github.com/dymensionxyz/gerr-cosmos v1.0.0 github.com/go-kit/kit v0.12.0 @@ -30,12 +30,12 @@ require ( github.com/multiformats/go-multiaddr v0.12.2 github.com/prometheus/client_golang v1.18.0 github.com/rs/cors v1.9.0 - github.com/spf13/cobra v1.8.0 + github.com/spf13/cobra v1.8.1 github.com/spf13/viper v1.15.0 github.com/stretchr/testify v1.9.0 github.com/tendermint/tendermint v0.34.29 go.uber.org/multierr v1.11.0 - golang.org/x/net v0.24.0 + golang.org/x/net v0.28.0 gonum.org/v1/gonum v0.14.0 google.golang.org/grpc v1.64.0 google.golang.org/protobuf v1.33.0 @@ -47,6 +47,7 @@ require ( github.com/celestiaorg/go-square v1.0.1 // indirect github.com/celestiaorg/go-square/merkle v0.0.0-20240429192549-dea967e1533b // indirect github.com/cskr/pubsub v1.0.2 // indirect + github.com/dgraph-io/badger/v3 v3.2103.3 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/hashicorp/go-getter v1.7.5 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -127,7 +128,7 @@ require ( require ( github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/confio/ics23/go v0.9.0 // indirect github.com/containerd/cgroups v1.1.0 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect @@ -140,7 +141,7 @@ require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect - github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 // indirect github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect @@ -155,7 +156,6 @@ require ( github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/godbus/dbus/v5 v5.1.0 // indirect - github.com/golang/glog v1.2.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect @@ -182,7 +182,7 @@ require ( github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jbenet/goprocess v0.1.4 // indirect github.com/jmhodges/levigo v1.0.0 // indirect - github.com/klauspost/compress v1.17.6 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/klauspost/cpuid/v2 v2.2.7 // indirect github.com/koron/go-ssdp v0.0.4 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect @@ -242,12 +242,12 @@ require ( go.etcd.io/bbolt v1.3.8 // indirect go.opencensus.io v0.24.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/mod v0.15.0 // indirect - golang.org/x/sync v0.6.0 - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/crypto v0.26.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/sync v0.8.0 + golang.org/x/sys v0.24.0 // indirect + golang.org/x/term v0.23.0 // indirect + golang.org/x/text v0.17.0 // indirect google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 @@ -291,7 +291,7 @@ require ( github.com/rogpeppe/go-internal v1.12.0 // indirect github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect go.uber.org/mock v0.4.0 // indirect - golang.org/x/tools v0.18.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect pgregory.net/rapid v1.1.0 ) diff --git a/go.sum b/go.sum index fe31d1cd4..c09250776 100644 --- a/go.sum +++ b/go.sum @@ -317,8 +317,8 @@ github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -394,7 +394,7 @@ github.com/cosmos/ledger-cosmos-go v0.12.4/go.mod h1:fjfVWRf++Xkygt9wzCsjEBdjcf7 github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creachadair/taskgroup v0.3.2 h1:zlfutDS+5XG40AOxcHDSThxKzns8Tnr9jnr6VqkYlkM= github.com/creachadair/taskgroup v0.3.2/go.mod h1:wieWwecHVzsidg2CsUnFinW1faVN4+kq+TDlRJQ0Wbk= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -430,9 +430,12 @@ github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdw github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= github.com/dgraph-io/badger/v3 v3.2103.3 h1:s63J1pisDhKpzWslXFe+ChuthuZptpwTE6qEKoczPb4= github.com/dgraph-io/badger/v3 v3.2103.3/go.mod h1:4MPiseMeDQ3FNCYwRbbcBOGJLf5jsE0PPFzRiKjtcdw= +github.com/dgraph-io/badger/v4 v4.3.0 h1:lcsCE1/1qrRhqP+zYx6xDZb8n7U+QlwNicpc676Ub40= +github.com/dgraph-io/badger/v4 v4.3.0/go.mod h1:Sc0T595g8zqAQRDf44n+z3wG4BOqLwceaFntt8KPxUM= github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91 h1:Pux6+xANi0I7RRo5E1gflI4EZ2yx3BGZ75JkAIvGEOA= +github.com/dgraph-io/ristretto v0.1.2-0.20240116140435-c67e07994f91/go.mod h1:swkazRqnUf1N62d0Nutz7KIj2UKqsm/H8tD0nBJAXqM= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= @@ -558,8 +561,6 @@ github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRx github.com/gogo/gateway v1.1.0 h1:u0SuhL9+Il+UbjM9VIE3ntfRujKbvVpFvNB4HbjeVQ0= github.com/gogo/gateway v1.1.0/go.mod h1:S7rR8FRQyG3QFESeSv4l2WnsyzlCLG0CzBbUUo/mbic= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -830,8 +831,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI= -github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/klauspost/reedsolomon v1.11.8 h1:s8RpUW5TK4hjr+djiOpbZJB4ksx+TdYbRH7vHQpwPOY= @@ -1144,8 +1145,8 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -1315,8 +1316,8 @@ golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1356,8 +1357,8 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= -golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1417,8 +1418,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1463,8 +1464,8 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1557,13 +1558,13 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg= +golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= +golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1574,8 +1575,8 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1644,8 +1645,8 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= -golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/store/badger.go b/store/badger.go index dd72dd79f..9161817c4 100644 --- a/store/badger.go +++ b/store/badger.go @@ -3,10 +3,13 @@ package store import ( "errors" "path/filepath" + "runtime" + "github.com/celestiaorg/celestia-openrpc/types/share" "github.com/dymensionxyz/gerr-cosmos/gerrc" - "github.com/dgraph-io/badger/v3" + "github.com/dgraph-io/badger/v4" + "github.com/dgraph-io/badger/v4/options" ) var ( @@ -189,3 +192,53 @@ func (i *BadgerIterator) Discard() { i.iter.Close() i.txn.Discard() } + +func constraintBadgerConfig(path string) *badger.Options { + opts := badger.DefaultOptions(path) // this must be copied + // ValueLog: + // 2mib default => share.Size - makes sure headers and samples are stored in value log + // This *tremendously* reduces the amount of memory used by the node, up to 10 times less during + // compaction + opts.ValueThreshold = share.Size + // make sure we don't have any limits for stored headers + opts.ValueLogMaxEntries = 100000000 + // run value log GC more often to spread the work over time + //opts.GcInterval = time.Minute * 1 + // default 0.5 => 0.125 - makes sure value log GC is more aggressive on reclaiming disk space + //opts.GcDiscardRatio = 0.125 + + // badger stores checksum for every value, but doesn't verify it by default + // enabling this option may allow us to see detect corrupted data + opts.ChecksumVerificationMode = options.OnBlockRead + opts.VerifyValueChecksum = true + // default 64mib => 0 - disable block cache + // most of our component maintain their own caches, so this is not needed + opts.BlockCacheSize = 0 + // not much gain as it compresses the LSM only as well compression requires block cache + opts.Compression = options.None + + // MemTables: + // default 64mib => 16mib - decreases memory usage and makes compaction more often + opts.MemTableSize = 16 << 20 + // default 5 => 3 + opts.NumMemtables = 3 + // default 5 => 3 + opts.NumLevelZeroTables = 3 + // default 15 => 5 - this prevents memory growth on CPU constraint systems by blocking all writers + opts.NumLevelZeroTablesStall = 5 + + // Compaction: + // Dynamic compactor allocation + compactors := runtime.NumCPU() / 2 + if compactors < 2 { + compactors = 2 // can't be less than 2 + } + if compactors > opts.MaxLevels { // ensure there is no more compactors than db table levels + compactors = opts.MaxLevels + } + opts.NumCompactors = compactors + // makes sure badger is always compacted on shutdown + opts.CompactL0OnClose = true + + return &opts +} diff --git a/store/badger_test.go b/store/badger_test.go index bd9a16fe3..e40da6e8c 100644 --- a/store/badger_test.go +++ b/store/badger_test.go @@ -4,7 +4,7 @@ import ( "errors" "testing" - "github.com/dgraph-io/badger/v3" + "github.com/dgraph-io/badger/v4" "github.com/dymensionxyz/gerr-cosmos/gerrc" ) From 62c9207cdc854293f0df3961d17e5c7d5d1265b9 Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Tue, 10 Sep 2024 12:57:36 +0200 Subject: [PATCH 02/14] use config --- store/badger.go | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/store/badger.go b/store/badger.go index 9161817c4..9d104d1e8 100644 --- a/store/badger.go +++ b/store/badger.go @@ -3,7 +3,6 @@ package store import ( "errors" "path/filepath" - "runtime" "github.com/celestiaorg/celestia-openrpc/types/share" "github.com/dymensionxyz/gerr-cosmos/gerrc" @@ -35,7 +34,7 @@ func NewDefaultInMemoryKVStore() KV { func NewKVStore(rootDir, dbPath, dbName string, syncWrites bool) KV { path := filepath.Join(Rootify(rootDir, dbPath), dbName) - db, err := badger.Open(badger.DefaultOptions(path).WithSyncWrites(syncWrites)) + db, err := badger.Open(constraintBadgerConfig(path).WithSyncWrites(syncWrites)) if err != nil { panic(err) } @@ -227,16 +226,7 @@ func constraintBadgerConfig(path string) *badger.Options { // default 15 => 5 - this prevents memory growth on CPU constraint systems by blocking all writers opts.NumLevelZeroTablesStall = 5 - // Compaction: - // Dynamic compactor allocation - compactors := runtime.NumCPU() / 2 - if compactors < 2 { - compactors = 2 // can't be less than 2 - } - if compactors > opts.MaxLevels { // ensure there is no more compactors than db table levels - compactors = opts.MaxLevels - } - opts.NumCompactors = compactors + opts.NumCompactors = 2 // makes sure badger is always compacted on shutdown opts.CompactL0OnClose = true From 5cf9dd3993e74185045922e7af4418e16e31e246 Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Tue, 10 Sep 2024 16:47:46 +0200 Subject: [PATCH 03/14] add gc --- store/badger.go | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/store/badger.go b/store/badger.go index 9d104d1e8..9db9f2a5d 100644 --- a/store/badger.go +++ b/store/badger.go @@ -1,8 +1,10 @@ package store import ( + "context" "errors" "path/filepath" + "time" "github.com/celestiaorg/celestia-openrpc/types/share" "github.com/dymensionxyz/gerr-cosmos/gerrc" @@ -11,6 +13,11 @@ import ( "github.com/dgraph-io/badger/v4/options" ) +const ( + gcTimeout = 1 * time.Minute + discardRatio = 0.125 +) + var ( _ KV = &BadgerKV{} _ KVBatch = &BadgerBatch{} @@ -34,13 +41,17 @@ func NewDefaultInMemoryKVStore() KV { func NewKVStore(rootDir, dbPath, dbName string, syncWrites bool) KV { path := filepath.Join(Rootify(rootDir, dbPath), dbName) - db, err := badger.Open(constraintBadgerConfig(path).WithSyncWrites(syncWrites)) + opts := constraintBadgerConfig(path) + db, err := badger.Open(opts.WithSyncWrites(syncWrites)) if err != nil { panic(err) } - return &BadgerKV{ + b := &BadgerKV{ db: db, } + go b.gc(gcTimeout, discardRatio) + + return b } // NewDefaultKVStore creates instance of default key-value store. @@ -61,6 +72,25 @@ func (b *BadgerKV) Close() error { return b.db.Close() } +func (b *BadgerKV) gc(period time.Duration, discardRatio float64) error { + + gcTimeout := time.NewTimer(period) + defer gcTimeout.Stop() + + ctx := context.Background() + for { + select { + case <-ctx.Done(): + return nil + case <-gcTimeout.C: + err := b.db.RunValueLogGC(discardRatio) + if err != nil { + return err + } + } + } +} + // Get returns value for given key, or error. func (b *BadgerKV) Get(key []byte) ([]byte, error) { txn := b.db.NewTransaction(false) @@ -201,10 +231,6 @@ func constraintBadgerConfig(path string) *badger.Options { opts.ValueThreshold = share.Size // make sure we don't have any limits for stored headers opts.ValueLogMaxEntries = 100000000 - // run value log GC more often to spread the work over time - //opts.GcInterval = time.Minute * 1 - // default 0.5 => 0.125 - makes sure value log GC is more aggressive on reclaiming disk space - //opts.GcDiscardRatio = 0.125 // badger stores checksum for every value, but doesn't verify it by default // enabling this option may allow us to see detect corrupted data From 25d7bcca84b0dc620c1e6e66ab7639272ce5d974 Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Wed, 11 Sep 2024 08:58:56 +0200 Subject: [PATCH 04/14] add single gc call to kv --- store/badger.go | 11 +++++++---- store/prefix.go | 4 ++++ store/storeIface.go | 1 + 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/store/badger.go b/store/badger.go index 9db9f2a5d..30eaf10db 100644 --- a/store/badger.go +++ b/store/badger.go @@ -6,7 +6,6 @@ import ( "path/filepath" "time" - "github.com/celestiaorg/celestia-openrpc/types/share" "github.com/dymensionxyz/gerr-cosmos/gerrc" "github.com/dgraph-io/badger/v4" @@ -15,7 +14,7 @@ import ( const ( gcTimeout = 1 * time.Minute - discardRatio = 0.125 + discardRatio = 0.5 ) var ( @@ -72,6 +71,10 @@ func (b *BadgerKV) Close() error { return b.db.Close() } +func (b *BadgerKV) RunValueLogGC(discardRatio float64) error { + return b.db.RunValueLogGC(discardRatio) +} + func (b *BadgerKV) gc(period time.Duration, discardRatio float64) error { gcTimeout := time.NewTimer(period) @@ -85,7 +88,7 @@ func (b *BadgerKV) gc(period time.Duration, discardRatio float64) error { case <-gcTimeout.C: err := b.db.RunValueLogGC(discardRatio) if err != nil { - return err + continue } } } @@ -228,7 +231,7 @@ func constraintBadgerConfig(path string) *badger.Options { // 2mib default => share.Size - makes sure headers and samples are stored in value log // This *tremendously* reduces the amount of memory used by the node, up to 10 times less during // compaction - opts.ValueThreshold = share.Size + //opts.ValueThreshold = share.Size // make sure we don't have any limits for stored headers opts.ValueLogMaxEntries = 100000000 diff --git a/store/prefix.go b/store/prefix.go index 23842dff3..e2eb21548 100644 --- a/store/prefix.go +++ b/store/prefix.go @@ -47,6 +47,10 @@ func (p *PrefixKV) NewBatch() KVBatch { } } +func (b *PrefixKV) RunValueLogGC(discardRatio float64) error { + return b.kv.RunValueLogGC(discardRatio) +} + // PrefixIterator creates iterator to traverse given prefix. func (p *PrefixKV) PrefixIterator(prefix []byte) KVIterator { return p.kv.PrefixIterator(append(p.prefix, prefix...)) diff --git a/store/storeIface.go b/store/storeIface.go index 3061fc936..16fa49520 100644 --- a/store/storeIface.go +++ b/store/storeIface.go @@ -16,6 +16,7 @@ type KV interface { NewBatch() KVBatch // NewBatch creates a new batch. PrefixIterator(prefix []byte) KVIterator // PrefixIterator creates iterator to traverse given prefix. Close() error // Close closes the store. + RunValueLogGC(float64) error // run garbage collector } // KVBatch enables batching of transactions. From a98fdf5156db02430137194a25011723b090dbee Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Fri, 13 Sep 2024 10:53:19 +0200 Subject: [PATCH 05/14] improving comments badger config --- store/badger.go | 36 ++++++++++++++++-------------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/store/badger.go b/store/badger.go index 30eaf10db..b531a4e17 100644 --- a/store/badger.go +++ b/store/badger.go @@ -40,8 +40,8 @@ func NewDefaultInMemoryKVStore() KV { func NewKVStore(rootDir, dbPath, dbName string, syncWrites bool) KV { path := filepath.Join(Rootify(rootDir, dbPath), dbName) - opts := constraintBadgerConfig(path) - db, err := badger.Open(opts.WithSyncWrites(syncWrites)) + opts := memoryEfficientBadgerConfig(path, syncWrites) + db, err := badger.Open(*opts) if err != nil { panic(err) } @@ -225,36 +225,32 @@ func (i *BadgerIterator) Discard() { i.txn.Discard() } -func constraintBadgerConfig(path string) *badger.Options { +// memoryEfficientBadgerConfig sets badger configuration parameters to reduce memory usage, specially during compactions to avoid memory spikes that causes OOM. +// based on https://github.com/celestiaorg/celestia-node/issues/2905 +func memoryEfficientBadgerConfig(path string, syncWrites bool) *badger.Options { opts := badger.DefaultOptions(path) // this must be copied - // ValueLog: - // 2mib default => share.Size - makes sure headers and samples are stored in value log - // This *tremendously* reduces the amount of memory used by the node, up to 10 times less during - // compaction - //opts.ValueThreshold = share.Size - // make sure we don't have any limits for stored headers - opts.ValueLogMaxEntries = 100000000 - - // badger stores checksum for every value, but doesn't verify it by default - // enabling this option may allow us to see detect corrupted data - opts.ChecksumVerificationMode = options.OnBlockRead - opts.VerifyValueChecksum = true + // SyncWrites is a configuration option in Badger that determines whether writes are immediately synced to disk or no. + // If set to true it writes to the write-ahead log (value log) are synced to disk before being applied to the LSM tree. + opts.SyncWrites = syncWrites // default 64mib => 0 - disable block cache - // most of our component maintain their own caches, so this is not needed + // BlockCacheSize specifies how much data cache should hold in memory. + // It improves lookup performance but increases memory consumption. + // Not really necessary if disabling compression opts.BlockCacheSize = 0 - // not much gain as it compresses the LSM only as well compression requires block cache + // compressions reduces storage usage but increases memory consumption, specially during compaction opts.Compression = options.None - - // MemTables: + // MemTables: maximum size of in-memory data structures before they are flushed to disk // default 64mib => 16mib - decreases memory usage and makes compaction more often opts.MemTableSize = 16 << 20 + // NumMemtables is a configuration option in Badger that sets the maximum number of memtables to keep in memory before stalling // default 5 => 3 opts.NumMemtables = 3 + // NumLevelZeroTables sets the maximum number of Level 0 tables before compaction starts // default 5 => 3 opts.NumLevelZeroTables = 3 // default 15 => 5 - this prevents memory growth on CPU constraint systems by blocking all writers opts.NumLevelZeroTablesStall = 5 - + // reducing number compactors, makes it slower but reduces memory usage during compaction opts.NumCompactors = 2 // makes sure badger is always compacted on shutdown opts.CompactL0OnClose = true From b4fdc5eca45717be9580d5d84bc6ef994662ba8f Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Fri, 13 Sep 2024 11:07:05 +0200 Subject: [PATCH 06/14] fix --- store/badger.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/store/badger.go b/store/badger.go index b531a4e17..1a9526ff9 100644 --- a/store/badger.go +++ b/store/badger.go @@ -75,7 +75,7 @@ func (b *BadgerKV) RunValueLogGC(discardRatio float64) error { return b.db.RunValueLogGC(discardRatio) } -func (b *BadgerKV) gc(period time.Duration, discardRatio float64) error { +func (b *BadgerKV) gc(period time.Duration, discardRatio float64) { gcTimeout := time.NewTimer(period) defer gcTimeout.Stop() @@ -84,7 +84,7 @@ func (b *BadgerKV) gc(period time.Duration, discardRatio float64) error { for { select { case <-ctx.Done(): - return nil + return case <-gcTimeout.C: err := b.db.RunValueLogGC(discardRatio) if err != nil { From 7a5e2c58b10fbcac1cf3ff6cb3da7eb6a64aadaf Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Fri, 13 Sep 2024 11:24:56 +0200 Subject: [PATCH 07/14] lint fix --- store/badger.go | 1 - 1 file changed, 1 deletion(-) diff --git a/store/badger.go b/store/badger.go index 1a9526ff9..a7703c203 100644 --- a/store/badger.go +++ b/store/badger.go @@ -76,7 +76,6 @@ func (b *BadgerKV) RunValueLogGC(discardRatio float64) error { } func (b *BadgerKV) gc(period time.Duration, discardRatio float64) { - gcTimeout := time.NewTimer(period) defer gcTimeout.Stop() From 5909a66fc82773d024b4b2f5290a8765c449cf64 Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Fri, 13 Sep 2024 20:15:28 +0200 Subject: [PATCH 08/14] remove gc prefixkv --- store/badger.go | 4 ---- store/prefix.go | 4 ---- store/storeIface.go | 1 - 3 files changed, 9 deletions(-) diff --git a/store/badger.go b/store/badger.go index a7703c203..798e4c430 100644 --- a/store/badger.go +++ b/store/badger.go @@ -71,10 +71,6 @@ func (b *BadgerKV) Close() error { return b.db.Close() } -func (b *BadgerKV) RunValueLogGC(discardRatio float64) error { - return b.db.RunValueLogGC(discardRatio) -} - func (b *BadgerKV) gc(period time.Duration, discardRatio float64) { gcTimeout := time.NewTimer(period) defer gcTimeout.Stop() diff --git a/store/prefix.go b/store/prefix.go index e2eb21548..23842dff3 100644 --- a/store/prefix.go +++ b/store/prefix.go @@ -47,10 +47,6 @@ func (p *PrefixKV) NewBatch() KVBatch { } } -func (b *PrefixKV) RunValueLogGC(discardRatio float64) error { - return b.kv.RunValueLogGC(discardRatio) -} - // PrefixIterator creates iterator to traverse given prefix. func (p *PrefixKV) PrefixIterator(prefix []byte) KVIterator { return p.kv.PrefixIterator(append(p.prefix, prefix...)) diff --git a/store/storeIface.go b/store/storeIface.go index 16fa49520..3061fc936 100644 --- a/store/storeIface.go +++ b/store/storeIface.go @@ -16,7 +16,6 @@ type KV interface { NewBatch() KVBatch // NewBatch creates a new batch. PrefixIterator(prefix []byte) KVIterator // PrefixIterator creates iterator to traverse given prefix. Close() error // Close closes the store. - RunValueLogGC(float64) error // run garbage collector } // KVBatch enables batching of transactions. From 3d56ca961bdb21832cc56201889060a4cea7b768 Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Mon, 16 Sep 2024 18:08:38 +0200 Subject: [PATCH 09/14] context for canceling --- da/grpc/mockserv/cmd/main.go | 3 ++- indexers/txindex/kv/kv_bench_test.go | 2 +- indexers/txindex/kv/kv_test.go | 2 +- node/node.go | 2 +- settlement/grpc/mockserv/mockserv.go | 2 +- settlement/local/local.go | 2 +- store/badger.go | 16 ++++++++-------- store/store_test.go | 3 ++- test/loadtime/cmd/report/main.go | 3 ++- 9 files changed, 19 insertions(+), 16 deletions(-) diff --git a/da/grpc/mockserv/cmd/main.go b/da/grpc/mockserv/cmd/main.go index 9da0804a2..6320673c4 100644 --- a/da/grpc/mockserv/cmd/main.go +++ b/da/grpc/mockserv/cmd/main.go @@ -1,6 +1,7 @@ package main import ( + "context" "flag" "log" "net" @@ -18,7 +19,7 @@ func main() { flag.StringVar(&conf.Host, "host", "0.0.0.0", "listening address") flag.Parse() - kv := store.NewDefaultKVStore(".", "db", "dymint") + kv := store.NewDefaultKVStore(context.TODO(), ".", "db", "dymint") lis, err := net.Listen("tcp", conf.Host+":"+strconv.Itoa(conf.Port)) if err != nil { log.Panic(err) diff --git a/indexers/txindex/kv/kv_bench_test.go b/indexers/txindex/kv/kv_bench_test.go index 846b13da8..17f143d1d 100644 --- a/indexers/txindex/kv/kv_bench_test.go +++ b/indexers/txindex/kv/kv_bench_test.go @@ -20,7 +20,7 @@ func BenchmarkTxSearch(b *testing.B) { b.Errorf("create temporary directory: %s", err) } - db := store.NewDefaultKVStore(dbDir, "db", "benchmark_tx_search_test") + db := store.NewDefaultKVStore(context.TODO(), dbDir, "db", "benchmark_tx_search_test") if err != nil { b.Errorf("create database: %s", err) } diff --git a/indexers/txindex/kv/kv_test.go b/indexers/txindex/kv/kv_test.go index 023bb1f84..9290f8201 100644 --- a/indexers/txindex/kv/kv_test.go +++ b/indexers/txindex/kv/kv_test.go @@ -335,7 +335,7 @@ func benchmarkTxIndex(txsCount int64, b *testing.B) { require.NoError(b, err) }() - store := store.NewDefaultKVStore(dir, "db", "tx_index") + store := store.NewDefaultKVStore(context.TODO(), dir, "db", "tx_index") require.NoError(b, err) indexer := NewTxIndex(store) diff --git a/node/node.go b/node/node.go index f620f8929..e9d34a46e 100644 --- a/node/node.go +++ b/node/node.go @@ -106,7 +106,7 @@ func NewNode( dstore = datastore.NewMapDatastore() } else { // TODO(omritoptx): Move dymint to const - baseKV = store.NewKVStore(conf.RootDir, conf.DBPath, "dymint", conf.DBConfig.SyncWrites) + baseKV = store.NewKVStore(ctx, conf.RootDir, conf.DBPath, "dymint", conf.DBConfig.SyncWrites) path := filepath.Join(store.Rootify(conf.RootDir, conf.DBPath), "blocksync") var err error dstore, err = leveldb.NewDatastore(path, &leveldb.Options{}) diff --git a/settlement/grpc/mockserv/mockserv.go b/settlement/grpc/mockserv/mockserv.go index 4a9c22eda..bf07ade94 100644 --- a/settlement/grpc/mockserv/mockserv.go +++ b/settlement/grpc/mockserv/mockserv.go @@ -67,7 +67,7 @@ func (s *server) SetBatch(ctx context.Context, in *slmock.SLSetBatchRequest) (*s func GetServer(conf settlement.GrpcConfig) *grpc.Server { srv := grpc.NewServer() - slstore := store.NewDefaultKVStore(".", "db", "settlement") + slstore := store.NewDefaultKVStore(context.TODO(), ".", "db", "settlement") kv := store.NewPrefixKV(slstore, settlementKVPrefix) mockImpl := &server{kv: kv} diff --git a/settlement/local/local.go b/settlement/local/local.go index b085a567b..cf38a8787 100644 --- a/settlement/local/local.go +++ b/settlement/local/local.go @@ -106,7 +106,7 @@ func initConfig(conf settlement.Config) (slstore store.KV, proposer string, err proposer = hex.EncodeToString(pubKeybytes) } } else { - slstore = store.NewDefaultKVStore(conf.KeyringHomeDir, "data", kvStoreDBName) + slstore = store.NewDefaultKVStore(context.TODO(), conf.KeyringHomeDir, "data", kvStoreDBName) if conf.ProposerPubKey != "" { proposer = conf.ProposerPubKey } else { diff --git a/store/badger.go b/store/badger.go index 798e4c430..eb2a59315 100644 --- a/store/badger.go +++ b/store/badger.go @@ -14,7 +14,7 @@ import ( const ( gcTimeout = 1 * time.Minute - discardRatio = 0.5 + discardRatio = 0.5 // Recommended by badger. Indicates that a file will be rewritten if half the space can be discarded. ) var ( @@ -38,7 +38,7 @@ func NewDefaultInMemoryKVStore() KV { } } -func NewKVStore(rootDir, dbPath, dbName string, syncWrites bool) KV { +func NewKVStore(ctx context.Context, rootDir, dbPath, dbName string, syncWrites bool) KV { path := filepath.Join(Rootify(rootDir, dbPath), dbName) opts := memoryEfficientBadgerConfig(path, syncWrites) db, err := badger.Open(*opts) @@ -48,14 +48,15 @@ func NewKVStore(rootDir, dbPath, dbName string, syncWrites bool) KV { b := &BadgerKV{ db: db, } - go b.gc(gcTimeout, discardRatio) - + if ctx != context.TODO() { + go b.gc(ctx, gcTimeout, discardRatio) + } return b } // NewDefaultKVStore creates instance of default key-value store. -func NewDefaultKVStore(rootDir, dbPath, dbName string) KV { - return NewKVStore(rootDir, dbPath, dbName, true) +func NewDefaultKVStore(ctx context.Context, rootDir, dbPath, dbName string) KV { + return NewKVStore(ctx, rootDir, dbPath, dbName, true) } // Rootify is helper function to make config creation independent of root dir @@ -71,11 +72,10 @@ func (b *BadgerKV) Close() error { return b.db.Close() } -func (b *BadgerKV) gc(period time.Duration, discardRatio float64) { +func (b *BadgerKV) gc(ctx context.Context, period time.Duration, discardRatio float64) { gcTimeout := time.NewTimer(period) defer gcTimeout.Stop() - ctx := context.Background() for { select { case <-ctx.Done(): diff --git a/store/store_test.go b/store/store_test.go index f7afb7746..de1746904 100644 --- a/store/store_test.go +++ b/store/store_test.go @@ -1,6 +1,7 @@ package store_test import ( + "context" "os" "testing" @@ -49,7 +50,7 @@ func TestStoreLoad(t *testing.T) { } }() - for _, kv := range []store.KV{store.NewDefaultInMemoryKVStore(), store.NewDefaultKVStore(tmpDir, "db", "test")} { + for _, kv := range []store.KV{store.NewDefaultInMemoryKVStore(), store.NewDefaultKVStore(context.TODO(), tmpDir, "db", "test")} { for _, c := range cases { t.Run(c.name, func(t *testing.T) { assert := assert.New(t) diff --git a/test/loadtime/cmd/report/main.go b/test/loadtime/cmd/report/main.go index c981a65e4..01e422403 100644 --- a/test/loadtime/cmd/report/main.go +++ b/test/loadtime/cmd/report/main.go @@ -1,6 +1,7 @@ package main import ( + "context" "encoding/csv" "flag" "fmt" @@ -39,7 +40,7 @@ func (b *BlockStore) Base() uint64 { func getStore(directory string) *store.PrefixKV { dataDirectory := directory[strings.LastIndex(directory, "/")+1:] baseDirectory := directory[:len(directory)-len(dataDirectory)] - baseKV := store.NewDefaultKVStore(baseDirectory, dataDirectory, blockStoreDBName) + baseKV := store.NewDefaultKVStore(context.TODO(), baseDirectory, dataDirectory, blockStoreDBName) mainKV := store.NewPrefixKV(baseKV, mainPrefix[:]) return mainKV } From a4acba417936af3be6c1c2f101bf12b672381b22 Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Mon, 16 Sep 2024 18:13:54 +0200 Subject: [PATCH 10/14] log added --- node/node.go | 2 +- store/badger.go | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/node/node.go b/node/node.go index e9d34a46e..ffa93e44c 100644 --- a/node/node.go +++ b/node/node.go @@ -106,7 +106,7 @@ func NewNode( dstore = datastore.NewMapDatastore() } else { // TODO(omritoptx): Move dymint to const - baseKV = store.NewKVStore(ctx, conf.RootDir, conf.DBPath, "dymint", conf.DBConfig.SyncWrites) + baseKV = store.NewKVStore(ctx, conf.RootDir, conf.DBPath, "dymint", conf.DBConfig.SyncWrites, logger) path := filepath.Join(store.Rootify(conf.RootDir, conf.DBPath), "blocksync") var err error dstore, err = leveldb.NewDatastore(path, &leveldb.Options{}) diff --git a/store/badger.go b/store/badger.go index eb2a59315..6feafddd2 100644 --- a/store/badger.go +++ b/store/badger.go @@ -6,7 +6,9 @@ import ( "path/filepath" "time" + "github.com/dymensionxyz/dymint/types" "github.com/dymensionxyz/gerr-cosmos/gerrc" + "github.com/tendermint/tendermint/libs/log" "github.com/dgraph-io/badger/v4" "github.com/dgraph-io/badger/v4/options" @@ -38,7 +40,7 @@ func NewDefaultInMemoryKVStore() KV { } } -func NewKVStore(ctx context.Context, rootDir, dbPath, dbName string, syncWrites bool) KV { +func NewKVStore(ctx context.Context, rootDir, dbPath, dbName string, syncWrites bool, logger types.Logger) KV { path := filepath.Join(Rootify(rootDir, dbPath), dbName) opts := memoryEfficientBadgerConfig(path, syncWrites) db, err := badger.Open(*opts) @@ -49,14 +51,14 @@ func NewKVStore(ctx context.Context, rootDir, dbPath, dbName string, syncWrites db: db, } if ctx != context.TODO() { - go b.gc(ctx, gcTimeout, discardRatio) + go b.gc(ctx, gcTimeout, discardRatio, logger) } return b } // NewDefaultKVStore creates instance of default key-value store. func NewDefaultKVStore(ctx context.Context, rootDir, dbPath, dbName string) KV { - return NewKVStore(ctx, rootDir, dbPath, dbName, true) + return NewKVStore(ctx, rootDir, dbPath, dbName, true, log.NewNopLogger()) } // Rootify is helper function to make config creation independent of root dir @@ -72,7 +74,7 @@ func (b *BadgerKV) Close() error { return b.db.Close() } -func (b *BadgerKV) gc(ctx context.Context, period time.Duration, discardRatio float64) { +func (b *BadgerKV) gc(ctx context.Context, period time.Duration, discardRatio float64, logger types.Logger) { gcTimeout := time.NewTimer(period) defer gcTimeout.Stop() @@ -83,6 +85,7 @@ func (b *BadgerKV) gc(ctx context.Context, period time.Duration, discardRatio fl case <-gcTimeout.C: err := b.db.RunValueLogGC(discardRatio) if err != nil { + logger.Debug("Running db RunValueLogGC", "err", err) continue } } From 2592d1d8c350c47d35d6974ea5776c451c453e07 Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Tue, 17 Sep 2024 16:26:17 +0200 Subject: [PATCH 11/14] fix store ctx --- da/grpc/mockserv/cmd/main.go | 3 +-- indexers/txindex/kv/kv_bench_test.go | 2 +- indexers/txindex/kv/kv_test.go | 2 +- node/node.go | 2 +- settlement/grpc/mockserv/mockserv.go | 2 +- settlement/local/local.go | 2 +- store/badger.go | 34 +++++++++++----------------- store/store_test.go | 3 +-- test/loadtime/cmd/report/main.go | 3 +-- 9 files changed, 21 insertions(+), 32 deletions(-) diff --git a/da/grpc/mockserv/cmd/main.go b/da/grpc/mockserv/cmd/main.go index 6320673c4..9da0804a2 100644 --- a/da/grpc/mockserv/cmd/main.go +++ b/da/grpc/mockserv/cmd/main.go @@ -1,7 +1,6 @@ package main import ( - "context" "flag" "log" "net" @@ -19,7 +18,7 @@ func main() { flag.StringVar(&conf.Host, "host", "0.0.0.0", "listening address") flag.Parse() - kv := store.NewDefaultKVStore(context.TODO(), ".", "db", "dymint") + kv := store.NewDefaultKVStore(".", "db", "dymint") lis, err := net.Listen("tcp", conf.Host+":"+strconv.Itoa(conf.Port)) if err != nil { log.Panic(err) diff --git a/indexers/txindex/kv/kv_bench_test.go b/indexers/txindex/kv/kv_bench_test.go index 17f143d1d..846b13da8 100644 --- a/indexers/txindex/kv/kv_bench_test.go +++ b/indexers/txindex/kv/kv_bench_test.go @@ -20,7 +20,7 @@ func BenchmarkTxSearch(b *testing.B) { b.Errorf("create temporary directory: %s", err) } - db := store.NewDefaultKVStore(context.TODO(), dbDir, "db", "benchmark_tx_search_test") + db := store.NewDefaultKVStore(dbDir, "db", "benchmark_tx_search_test") if err != nil { b.Errorf("create database: %s", err) } diff --git a/indexers/txindex/kv/kv_test.go b/indexers/txindex/kv/kv_test.go index 9290f8201..023bb1f84 100644 --- a/indexers/txindex/kv/kv_test.go +++ b/indexers/txindex/kv/kv_test.go @@ -335,7 +335,7 @@ func benchmarkTxIndex(txsCount int64, b *testing.B) { require.NoError(b, err) }() - store := store.NewDefaultKVStore(context.TODO(), dir, "db", "tx_index") + store := store.NewDefaultKVStore(dir, "db", "tx_index") require.NoError(b, err) indexer := NewTxIndex(store) diff --git a/node/node.go b/node/node.go index ffa93e44c..c2f7dca18 100644 --- a/node/node.go +++ b/node/node.go @@ -106,7 +106,7 @@ func NewNode( dstore = datastore.NewMapDatastore() } else { // TODO(omritoptx): Move dymint to const - baseKV = store.NewKVStore(ctx, conf.RootDir, conf.DBPath, "dymint", conf.DBConfig.SyncWrites, logger) + baseKV = store.NewKVStore(conf.RootDir, conf.DBPath, "dymint", conf.DBConfig.SyncWrites, logger) path := filepath.Join(store.Rootify(conf.RootDir, conf.DBPath), "blocksync") var err error dstore, err = leveldb.NewDatastore(path, &leveldb.Options{}) diff --git a/settlement/grpc/mockserv/mockserv.go b/settlement/grpc/mockserv/mockserv.go index bf07ade94..4a9c22eda 100644 --- a/settlement/grpc/mockserv/mockserv.go +++ b/settlement/grpc/mockserv/mockserv.go @@ -67,7 +67,7 @@ func (s *server) SetBatch(ctx context.Context, in *slmock.SLSetBatchRequest) (*s func GetServer(conf settlement.GrpcConfig) *grpc.Server { srv := grpc.NewServer() - slstore := store.NewDefaultKVStore(context.TODO(), ".", "db", "settlement") + slstore := store.NewDefaultKVStore(".", "db", "settlement") kv := store.NewPrefixKV(slstore, settlementKVPrefix) mockImpl := &server{kv: kv} diff --git a/settlement/local/local.go b/settlement/local/local.go index cf38a8787..b085a567b 100644 --- a/settlement/local/local.go +++ b/settlement/local/local.go @@ -106,7 +106,7 @@ func initConfig(conf settlement.Config) (slstore store.KV, proposer string, err proposer = hex.EncodeToString(pubKeybytes) } } else { - slstore = store.NewDefaultKVStore(context.TODO(), conf.KeyringHomeDir, "data", kvStoreDBName) + slstore = store.NewDefaultKVStore(conf.KeyringHomeDir, "data", kvStoreDBName) if conf.ProposerPubKey != "" { proposer = conf.ProposerPubKey } else { diff --git a/store/badger.go b/store/badger.go index 6feafddd2..8bc78ee6b 100644 --- a/store/badger.go +++ b/store/badger.go @@ -1,7 +1,6 @@ package store import ( - "context" "errors" "path/filepath" "time" @@ -40,7 +39,7 @@ func NewDefaultInMemoryKVStore() KV { } } -func NewKVStore(ctx context.Context, rootDir, dbPath, dbName string, syncWrites bool, logger types.Logger) KV { +func NewKVStore(rootDir, dbPath, dbName string, syncWrites bool, logger types.Logger) KV { path := filepath.Join(Rootify(rootDir, dbPath), dbName) opts := memoryEfficientBadgerConfig(path, syncWrites) db, err := badger.Open(*opts) @@ -50,15 +49,13 @@ func NewKVStore(ctx context.Context, rootDir, dbPath, dbName string, syncWrites b := &BadgerKV{ db: db, } - if ctx != context.TODO() { - go b.gc(ctx, gcTimeout, discardRatio, logger) - } + go b.gc(gcTimeout, discardRatio, logger) return b } // NewDefaultKVStore creates instance of default key-value store. -func NewDefaultKVStore(ctx context.Context, rootDir, dbPath, dbName string) KV { - return NewKVStore(ctx, rootDir, dbPath, dbName, true, log.NewNopLogger()) +func NewDefaultKVStore(rootDir, dbPath, dbName string) KV { + return NewKVStore(rootDir, dbPath, dbName, true, log.NewNopLogger()) } // Rootify is helper function to make config creation independent of root dir @@ -74,20 +71,15 @@ func (b *BadgerKV) Close() error { return b.db.Close() } -func (b *BadgerKV) gc(ctx context.Context, period time.Duration, discardRatio float64, logger types.Logger) { - gcTimeout := time.NewTimer(period) - defer gcTimeout.Stop() - - for { - select { - case <-ctx.Done(): - return - case <-gcTimeout.C: - err := b.db.RunValueLogGC(discardRatio) - if err != nil { - logger.Debug("Running db RunValueLogGC", "err", err) - continue - } +func (b *BadgerKV) gc(period time.Duration, discardRatio float64, logger types.Logger) { + + ticker := time.NewTicker(period) + defer ticker.Stop() + for range ticker.C { + err := b.db.RunValueLogGC(discardRatio) + if err != nil { + logger.Debug("Running db RunValueLogGC", "err", err) + continue } } } diff --git a/store/store_test.go b/store/store_test.go index de1746904..f7afb7746 100644 --- a/store/store_test.go +++ b/store/store_test.go @@ -1,7 +1,6 @@ package store_test import ( - "context" "os" "testing" @@ -50,7 +49,7 @@ func TestStoreLoad(t *testing.T) { } }() - for _, kv := range []store.KV{store.NewDefaultInMemoryKVStore(), store.NewDefaultKVStore(context.TODO(), tmpDir, "db", "test")} { + for _, kv := range []store.KV{store.NewDefaultInMemoryKVStore(), store.NewDefaultKVStore(tmpDir, "db", "test")} { for _, c := range cases { t.Run(c.name, func(t *testing.T) { assert := assert.New(t) diff --git a/test/loadtime/cmd/report/main.go b/test/loadtime/cmd/report/main.go index 01e422403..c981a65e4 100644 --- a/test/loadtime/cmd/report/main.go +++ b/test/loadtime/cmd/report/main.go @@ -1,7 +1,6 @@ package main import ( - "context" "encoding/csv" "flag" "fmt" @@ -40,7 +39,7 @@ func (b *BlockStore) Base() uint64 { func getStore(directory string) *store.PrefixKV { dataDirectory := directory[strings.LastIndex(directory, "/")+1:] baseDirectory := directory[:len(directory)-len(dataDirectory)] - baseKV := store.NewDefaultKVStore(context.TODO(), baseDirectory, dataDirectory, blockStoreDBName) + baseKV := store.NewDefaultKVStore(baseDirectory, dataDirectory, blockStoreDBName) mainKV := store.NewPrefixKV(baseKV, mainPrefix[:]) return mainKV } From c02af950d01fc53681d2c5a14135968c0d2a646d Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Tue, 17 Sep 2024 16:28:58 +0200 Subject: [PATCH 12/14] lint fix --- store/badger.go | 1 - 1 file changed, 1 deletion(-) diff --git a/store/badger.go b/store/badger.go index 8bc78ee6b..76c528d48 100644 --- a/store/badger.go +++ b/store/badger.go @@ -72,7 +72,6 @@ func (b *BadgerKV) Close() error { } func (b *BadgerKV) gc(period time.Duration, discardRatio float64, logger types.Logger) { - ticker := time.NewTicker(period) defer ticker.Stop() for range ticker.C { From 03c6792f89c6c45cced23c7c40b458c820c17b81 Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Wed, 18 Sep 2024 22:01:22 +0200 Subject: [PATCH 13/14] adding closing channel store --- store/badger.go | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/store/badger.go b/store/badger.go index 76c528d48..2d85f2f61 100644 --- a/store/badger.go +++ b/store/badger.go @@ -25,7 +25,8 @@ var ( // BadgerKV is a implementation of KVStore using Badger v3. type BadgerKV struct { - db *badger.DB + db *badger.DB + closing chan struct{} } // NewDefaultInMemoryKVStore builds KVStore that works in-memory (without accessing disk). @@ -35,7 +36,8 @@ func NewDefaultInMemoryKVStore() KV { panic(err) } return &BadgerKV{ - db: db, + db: db, + closing: make(chan struct{}), } } @@ -68,17 +70,24 @@ func Rootify(rootDir, dbPath string) string { // Close implements KVStore. func (b *BadgerKV) Close() error { + close(b.closing) return b.db.Close() } func (b *BadgerKV) gc(period time.Duration, discardRatio float64, logger types.Logger) { ticker := time.NewTicker(period) defer ticker.Stop() - for range ticker.C { - err := b.db.RunValueLogGC(discardRatio) - if err != nil { - logger.Debug("Running db RunValueLogGC", "err", err) - continue + for { + select { + case <-b.closing: + // Exit the periodic garbage collector function when store is closed + return + case <-ticker.C: + err := b.db.RunValueLogGC(discardRatio) + if err != nil { + logger.Debug("Running db RunValueLogGC", "err", err) + continue + } } } } From 70dc4b7e16ac5d2b172e196a457e66fff783c005 Mon Sep 17 00:00:00 2001 From: Sergi Rene Date: Thu, 19 Sep 2024 10:09:11 +0200 Subject: [PATCH 14/14] fix missing channel init --- store/badger.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/store/badger.go b/store/badger.go index 2d85f2f61..5fbb244f5 100644 --- a/store/badger.go +++ b/store/badger.go @@ -3,6 +3,7 @@ package store import ( "errors" "path/filepath" + "sync" "time" "github.com/dymensionxyz/dymint/types" @@ -25,8 +26,9 @@ var ( // BadgerKV is a implementation of KVStore using Badger v3. type BadgerKV struct { - db *badger.DB - closing chan struct{} + db *badger.DB + closing chan struct{} + closeOnce sync.Once } // NewDefaultInMemoryKVStore builds KVStore that works in-memory (without accessing disk). @@ -49,7 +51,8 @@ func NewKVStore(rootDir, dbPath, dbName string, syncWrites bool, logger types.Lo panic(err) } b := &BadgerKV{ - db: db, + db: db, + closing: make(chan struct{}), } go b.gc(gcTimeout, discardRatio, logger) return b @@ -70,7 +73,9 @@ func Rootify(rootDir, dbPath string) string { // Close implements KVStore. func (b *BadgerKV) Close() error { - close(b.closing) + b.closeOnce.Do(func() { + close(b.closing) + }) return b.db.Close() }