mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
server: Refactor hasher
Signed-off-by: Marek Siarkowicz <siarkowicz@google.com>
This commit is contained in:
parent
f5ed371885
commit
679e327d5e
@ -23,40 +23,47 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func unsafeHashByRev(tx backend.ReadTx, lower, upper revision, keep map[revision]struct{}) (uint32, error) {
|
func unsafeHashByRev(tx backend.ReadTx, lower, upper revision, keep map[revision]struct{}) (uint32, error) {
|
||||||
h := newKVHasher()
|
h := newKVHasher(lower, upper, keep)
|
||||||
err := tx.UnsafeForEach(buckets.Key, func(k, v []byte) error {
|
err := tx.UnsafeForEach(buckets.Key, func(k, v []byte) error {
|
||||||
kr := bytesToRev(k)
|
|
||||||
if !upper.GreaterThan(kr) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
// skip revisions that are scheduled for deletion
|
|
||||||
// due to compacting; don't skip if there isn't one.
|
|
||||||
if lower.GreaterThan(kr) && len(keep) > 0 {
|
|
||||||
if _, ok := keep[kr]; !ok {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
h.WriteKeyValue(k, v)
|
h.WriteKeyValue(k, v)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
return h.Hash(), err
|
return h.Hash(), err
|
||||||
}
|
}
|
||||||
|
|
||||||
type hasher struct {
|
type kvHasher struct {
|
||||||
h hash.Hash32
|
hash hash.Hash32
|
||||||
|
lower, upper revision
|
||||||
|
keep map[revision]struct{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newKVHasher() hasher {
|
func newKVHasher(lower, upper revision, keep map[revision]struct{}) kvHasher {
|
||||||
h := crc32.New(crc32.MakeTable(crc32.Castagnoli))
|
h := crc32.New(crc32.MakeTable(crc32.Castagnoli))
|
||||||
h.Write(buckets.Key.Name())
|
h.Write(buckets.Key.Name())
|
||||||
return hasher{h}
|
return kvHasher{
|
||||||
|
hash: h,
|
||||||
|
lower: lower,
|
||||||
|
upper: upper,
|
||||||
|
keep: keep,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *hasher) WriteKeyValue(k, v []byte) {
|
func (h *kvHasher) WriteKeyValue(k, v []byte) {
|
||||||
h.h.Write(k)
|
kr := bytesToRev(k)
|
||||||
h.h.Write(v)
|
if !h.upper.GreaterThan(kr) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// skip revisions that are scheduled for deletion
|
||||||
|
// due to compacting; don't skip if there isn't one.
|
||||||
|
if h.lower.GreaterThan(kr) && len(h.keep) > 0 {
|
||||||
|
if _, ok := h.keep[kr]; !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
h.hash.Write(k)
|
||||||
|
h.hash.Write(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *hasher) Hash() uint32 {
|
func (h *kvHasher) Hash() uint32 {
|
||||||
return h.h.Sum32()
|
return h.hash.Sum32()
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user