Skip to content

Commit 03c01e5

Browse files
Dynamic modification of configuration files at the Codis level (OpenAtomFoundation#2110)
* Dynamic modification of configuration files.Check the correctness of the functionality. * Modified some specification issues. * Dynamically modify Codis configuration file and add slow query logs. * Dynamic modification of configuration files at the Codis level
1 parent 5e317d6 commit 03c01e5

7 files changed

Lines changed: 97 additions & 265 deletions

File tree

codis/config/proxy.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,6 @@ session_break_on_failure = false
102102
# Slowlog-log-slower-than(us), from receive command to send response, 0 is allways print slow log
103103
slowlog_log_slower_than = 100000
104104

105-
# set the number of slowlog in memory, max len is 10000000. (0 to disable)
106-
slowlog_max_len = 128000
107-
108105
# Set metrics server (such as http://localhost:28000), proxy will report json formatted metrics to specified server in a predefined period.
109106
metrics_report_server = ""
110107
metrics_report_period = "1s"

codis/pkg/proxy/config.go

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,6 @@ session_break_on_failure = false
118118
# Slowlog-log-slower-than(us), from receive command to send response, 0 is allways print slow log
119119
slowlog_log_slower_than = 100000
120120
121-
# set the number of slowlog in memory, max len is 10000000. (0 to disable)
122-
slowlog_max_len = 128000
123-
124121
# Set metrics server (such as http://localhost:28000), proxy will report json formatted metrics to specified server in a predefined period.
125122
metrics_report_server = ""
126123
metrics_report_period = "1s"
@@ -183,7 +180,6 @@ type Config struct {
183180
SessionBreakOnFailure bool `toml:"session_break_on_failure" json:"session_break_on_failure"`
184181

185182
SlowlogLogSlowerThan int64 `toml:"slowlog_log_slower_than" json:"slowlog_log_slower_than"`
186-
SlowlogMaxLen int64 `toml:"slowlog_max_len" json:"slowlog_max_len"`
187183

188184
MetricsReportServer string `toml:"metrics_report_server" json:"metrics_report_server"`
189185
MetricsReportPeriod timesize.Duration `toml:"metrics_report_period" json:"metrics_report_period"`
@@ -195,7 +191,8 @@ type Config struct {
195191
MetricsReportStatsdServer string `toml:"metrics_report_statsd_server" json:"metrics_report_statsd_server"`
196192
MetricsReportStatsdPeriod timesize.Duration `toml:"metrics_report_statsd_period" json:"metrics_report_statsd_period"`
197193
MetricsReportStatsdPrefix string `toml:"metrics_report_statsd_prefix" json:"metrics_report_statsd_prefix"`
198-
ConfigFileName string `toml:"-" json:"config_file_name"`
194+
195+
ConfigFileName string `toml:"-" json:"config_file_name"`
199196
}
200197

201198
func NewDefaultConfig() *Config {
@@ -315,9 +312,6 @@ func (c *Config) Validate() error {
315312
if c.SlowlogLogSlowerThan < 0 {
316313
return errors.New("invalid slowlog_log_slower_than")
317314
}
318-
if c.SlowlogMaxLen < 0 {
319-
return errors.New("invalid slowlog_max_len")
320-
}
321315

322316
if c.MetricsReportPeriod < 0 {
323317
return errors.New("invalid metrics_report_period")

codis/pkg/proxy/mapper.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,6 @@ func init() {
230230
{"SUNIONSTORE", FlagWrite},
231231
{"SYNC", FlagNotAllow},
232232
{"PCONFIG", 0},
233-
{"PSLOWLOG", 0},
234233
{"TIME", FlagNotAllow},
235234
{"TOUCH", FlagWrite},
236235
{"TTL", 0},

codis/pkg/proxy/proxy.go

Lines changed: 91 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -216,14 +216,98 @@ func (p *Proxy) ConfigGet(key string) *redis.Resp {
216216
p.mu.Lock()
217217
defer p.mu.Unlock()
218218
switch key {
219-
case "proxy_max_clients":
220-
return redis.NewBulkBytes([]byte(strconv.Itoa(p.config.ProxyMaxClients)))
219+
case "jodis":
220+
return redis.NewArray([]*redis.Resp{
221+
redis.NewBulkBytes([]byte("jodis_name")),
222+
redis.NewBulkBytes([]byte(p.config.JodisName)),
223+
redis.NewBulkBytes([]byte("jodis_addr")),
224+
redis.NewBulkBytes([]byte(p.config.JodisAddr)),
225+
redis.NewBulkBytes([]byte("jodis_auth")),
226+
redis.NewBulkBytes([]byte(p.config.JodisAuth)),
227+
redis.NewBulkBytes([]byte("jodis_timeout")),
228+
redis.NewBulkBytes([]byte(p.config.JodisTimeout.Duration().String())),
229+
redis.NewBulkBytes([]byte("jodis_compatible")),
230+
redis.NewBulkBytes([]byte(strconv.FormatBool(p.config.JodisCompatible))),
231+
})
232+
case "proxy":
233+
return redis.NewArray([]*redis.Resp{
234+
redis.NewBulkBytes([]byte("proxy_datacenter")),
235+
redis.NewBulkBytes([]byte(p.config.ProxyDataCenter)),
236+
redis.NewBulkBytes([]byte("proxy_max_clients")),
237+
redis.NewBulkBytes([]byte(strconv.Itoa(p.config.ProxyMaxClients))),
238+
redis.NewBulkBytes([]byte("proxy_max_offheap_size")),
239+
redis.NewBulkBytes([]byte(p.config.ProxyMaxOffheapBytes.HumanString())),
240+
redis.NewBulkBytes([]byte("proxy_heap_placeholder")),
241+
redis.NewBulkBytes([]byte(p.config.ProxyHeapPlaceholder.HumanString())),
242+
})
243+
case "backend_ping_period":
244+
return redis.NewBulkBytes([]byte(p.config.BackendPingPeriod.Duration().String()))
245+
case "backend_buffer_size":
246+
return redis.NewArray([]*redis.Resp{
247+
redis.NewBulkBytes([]byte("backend_recv_bufsize")),
248+
redis.NewBulkBytes([]byte(p.config.BackendRecvBufsize.HumanString())),
249+
redis.NewBulkBytes([]byte("backend_send_bufsize")),
250+
redis.NewBulkBytes([]byte(p.config.BackendSendBufsize.HumanString())),
251+
})
252+
case "backend_timeout":
253+
return redis.NewArray([]*redis.Resp{
254+
redis.NewBulkBytes([]byte("backend_recv_timeout")),
255+
redis.NewBulkBytes([]byte(p.config.BackendRecvTimeout.Duration().String())),
256+
redis.NewBulkBytes([]byte("backend_send_timeout")),
257+
redis.NewBulkBytes([]byte(p.config.BackendSendTimeout.Duration().String())),
258+
})
259+
case "backend_max_pipeline":
260+
return redis.NewBulkBytes([]byte(strconv.Itoa(p.config.BackendMaxPipeline)))
221261
case "backend_primary_only":
222262
return redis.NewBulkBytes([]byte(strconv.FormatBool(p.config.BackendPrimaryOnly)))
263+
case "max_slot_num":
264+
return redis.NewBulkBytes([]byte(strconv.Itoa(p.config.MaxSlotNum)))
265+
case "backend_replica_parallel":
266+
return redis.NewBulkBytes([]byte(strconv.Itoa(p.config.BackendReplicaParallel)))
267+
case "backend_keepalive_period":
268+
return redis.NewBulkBytes([]byte(p.config.BackendKeepAlivePeriod.Duration().String()))
269+
case "backend_number_databases":
270+
return redis.NewBulkBytes([]byte(strconv.FormatInt(int64(p.config.BackendNumberDatabases), 10)))
271+
case "session_buffer_size":
272+
return redis.NewArray([]*redis.Resp{
273+
redis.NewBulkBytes([]byte("session_recv_bufsize")),
274+
redis.NewBulkBytes([]byte(p.config.SessionRecvBufsize.HumanString())),
275+
redis.NewBulkBytes([]byte("session_send_bufsize")),
276+
redis.NewBulkBytes([]byte(p.config.SessionSendBufsize.HumanString())),
277+
})
278+
case "session_timeout":
279+
return redis.NewArray([]*redis.Resp{
280+
redis.NewBulkBytes([]byte("session_recv_timeout")),
281+
redis.NewBulkBytes([]byte(p.config.SessionRecvTimeout.Duration().String())),
282+
redis.NewBulkBytes([]byte("session_send_timeout")),
283+
redis.NewBulkBytes([]byte(p.config.SessionSendTimeout.Duration().String())),
284+
})
223285
case "slowlog_log_slower_than":
224286
return redis.NewBulkBytes([]byte(strconv.FormatInt(p.config.SlowlogLogSlowerThan, 10)))
225-
case "slowlog_max_len":
226-
return redis.NewBulkBytes([]byte(strconv.FormatInt(p.config.SlowlogMaxLen, 10)))
287+
case "metrics_report_server":
288+
return redis.NewBulkBytes([]byte(p.config.MetricsReportServer))
289+
case "metrics_report_period":
290+
return redis.NewBulkBytes([]byte(p.config.MetricsReportPeriod.Duration().String()))
291+
case "metrics_report_influxdb":
292+
return redis.NewArray([]*redis.Resp{
293+
redis.NewBulkBytes([]byte("metrics_report_influxdb_server")),
294+
redis.NewBulkBytes([]byte(p.config.MetricsReportInfluxdbServer)),
295+
redis.NewBulkBytes([]byte("metrics_report_influxdb_period")),
296+
redis.NewBulkBytes([]byte(p.config.MetricsReportInfluxdbPeriod.Duration().String())),
297+
redis.NewBulkBytes([]byte("metrics_report_influxdb_username")),
298+
redis.NewBulkBytes([]byte(p.config.MetricsReportInfluxdbUsername)),
299+
redis.NewBulkBytes([]byte("metrics_report_influxdb_database")),
300+
redis.NewBulkBytes([]byte(p.config.MetricsReportInfluxdbDatabase)),
301+
})
302+
case "metrics_report_statsd":
303+
return redis.NewArray([]*redis.Resp{
304+
redis.NewBulkBytes([]byte("metrics_report_statsd_server")),
305+
redis.NewBulkBytes([]byte(p.config.MetricsReportStatsdServer)),
306+
redis.NewBulkBytes([]byte("metrics_report_statsd_period")),
307+
redis.NewBulkBytes([]byte(p.config.MetricsReportStatsdPeriod.Duration().String())),
308+
redis.NewBulkBytes([]byte("metrics_report_statsd_prefix")),
309+
redis.NewBulkBytes([]byte(p.config.MetricsReportStatsdPrefix)),
310+
})
227311
default:
228312
return redis.NewErrorf("unsupported key: %s", key)
229313
}
@@ -233,6 +317,9 @@ func (p *Proxy) ConfigSet(key, value string) *redis.Resp {
233317
p.mu.Lock()
234318
defer p.mu.Unlock()
235319
switch key {
320+
case "product_name":
321+
p.config.ProductName = value
322+
return redis.NewString([]byte("OK"))
236323
case "proxy_max_clients":
237324
n, err := strconv.Atoi(value)
238325
if err != nil {
@@ -255,20 +342,6 @@ func (p *Proxy) ConfigSet(key, value string) *redis.Resp {
255342
}
256343
p.config.SlowlogLogSlowerThan = n
257344
return redis.NewString([]byte("OK"))
258-
case "slowlog_max_len":
259-
n, err := strconv.ParseInt(value, 10, 64)
260-
if err != nil {
261-
return redis.NewErrorf("err:%s", err)
262-
}
263-
264-
if n < 0 {
265-
return redis.NewErrorf("invalid slowlog_max_len")
266-
}
267-
p.config.SlowlogMaxLen = n
268-
if p.config.SlowlogMaxLen > 0 {
269-
SlowLogSetMaxLen(p.config.SlowlogMaxLen)
270-
}
271-
return redis.NewString([]byte("OK"))
272345
default:
273346
return redis.NewErrorf("unsupported key: %s", key)
274347
}

codis/pkg/proxy/session.go

Lines changed: 1 addition & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -257,12 +257,8 @@ func (s *Session) loopWriter(tasks *RequestChan) (err error) {
257257
d2 = int64((nowTime - r.ReceiveFromServerTime) / 1e3)
258258
}
259259
index := getWholeCmd(r.Multi, cmd)
260-
cmdLog := fmt.Sprintf("%s remote:%s, start_time(us):%d, duration(us): [%d, %d, %d], %d, tasksLen:%d, command:[%s].",
260+
log.Errorf("%s remote:%s, start_time(us):%d, duration(us): [%d, %d, %d], %d, tasksLen:%d, command:[%s].",
261261
time.Unix(r.ReceiveTime/1e9, 0).Format("2006-01-02 15:04:05"), s.Conn.RemoteAddr(), r.ReceiveTime/1e3, d0, d1, d2, duration, r.TasksLen, string(cmd[:index]))
262-
log.Warnf("%s", cmdLog)
263-
if s.config.SlowlogMaxLen > 0 {
264-
SlowLogPush(&SlowLogEntry{SlowLogGetCurLogId(), r.ReceiveTime / 1e3, duration, cmdLog})
265-
}
266262
}
267263
return nil
268264
})
@@ -328,8 +324,6 @@ func (s *Session) handleRequest(r *Request, d *Router) error {
328324
return s.handleRequestExists(r, d)
329325
case "PCONFIG":
330326
return s.handlePConfig(r)
331-
case "PSLOWLOG":
332-
return s.handlePSlowLog(r)
333327
case "SLOTSINFO":
334328
return s.handleRequestSlotsInfo(r, d)
335329
case "SLOTSSCAN":
@@ -726,61 +720,6 @@ func (s *Session) flushOpStats(force bool) {
726720
}
727721
}
728722

729-
func (s *Session) handlePSlowLog(r *Request) error {
730-
if len(r.Multi) < 2 || len(r.Multi) > 4 {
731-
r.Resp = redis.NewErrorf("ERR slowLog parameters")
732-
return nil
733-
}
734-
var subCmd = strings.ToUpper(string(r.Multi[1].Value))
735-
switch subCmd {
736-
case "GET":
737-
if len(r.Multi) == 3 {
738-
num, err := strconv.ParseInt(string(r.Multi[2].Value), 10, 64)
739-
if err != nil {
740-
r.Resp = redis.NewErrorf("ERR invalid slowLog number")
741-
break
742-
}
743-
744-
r.Resp = SlowLogGetByNum(num)
745-
} else if len(r.Multi) == 4 {
746-
var (
747-
id int64
748-
num int64
749-
err error
750-
)
751-
id, err = strconv.ParseInt(string(r.Multi[2].Value), 10, 64)
752-
if err != nil {
753-
r.Resp = redis.NewErrorf("ERR invalid slowLog start logId")
754-
break
755-
}
756-
num, err = strconv.ParseInt(string(r.Multi[3].Value), 10, 64)
757-
if err != nil {
758-
r.Resp = redis.NewErrorf("ERR invalid slowLog number")
759-
break
760-
}
761-
762-
r.Resp = SlowLogGetByIdAndNUm(id, num)
763-
} else {
764-
r.Resp = SlowLogGetByNum(10)
765-
}
766-
case "LEN":
767-
if len(r.Multi) == 2 {
768-
r.Resp = SlowLogGetLen()
769-
} else {
770-
r.Resp = redis.NewErrorf("ERR slowLog parameters")
771-
}
772-
case "RESET":
773-
if len(r.Multi) == 2 {
774-
r.Resp = SlowLogReset()
775-
} else {
776-
r.Resp = redis.NewErrorf("ERR slowLog parameters")
777-
}
778-
default:
779-
r.Resp = redis.NewErrorf("ERR Unknown SLOWLOG subcommand or wrong args. Try GET, RESET, LEN.")
780-
}
781-
return nil
782-
}
783-
784723
func (s *Session) handlePConfig(r *Request) error {
785724
if len(r.Multi) < 2 || len(r.Multi) > 4 {
786725
r.Resp = redis.NewErrorf("ERR config parameters")

0 commit comments

Comments
 (0)