Skip to content

Instantly share code, notes, and snippets.

@nilnilnil
Forked from dustin/validate.go
Created September 6, 2012 23:06
Show Gist options
  • Save nilnilnil/3661103 to your computer and use it in GitHub Desktop.
Save nilnilnil/3661103 to your computer and use it in GitHub Desktop.
Concurrent seriesly test
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"sync"
)
const baseUrl = "http://localhost:3133/"
const query = baseUrl + "%s/_query?ptr=/r&reducer=%s&from=2008&to=1346821500000&group=86400000"
func getDBs() []string {
resp, err := http.Get(baseUrl + "_all_dbs")
if err != nil {
log.Fatalf("Error getting DBs: %v", err)
}
defer resp.Body.Close()
d := json.NewDecoder(resp.Body)
rv := []string{}
err = d.Decode(&rv)
if err != nil {
log.Fatalf("Error decoding response: %v", err)
}
return rv
}
func grabSome(db, red string, out chan<- map[string][]float64) {
url := fmt.Sprintf(query, db, red)
resp, err := http.Get(url)
if err != nil {
log.Fatalf("Error getting DBs: %v", err)
}
defer resp.Body.Close()
d := json.NewDecoder(resp.Body)
rv := map[string][]float64{}
err = d.Decode(&rv)
if err != nil {
log.Fatalf("Error decoding response: %v", err)
}
out <- rv
}
func check(db, lbl string, lower, upper map[string][]float64) {
log.Printf("Checking %v %v (%v -> %v)", db, lbl,
len(lower), len(upper))
for k, lv := range lower {
if uv, ok := upper[k]; ok {
if uv[0]+0.0000001 < lv[0] {
log.Fatalf("Upper %v was %v, lower was %v on %v %v",
k, uv, lv, db, lbl)
}
} else {
log.Fatalf("Missing %v from upper in %v %v", k, db, lbl)
}
}
for k := range upper {
if _, ok := lower[k]; !ok {
log.Fatalf("Missing %v from lower in %v %v", k, db, lbl)
}
}
}
var wg sync.WaitGroup
func doDB(db string) {
defer wg.Done()
log.Printf("Doing %v", db)
chmin := make(chan map[string][]float64, 1)
chavg := make(chan map[string][]float64, 1)
chmax := make(chan map[string][]float64, 1)
defer close(chmin)
defer close(chavg)
defer close(chmax)
go grabSome(db, "min", chmin)
go grabSome(db, "avg", chavg)
go grabSome(db, "max", chmax)
min := <-chmin
avg := <-chavg
max := <-chmax
check(db, "min -> max", min, max)
check(db, "min -> avg", min, avg)
check(db, "avg -> max", avg, max)
}
func main() {
dbs := getDBs()
for i := 0; i < 100; i++ {
for _, db := range dbs {
wg.Add(1)
go doDB(db)
}
wg.Wait()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment