diff --git a/docs/tidb_http_api.md b/docs/tidb_http_api.md index 2caddcec5981d..d948146b58b83 100644 --- a/docs/tidb_http_api.md +++ b/docs/tidb_http_api.md @@ -477,3 +477,18 @@ timezone.* * op=nowait: return after binlog status is recoverd, do not wait until the skipped-binlog transactions are committed. * op=reset: reset `SkippedCommitterCounter` to 0 to avoid the problem that `SkippedCommitterCounter` is not cleared due to some unusual cases. * op=status: Get the current status of binlog recovery. + +1. Enable/disable async commit feature + + ```shell + curl -X POST -d "tidb_enable_async_commit=1" http://{TiDBIP}:10080/settings + curl -X POST -d "tidb_enable_async_commit=0" http://{TiDBIP}:10080/settings + ``` + +1. Enable/disable one-phase commit feature + + ```shell + curl -X POST -d "tidb_enable_1pc=1" http://{TiDBIP}:10080/settings + curl -X POST -d "tidb_enable_1pc=0" http://{TiDBIP}:10080/settings + ``` + diff --git a/server/http_handler.go b/server/http_handler.go index 5a3b59e6de6ae..d2705d721e3c2 100644 --- a/server/http_handler.go +++ b/server/http_handler.go @@ -395,6 +395,7 @@ func (t *tikvHandlerTool) handleMvccGetByHex(params map[string]string) (*mvccKV, // settingsHandler is the handler for list tidb server settings. type settingsHandler struct { + *tikvHandlerTool } // binlogRecover is used to recover binlog service. @@ -720,6 +721,52 @@ func (h settingsHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { return } } + if asyncCommit := req.Form.Get("tidb_enable_async_commit"); asyncCommit != "" { + s, err := session.CreateSession(h.Store.(kv.Storage)) + if err != nil { + writeError(w, err) + return + } + if s != nil { + defer s.Close() + } + switch asyncCommit { + case "0": + err = s.GetSessionVars().GlobalVarsAccessor.SetGlobalSysVar(variable.TiDBEnableAsyncCommit, variable.BoolOff) + case "1": + err = s.GetSessionVars().GlobalVarsAccessor.SetGlobalSysVar(variable.TiDBEnableAsyncCommit, variable.BoolOn) + default: + writeError(w, errors.New("illegal argument")) + return + } + if err != nil { + writeError(w, err) + return + } + } + if onePC := req.Form.Get("tidb_enable_1pc"); onePC != "" { + s, err := session.CreateSession(h.Store.(kv.Storage)) + if err != nil { + writeError(w, err) + return + } + if s != nil { + defer s.Close() + } + switch onePC { + case "0": + err = s.GetSessionVars().GlobalVarsAccessor.SetGlobalSysVar(variable.TiDBEnable1PC, variable.BoolOff) + case "1": + err = s.GetSessionVars().GlobalVarsAccessor.SetGlobalSysVar(variable.TiDBEnable1PC, variable.BoolOn) + default: + writeError(w, errors.New("illegal argument")) + return + } + if err != nil { + writeError(w, err) + return + } + } if ddlSlowThreshold := req.Form.Get("ddl_slow_threshold"); ddlSlowThreshold != "" { threshold, err1 := strconv.Atoi(ddlSlowThreshold) if err1 != nil { diff --git a/server/http_handler_test.go b/server/http_handler_test.go index d2e75d319ec36..89b41d0aa3db3 100644 --- a/server/http_handler_test.go +++ b/server/http_handler_test.go @@ -1104,9 +1104,14 @@ func (ts *HTTPHandlerTestSuite) TestPostSettings(c *C) { ts.startServer(c) ts.prepareData(c) defer ts.stopServer(c) + se, err := session.CreateSession(ts.store.(kv.Storage)) + c.Assert(err, IsNil) + form := make(url.Values) form.Set("log_level", "error") form.Set("tidb_general_log", "1") + form.Set("tidb_enable_async_commit", "1") + form.Set("tidb_enable_1pc", "1") resp, err := ts.formStatus("/settings", form) c.Assert(err, IsNil) c.Assert(resp.StatusCode, Equals, http.StatusOK) @@ -1114,9 +1119,18 @@ func (ts *HTTPHandlerTestSuite) TestPostSettings(c *C) { c.Assert(zaplog.GetLevel(), Equals, zap.ErrorLevel) c.Assert(config.GetGlobalConfig().Log.Level, Equals, "error") c.Assert(variable.ProcessGeneralLog.Load(), IsTrue) + val, err := variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnableAsyncCommit) + c.Assert(err, IsNil) + c.Assert(val, Equals, variable.BoolOn) + val, err = variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnable1PC) + c.Assert(err, IsNil) + c.Assert(val, Equals, variable.BoolOn) + form = make(url.Values) form.Set("log_level", "fatal") form.Set("tidb_general_log", "0") + form.Set("tidb_enable_async_commit", "0") + form.Set("tidb_enable_1pc", "0") resp, err = ts.formStatus("/settings", form) c.Assert(err, IsNil) c.Assert(resp.StatusCode, Equals, http.StatusOK) @@ -1124,6 +1138,12 @@ func (ts *HTTPHandlerTestSuite) TestPostSettings(c *C) { c.Assert(log.GetLevel(), Equals, log.FatalLevel) c.Assert(zaplog.GetLevel(), Equals, zap.FatalLevel) c.Assert(config.GetGlobalConfig().Log.Level, Equals, "fatal") + val, err = variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnableAsyncCommit) + c.Assert(err, IsNil) + c.Assert(val, Equals, variable.BoolOff) + val, err = variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnable1PC) + c.Assert(err, IsNil) + c.Assert(val, Equals, variable.BoolOff) form.Set("log_level", os.Getenv("log_level")) // test ddl_slow_threshold diff --git a/server/http_status.go b/server/http_status.go index f956c4cfb3e93..4671da3b4bdd9 100644 --- a/server/http_status.go +++ b/server/http_status.go @@ -116,10 +116,10 @@ func (s *Server) startHTTPServer() { router.Handle("/stats/dump/{db}/{table}", s.newStatsHandler()).Name("StatsDump") router.Handle("/stats/dump/{db}/{table}/{snapshot}", s.newStatsHistoryHandler()).Name("StatsHistoryDump") - router.Handle("/settings", settingsHandler{}).Name("Settings") + tikvHandlerTool := s.newTikvHandlerTool() + router.Handle("/settings", settingsHandler{tikvHandlerTool}).Name("Settings") router.Handle("/binlog/recover", binlogRecover{}).Name("BinlogRecover") - tikvHandlerTool := s.newTikvHandlerTool() router.Handle("/schema", schemaHandler{tikvHandlerTool}).Name("Schema") router.Handle("/schema/{db}", schemaHandler{tikvHandlerTool}) router.Handle("/schema/{db}/{table}", schemaHandler{tikvHandlerTool})