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/03 01:48:22 UTC

[servicecomb-kie] branch master updated: topic support none label cases (#107)

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 959a309  topic support none label cases (#107)
959a309 is described below

commit 959a30975b44388cfdfbf96e10743013ab8b2f9c
Author: zhulijian <zh...@huawei.com>
AuthorDate: Tue Mar 3 09:48:12 2020 +0800

    topic support none label cases (#107)
---
 pkg/stringutil/string_util.go                      |  7 +++-
 pkg/{stringutil/string_util.go => util/util.go}    | 32 +++++-------------
 .../string_util.go => util/util_test.go}           | 39 +++++++++++-----------
 server/pubsub/event_handler.go                     |  2 +-
 server/pubsub/struct.go                            | 16 +++++++--
 server/service/mongo/kv/kv_service.go              |  4 +--
 6 files changed, 50 insertions(+), 50 deletions(-)

diff --git a/pkg/stringutil/string_util.go b/pkg/stringutil/string_util.go
index 6f01d14..0e0ab86 100644
--- a/pkg/stringutil/string_util.go
+++ b/pkg/stringutil/string_util.go
@@ -22,10 +22,15 @@ import (
 	"strings"
 )
 
+const (
+	// LabelNone is the format string when the map is none
+	LabelNone = "none"
+)
+
 //FormatMap format map to string
 func FormatMap(m map[string]string) string {
 	if len(m) == 0 {
-		return "none"
+		return LabelNone
 	}
 	sb := strings.Builder{}
 	s := make([]string, 0, len(m))
diff --git a/pkg/stringutil/string_util.go b/pkg/util/util.go
similarity index 64%
copy from pkg/stringutil/string_util.go
copy to pkg/util/util.go
index 6f01d14..29eb39e 100644
--- a/pkg/stringutil/string_util.go
+++ b/pkg/util/util.go
@@ -15,31 +15,15 @@
  * limitations under the License.
  */
 
-package stringutil
+package util
 
-import (
-	"sort"
-	"strings"
-)
+import "reflect"
 
-//FormatMap format map to string
-func FormatMap(m map[string]string) string {
-	if len(m) == 0 {
-		return "none"
+//IsEquivalentLabel compares whether two labels are equal.
+//In particular, if one is nil and another is an empty map, it return true
+func IsEquivalentLabel(x, y map[string]string) bool {
+	if len(x) == 0 && len(y) == 0 {
+		return true
 	}
-	sb := strings.Builder{}
-	s := make([]string, 0, len(m))
-	for k := range m {
-		s = append(s, k)
-	}
-	sort.Strings(s)
-	for i, k := range s {
-		sb.WriteString(k)
-		sb.WriteString("=")
-		sb.WriteString(m[k])
-		if i != (len(s) - 1) {
-			sb.WriteString("::")
-		}
-	}
-	return sb.String()
+	return reflect.DeepEqual(x, y)
 }
diff --git a/pkg/stringutil/string_util.go b/pkg/util/util_test.go
similarity index 57%
copy from pkg/stringutil/string_util.go
copy to pkg/util/util_test.go
index 6f01d14..a98e0ed 100644
--- a/pkg/stringutil/string_util.go
+++ b/pkg/util/util_test.go
@@ -15,31 +15,30 @@
  * limitations under the License.
  */
 
-package stringutil
+package util_test
 
 import (
-	"sort"
-	"strings"
+	"testing"
+
+	"github.com/apache/servicecomb-kie/pkg/util"
+	"github.com/stretchr/testify/assert"
 )
 
-//FormatMap format map to string
-func FormatMap(m map[string]string) string {
-	if len(m) == 0 {
-		return "none"
+func TestIsEquivalentLabel(t *testing.T) {
+	var m1 map[string]string
+	m2 := make(map[string]string)
+	m3 := map[string]string{
+		"foo": "bar",
 	}
-	sb := strings.Builder{}
-	s := make([]string, 0, len(m))
-	for k := range m {
-		s = append(s, k)
+	m4 := map[string]string{
+		"foo": "bar",
 	}
-	sort.Strings(s)
-	for i, k := range s {
-		sb.WriteString(k)
-		sb.WriteString("=")
-		sb.WriteString(m[k])
-		if i != (len(s) - 1) {
-			sb.WriteString("::")
-		}
+	m5 := map[string]string{
+		"bar": "foo",
 	}
-	return sb.String()
+	assert.Equal(t, util.IsEquivalentLabel(m1, m1), true)
+	assert.Equal(t, util.IsEquivalentLabel(m1, m2), true)
+	assert.Equal(t, util.IsEquivalentLabel(m2, m3), false)
+	assert.Equal(t, util.IsEquivalentLabel(m3, m4), true)
+	assert.Equal(t, util.IsEquivalentLabel(m3, m5), false)
 }
diff --git a/server/pubsub/event_handler.go b/server/pubsub/event_handler.go
index 941e143..7b6ebca 100644
--- a/server/pubsub/event_handler.go
+++ b/server/pubsub/event_handler.go
@@ -49,7 +49,7 @@ func handleKVEvent(e serf.Event) {
 	topics.Range(func(key, value interface{}) bool { //range all topics
 		t, err := ParseTopicString(key.(string))
 		if err != nil {
-			openlogging.Error("can not parse topic:" + key.(string))
+			openlogging.Error("can not parse topic " + key.(string) + ": " + err.Error())
 			return true
 		}
 		if t.Match(ke) {
diff --git a/server/pubsub/struct.go b/server/pubsub/struct.go
index df67116..dd7d156 100644
--- a/server/pubsub/struct.go
+++ b/server/pubsub/struct.go
@@ -20,10 +20,11 @@ package pubsub
 import (
 	"encoding/json"
 	"errors"
-	"reflect"
 	"strings"
 
 	"github.com/apache/servicecomb-kie/pkg/common"
+	"github.com/apache/servicecomb-kie/pkg/stringutil"
+	"github.com/apache/servicecomb-kie/pkg/util"
 )
 
 // const
@@ -67,6 +68,9 @@ func ParseTopicString(s string) (*Topic, error) {
 	if err != nil {
 		return nil, err
 	}
+	if t.LabelsFormat == stringutil.LabelNone {
+		return t, nil
+	}
 	ls := strings.Split(t.LabelsFormat, "::")
 	if len(ls) != 0 {
 		for _, l := range ls {
@@ -81,6 +85,11 @@ func ParseTopicString(s string) (*Topic, error) {
 }
 
 //Match compare event with topic
+//If the match type is set to exact in long pulling request, only update request with exactly
+//the same label of pulling request will match the request and will trigger an immediate return.
+//
+//If the match type is not set, it will be matched when pulling request labels is equal to
+//update request labels or a subset of it.
 func (t *Topic) Match(event *KVChangeEvent) bool {
 	match := false
 	if t.Key != "" {
@@ -89,10 +98,13 @@ func (t *Topic) Match(event *KVChangeEvent) bool {
 		}
 	}
 	if t.MatchType == common.PatternExact {
-		if !reflect.DeepEqual(t.Labels, event.Labels) {
+		if !util.IsEquivalentLabel(t.Labels, event.Labels) {
 			return false
 		}
 	}
+	if len(t.Labels) == 0 {
+		return true
+	}
 	for k, v := range t.Labels {
 		if event.Labels[k] != v {
 			return false
diff --git a/server/service/mongo/kv/kv_service.go b/server/service/mongo/kv/kv_service.go
index f828caa..99a11c8 100644
--- a/server/service/mongo/kv/kv_service.go
+++ b/server/service/mongo/kv/kv_service.go
@@ -20,10 +20,10 @@ package kv
 import (
 	"context"
 	"errors"
-	"reflect"
 	"time"
 
 	"github.com/apache/servicecomb-kie/pkg/model"
+	"github.com/apache/servicecomb-kie/pkg/util"
 	"github.com/apache/servicecomb-kie/server/service"
 	"github.com/apache/servicecomb-kie/server/service/mongo/label"
 	"github.com/apache/servicecomb-kie/server/service/mongo/session"
@@ -180,7 +180,7 @@ func (s *Service) List(ctx context.Context, domain, project string, options ...s
 			return nil, err
 		}
 		if opts.ExactLabels {
-			if !reflect.DeepEqual(opts.Labels, curKV.Labels) {
+			if !util.IsEquivalentLabel(opts.Labels, curKV.Labels) {
 				continue
 			}
 		}