You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ti...@apache.org on 2020/03/02 08:59:23 UTC

[servicecomb-kie] branch master updated: increase revision counter when delete key (#106)

This is an automated email from the ASF dual-hosted git repository.

tianxiaoliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-kie.git


The following commit(s) were added to refs/heads/master by this push:
     new 5ed2990  increase revision counter when delete key (#106)
5ed2990 is described below

commit 5ed299043a79b878426851dcc1a455093a914f7a
Author: zhulijian <zh...@huawei.com>
AuthorDate: Mon Mar 2 16:59:12 2020 +0800

    increase revision counter when delete key (#106)
---
 server/pubsub/struct.go               |  9 ++++-
 server/resource/v1/kv_resource.go     | 24 ++++++++++++--
 server/service/mongo/kv/kv_dao.go     | 15 +++++++++
 server/service/mongo/kv/kv_service.go | 62 ++++++++---------------------------
 server/service/mongo/kv/tool.go       | 61 ++++++++++++++++++++++++++++++++++
 server/service/options.go             |  8 +++++
 6 files changed, 128 insertions(+), 51 deletions(-)

diff --git a/server/pubsub/struct.go b/server/pubsub/struct.go
index 1e8cdae..df67116 100644
--- a/server/pubsub/struct.go
+++ b/server/pubsub/struct.go
@@ -20,9 +20,16 @@ package pubsub
 import (
 	"encoding/json"
 	"errors"
-	"github.com/apache/servicecomb-kie/pkg/common"
 	"reflect"
 	"strings"
+
+	"github.com/apache/servicecomb-kie/pkg/common"
+)
+
+// const
+const (
+	ActionPut    = "put"
+	ActionDelete = "delete"
 )
 
 //KVChangeEvent is event between kie nodes, and broadcast by serf
diff --git a/server/resource/v1/kv_resource.go b/server/resource/v1/kv_resource.go
index 463dfb7..2c36103 100644
--- a/server/resource/v1/kv_resource.go
+++ b/server/resource/v1/kv_resource.go
@@ -72,7 +72,7 @@ func (r *KVResource) Put(context *restful.Context) {
 		Labels:   kv.Labels,
 		Project:  project,
 		DomainID: kv.Domain,
-		Action:   "put",
+		Action:   pubsub.ActionPut,
 	})
 	if err != nil {
 		openlogging.Warn("lost kv change event:" + err.Error())
@@ -326,7 +326,17 @@ func (r *KVResource) Delete(context *restful.Context) {
 		WriteErrResponse(context, http.StatusBadRequest, common.ErrKvIDMustNotEmpty, common.ContentTypeText)
 		return
 	}
-	err := service.KVService.Delete(context.Ctx, kvID, domain.(string), project)
+	result, err := service.KVService.FindKV(context.Ctx, domain.(string), project,
+		service.WithID(kvID))
+	if err != nil && err != service.ErrKeyNotExists {
+		WriteErrResponse(context, http.StatusInternalServerError, err.Error(), common.ContentTypeText)
+		return
+	} else if err == service.ErrKeyNotExists {
+		context.WriteHeader(http.StatusNoContent)
+		return
+	}
+	kv := result[0].Data[0]
+	err = service.KVService.Delete(context.Ctx, kvID, domain.(string), project)
 	if err != nil {
 		openlogging.Error("delete failed ,", openlogging.WithTags(openlogging.Tags{
 			"kvID":  kvID,
@@ -335,6 +345,16 @@ func (r *KVResource) Delete(context *restful.Context) {
 		WriteErrResponse(context, http.StatusInternalServerError, err.Error(), common.ContentTypeText)
 		return
 	}
+	err = pubsub.Publish(&pubsub.KVChangeEvent{
+		Key:      kv.Key,
+		Labels:   kv.Labels,
+		Project:  project,
+		DomainID: domain.(string),
+		Action:   pubsub.ActionDelete,
+	})
+	if err != nil {
+		openlogging.Warn("lost kv change event:" + err.Error())
+	}
 	context.WriteHeader(http.StatusNoContent)
 }
 
diff --git a/server/service/mongo/kv/kv_dao.go b/server/service/mongo/kv/kv_dao.go
index f96114a..9b978db 100644
--- a/server/service/mongo/kv/kv_dao.go
+++ b/server/service/mongo/kv/kv_dao.go
@@ -167,6 +167,10 @@ func findOneKey(ctx context.Context, filter bson.M) ([]*model.KVDoc, error) {
 
 //deleteKV by kvID
 func deleteKV(ctx context.Context, kvID, project, domain string) error {
+	if _, err := counter.ApplyRevision(ctx, domain); err != nil {
+		openlogging.Error(fmt.Sprintf("increase revision failed, the kv [%s] not deleted: [%s]", kvID, err))
+		return err
+	}
 	collection := session.GetDB().Collection(session.CollectionKV)
 	dr, err := collection.DeleteOne(ctx, bson.M{"id": kvID, "project": project, "domain": domain})
 	//check error and delete number
@@ -229,3 +233,14 @@ func findKVByLabelID(ctx context.Context, domain, labelID, key string, project s
 	return findKeys(ctx, filter, true)
 
 }
+
+//findKVByID get kvs by kv id
+func findKVDocByID(ctx context.Context, domain, project, kvID string) (*model.KVDoc, error) {
+	filter := bson.M{"id": kvID, "domain": domain, "project": project}
+	kvs, err := findOneKey(ctx, filter)
+	if err != nil {
+		openlogging.Error(err.Error())
+		return nil, err
+	}
+	return kvs[0], nil
+}
diff --git a/server/service/mongo/kv/kv_service.go b/server/service/mongo/kv/kv_service.go
index 7e95ddd..f828caa 100644
--- a/server/service/mongo/kv/kv_service.go
+++ b/server/service/mongo/kv/kv_service.go
@@ -20,7 +20,6 @@ package kv
 import (
 	"context"
 	"errors"
-	"fmt"
 	"reflect"
 	"time"
 
@@ -35,6 +34,8 @@ import (
 const (
 	MsgFindKvFailed    = "find kv failed, deadline exceeded"
 	MsgFindOneKey      = "find one key"
+	MsgFindOneKeyByID  = "find one key by id"
+	MsgFindMoreKey     = "find more"
 	MsgHitExactLabels  = "hit exact labels"
 	FmtErrFindKvFailed = "can not find kv in %s"
 )
@@ -211,13 +212,21 @@ func (s *Service) FindKV(ctx context.Context, domain string, project string, opt
 		return nil, session.ErrMissingProject
 	}
 
+	if opts.ID != "" {
+		openlogging.Debug(MsgFindOneKeyByID, openlogging.WithTags(openlogging.Tags{
+			"id":     opts.ID,
+			"key":    opts.Key,
+			"labels": opts.Labels,
+		}))
+		return findKVByID(ctx, domain, project, opts.ID)
+	}
+
 	cur, _, err := findKV(ctx, domain, project, opts)
 	if err != nil {
 		return nil, err
 	}
 	defer cur.Close(ctx)
 
-	kvResp := make([]*model.KVResponse, 0)
 	if opts.Depth == 0 && opts.Key != "" {
 		openlogging.Debug(MsgFindOneKey, openlogging.WithTags(
 			map[string]interface{}{
@@ -228,53 +237,10 @@ func (s *Service) FindKV(ctx context.Context, domain string, project string, opt
 		))
 		return cursorToOneKV(ctx, cur, opts.Labels)
 	}
-	openlogging.Debug("find more", openlogging.WithTags(openlogging.Tags{
+	openlogging.Debug(MsgFindMoreKey, openlogging.WithTags(openlogging.Tags{
 		"depth":  opts.Depth,
-		"k":      opts.Key,
+		"key":    opts.Key,
 		"labels": opts.Labels,
 	}))
-	for cur.Next(ctx) {
-		curKV := &model.KVDoc{}
-
-		if err := cur.Decode(curKV); err != nil {
-			openlogging.Error("decode to KVs error: " + err.Error())
-			return nil, err
-		}
-		if (len(curKV.Labels) - len(opts.Labels)) > opts.Depth {
-			//because it is query by labels, so result can not be minus
-			//so many labels,then continue
-			openlogging.Debug("so deep, skip this key")
-			continue
-		}
-		openlogging.Debug(fmt.Sprintf("%v", curKV))
-		var groupExist bool
-		var labelGroup *model.KVResponse
-		for _, labelGroup = range kvResp {
-			if reflect.DeepEqual(labelGroup.LabelDoc.Labels, curKV.Labels) {
-				groupExist = true
-				clearAll(curKV)
-				labelGroup.Data = append(labelGroup.Data, curKV)
-				break
-			}
-
-		}
-		if !groupExist {
-			labelGroup = &model.KVResponse{
-				LabelDoc: &model.LabelDocResponse{
-					Labels:  curKV.Labels,
-					LabelID: curKV.LabelID,
-				},
-				Data: []*model.KVDoc{curKV},
-			}
-			clearAll(curKV)
-			openlogging.Debug("add new label group")
-			kvResp = append(kvResp, labelGroup)
-		}
-
-	}
-	if len(kvResp) == 0 {
-		return nil, service.ErrKeyNotExists
-	}
-	return kvResp, nil
-
+	return findMoreKV(ctx, cur, &opts)
 }
diff --git a/server/service/mongo/kv/tool.go b/server/service/mongo/kv/tool.go
index e3b1bdb..cbeb5af 100644
--- a/server/service/mongo/kv/tool.go
+++ b/server/service/mongo/kv/tool.go
@@ -19,6 +19,7 @@ package kv
 
 import (
 	"context"
+	"fmt"
 	"reflect"
 
 	"github.com/apache/servicecomb-kie/pkg/model"
@@ -68,3 +69,63 @@ func cursorToOneKV(ctx context.Context, cur *mongo.Cursor, labels map[string]str
 	}
 	return nil, service.ErrKeyNotExists
 }
+
+func findKVByID(ctx context.Context, domain, project, kvID string) ([]*model.KVResponse, error) {
+	kvResp := make([]*model.KVResponse, 0)
+	kv, err := findKVDocByID(ctx, domain, project, kvID)
+	if err != nil {
+		return nil, err
+	}
+	kvResp = append(kvResp, &model.KVResponse{
+		Total: 1,
+		Data:  []*model.KVDoc{kv},
+	})
+	return kvResp, nil
+}
+
+func findMoreKV(ctx context.Context, cur *mongo.Cursor, opts *service.FindOptions) ([]*model.KVResponse, error) {
+	kvResp := make([]*model.KVResponse, 0)
+	for cur.Next(ctx) {
+		curKV := &model.KVDoc{}
+
+		if err := cur.Decode(curKV); err != nil {
+			openlogging.Error("decode to KVs error: " + err.Error())
+			return nil, err
+		}
+		if (len(curKV.Labels) - len(opts.Labels)) > opts.Depth {
+			//because it is query by labels, so result can not be minus
+			//so many labels,then continue
+			openlogging.Debug("so deep, skip this key")
+			continue
+		}
+		openlogging.Debug(fmt.Sprintf("%v", curKV))
+		var groupExist bool
+		var labelGroup *model.KVResponse
+		for _, labelGroup = range kvResp {
+			if reflect.DeepEqual(labelGroup.LabelDoc.Labels, curKV.Labels) {
+				groupExist = true
+				clearAll(curKV)
+				labelGroup.Data = append(labelGroup.Data, curKV)
+				break
+			}
+
+		}
+		if !groupExist {
+			labelGroup = &model.KVResponse{
+				LabelDoc: &model.LabelDocResponse{
+					Labels:  curKV.Labels,
+					LabelID: curKV.LabelID,
+				},
+				Data: []*model.KVDoc{curKV},
+			}
+			clearAll(curKV)
+			openlogging.Debug("add new label group")
+			kvResp = append(kvResp, labelGroup)
+		}
+
+	}
+	if len(kvResp) == 0 {
+		return nil, service.ErrKeyNotExists
+	}
+	return kvResp, nil
+}
diff --git a/server/service/options.go b/server/service/options.go
index bca3a90..859ea3d 100644
--- a/server/service/options.go
+++ b/server/service/options.go
@@ -34,6 +34,7 @@ type FindOptions struct {
 	ExactLabels bool
 	Status      string
 	Depth       int
+	ID          string
 	Key         string
 	Labels      map[string]string
 	LabelID     string
@@ -53,6 +54,13 @@ func WithExactLabels() FindOption {
 	}
 }
 
+//WithID find by kvID
+func WithID(id string) FindOption {
+	return func(o *FindOptions) {
+		o.ID = id
+	}
+}
+
 //WithKey find by key
 func WithKey(key string) FindOption {
 	return func(o *FindOptions) {