forked from TrueCloudLab/frostfs-node
72 lines
1 KiB
Go
72 lines
1 KiB
Go
|
package rangehashsvc
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"hash"
|
||
|
"sync"
|
||
|
|
||
|
"github.com/nspcc-dev/neofs-node/pkg/services/object_manager/placement"
|
||
|
"github.com/nspcc-dev/tzhash/tz"
|
||
|
)
|
||
|
|
||
|
type onceHashWriter struct {
|
||
|
once *sync.Once
|
||
|
|
||
|
traverser *placement.Traverser
|
||
|
|
||
|
resp *Response
|
||
|
|
||
|
cancel context.CancelFunc
|
||
|
}
|
||
|
|
||
|
type hasher interface {
|
||
|
add([]byte)
|
||
|
sum() ([]byte, error)
|
||
|
}
|
||
|
|
||
|
type tzHasher struct {
|
||
|
hashes [][]byte
|
||
|
}
|
||
|
|
||
|
type commonHasher struct {
|
||
|
h hash.Hash
|
||
|
}
|
||
|
|
||
|
type singleHasher struct {
|
||
|
hash []byte
|
||
|
}
|
||
|
|
||
|
func (h *singleHasher) add(p []byte) {
|
||
|
h.hash = p
|
||
|
}
|
||
|
|
||
|
func (h *singleHasher) sum() ([]byte, error) {
|
||
|
return h.hash, nil
|
||
|
}
|
||
|
|
||
|
func (w *onceHashWriter) write(hs [][]byte) {
|
||
|
w.once.Do(func() {
|
||
|
w.resp.hashes = hs
|
||
|
w.traverser.SubmitSuccess()
|
||
|
w.cancel()
|
||
|
})
|
||
|
}
|
||
|
|
||
|
func (h *tzHasher) add(p []byte) {
|
||
|
h.hashes = append(h.hashes, p)
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func (h *tzHasher) sum() ([]byte, error) {
|
||
|
return tz.Concat(h.hashes)
|
||
|
}
|
||
|
|
||
|
func (h *commonHasher) add(p []byte) {
|
||
|
h.h.Write(p)
|
||
|
}
|
||
|
|
||
|
func (h *commonHasher) sum() ([]byte, error) {
|
||
|
return h.h.Sum(nil), nil
|
||
|
}
|