mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-07-20 19:56:44 +00:00
abstract out testStore + randomChunks into common_test
This commit is contained in:
parent
8e6ef48a28
commit
60931dfaa3
4 changed files with 101 additions and 162 deletions
97
bzz/common_test.go
Normal file
97
bzz/common_test.go
Normal file
|
|
@ -0,0 +1,97 @@
|
||||||
|
package bzz
|
||||||
|
|
||||||
|
import (
|
||||||
|
"crypto/rand"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func randomChunks(l int64, branches int64, chunkC chan *Chunk) (key Key, errC chan error) {
|
||||||
|
chunker := &TreeChunker{
|
||||||
|
Branches: branches,
|
||||||
|
}
|
||||||
|
chunker.Init()
|
||||||
|
key = make([]byte, 32)
|
||||||
|
b := make([]byte, l)
|
||||||
|
_, err := rand.Read(b)
|
||||||
|
if err != nil {
|
||||||
|
panic("no rand")
|
||||||
|
}
|
||||||
|
errC = chunker.Split(key, NewChunkReaderFromBytes(b), chunkC)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func testStore(m ChunkStore, l int64, branches int64, t *testing.T) {
|
||||||
|
|
||||||
|
chunkC := make(chan *Chunk)
|
||||||
|
key, errC := randomChunks(l, branches, chunkC)
|
||||||
|
|
||||||
|
SPLIT:
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case chunk := <-chunkC:
|
||||||
|
chunk.Data = make([]byte, chunk.Reader.Size())
|
||||||
|
chunk.Reader.ReadAt(chunk.Data, 0)
|
||||||
|
m.Put(chunk)
|
||||||
|
|
||||||
|
case err, ok := <-errC:
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Chunker error: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
t.Logf("quitting SPLIT loop\n")
|
||||||
|
break SPLIT
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
chunker := &TreeChunker{
|
||||||
|
Branches: branches,
|
||||||
|
}
|
||||||
|
chunker.Init()
|
||||||
|
chunkC = make(chan *Chunk)
|
||||||
|
var r LazySectionReader
|
||||||
|
r, errC = chunker.Join(key, chunkC)
|
||||||
|
|
||||||
|
quit := make(chan bool)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
JOIN:
|
||||||
|
for {
|
||||||
|
select {
|
||||||
|
case chunk := <-chunkC:
|
||||||
|
go func() {
|
||||||
|
storedChunk, err := m.Get(chunk.Key)
|
||||||
|
if err == notFound {
|
||||||
|
t.Errorf("Chunk not found: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("GET error: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
chunk.Reader = NewChunkReaderFromBytes(storedChunk.Data)
|
||||||
|
chunk.Size = storedChunk.Size
|
||||||
|
close(chunk.C)
|
||||||
|
}()
|
||||||
|
case err, ok := <-errC:
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Chunker error: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !ok {
|
||||||
|
break JOIN
|
||||||
|
}
|
||||||
|
case <-quit:
|
||||||
|
break JOIN
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
b := make([]byte, l)
|
||||||
|
n, err := r.ReadAt(b, 0)
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("read error (%v/%v) %v", n, l, err)
|
||||||
|
close(quit)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -15,78 +15,7 @@ func testDbStore(l int64, branches int64, t *testing.T) {
|
||||||
panic("no dbStore")
|
panic("no dbStore")
|
||||||
}
|
}
|
||||||
defer m.close()
|
defer m.close()
|
||||||
chunkC := make(chan *Chunk)
|
testStore(m, l, branches, t)
|
||||||
key, errC := randomChunks(l, branches, chunkC)
|
|
||||||
|
|
||||||
SPLIT:
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case chunk := <-chunkC:
|
|
||||||
chunk.Data = make([]byte, chunk.Reader.Size())
|
|
||||||
chunk.Reader.ReadAt(chunk.Data, 0)
|
|
||||||
m.Put(chunk)
|
|
||||||
|
|
||||||
case err, ok := <-errC:
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Chunker error: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !ok {
|
|
||||||
t.Logf("quitting SPLIT loop\n")
|
|
||||||
break SPLIT
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chunker := &TreeChunker{
|
|
||||||
Branches: branches,
|
|
||||||
}
|
|
||||||
chunker.Init()
|
|
||||||
chunkC = make(chan *Chunk)
|
|
||||||
var r LazySectionReader
|
|
||||||
r, errC = chunker.Join(key, chunkC)
|
|
||||||
|
|
||||||
quit := make(chan bool)
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
JOIN:
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case chunk := <-chunkC:
|
|
||||||
go func() {
|
|
||||||
storedChunk, err := m.Get(chunk.Key)
|
|
||||||
if err == notFound {
|
|
||||||
t.Errorf("Chunk not found: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("GET error: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
chunk.Reader = NewChunkReaderFromBytes(storedChunk.Data)
|
|
||||||
chunk.Size = storedChunk.Size
|
|
||||||
close(chunk.C)
|
|
||||||
}()
|
|
||||||
case err, ok := <-errC:
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Chunker error: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !ok {
|
|
||||||
break JOIN
|
|
||||||
}
|
|
||||||
case <-quit:
|
|
||||||
break JOIN
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
b := make([]byte, l)
|
|
||||||
n, err := r.ReadAt(b, 0)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("read error (%v/%v) %v", n, l, err)
|
|
||||||
close(quit)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDbStore128_10000(t *testing.T) {
|
func TestDbStore128_10000(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ type Chunk struct {
|
||||||
|
|
||||||
type ChunkStore interface {
|
type ChunkStore interface {
|
||||||
Put(*Chunk) // effectively there is no error even if there is no error
|
Put(*Chunk) // effectively there is no error even if there is no error
|
||||||
Get() (*Chunk, error)
|
Get(Key) (*Chunk, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *DPA) Retrieve(key Key) (data LazySectionReader, err error) {
|
func (self *DPA) Retrieve(key Key) (data LazySectionReader, err error) {
|
||||||
|
|
@ -151,7 +151,7 @@ func (self *DPA) retrieveLoop() {
|
||||||
for chunk := range self.retrieveC {
|
for chunk := range self.retrieveC {
|
||||||
go func() {
|
go func() {
|
||||||
for _, store := range self.Stores {
|
for _, store := range self.Stores {
|
||||||
if _, err := store.Get(); err != nil { // no waiting/blocking here
|
if _, err := store.Get(chunk.Key); err != nil { // no waiting/blocking here
|
||||||
dpaLogger.DebugDetailf("%v retrieving chunk %x: %v", store, chunk.Key, err)
|
dpaLogger.DebugDetailf("%v retrieving chunk %x: %v", store, chunk.Key, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,101 +1,14 @@
|
||||||
package bzz
|
package bzz
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/rand"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/bzz/test"
|
"github.com/ethereum/go-ethereum/bzz/test"
|
||||||
)
|
)
|
||||||
|
|
||||||
func randomChunks(l int64, branches int64, chunkC chan *Chunk) (key Key, errC chan error) {
|
|
||||||
chunker := &TreeChunker{
|
|
||||||
Branches: branches,
|
|
||||||
}
|
|
||||||
chunker.Init()
|
|
||||||
key = make([]byte, 32)
|
|
||||||
b := make([]byte, l)
|
|
||||||
_, err := rand.Read(b)
|
|
||||||
if err != nil {
|
|
||||||
panic("no rand")
|
|
||||||
}
|
|
||||||
errC = chunker.Split(key, NewChunkReaderFromBytes(b), chunkC)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func testMemStore(l int64, branches int64, t *testing.T) {
|
func testMemStore(l int64, branches int64, t *testing.T) {
|
||||||
m := newMemStore(nil)
|
m := newMemStore(nil)
|
||||||
chunkC := make(chan *Chunk)
|
testStore(m, l, branches, t)
|
||||||
key, errC := randomChunks(l, branches, chunkC)
|
|
||||||
|
|
||||||
SPLIT:
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case chunk := <-chunkC:
|
|
||||||
chunk.Data = make([]byte, chunk.Reader.Size())
|
|
||||||
chunk.Reader.ReadAt(chunk.Data, 0)
|
|
||||||
m.Put(chunk)
|
|
||||||
|
|
||||||
case err, ok := <-errC:
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Chunker error: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !ok {
|
|
||||||
t.Logf("quitting SPLIT loop\n")
|
|
||||||
break SPLIT
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
chunker := &TreeChunker{
|
|
||||||
Branches: branches,
|
|
||||||
}
|
|
||||||
chunker.Init()
|
|
||||||
chunkC = make(chan *Chunk)
|
|
||||||
var r LazySectionReader
|
|
||||||
r, errC = chunker.Join(key, chunkC)
|
|
||||||
|
|
||||||
quit := make(chan bool)
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
JOIN:
|
|
||||||
for {
|
|
||||||
select {
|
|
||||||
case chunk := <-chunkC:
|
|
||||||
go func() {
|
|
||||||
storedChunk, err := m.Get(chunk.Key)
|
|
||||||
if err == notFound {
|
|
||||||
t.Errorf("Chunk not found: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("GET error: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
chunk.Reader = NewChunkReaderFromBytes(storedChunk.Data)
|
|
||||||
chunk.Size = storedChunk.Size
|
|
||||||
close(chunk.C)
|
|
||||||
}()
|
|
||||||
case err, ok := <-errC:
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("Chunker error: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if !ok {
|
|
||||||
break JOIN
|
|
||||||
}
|
|
||||||
case <-quit:
|
|
||||||
break JOIN
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
b := make([]byte, l)
|
|
||||||
n, err := r.ReadAt(b, 0)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("read error (%v/%v) %v", n, l, err)
|
|
||||||
close(quit)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestMemStore128_10000(t *testing.T) {
|
func TestMemStore128_10000(t *testing.T) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue