This is an automated email from the ASF dual-hosted git repository. humingcheng pushed a commit to branch revert-327-dev in repository https://gitbox.apache.org/repos/asf/servicecomb-kie.git
commit 2d9f245af35ad68e3d1410609339ce1cb767e8c5 Author: humingcheng <[email protected]> AuthorDate: Mon Jan 5 22:49:21 2026 +0800 Revert "模糊匹配新增kvIdFuzzyCache,查询时缓存,增删改时直接整个失效,底层kvDoc直接复用 (#327)" This reverts commit 14ed5c08c9eb9907844116c87b26a781edf711e4. --- go.mod | 7 +-- go.sum | 16 ++--- pkg/stringutil/string_util_test.go | 4 +- server/datasource/etcd/kv/kv_cache.go | 82 ++++++++----------------- server/datasource/etcd/kv/kv_cache_test.go | 5 -- server/datasource/etcd/kv/kv_dao.go | 96 +++++++----------------------- 6 files changed, 57 insertions(+), 153 deletions(-) diff --git a/go.mod b/go.mod index 8d1f4dc..f88e287 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,6 @@ module github.com/apache/servicecomb-kie require ( github.com/apache/servicecomb-service-center/eventbase v0.0.0-20240328150344-01abe81dc5d0 - github.com/dgraph-io/ristretto v0.2.0 github.com/emicklei/go-restful v2.15.1-0.20220703112237-d9c71e118c95+incompatible github.com/go-chassis/cari v0.9.1-0.20240328115504-88da93faaca7 github.com/go-chassis/etcdadpt v0.5.3-0.20240328092602-984e34b756fe @@ -14,7 +13,7 @@ require ( github.com/gofrs/uuid v4.0.0+incompatible github.com/hashicorp/serf v0.9.5 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/stretchr/testify v1.8.4 + github.com/stretchr/testify v1.7.2 github.com/urfave/cli v1.22.4 go.etcd.io/etcd/api/v3 v3.5.4 go.mongodb.org/mongo-driver v1.5.1 @@ -36,7 +35,7 @@ require ( github.com/cpuguy83/go-md2man/v2 v2.0.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/deckarep/golang-set v1.7.1 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dustin/go-humanize v1.0.0 // indirect github.com/fatih/color v1.10.0 // indirect github.com/form3tech-oss/jwt-go v3.2.3+incompatible // indirect github.com/fsnotify/fsnotify v1.4.9 // indirect @@ -126,7 +125,7 @@ require ( golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838 // indirect golang.org/x/net v0.7.0 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect - golang.org/x/sys v0.11.0 // indirect + golang.org/x/sys v0.5.0 // indirect golang.org/x/text v0.7.0 // indirect golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba // indirect google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c // indirect diff --git a/go.sum b/go.sum index e93b436..652132a 100644 --- a/go.sum +++ b/go.sum @@ -126,16 +126,12 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ= github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= -github.com/dgraph-io/ristretto v0.2.0 h1:XAfl+7cmoUDWW/2Lx8TGZQjjxIQ2Ley9DSf52dru4WE= -github.com/dgraph-io/ristretto v0.2.0/go.mod h1:8uBHCU/PBV4Ag0CJrP47b9Ofby5dqWNh4FicAdoqFNU= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= @@ -581,8 +577,8 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1 h1:2vfRuCMp5sSVIDSqO8oNnWJq7mPa6KVP3iPIwFBuy8A= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -590,8 +586,8 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= @@ -856,8 +852,8 @@ golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/pkg/stringutil/string_util_test.go b/pkg/stringutil/string_util_test.go index 333b8ff..7963f8c 100644 --- a/pkg/stringutil/string_util_test.go +++ b/pkg/stringutil/string_util_test.go @@ -20,9 +20,8 @@ package stringutil_test import ( "testing" - "github.com/stretchr/testify/assert" - "github.com/apache/servicecomb-kie/pkg/stringutil" + "github.com/stretchr/testify/assert" ) func TestFormat(t *testing.T) { @@ -36,7 +35,6 @@ func TestFormat(t *testing.T) { }) t.Log(s) assert.Equal(t, s, s2) - assert.Equal(t, s, "service=a::version=1") s3 := stringutil.FormatMap(nil) assert.Equal(t, "none", s3) } diff --git a/server/datasource/etcd/kv/kv_cache.go b/server/datasource/etcd/kv/kv_cache.go index 025cf3a..e890b87 100644 --- a/server/datasource/etcd/kv/kv_cache.go +++ b/server/datasource/etcd/kv/kv_cache.go @@ -4,16 +4,13 @@ import ( "context" "encoding/json" "fmt" - "log" "regexp" "strings" "sync" "time" - "github.com/dgraph-io/ristretto" "github.com/go-chassis/etcdadpt" "github.com/go-chassis/foundation/backoff" - "github.com/go-chassis/go-archaius" "github.com/go-chassis/openlog" goCache "github.com/patrickmn/go-cache" "go.etcd.io/etcd/api/v3/mvccpb" @@ -22,7 +19,6 @@ import ( "github.com/apache/servicecomb-kie/pkg/stringutil" "github.com/apache/servicecomb-kie/server/datasource" "github.com/apache/servicecomb-kie/server/datasource/etcd/key" - "github.com/apache/servicecomb-kie/server/plugin/qms" ) func Init() { @@ -41,38 +37,24 @@ const ( ) type Cache struct { - timeOut time.Duration - client etcdadpt.Client - revision int64 - kvIDCache sync.Map // map[labels]map[kvId]struct{} 精确匹配某组labels的kvId集合 - // 非精确匹配时,对每一个查找条件建立缓存,由于n个标签理论上有2^n个查找条件,因此需要限制缓存大小。 - // 任意创建,删除操作,由于其频率较低,直接重建整个缓存,更新操作由于不影响此缓存与etcd一致性,不需额外处理 - kvIDFuzzyCache *ristretto.Cache // map[labels]map[kvId]struct{} 模糊匹配某组labels的kvId集合 - kvDocCache *goCache.Cache + timeOut time.Duration + client etcdadpt.Client + revision int64 + kvIDCache sync.Map + kvDocCache *goCache.Cache } func NewKvCache() *Cache { - quota := archaius.GetInt64(qms.QuotaConfigKey, qms.DefaultQuota) - fuzzyCache, err := ristretto.NewCache(&ristretto.Config{ - MaxCost: quota * 10, - NumCounters: quota * 100, - BufferItems: 64, - }) - if err != nil { - log.Fatalf("init kv cache fail, configuration error %v", err) - } - kvDocCache := goCache.New(cacheExpirationTime, cacheCleanupInterval) return &Cache{ - timeOut: etcdWatchTimeout, - client: etcdadpt.Instance(), - revision: 0, - kvDocCache: kvDocCache, - kvIDFuzzyCache: fuzzyCache, + timeOut: etcdWatchTimeout, + client: etcdadpt.Instance(), + revision: 0, + kvDocCache: kvDocCache, } } -func cacheEnabled() bool { +func Enabled() bool { return kvCache != nil } @@ -124,6 +106,7 @@ func (kc *Cache) watch(ctx context.Context) error { timoutCtx, cancel := context.WithTimeout(ctx, kc.timeOut) defer cancel() + rev := kc.revision opts := append( etcdadpt.WatchPrefixOpOptions(prefixKvs), etcdadpt.WithRev(kc.revision+1), @@ -131,7 +114,7 @@ func (kc *Cache) watch(ctx context.Context) error { ) err := kc.client.Watch(timoutCtx, opts...) if err != nil { - openlog.Error(fmt.Sprintf("watch prefix %s failed, start rev: %d+1->%d->0, err %v", prefixKvs, kc.revision, kc.revision, err)) + openlog.Error(fmt.Sprintf("watch prefix %s failed, start rev: %d+1->%d->0, err %v", prefixKvs, rev, kc.revision, err)) kc.revision = 0 } return err @@ -146,7 +129,7 @@ func (kc *Cache) list(ctx context.Context) (*etcdadpt.Response, error) { return rsp, nil } -func (kc *Cache) watchCallBack(_ string, rsp *etcdadpt.Response) error { +func (kc *Cache) watchCallBack(message string, rsp *etcdadpt.Response) error { if rsp == nil || len(rsp.Kvs) == 0 { return fmt.Errorf("unknown event") } @@ -165,7 +148,7 @@ func (kc *Cache) watchCallBack(_ string, rsp *etcdadpt.Response) error { func (kc *Cache) cachePut(rsp *etcdadpt.Response) { for _, kv := range rsp.Kvs { - kvDoc, err := unmarshalKVDoc(kv) + kvDoc, err := kc.GetKvDoc(kv) if err != nil { openlog.Error(fmt.Sprintf("failed to unmarshal kv, err %v", err)) continue @@ -186,7 +169,7 @@ func (kc *Cache) cachePut(rsp *etcdadpt.Response) { func (kc *Cache) cacheDelete(rsp *etcdadpt.Response) { for _, kv := range rsp.Kvs { - kvDoc, err := unmarshalKVDoc(kv) + kvDoc, err := kc.GetKvDoc(kv) if err != nil { openlog.Error(fmt.Sprintf("failed to unmarshal kv, err %v", err)) continue @@ -214,18 +197,6 @@ func (kc *Cache) LoadKvIDSet(cacheKey string) (*sync.Map, bool) { return kvIds, true } -func (kc *Cache) LoadKvIDSetByFuzzyCache(cacheKey string) (*sync.Map, bool) { - val, ok := kc.kvIDFuzzyCache.Get(cacheKey) - if !ok { - return nil, false - } - kvIds, ok := val.(*sync.Map) - if !ok { - return nil, false - } - return kvIds, true -} - func (kc *Cache) StoreKvIDSet(cacheKey string, kvIds *sync.Map) { kc.kvIDCache.Store(cacheKey, kvIds) } @@ -250,7 +221,11 @@ func (kc *Cache) DeleteKvDoc(kvID string) { kc.kvDocCache.Delete(kvID) } -func Search(ctx context.Context, req *CacheSearchReq) (*model.KVResponse, error) { +func Search(ctx context.Context, req *CacheSearchReq) (*model.KVResponse, bool, error) { + if !req.Opts.ExactLabels { + return nil, false, nil + } + openlog.Debug(fmt.Sprintf("using cache to search kv, domain %v, project %v, opts %+v", req.Domain, req.Project, *req.Opts)) result := &model.KVResponse{ Data: []*model.KVDoc{}, @@ -259,16 +234,9 @@ func Search(ctx context.Context, req *CacheSearchReq) (*model.KVResponse, error) kvIds, ok := kvCache.LoadKvIDSet(cacheKey) if !ok { kvCache.StoreKvIDSet(cacheKey, &sync.Map{}) - return result, nil + return result, true, nil } - return getKvDocsByIds(ctx, req, kvIds) -} - -func getKvDocsByIds(ctx context.Context, req *CacheSearchReq, kvIds *sync.Map) (*model.KVResponse, error) { - result := &model.KVResponse{ - Data: []*model.KVDoc{}, - } var docs []*model.KVDoc var kvIdsLeft []string @@ -282,7 +250,7 @@ func getKvDocsByIds(ctx context.Context, req *CacheSearchReq, kvIds *sync.Map) ( }) tpData, err := kvCache.getKvFromEtcd(ctx, req, kvIdsLeft) if err != nil { - return nil, err + return nil, true, err } docs = append(docs, tpData...) @@ -293,7 +261,7 @@ func getKvDocsByIds(ctx context.Context, req *CacheSearchReq, kvIds *sync.Map) ( } } result.Total = len(result.Data) - return result, nil + return result, true, nil } func (kc *Cache) getKvFromEtcd(ctx context.Context, req *CacheSearchReq, kvIdsLeft []string) ([]*model.KVDoc, error) { @@ -318,7 +286,7 @@ func (kc *Cache) getKvFromEtcd(ctx context.Context, req *CacheSearchReq, kvIdsLe return } - doc, err := unmarshalKVDoc(kv) + doc, err := kc.GetKvDoc(kv) if err != nil { openlog.Error(fmt.Sprintf("failed to unmarshal kv, err %v", err)) getKvErr = err @@ -352,7 +320,7 @@ func isMatch(req *CacheSearchReq, doc *model.KVDoc) bool { return true } -func unmarshalKVDoc(kv *mvccpb.KeyValue) (*model.KVDoc, error) { +func (kc *Cache) GetKvDoc(kv *mvccpb.KeyValue) (*model.KVDoc, error) { kvDoc := &model.KVDoc{} err := json.Unmarshal(kv.Value, kvDoc) if err != nil { diff --git a/server/datasource/etcd/kv/kv_cache_test.go b/server/datasource/etcd/kv/kv_cache_test.go index e198361..56711ac 100644 --- a/server/datasource/etcd/kv/kv_cache_test.go +++ b/server/datasource/etcd/kv/kv_cache_test.go @@ -4,7 +4,6 @@ import ( "testing" "github.com/go-chassis/etcdadpt" - "github.com/go-chassis/go-archaius" "github.com/stretchr/testify/assert" "go.etcd.io/etcd/api/v3/mvccpb" ) @@ -13,10 +12,6 @@ type args struct { rsp *etcdadpt.Response } -func init() { - archaius.Init() -} - func TestCachePut(t *testing.T) { tests := []struct { name string diff --git a/server/datasource/etcd/kv/kv_dao.go b/server/datasource/etcd/kv/kv_dao.go index d7ebc37..8d9f63b 100644 --- a/server/datasource/etcd/kv/kv_dao.go +++ b/server/datasource/etcd/kv/kv_dao.go @@ -22,9 +22,8 @@ import ( "encoding/json" "regexp" "strings" - "sync" - pkgsync "github.com/go-chassis/cari/sync" + "github.com/go-chassis/cari/sync" "github.com/go-chassis/etcdadpt" "github.com/go-chassis/openlog" @@ -69,10 +68,6 @@ func (s *Dao) Create(ctx context.Context, kv *model.KVDoc, options ...datasource })) return nil, datasource.ErrKVAlreadyExists } - // 添加kv时,直接重建kvIdFuzzyCache - if cacheEnabled() { - kvCache.kvIDFuzzyCache.Clear() - } return kv, nil } @@ -91,7 +86,7 @@ func txnCreate(ctx context.Context, kv *model.KVDoc) (bool, error) { openlog.Error("fail to marshal kv " + err.Error()) return false, err } - task, err := pkgsync.NewTask(kv.Domain, kv.Project, pkgsync.CreateAction, datasource.ConfigResource, kv) + task, err := sync.NewTask(kv.Domain, kv.Project, sync.CreateAction, datasource.ConfigResource, kv) if err != nil { openlog.Error("fail to create task" + err.Error()) return false, err @@ -161,7 +156,7 @@ func txnUpdate(ctx context.Context, kv *model.KVDoc) error { openlog.Error(err.Error()) return err } - task, err := pkgsync.NewTask(kv.Domain, kv.Project, pkgsync.UpdateAction, datasource.ConfigResource, kv) + task, err := sync.NewTask(kv.Domain, kv.Project, sync.UpdateAction, datasource.ConfigResource, kv) if err != nil { openlog.Error("fail to create task" + err.Error()) return err @@ -274,10 +269,6 @@ func findOneAndDelete(ctx context.Context, kvID, project, domain string) (*model openlog.Error("decode error: " + err.Error()) return nil, err } - // 删除kv时,直接重建kvIdFuzzyCache - if cacheEnabled() { - kvCache.kvIDFuzzyCache.Clear() - } return &kvDoc, nil } @@ -289,7 +280,7 @@ func txnFindOneAndDelete(ctx context.Context, kvID, project, domain string) (*mo openlog.Error(err.Error()) return nil, err } - task, err := pkgsync.NewTask(domain, project, pkgsync.DeleteAction, datasource.ConfigResource, kvDoc) + task, err := sync.NewTask(domain, project, sync.DeleteAction, datasource.ConfigResource, kvDoc) if err != nil { openlog.Error("fail to create task" + err.Error()) return nil, err @@ -299,7 +290,7 @@ func txnFindOneAndDelete(ctx context.Context, kvID, project, domain string) (*mo openlog.Error("fail to marshal task" + err.Error()) return nil, err } - tombstone := pkgsync.NewTombstone(domain, project, datasource.ConfigResource, datasource.TombstoneID(kvDoc)) + tombstone := sync.NewTombstone(domain, project, datasource.ConfigResource, datasource.TombstoneID(kvDoc)) tombstoneBytes, err := json.Marshal(tombstone) if err != nil { openlog.Error("fail to marshal tombstone" + err.Error()) @@ -316,10 +307,6 @@ func txnFindOneAndDelete(ctx context.Context, kvID, project, domain string) (*mo })) return nil, err } - // 删除kv时,直接重建kvIdFuzzyCache - if cacheEnabled() { - kvCache.kvIDFuzzyCache.Clear() - } return kvDoc, nil } @@ -389,10 +376,6 @@ func findManyAndDelete(ctx context.Context, kvIDs []string, project, domain stri } docs = append(docs, &doc) } - // 删除kv时,直接重建kvIdFuzzyCache - if cacheEnabled() { - kvCache.kvIDFuzzyCache.Clear() - } return docs, resp.Count, nil } @@ -402,8 +385,8 @@ func txnFindManyAndDelete(ctx context.Context, kvIDs []string, project, domain s var opOptions []etcdadpt.OpOptions kvTotalNum := len(kvIDs) docs = make([]*model.KVDoc, kvTotalNum) - tasks := make([]*pkgsync.Task, kvTotalNum) - tombstones := make([]*pkgsync.Tombstone, kvTotalNum) + tasks := make([]*sync.Task, kvTotalNum) + tombstones := make([]*sync.Tombstone, kvTotalNum) successKVNum := 0 for i := 0; i < kvTotalNum; i++ { kvDoc, err := getKVDoc(ctx, domain, project, kvIDs[i]) @@ -418,14 +401,14 @@ func txnFindManyAndDelete(ctx context.Context, kvIDs []string, project, domain s if kvDoc == nil { continue } - task, err := pkgsync.NewTask(domain, project, pkgsync.DeleteAction, datasource.ConfigResource, kvDoc) + task, err := sync.NewTask(domain, project, sync.DeleteAction, datasource.ConfigResource, kvDoc) if err != nil { openlog.Error("fail to create task") return nil, 0, err } docs[successKVNum] = kvDoc tasks[successKVNum] = task - tombstones[successKVNum] = pkgsync.NewTombstone(domain, project, datasource.ConfigResource, + tombstones[successKVNum] = sync.NewTombstone(domain, project, datasource.ConfigResource, datasource.TombstoneID(kvDoc)) successKVNum++ } @@ -465,10 +448,6 @@ func txnFindManyAndDelete(ctx context.Context, kvIDs []string, project, domain s })) return nil, 0, err } - // 删除kv时,直接重建kvIdFuzzyCache - if cacheEnabled() { - kvCache.kvIDFuzzyCache.Clear() - } return docs, int64(successKVNum), nil } @@ -546,43 +525,19 @@ func (s *Dao) listData(ctx context.Context, project, domain string, options ...d return nil, opts, err } - if cacheEnabled() { - return listDataByCache(ctx, project, domain, opts, regex) - } - - result, err := matchLabelsSearch(ctx, domain, project, regex, opts) - if err != nil { - openlog.Error("list kv failed: " + err.Error()) - return nil, opts, err - } - - return result, opts, nil -} - -func listDataByCache(ctx context.Context, project string, domain string, opts datasource.FindOptions, regex *regexp.Regexp) (*model.KVResponse, datasource.FindOptions, error) { - req := &CacheSearchReq{ - Domain: domain, - Project: project, - Opts: &opts, - Regex: regex, - } - if opts.ExactLabels { - result, err := Search(ctx, req) - if err == nil { + if Enabled() { + result, useCache, err := Search(ctx, &CacheSearchReq{ + Domain: domain, + Project: project, + Opts: &opts, + Regex: regex, + }) + if useCache && err == nil { return result, opts, nil } - openlog.Warn("using cache to search kv failed: " + err.Error()) - } else { - cacheKey := kvCache.GetCacheKey(domain, project, opts.Labels) - kvIdSet, ok := kvCache.LoadKvIDSetByFuzzyCache(cacheKey) - if ok { - result, err := getKvDocsByIds(ctx, req, kvIdSet) - if err == nil { - return result, opts, nil - } - openlog.Warn("using fuzzy cache to search kv failed: " + err.Error()) + if useCache && err != nil { + openlog.Error("using cache to search kv failed: " + err.Error()) } - openlog.Info("using fuzzy cache to search kv not hit") } result, err := matchLabelsSearch(ctx, domain, project, regex, opts) @@ -591,16 +546,6 @@ func listDataByCache(ctx context.Context, project string, domain string, opts da return nil, opts, err } - if opts.ExactLabels { - return result, opts, nil - } - - kvIdSet := new(sync.Map) - for _, kv := range result.Data { - kvIdSet.Store(kv.ID, struct{}{}) - } - cacheKey := kvCache.GetCacheKey(domain, project, opts.Labels) - kvCache.kvIDFuzzyCache.Set(cacheKey, kvIdSet, int64(result.Total)) return result, opts, nil } @@ -628,6 +573,9 @@ func matchLabelsSearch(ctx context.Context, domain, project string, regex *regex result.Data = append(result.Data, &doc) result.Total++ + if IsUniqueFind(opts) { + break + } } return result, nil
