From b11c619650898ba679c735be7cca2a4b25bb7158 Mon Sep 17 00:00:00 2001 From: Josh Baker Date: Mon, 28 Mar 2016 15:50:18 -0700 Subject: [PATCH] resp server --- controller/controller.go | 19 ++++++++++--------- controller/stats.go | 39 +++++++++++++++++++++++++++++++++------ 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/controller/controller.go b/controller/controller.go index 3f3a96ca..06d22210 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -8,6 +8,7 @@ import ( "fmt" "io" "os" + "runtime" "strings" "sync" "time" @@ -316,7 +317,6 @@ func (c *Controller) command(msg *server.Message, w io.Writer) (res string, d co } return "" } - okResp = okResp switch msg.Command { default: err = fmt.Errorf("unknown command '%s'", msg.Values[0]) @@ -357,8 +357,8 @@ func (c *Controller) command(msg *server.Message, w io.Writer) (res string, d co // resp = okResp() // case "stats": // resp, err = c.cmdStats(nline) - // case "server": - // resp, err = c.cmdServer(nline) + case "server": + res, err = c.cmdServer(msg) case "scan": res, err = c.cmdScan(msg) case "nearby": @@ -371,12 +371,13 @@ func (c *Controller) command(msg *server.Message, w io.Writer) (res string, d co res, err = c.cmdGet(msg) case "keys": res, err = c.cmdKeys(msg) - // case "aof": - // err = c.cmdAOF(nline, w) - // case "aofmd5": - // resp, err = c.cmdAOFMD5(nline) - // case "gc": - // go runtime.GC() + // case "aof": + // err = c.cmdAOF(nline, w) + // case "aofmd5": + // resp, err = c.cmdAOFMD5(nline) + case "gc": + go runtime.GC() + res = okResp() // resp = okResp() // case "aofshrink": // go c.aofshrink() diff --git a/controller/stats.go b/controller/stats.go index 7e133939..6b134ae8 100644 --- a/controller/stats.go +++ b/controller/stats.go @@ -4,9 +4,12 @@ import ( "encoding/json" "fmt" "runtime" + "sort" "time" "github.com/google/btree" + "github.com/tidwall/resp" + "github.com/tidwall/tile38/controller/server" ) func (c *Controller) cmdStats(line string) (string, error) { @@ -36,9 +39,9 @@ func (c *Controller) cmdStats(line string) (string, error) { } return `{"ok":true,"stats":` + string(data) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}", nil } -func (c *Controller) cmdServer(line string) (string, error) { +func (c *Controller) cmdServer(msg *server.Message) (res string, err error) { start := time.Now() - if line != "" { + if len(msg.Values) != 1 { return "", errInvalidNumberOfArguments } m := make(map[string]interface{}) @@ -77,11 +80,35 @@ func (c *Controller) cmdServer(line string) (string, error) { m["pointer_size"] = (32 << uintptr(uint64(^uintptr(0))>>63)) / 8 m["read_only"] = c.config.ReadOnly - data, err := json.Marshal(m) - if err != nil { - return "", err + switch msg.OutputType { + case server.JSON: + data, err := json.Marshal(m) + if err != nil { + return "", err + } + res = `{"ok":true,"stats":` + string(data) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}" + case server.RESP: + var keys []string + for key, _ := range m { + keys = append(keys, key) + } + sort.Strings(keys) + + var vals []resp.Value + + for _, key := range keys { + val := m[key] + vals = append(vals, resp.StringValue(key)) + vals = append(vals, resp.StringValue(fmt.Sprintf("%v", val))) + } + data, err := resp.ArrayValue(vals).MarshalRESP() + if err != nil { + return "", err + } + res = string(data) } - return `{"ok":true,"stats":` + string(data) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}", nil + + return res, nil } func (c *Controller) statsCollections(line string) (string, error) { start := time.Now()