-
Notifications
You must be signed in to change notification settings - Fork 219
Expand file tree
/
Copy pathspanner.go
More file actions
153 lines (132 loc) · 3.51 KB
/
spanner.go
File metadata and controls
153 lines (132 loc) · 3.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/*
* Radon
*
* Copyright 2018 The Radon Authors.
* Code is licensed under the GPLv3.
*
*/
package proxy
import (
"audit"
"backend"
"config"
"monitor"
"plugins"
"router"
"sync"
"xbase"
"xbase/sync2"
"github.com/xelabs/go-mysqlstack/driver"
"github.com/xelabs/go-mysqlstack/xlog"
)
// Spanner tuple.
type Spanner struct {
log *xlog.Log
audit *audit.Audit
conf *config.Config
router *router.Router
scatter *backend.Scatter
sessions *Sessions
iptable *IPTable
throttle *xbase.Throttle
plugins *plugins.Plugin
diskChecker *DiskCheck
manager *Manager
readonly sync2.AtomicBool
mu sync.RWMutex
serverVersion string
}
// NewSpanner creates a new spanner.
func NewSpanner(log *xlog.Log, conf *config.Config,
iptable *IPTable, router *router.Router, scatter *backend.Scatter, sessions *Sessions, audit *audit.Audit, throttle *xbase.Throttle, plugins *plugins.Plugin, serverVersion string) *Spanner {
return &Spanner{
log: log,
conf: conf,
audit: audit,
iptable: iptable,
router: router,
scatter: scatter,
sessions: sessions,
throttle: throttle,
plugins: plugins,
serverVersion: serverVersion,
}
}
// Init used to init the async worker.
func (spanner *Spanner) Init() error {
log := spanner.log
conf := spanner.conf
diskChecker := NewDiskCheck(log, conf.Audit.LogDir)
if err := diskChecker.Init(); err != nil {
return err
}
spanner.diskChecker = diskChecker
mgr := NewManager(log, spanner.sessions, conf.Proxy)
if err := mgr.Init(); err != nil {
return err
}
spanner.manager = mgr
return nil
}
// Close used to close spanner.
func (spanner *Spanner) Close() error {
spanner.diskChecker.Close()
spanner.manager.Close()
spanner.log.Info("spanner.closed...")
return nil
}
// ReadOnly returns the readonly or not.
func (spanner *Spanner) ReadOnly() bool {
return spanner.readonly.Get()
}
// SetReadOnly used to set readonly.
func (spanner *Spanner) SetReadOnly(val bool) {
spanner.readonly.Set(val)
}
// NewSession impl.
func (spanner *Spanner) NewSession(s *driver.Session) {
spanner.sessions.Add(s)
}
// SessionClosed impl.
func (spanner *Spanner) SessionClosed(s *driver.Session) {
spanner.sessions.Remove(s)
}
// SessionInc increase client connection metrics, it need the user is assigned
func (spanner *Spanner) SessionInc(s *driver.Session) {
monitor.ClientConnectionInc(s.User())
}
// SessionDec decrease client connection metrics.
func (spanner *Spanner) SessionDec(s *driver.Session) {
monitor.ClientConnectionDec(s.User())
}
// ServerVersion impl -- returns server version of Radon when greeting.
func (spanner *Spanner) ServerVersion() string {
spanner.mu.RLock()
defer spanner.mu.RUnlock()
if spanner.serverVersion == "" {
spanner.serverVersion = defaultMySQLVersionStr
}
return spanner.serverVersion
}
// SetServerVersion used to set serverVersion.
func (spanner *Spanner) SetServerVersion() {
version, err := getBackendVersion(spanner)
if err != nil {
return
}
// get the org ServerVersion and tag
orgServerVersion, err := parseVersionString(spanner.ServerVersion(), true)
if version.equal(orgServerVersion) {
return
}
version.Tag = orgServerVersion.Tag
spanner.mu.Lock()
defer spanner.mu.Unlock()
spanner.serverVersion = version.toStr()
}
func (spanner *Spanner) isTwoPC() bool {
return spanner.conf.Proxy.TwopcEnable
}
func (spanner *Spanner) isAutocommitFalseIsTxn() bool {
return spanner.conf.Proxy.AutocommitFalseIsTxn
}