Skip to content

Commit 18831d4

Browse files
committed
"show proxy config;" support
1 parent 0803985 commit 18831d4

File tree

5 files changed

+109
-4
lines changed

5 files changed

+109
-4
lines changed

client/db.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package client
22

33
import (
44
"container/list"
5+
"fmt"
56
. "github.com/siddontang/mixer/mysql"
67
"sync"
78
)
@@ -35,6 +36,11 @@ func (db *DB) Addr() string {
3536
return db.addr
3637
}
3738

39+
func (db *DB) String() string {
40+
return fmt.Sprintf("%s:%s@%s/%s?idleConns=%v&conns=%v",
41+
db.user, db.password, db.addr, db.db, db.idleConns, db.conns.Len())
42+
}
43+
3844
func (db *DB) Close() error {
3945
db.Lock()
4046

proxy/conn_resultset.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ func (c *Conn) buildResultset(names []string, values [][]interface{}) (*Resultse
6666

6767
r.Fields = make([]*Field, len(names))
6868

69-
var row []byte
7069
var b []byte
7170
var err error
7271

@@ -75,7 +74,7 @@ func (c *Conn) buildResultset(names []string, values [][]interface{}) (*Resultse
7574
return nil, fmt.Errorf("row %d has %d column not equal %d", i, len(vs), len(r.Fields))
7675
}
7776

78-
row = row[0:0]
77+
var row []byte
7978
for j, value := range vs {
8079
if i == 0 {
8180
field := &Field{}

proxy/conn_show.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package proxy
22

33
import (
44
"fmt"
5+
"github.com/siddontang/go-log/log"
56
"github.com/siddontang/mixer/hack"
67
. "github.com/siddontang/mixer/mysql"
78
"github.com/siddontang/mixer/sqlparser"
89
"sort"
910
"strings"
11+
"time"
1012
)
1113

1214
func (c *Conn) handleShow(sql string, stmt *sqlparser.Show) error {
@@ -17,6 +19,8 @@ func (c *Conn) handleShow(sql string, stmt *sqlparser.Show) error {
1719
r, err = c.handleShowDatabases()
1820
case "tables":
1921
r, err = c.handleShowTables(sql, stmt)
22+
case "proxy":
23+
r, err = c.handleShowProxy(sql, stmt)
2024
default:
2125
err = fmt.Errorf("unsupport show %s now", sql)
2226
}
@@ -85,6 +89,95 @@ func (c *Conn) handleShowTables(sql string, stmt *sqlparser.Show) (*Resultset, e
8589
return c.buildSimpleShowResultset(values, fmt.Sprintf("Tables_in_%s", s.db))
8690
}
8791

92+
func (c *Conn) handleShowProxy(sql string, stmt *sqlparser.Show) (*Resultset, error) {
93+
var err error
94+
var r *Resultset
95+
switch strings.ToLower(stmt.Key) {
96+
case "config":
97+
r, err = c.handleShowProxyConfig()
98+
case "status":
99+
r, err = c.handleShowProxyStatus(sql, stmt)
100+
default:
101+
err = fmt.Errorf("Unsupport show proxy [%v] yet, just support [config|status] now.", stmt.Key)
102+
log.Warn(err.Error())
103+
return nil, err
104+
}
105+
return r, err
106+
}
107+
108+
func (c *Conn) handleShowProxyConfig() (*Resultset, error) {
109+
var names []string = []string{"Section", "Key", "Value"}
110+
var rows [][]string
111+
const (
112+
Section = 0
113+
Key = 1
114+
Value = 2
115+
Column = 3
116+
)
117+
118+
rows = append(rows, []string{"Global_Config", "Addr", c.server.cfg.Addr})
119+
rows = append(rows, []string{"Global_Config", "User", c.server.cfg.User})
120+
rows = append(rows, []string{"Global_Config", "Password", c.server.cfg.Password})
121+
rows = append(rows, []string{"Global_Config", "LogLevel", c.server.cfg.LogLevel})
122+
123+
rows = append(rows, []string{"Global_Config", "Schemas_Count", fmt.Sprintf("%d", len(c.server.schemas))})
124+
rows = append(rows, []string{"Global_Config", "Nodes_Count", fmt.Sprintf("%d", len(c.server.nodes))})
125+
126+
// var row []string = make([]string, Column)
127+
128+
for db, schema := range c.server.schemas {
129+
rows = append(rows, []string{"Schemas", "DB", db})
130+
131+
var nodeNames []string
132+
var nodeRows [][]string
133+
for name, node := range schema.nodes {
134+
nodeNames = append(nodeNames, name)
135+
var nodeSection = fmt.Sprintf("Schemas[%s]-Node[ %v ]", db, name)
136+
137+
if node.master != nil {
138+
nodeRows = append(nodeRows, []string{nodeSection, "Master", node.master.String()})
139+
}
140+
if node.masterBackup != nil {
141+
nodeRows = append(nodeRows, []string{nodeSection, "Master_Backup", node.masterBackup.String()})
142+
}
143+
144+
if node.slave != nil {
145+
nodeRows = append(nodeRows, []string{nodeSection, "Slave", node.slave.String()})
146+
}
147+
nodeRows = append(nodeRows, []string{nodeSection, "Last_Master_Ping", fmt.Sprintf("%v", time.Unix(node.lastMasterPing, 0))})
148+
149+
nodeRows = append(nodeRows, []string{nodeSection, "Last_Slave_Ping", fmt.Sprintf("%v", time.Unix(node.lastSlavePing, 0))})
150+
151+
nodeRows = append(nodeRows, []string{nodeSection, "down_after_noalive", fmt.Sprintf("%v", node.downAfterNoAlive)})
152+
153+
}
154+
rows = append(rows, []string{fmt.Sprintf("Schemas[%s]", db), "Nodes_List", strings.Join(nodeNames, ",")})
155+
rows = append(rows, []string{fmt.Sprintf("Schemas[%s]", db), "Rule", schema.rule.String()})
156+
157+
for i := range nodeRows {
158+
rows = append(rows, nodeRows[i])
159+
}
160+
161+
}
162+
163+
var values [][]interface{} = make([][]interface{}, len(rows))
164+
for i := range rows {
165+
values[i] = make([]interface{}, Column)
166+
for j := range rows[i] {
167+
values[i][j] = rows[i][j]
168+
}
169+
}
170+
171+
var r, err = c.buildResultset(names, values)
172+
173+
return r, err
174+
}
175+
176+
func (c *Conn) handleShowProxyStatus(sql string, stmt *sqlparser.Show) (*Resultset, error) {
177+
// TODO: handle like_or_where expr
178+
return nil, nil
179+
}
180+
88181
func (c *Conn) buildSimpleShowResultset(values []interface{}, name string) (*Resultset, error) {
89182

90183
r := new(Resultset)

proxy/server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ func NewServer(cfg *config.Config) (*Server, error) {
5353
return nil, err
5454
}
5555

56+
log.Info("Server run MySql Protocol Listen(%s) at [%s]", netProto, s.addr)
5657
return s, nil
5758
}
5859

router/router.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package router
33
import (
44
"fmt"
55
"github.com/siddontang/mixer/config"
6+
"strings"
67
)
78

89
type Rule struct {
@@ -26,7 +27,7 @@ func (r *Rule) FindNodeIndex(key interface{}) int {
2627
}
2728

2829
func (r *Rule) String() string {
29-
return fmt.Sprintf("%s:%s", r.DB, r.Table)
30+
return fmt.Sprintf("%s.%s(%s)?shard=%s", r.DB, r.Table, r.Key, r.Type)
3031
}
3132

3233
type DBRules struct {
@@ -56,7 +57,12 @@ func (r *DBRules) GetRule(table string) *Rule {
5657
}
5758

5859
func (r *DBRules) String() string {
59-
return r.DB
60+
var rules []string
61+
62+
for _, rule := range r.Rules {
63+
rules = append(rules, rule.String())
64+
}
65+
return strings.Join(rules, "; ")
6066
}
6167

6268
type Router struct {

0 commit comments

Comments
 (0)