Open
Description
Welcome
- Yes, I've searched similar issues on GitHub and didn't find any.
- Yes, I've included all information below (version, config, etc).
Description of the problem
The traefik kv provider utilizes the WatchTree interface to monitor events of key changes in the kv store. However, when we delete the root key in Redis, the WatchTree fails to notify the kv provider about the modification of certain keys.
Version of Valkeyrie
commitID: 7cf91fd7ec3f113bf4ef40af497ccb1e803f69c8
Version of store
commitID: d785cd6
Go environment
$ go version && go env
go version go1.20.5 linux/amd64
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/sunyakun.king/.cache/go-build"
GOENV="/home/sunyakun.king/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/data00/home/sunyakun.king/go/pkg/mod"
GOOS="linux"
GOPATH="/data00/home/sunyakun.king/go"
GOPROXY="https://goproxy.cn,https://proxy.golang.org,direct"
GOROOT="/home/sunyakun.king/sdk/go1.20.5"
GOSUMDB="sum.golang.google.cn"
GOTMPDIR=""
GOTOOLDIR="/home/sunyakun.king/sdk/go1.20.5/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.20.5"
GCCGO="gccgo"
GOAMD64="v1"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/sunyakun.king/kvtools/redis/go.mod"
GOWORK="/home/sunyakun.king/kvtools/go.work"
CGO_CFLAGS="-O2 -g"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-O2 -g"
CGO_FFLAGS="-O2 -g"
CGO_LDFLAGS="-O2 -g"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build1759202274=/tmp/go-build -gno-record-gcc-switches"
Code example or link to a public repository
First you should start a local redis running in the docker container.
$ docker run -d --rm --name redis -p 6379:6379 redis
Then execute the script.
package main
import (
"context"
"time"
"github.com/kvtools/redis"
"github.com/kvtools/valkeyrie"
"github.com/sirupsen/logrus"
)
var (
RedisAddr = "localhost:6379"
)
func main() {
ctx := context.Background()
r, err := valkeyrie.NewStore(
context.Background(),
redis.StoreName,
[]string{RedisAddr},
&redis.Config{
DB: 0,
},
)
if err != nil {
logrus.Fatal(err)
}
kvpairsCh, err := r.WatchTree(ctx, "traefik", nil)
if err != nil {
logrus.Fatal(err)
}
go func() {
for kvpairs := range kvpairsCh {
logrus.Info("====== Receive ======")
for _, pair := range kvpairs {
logrus.Info(pair.Key)
}
logrus.Info("====== End ======")
}
}()
time.Sleep(1 * time.Second)
// put key to kv store
err = r.Put(ctx, "traefik/node1", []byte("val1"), nil)
if err != nil {
logrus.Fatal(err)
}
time.Sleep(1 * time.Second)
// delete key from kv store
err = r.Delete(ctx, "traefik/node1")
if err != nil {
logrus.Fatal(err)
}
time.Sleep(1 * time.Second)
logrus.Info("exit!")
}
Expected output:
// watchLoop will fetch all kv pairs before receive message from redis
INFO[0000] ====== Receive ======
INFO[0000] ====== End ======
// receive key set message from redis
INFO[0001] ====== Receive ======
INFO[0001] traefik/node1
INFO[0001] ====== End ======
// receive key del message from redis
INFO[0002] ====== Receive ======
INFO[0002] ====== End ======
INFO[0003] exit!
Actual output
INFO[0001] ====== Receive ======
INFO[0001] traefik/node1
INFO[0001] ====== End ======
INFO[0003] exit!
Activity