Skip to content

Commit

Permalink
Merge pull request influxdata#8635 from influxdata/sgc-xxhash
Browse files Browse the repository at this point in the history
update xxhash and use Sum64String to avoid allocs
  • Loading branch information
stuartcarnie authored Jul 26, 2017
2 parents fe1167c + 0c79ec6 commit c86e94a
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 4 deletions.
2 changes: 1 addition & 1 deletion Godeps
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ collectd.org e84e8af5356e7f47485bbc95c96da6dd7984a67e
github.com/BurntSushi/toml 99064174e013895bbd9b025c31100bd1d9b590ca
github.com/bmizerany/pat c068ca2f0aacee5ac3681d68e4d0a003b7d1fd2c
github.com/boltdb/bolt 4b1ebc1869ad66568b313d0dc410e2be72670dda
github.com/cespare/xxhash 4a94f899c20bc44d4f5f807cb14529e72aca99d6
github.com/cespare/xxhash 1b6d2e40c16ba0dfce5c8eac2480ad6e7394819b
github.com/davecgh/go-spew 346938d642f2ec3594ed81d874461961cd0faa76
github.com/dgrijalva/jwt-go 24c63f56522a87ec5339cc3567883f1039378fdb
github.com/dgryski/go-bits 2ad8d707cc05b1815ce6ff2543bb5e8d8f9298ef
Expand Down
6 changes: 3 additions & 3 deletions tsdb/engine/tsm1/ring.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ func (r *ring) reset() {
// getPartition retrieves the hash ring partition associated with the provided
// key.
func (r *ring) getPartition(key string) *partition {
return r.continuum[int(xxhash.Sum64([]byte(key))%partitions)]
return r.continuum[int(xxhash.Sum64String(key)%partitions)]
}

// entry returns the entry for the given key.
Expand Down Expand Up @@ -240,7 +240,7 @@ func (p *partition) write(key string, values Values) error {
}

// Create a new entry using a preallocated size if we have a hint available.
hint, _ := p.entrySizeHints[xxhash.Sum64([]byte(key))]
hint, _ := p.entrySizeHints[xxhash.Sum64String(key)]
e, err := newEntryValues(values, hint)
if err != nil {
return err
Expand Down Expand Up @@ -289,7 +289,7 @@ func (p *partition) reset() {
// Store a hint to pre-allocate the next time we see the same entry.
entry.mu.RLock()
if cap(entry.values) > 128 { // 4 x the default entry capacity size.
p.entrySizeHints[xxhash.Sum64([]byte(k))] = cap(entry.values)
p.entrySizeHints[xxhash.Sum64String(k)] = cap(entry.values)
}
entry.mu.RUnlock()
}
Expand Down
22 changes: 22 additions & 0 deletions tsdb/engine/tsm1/ring_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,29 @@ func BenchmarkRing_keys_1000(b *testing.B) { benchmarkRingkeys(b, MustNewRing(
func BenchmarkRing_keys_10000(b *testing.B) { benchmarkRingkeys(b, MustNewRing(256), 10000) }
func BenchmarkRing_keys_100000(b *testing.B) { benchmarkRingkeys(b, MustNewRing(256), 100000) }

func benchmarkRingGetPartition(b *testing.B, r *ring, keys int) {
vals := make([]string, keys)

// Add some keys
for i := 0; i < keys; i++ {
vals[i] = fmt.Sprintf("cpu,host=server-%d field1=value1,field2=value2,field4=value4,field5=value5,field6=value6,field7=value7,field8=value1,field9=value2,field10=value4,field11=value5,field12=value6,field13=value7", i)
r.add(vals[i], nil)
}

b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
r.getPartition(vals[i%keys])
}
}

func BenchmarkRing_getPartition_100(b *testing.B) { benchmarkRingGetPartition(b, MustNewRing(256), 100) }
func BenchmarkRing_getPartition_1000(b *testing.B) {
benchmarkRingGetPartition(b, MustNewRing(256), 1000)
}

func benchmarkRingWrite(b *testing.B, r *ring, n int) {
b.ReportAllocs()
for i := 0; i < b.N; i++ {
var wg sync.WaitGroup
for i := 0; i < runtime.GOMAXPROCS(0); i++ {
Expand Down

0 comments on commit c86e94a

Please sign in to comment.