@@ -18,6 +18,7 @@ import (
18
18
"github.com/pg-sharding/spqr/router/parser"
19
19
"github.com/pg-sharding/spqr/router/pgcopy"
20
20
"github.com/pg-sharding/spqr/router/rmeta"
21
+ "github.com/pg-sharding/spqr/router/server"
21
22
22
23
"github.com/pg-sharding/lyx/lyx"
23
24
)
@@ -27,6 +28,24 @@ type QueryStateExecutorImpl struct {
27
28
28
29
txStatus txstatus.TXStatus
29
30
cl client.RouterClient
31
+
32
+ savedBegin * pgproto3.Query
33
+ }
34
+
35
+ // Deploy implements QueryStateExecutor.
36
+ func (s * QueryStateExecutorImpl ) Deploy (server server.Server ) error {
37
+ if s .txStatus == txstatus .TXIDLE {
38
+ return nil
39
+ }
40
+
41
+ for _ , sh := range server .Datashards () {
42
+ if err := sh .Send (s .savedBegin ); err != nil {
43
+ s .txStatus = txstatus .TXERR
44
+ return err
45
+ }
46
+ }
47
+
48
+ return nil
30
49
}
31
50
32
51
func (s * QueryStateExecutorImpl ) SetTxStatus (status txstatus.TXStatus ) {
@@ -41,12 +60,10 @@ func (s *QueryStateExecutorImpl) TxStatus() txstatus.TXStatus {
41
60
42
61
func (s * QueryStateExecutorImpl ) ExecBegin (rst RelayStateMgr , query string , st * parser.ParseStateTXBegin ) error {
43
62
// explicitly set silent query message, as it can differ from query begin in xporot
44
- rst .AddSilentQuery (& pgproto3.Query {
45
- String : query ,
46
- })
47
63
48
64
s .SetTxStatus (txstatus .TXACT )
49
65
s .cl .StartTx ()
66
+ s .savedBegin = & pgproto3.Query {String : query }
50
67
51
68
spqrlog .Zero .Debug ().Msg ("start new transaction" )
52
69
@@ -59,7 +76,6 @@ func (s *QueryStateExecutorImpl) ExecBegin(rst RelayStateMgr, query string, st *
59
76
}
60
77
}
61
78
return rst .Client ().ReplyCommandComplete ("BEGIN" )
62
-
63
79
}
64
80
65
81
// query in commit query. maybe commit or commit `name`
@@ -73,14 +89,16 @@ func (s *QueryStateExecutorImpl) ExecCommit(rst RelayStateMgr, query string) err
73
89
rst .Flush ()
74
90
return nil
75
91
}
76
- rst . AddQuery ( & pgproto3. Query {
77
- String : query ,
78
- })
79
- err := rst . ProcessMessageBuf ( true , true )
80
- if err == nil {
81
- rst . Client (). CommitActiveSet ()
92
+
93
+ for _ , sh := range rst . Client (). Server (). Datashards () {
94
+ if err := sh . Send ( & pgproto3. Query { String : query }); err != nil {
95
+ s . txStatus = txstatus . TXERR
96
+ return err
97
+ }
82
98
}
83
- return err
99
+
100
+ rst .Client ().CommitActiveSet ()
101
+ return nil
84
102
}
85
103
86
104
/* TODO: proper support for rollback to savepoint */
@@ -94,14 +112,16 @@ func (s *QueryStateExecutorImpl) ExecRollback(rst RelayStateMgr, query string) e
94
112
rst .Flush ()
95
113
return nil
96
114
}
97
- rst . AddQuery ( & pgproto3. Query {
98
- String : query ,
99
- })
100
- err := rst . ProcessMessageBuf ( true , true )
101
- if err == nil {
102
- s . cl . Rollback ()
115
+
116
+ for _ , sh := range rst . Client (). Server (). Datashards () {
117
+ if err := sh . Send ( & pgproto3. Query { String : query }); err != nil {
118
+ s . txStatus = txstatus . TXERR
119
+ return err
120
+ }
103
121
}
104
- return err
122
+
123
+ s .cl .Rollback ()
124
+ return nil
105
125
}
106
126
107
127
func (s * QueryStateExecutorImpl ) ExecSet (rst RelayStateMgr , query string , name , value string ) error {
0 commit comments