// Copyright 2017 CoreOS, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package dbtester import ( "fmt" "io" "io/ioutil" mrand "math/rand" "net/http" "os" "strings" "time" ) func toMillisecond(d time.Duration) float64 { return d.Seconds() * 1000 } func assignRequest(ranges []int64, total int64) (rs []int64) { reqEach := int(float64(total) / float64(len(ranges))) // truncate 10000th digits if reqEach > 10000 { reqEach = (reqEach / 10000) * 10000 } // truncate 1000th digits if reqEach > 1000 { reqEach = (reqEach / 1000) * 1000 } curSum := int64(0) rs = make([]int64, len(ranges)) for i := range ranges { if i < len(ranges)-1 { rs[i] = int64(reqEach) curSum += int64(reqEach) } else { rs[i] = int64(total) - curSum } } return } func toFile(txt, fpath string) error { f, err := os.OpenFile(fpath, os.O_RDWR|os.O_TRUNC, 0777) if err != nil { f, err = os.Create(fpath) if err != nil { return err } } defer f.Close() _, err = f.WriteString(txt) return err } // exist returns true if the file or directory exists. func exist(fpath string) bool { st, err := os.Stat(fpath) if err != nil { if os.IsNotExist(err) { return false } } if st.IsDir() { return true } if _, err := os.Stat(fpath); err != nil { if os.IsNotExist(err) { return false } } return true } // gracefulClose drains http.Response.Body until it hits EOF // and closes it. This prevents TCP/TLS connections from closing, // therefore available for reuse. func gracefulClose(resp *http.Response) { io.Copy(ioutil.Discard, resp.Body) resp.Body.Close() } // sequentialKey returns '00012' when size is 5 and num is 12. func sequentialKey(size, num int64) string { txt := fmt.Sprintf("%d", num) if len(txt) > int(size) { return txt } delta := int(size) - len(txt) return strings.Repeat("0", delta) + txt } func sameKey(size int64) string { return strings.Repeat("a", int(size)) } func randBytes(bytesN int64) []byte { const ( letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" letterIdxBits = 6 // 6 bits to represent a letter index letterIdxMask = 1<= 0; { if remain == 0 { cache, remain = src.Int63(), letterIdxMax } if idx := int(cache & letterIdxMask); idx < len(letterBytes) { b[i] = letterBytes[idx] i-- } cache >>= letterIdxBits remain-- } return b }