frostfs-node/pkg/services/object/rangehash/util.go
Leonard Lyubich 1d23483828 [#235] services/object: Implement new GetRange algorithm
Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
2020-12-11 17:19:37 +03:00

75 lines
1.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 {
WriteChunk([]byte) error
sum() ([]byte, error)
}
type tzHasher struct {
hashes [][]byte
}
type commonHasher struct {
h hash.Hash
}
type singleHasher struct {
hash []byte
}
func (h *singleHasher) WriteChunk(p []byte) error {
h.hash = p
return nil
}
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) WriteChunk(p []byte) error {
h.hashes = append(h.hashes, p)
return nil
}
func (h *tzHasher) sum() ([]byte, error) {
return tz.Concat(h.hashes)
}
func (h *commonHasher) WriteChunk(p []byte) error {
h.h.Write(p)
return nil
}
func (h *commonHasher) sum() ([]byte, error) {
return h.h.Sum(nil), nil
}