You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by mi...@apache.org on 2023/05/16 11:11:48 UTC

[shardingsphere-on-cloud] branch main updated: fix(pitr): fix pitr restore metadata failed

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

miaoliyao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/shardingsphere-on-cloud.git


The following commit(s) were added to refs/heads/main by this push:
     new 7fc4746  fix(pitr): fix pitr restore metadata failed
     new eb4dbf8  Merge pull request #365 from Xu-Wentao/pitr
7fc4746 is described below

commit 7fc4746fe445ae43c5c2371130edb202015c6d8c
Author: xuwentao <cu...@yahoo.com>
AuthorDate: Tue May 16 18:40:20 2023 +0800

    fix(pitr): fix pitr restore metadata failed
---
 .gitignore                                         |  2 +
 pitr/cli/go.mod                                    |  1 +
 pitr/cli/go.sum                                    |  2 +
 pitr/cli/internal/pkg/shardingsphere-proxy.go      |  9 +++-
 pitr/cli/internal/pkg/shardingsphere-proxy_test.go | 62 ++++++++++++++++++++++
 5 files changed, 74 insertions(+), 2 deletions(-)

diff --git a/.gitignore b/.gitignore
index b379e5e..2e6c123 100644
--- a/.gitignore
+++ b/.gitignore
@@ -38,3 +38,5 @@ pitr/agent/agent
 pitr/agent/vendor/
 pitr/cli/vendor/
 pitr/cli/gs_pitr
