tile38/internal/server/dev.go

160 lines
4.2 KiB
Go
Raw Normal View History

package server
2016-03-05 02:08:16 +03:00
2016-03-30 19:32:38 +03:00
import (
"errors"
"fmt"
2016-03-30 19:32:38 +03:00
"math/rand"
"strconv"
"sync/atomic"
"time"
"github.com/tidwall/resp"
"github.com/tidwall/tile38/internal/log"
2016-03-30 19:32:38 +03:00
)
2016-05-24 00:21:18 +03:00
// MASSINSERT num_keys num_points [minx miny maxx maxy]
2016-04-04 04:13:33 +03:00
func randMassInsertPosition(minLat, minLon, maxLat, maxLon float64) (float64, float64) {
lat, lon := (rand.Float64()*(maxLat-minLat))+minLat, (rand.Float64()*(maxLon-minLon))+minLon
return lat, lon
}
func (s *Server) cmdMassInsert(msg *Message) (res resp.Value, err error) {
2016-03-30 19:32:38 +03:00
start := time.Now()
vs := msg.Args[1:]
2016-03-30 19:32:38 +03:00
2016-04-04 04:13:33 +03:00
minLat, minLon, maxLat, maxLon := -90.0, -180.0, 90.0, 180.0 //37.10776, -122.67145, 38.19502, -121.62775
2016-03-30 19:32:38 +03:00
var snumCols, snumPoints string
var cols, objs int
var ok bool
if vs, snumCols, ok = tokenval(vs); !ok || snumCols == "" {
return NOMessage, errInvalidNumberOfArguments
2016-03-30 19:32:38 +03:00
}
if vs, snumPoints, ok = tokenval(vs); !ok || snumPoints == "" {
return NOMessage, errInvalidNumberOfArguments
2016-03-30 19:32:38 +03:00
}
if len(vs) != 0 {
2016-04-04 04:13:33 +03:00
var sminLat, sminLon, smaxLat, smaxLon string
if vs, sminLat, ok = tokenval(vs); !ok || sminLat == "" {
return NOMessage, errInvalidNumberOfArguments
2016-04-04 04:13:33 +03:00
}
if vs, sminLon, ok = tokenval(vs); !ok || sminLon == "" {
return NOMessage, errInvalidNumberOfArguments
2016-04-04 04:13:33 +03:00
}
if vs, smaxLat, ok = tokenval(vs); !ok || smaxLat == "" {
return NOMessage, errInvalidNumberOfArguments
2016-04-04 04:13:33 +03:00
}
if vs, smaxLon, ok = tokenval(vs); !ok || smaxLon == "" {
return NOMessage, errInvalidNumberOfArguments
2016-04-04 04:13:33 +03:00
}
var err error
if minLat, err = strconv.ParseFloat(sminLat, 64); err != nil {
return NOMessage, err
2016-04-04 04:13:33 +03:00
}
if minLon, err = strconv.ParseFloat(sminLon, 64); err != nil {
return NOMessage, err
2016-04-04 04:13:33 +03:00
}
if maxLat, err = strconv.ParseFloat(smaxLat, 64); err != nil {
return NOMessage, err
2016-04-04 04:13:33 +03:00
}
if maxLon, err = strconv.ParseFloat(smaxLon, 64); err != nil {
return NOMessage, err
2016-04-04 04:13:33 +03:00
}
if len(vs) != 0 {
return NOMessage, errors.New("invalid number of arguments")
2016-04-04 04:13:33 +03:00
}
2016-03-30 19:32:38 +03:00
}
n, err := strconv.ParseUint(snumCols, 10, 64)
if err != nil {
return NOMessage, errInvalidArgument(snumCols)
2016-03-30 19:32:38 +03:00
}
cols = int(n)
n, err = strconv.ParseUint(snumPoints, 10, 64)
if err != nil {
return NOMessage, errInvalidArgument(snumPoints)
2016-03-30 19:32:38 +03:00
}
2019-09-04 03:01:26 +03:00
docmd := func(args []string) error {
s.mu.Lock()
defer s.mu.Unlock()
nmsg := *msg
2018-12-04 01:35:32 +03:00
nmsg._command = ""
nmsg.Args = args
_, d, err := s.command(&nmsg, nil)
2016-03-30 19:32:38 +03:00
if err != nil {
return err
}
return s.writeAOF(nmsg.Args, &d)
2016-03-30 19:32:38 +03:00
}
rand.Seed(time.Now().UnixNano())
objs = int(n)
2022-11-03 20:07:17 +03:00
var k atomic.Uint64
2016-03-30 19:32:38 +03:00
for i := 0; i < cols; i++ {
key := "mi:" + strconv.FormatInt(int64(i), 10)
func(key string) {
// lock cycle
2016-03-30 19:32:38 +03:00
for j := 0; j < objs; j++ {
id := strconv.FormatInt(int64(j), 10)
var values []string
2019-02-12 01:42:35 +03:00
values = append(values, "set", key, id)
fvals := []float64{
1, // one
0, // zero
-1, // negOne
14, // nibble
20.5, // tinyDiv10
120, // int8
-120, // int8
20000, // int16
-20000, // int16
214748300, // int32
-214748300, // int32
2014748300, // float64
123.12312301, // float64
}
for i, fval := range fvals {
values = append(values, "FIELD",
fmt.Sprintf("fname:%d", i),
strconv.FormatFloat(fval, 'f', -1, 64))
}
if rand.Int()%2 == 0 {
values = append(values, "EX", fmt.Sprint(rand.Intn(25)+5))
}
if j%8 == 0 {
2019-02-12 01:42:35 +03:00
values = append(values, "STRING", fmt.Sprintf("str%v", j))
} else {
lat, lon := randMassInsertPosition(minLat, minLon, maxLat, maxLon)
values = append(values, "POINT",
strconv.FormatFloat(lat, 'f', -1, 64),
strconv.FormatFloat(lon, 'f', -1, 64),
)
2016-03-30 19:32:38 +03:00
}
2019-09-04 03:01:26 +03:00
err := docmd(values)
if err != nil {
2016-03-30 19:32:38 +03:00
log.Fatal(err)
return
}
2022-11-03 20:07:17 +03:00
k.Add(1)
if j%1000 == 1000-1 {
2022-11-03 20:07:17 +03:00
log.Debugf("massinsert: %s %d/%d", key, k.Load(), cols*objs)
2016-03-30 19:32:38 +03:00
}
}
}(key)
}
2022-11-03 20:07:17 +03:00
log.Infof("massinsert: done %d objects", k.Load())
return OKMessage(msg, start), nil
2016-03-05 02:08:16 +03:00
}
2017-09-30 18:11:10 +03:00
func (s *Server) cmdSleep(msg *Message) (res resp.Value, err error) {
2017-09-30 18:11:10 +03:00
start := time.Now()
if len(msg.Args) != 2 {
return NOMessage, errInvalidNumberOfArguments
2017-09-30 18:11:10 +03:00
}
d, _ := strconv.ParseFloat(msg.Args[1], 64)
2018-03-08 16:48:12 +03:00
time.Sleep(time.Duration(float64(time.Second) * d))
return OKMessage(msg, start), nil
2017-09-30 18:11:10 +03:00
}