You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
3.6 KiB
Go

10 years ago
package main
import (
"flag"
"fmt"
"math/rand"
"net"
"os"
)
var options struct {
host string
port int
password string
buffer int
}
10 years ago
func usage(status int) {
fmt.Println("usage: rsload [filename]")
os.Exit(status)
}
func randomString(n int) string {
var alpha = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
buf := make([]byte, n)
for i := 0; i < len(buf); i++ {
buf[i] = alpha[rand.Intn(len(alpha)-1)]
}
return string(buf)
}
func main() {
flag.Parse()
args := flag.Args()
if len(args) < 1 {
usage(1)
}
fname := args[0]
conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", options.host, options.port))
10 years ago
if err != nil {
fmt.Printf("unable to connect to redis: %v\n", err)
os.Exit(1)
}
defer conn.Close()
if options.password != "" {
auth(options.password).Write(conn)
v, err := readValue(conn)
if err != nil {
fmt.Printf("unable to auth: %v\n", err)
os.Exit(1)
}
if !isOK(v) {
fmt.Printf("not OK: %v\n", v)
os.Exit(1)
}
}
infile, err := os.Open(fname)
10 years ago
if err != nil {
fmt.Printf("unable to open file %s: %v\n", fname, err)
os.Exit(1)
}
defer infile.Close()
10 years ago
c := make(chan maybe)
sent := make(chan value, options.buffer)
go streamValues(infile, c)
10 years ago
go func() {
defer func() {
close(sent)
fmt.Println("All data transferred. Waiting for the last reply...")
}()
for r := range c {
if r.ok() {
r.val().Write(conn)
sent <- r.val()
} else {
// this bad
fmt.Println(r.err())
10 years ago
}
}
}()
replies, errors := 0, 0
responses := make(chan maybe)
go streamValues(conn, responses)
for _ = range sent {
response := <-responses
if response.ok() {
switch r := response.val().(type) {
case Error:
fmt.Fprintln(os.Stderr, r)
errors++
default:
replies++
}
} else {
fmt.Fprintln(os.Stderr, response.err())
10 years ago
}
}
fmt.Println("Last reply received from server.")
fmt.Printf("errors: %d, replies: %d\n", errors, replies)
10 years ago
}
func init() {
flag.StringVar(&options.host, "h", "127.0.0.1", "hostname")
flag.IntVar(&options.port, "p", 6379, "port")
flag.StringVar(&options.password, "a", "", "password")
flag.IntVar(&options.buffer, "buffer", 0, "number of outstanding statements allowed before throttling")
}
/*
-h <hostname> Server hostname (default: 127.0.0.1)
-p <port> Server port (default: 6379)
-s <socket> Server socket (overrides hostname and port)
-a <password> Password to use when connecting to the server
-r <repeat> Execute specified command N times
-i <interval> When -r is used, waits <interval> seconds per command.
It is possible to specify sub-second times like -i 0.1
-n <db> Database number
-x Read last argument from STDIN
-d <delimiter> Multi-bulk delimiter in for raw formatting (default: \n)
-c Enable cluster mode (follow -ASK and -MOVED redirections)
--raw Use raw formatting for replies (default when STDOUT is
not a tty)
--latency Enter a special mode continuously sampling latency
--latency-history Like --latency but tracking latency changes over time.
Default time interval is 15 sec. Change it using -i.
--slave Simulate a slave showing commands received from the master
--rdb <filename> Transfer an RDB dump from remote server to local file.
--pipe Transfer raw Redis protocol from stdin to server
--bigkeys Sample Redis keys looking for big keys
--eval <file> Send an EVAL command using the Lua script at <file>
--help Output this help and exit
--version Output version and exit
*/