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 (