-
-
Save nilnilnil/3661103 to your computer and use it in GitHub Desktop.
Concurrent seriesly test
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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