This repository has been archived by the owner on Dec 9, 2019. It is now read-only.
/
dynamodb_query.go
88 lines (77 loc) · 2.17 KB
/
dynamodb_query.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// +build ignore
package main
import (
"flag"
"fmt"
"log"
"math/rand"
"sync"
"sync/atomic"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/dynamodb"
)
var (
idPrefix = flag.String("prefix", "", "id prefix")
table = flag.String("table", "test_table", "table name")
total = flag.Int("t", 100000, "total count to be inserted")
idTop = flag.Int("id", 100000, "id top")
gophers = flag.Int("g", 16, "concurrent gopher requests")
verbose = flag.Bool("v", false, "verbose")
debug = flag.Bool("d", false, "debug")
endpoint = flag.String("endpoint", "http://localhost:8000", "endpoint")
region = flag.String("region", "us-west-2", "region")
)
func main() {
flag.Parse()
log.Println("Total:", *total)
log.Println("Gophers:", *gophers)
log.Println("ID Top:", *idTop)
if *debug {
*verbose = true
}
db := dynamodb.New(session.New(
aws.NewConfig().
WithEndpoint(*endpoint).
WithRegion(*region).
WithCredentials(credentials.NewEnvCredentials()),
))
jobChans := make(chan struct{}, *gophers)
start := time.Now()
var totalDuration int64
var wg sync.WaitGroup
rand.Seed(time.Now().Unix())
for i := 0; i <= *total; i++ {
jobChans <- struct{}{}
wg.Add(1)
if i%((*total)/100) == 0 {
fmt.Printf("\r%s Queried %d%%", time.Now().Format("2006-01-02 15:04:05"), i/((*total)/100))
}
go func() {
start := time.Now()
if resp, err := db.GetItem(&dynamodb.GetItemInput{
TableName: aws.String(*table),
Key: map[string]*dynamodb.AttributeValue{
// "bench_area": &dynamodb.AttributeValue{S: aws.String("KingsLanding")},
"id": &dynamodb.AttributeValue{S: aws.String(fmt.Sprintf("%s%d", *idPrefix, rand.Intn(*idTop)))},
},
}); err != nil {
fmt.Println(err)
} else {
if *debug {
log.Println(resp)
}
}
atomic.AddInt64(&totalDuration, int64(time.Now().Sub(start)))
wg.Done()
<-jobChans
}()
}
wg.Wait()
fmt.Println("")
log.Println("Took:", time.Now().Sub(start))
log.Println("Total Duration:", time.Duration(totalDuration))
log.Println("TPQ:", time.Duration(totalDuration/int64(*total)))
}