+pitr/agent/pitr-agent
+
diff --git a/pitr/cli/go.mod b/pitr/cli/go.mod
index 8d5a5f2..45b52cf 100644
--- a/pitr/cli/go.mod
+++ b/pitr/cli/go.mod
@@ -5,6 +5,7 @@ go 1.20
 require (
 	bou.ke/monkey v1.0.2
 	gitee.com/opengauss/openGauss-connector-go-pq v1.0.4
+	github.com/DATA-DOG/go-sqlmock v1.5.0
 	github.com/golang/mock v1.6.0
 	github.com/google/uuid v1.3.0
 	github.com/jedib0t/go-pretty/v6 v6.4.6
diff --git a/pitr/cli/go.sum b/pitr/cli/go.sum
index c85685e..329499b 100644
--- a/pitr/cli/go.sum
+++ b/pitr/cli/go.sum
@@ -4,6 +4,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
 gitee.com/opengauss/openGauss-connector-go-pq v1.0.4 h1:npfLM9/QpkmdK+XY9X2pcC2EX5gosyn/6dRDRd2sEJs=
 gitee.com/opengauss/openGauss-connector-go-pq v1.0.4/go.mod h1:2UEp+ug6ls6C0pLfZgBn7VBzBntFUzxJuy+6FlQ7qyI=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
+github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
diff --git a/pitr/cli/internal/pkg/shardingsphere-proxy.go b/pitr/cli/internal/pkg/shardingsphere-proxy.go
index d66a4de..a688da4 100644
--- a/pitr/cli/internal/pkg/shardingsphere-proxy.go
+++ b/pitr/cli/internal/pkg/shardingsphere-proxy.go
@@ -19,6 +19,7 @@ package pkg
 
 import (
 	"database/sql"
+	"encoding/base64"
 	"encoding/json"
 	"fmt"
 
@@ -122,7 +123,11 @@ func (ss *shardingSphereProxy) ExportMetaData() (*model.ClusterInfo, error) {
 	}
 
 	var out model.ClusterInfo
-	if err = json.Unmarshal([]byte(data), &out); err != nil {
+	rawDecodedText, err := base64.StdEncoding.DecodeString(data)
+	if err != nil {
+		return nil, fmt.Errorf("base64 decode return err=%s", err)
+	}
+	if err = json.Unmarshal(rawDecodedText, &out); err != nil {
 		return nil, fmt.Errorf("json unmarshal return err=%s", err)
 	}
 
@@ -203,7 +208,7 @@ func (ss *shardingSphereProxy) ImportMetaData(in *model.ClusterInfo) error {
 		return xerr.NewCliErr(fmt.Sprintf("json marshal,invalid data[in=%+v]", in))
 	}
 
-	_, err = ss.db.Exec(fmt.Sprintf(`IMPORT METADATA '%s';`, marshal))
+	_, err = ss.db.Exec(fmt.Sprintf(`IMPORT METADATA '%s';`, base64.StdEncoding.EncodeToString(marshal)))
 	if err != nil {
 		return xerr.NewCliErr(fmt.Sprintf("import metadata failure,err=%s", err))
 	}
diff --git a/pitr/cli/internal/pkg/shardingsphere-proxy_test.go b/pitr/cli/internal/pkg/shardingsphere-proxy_test.go
index d949161..a4e26fd 100644
--- a/pitr/cli/internal/pkg/shardingsphere-proxy_test.go
+++ b/pitr/cli/internal/pkg/shardingsphere-proxy_test.go
@@ -18,13 +18,75 @@
 package pkg
 
 import (
+	"bou.ke/monkey"
+	"database/sql"
+	"encoding/base64"
+	"encoding/json"
 	"fmt"
+	"github.com/apache/shardingsphere-on-cloud/pitr/cli/internal/pkg/model"
+	"github.com/apache/shardingsphere-on-cloud/pitr/cli/pkg/gsutil"
+	"regexp"
 	"time"
 
+	"github.com/DATA-DOG/go-sqlmock"
 	. "github.com/onsi/ginkgo/v2"
 	. "github.com/onsi/gomega"
 )
 
+var _ = Describe("Test ShardingSphere Proxy With Sqlmock", func() {
+	var (
+		db     *sql.DB
+		dbmock sqlmock.Sqlmock
+		err    error
+		proxy  IShardingSphereProxy
+
+		clusterInfo = &model.ClusterInfo{
+			SnapshotInfo: &model.SnapshotInfo{
+				Csn:        "100",
+				CreateTime: "2023-05-16 18:12:20",
+			},
+			MetaData: model.MetaData{
+				Databases: map[string]string{
+					"sharding_db": "sharding_db",
+				},
+			},
+		}
+	)
+	BeforeEach(func() {
+		db, dbmock, err = sqlmock.New()
+		Expect(err).ShouldNot(HaveOccurred())
+		Expect(db).ShouldNot(BeNil())
+		Expect(dbmock).ShouldNot(BeNil())
+		monkey.Patch(gsutil.Open, func(_, _, _, _ string, _ uint16) (*sql.DB, error) {
+			return db, nil
+		})
+
+		proxy, err = NewShardingSphereProxy("root", "root", "opengauss", "localhost", 13308)
+		Expect(err).To(BeNil())
+	})
+	AfterEach(func() {
+		db.Close()
+	})
+
+	It("export metadata", func() {
+		data, err := json.Marshal(clusterInfo)
+		Expect(err).To(BeNil())
+		encodedData := base64.StdEncoding.EncodeToString(data)
+
+		dbmock.ExpectQuery(regexp.QuoteMeta("EXPORT METADATA;")).WillReturnRows(sqlmock.NewRows([]string{"id", "create_time", "data"}).AddRow("id", "2023-05-16", encodedData))
+		clusterInfo, err := proxy.ExportMetaData()
+		Expect(err).To(BeNil())
+		Expect(clusterInfo).NotTo(BeNil())
+		Expect(clusterInfo.SnapshotInfo.Csn).To(Equal("100"))
+	})
+
+	It("import metadata", func() {
+		dbmock.ExpectExec(regexp.QuoteMeta("IMPORT METADATA")).WillReturnResult(sqlmock.NewResult(1, 1))
+		Expect(proxy.ImportMetaData(clusterInfo)).To(BeNil())
+	})
+
+})
+
 var _ = Describe("IShardingSphereProxy", func() {
 	Context("NewShardingSphereProxy", func() {
 		var (