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

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


The following commit(s) were added to refs/heads/master by this push:
     new e50a9e7  save syncdata to etcd
     new 8415d94  Merge pull request #560 from ChinX/master
e50a9e7 is described below

commit e50a9e72b693bb3a01f530e97f91abc9f8a0d7b2
Author: chinx <c54948...@126.com>
AuthorDate: Fri Jun 21 10:02:18 2019 +0800

    save syncdata to etcd
---
 syncer/etcd/storage.go | 42 ++++++++++++++++++++++++++++++++++++------
 1 file changed, 36 insertions(+), 6 deletions(-)

diff --git a/syncer/etcd/storage.go b/syncer/etcd/storage.go
index 36995a3..5d45190 100644
--- a/syncer/etcd/storage.go
+++ b/syncer/etcd/storage.go
@@ -32,6 +32,8 @@ import (
 var (
        // mappingsKey the key of instances mapping in etcd
        mappingsKey = "/syncer/v1/mappings"
+       // servicesKey the key of service in etcd
+       servicesKey = "/syncer/v1/services"
 )
 
 type storage struct {
@@ -65,16 +67,12 @@ func (s *storage) getPrefixKey(prefix string, handler 
func(key, val []byte) (nex
 
 // UpdateData Update data to storage
 func (s *storage) UpdateData(data *pb.SyncData) {
-       s.lock.Lock()
-       s.data = data
-       s.lock.Unlock()
+       s.UpdateServices(data.Services)
 }
 
 // GetData Get data from storage
 func (s *storage) GetData() (data *pb.SyncData) {
-       s.lock.RLock()
-       data = s.data
-       s.lock.RUnlock()
+       data = &pb.SyncData{Services: s.GetServices()}
        return
 }
 
@@ -94,6 +92,38 @@ next:
        }
 }
 
+// UpdateServices Update services to storage
+func (s *storage) UpdateServices(services []*pb.SyncService) {
+       for _, val := range services {
+               key := servicesKey + "/" + val.Service.ServiceId
+               data, err := proto.Marshal(val)
+               if err != nil {
+                       log.Errorf(err, "Proto marshal failed: %s", err)
+                       continue
+               }
+               _, err = s.client.Put(context.Background(), key, 
util.BytesToStringWithNoCopy(data))
+               if err != nil {
+                       log.Errorf(err, "Save service to etcd failed: %s", err)
+               }
+       }
+}
+
+// GetServices Get services from storage
+func (s *storage) GetServices() (services []*pb.SyncService) {
+       services = make([]*pb.SyncService, 0, 10)
+       s.getPrefixKey(servicesKey, func(key, val []byte) (next bool) {
+               next = true
+               item := &pb.SyncService{}
+               if err := proto.Unmarshal(val, item); err != nil {
+                       log.Errorf(err, "Proto unmarshal '%s' failed: %s", val, 
err)
+                       return
+               }
+               services = append(services, item)
+               return
+       })
+       return
+}
+
 // UpdateMapByCluster update map to storage by clusterName of other cluster
 func (s *storage) UpdateMapByCluster(clusterName string, mapping 
pb.SyncMapping) {
        newMaps := make(pb.SyncMapping, 0, len(mapping))

Reply via email to