aboutsummaryrefslogtreecommitdiffstats
path: root/swarm/storage
diff options
context:
space:
mode:
authorBalint Gabor <balint.g@gmail.com>2018-09-25 23:35:54 +0800
committerJanos Guljas <janos@resenje.org>2018-09-26 17:34:40 +0800
commit3f7acbbeb929bc3a2a3073bae15977ec69761bab (patch)
treea1d371d0a8d043e51dff796ff04d0eb84599fa80 /swarm/storage
parentd3441ebb563439bac0837d70591f92e2c6080303 (diff)
downloaddexon-3f7acbbeb929bc3a2a3073bae15977ec69761bab.tar.gz
dexon-3f7acbbeb929bc3a2a3073bae15977ec69761bab.tar.zst
dexon-3f7acbbeb929bc3a2a3073bae15977ec69761bab.zip
swarm: prevent forever running retrieve request loops
Diffstat (limited to 'swarm/storage')
-rw-r--r--swarm/storage/mru/testutil.go2
-rw-r--r--swarm/storage/netstore.go7
-rw-r--r--swarm/storage/netstore_test.go11
3 files changed, 15 insertions, 5 deletions
diff --git a/swarm/storage/mru/testutil.go b/swarm/storage/mru/testutil.go
index 936132d40..7a5a9e4d9 100644
--- a/swarm/storage/mru/testutil.go
+++ b/swarm/storage/mru/testutil.go
@@ -40,7 +40,7 @@ func (t *TestHandler) Close() {
type mockNetFetcher struct{}
-func (m *mockNetFetcher) Request(ctx context.Context) {
+func (m *mockNetFetcher) Request(ctx context.Context, hopCount uint8) {
}
func (m *mockNetFetcher) Offer(ctx context.Context, source *enode.ID) {
}
diff --git a/swarm/storage/netstore.go b/swarm/storage/netstore.go
index a3a552232..16bc48a9a 100644
--- a/swarm/storage/netstore.go
+++ b/swarm/storage/netstore.go
@@ -34,7 +34,7 @@ type (
)
type NetFetcher interface {
- Request(ctx context.Context)
+ Request(ctx context.Context, hopCount uint8)
Offer(ctx context.Context, source *enode.ID)
}
@@ -263,6 +263,9 @@ func (f *fetcher) Fetch(rctx context.Context) (Chunk, error) {
// If there is a source in the context then it is an offer, otherwise a request
sourceIF := rctx.Value("source")
+
+ hopCount, _ := rctx.Value("hopcount").(uint8)
+
if sourceIF != nil {
var source enode.ID
if err := source.UnmarshalText([]byte(sourceIF.(string))); err != nil {
@@ -270,7 +273,7 @@ func (f *fetcher) Fetch(rctx context.Context) (Chunk, error) {
}
f.netFetcher.Offer(rctx, &source)
} else {
- f.netFetcher.Request(rctx)
+ f.netFetcher.Request(rctx, hopCount)
}
// wait until either the chunk is delivered or the context is done
diff --git a/swarm/storage/netstore_test.go b/swarm/storage/netstore_test.go
index b734c117b..8a09fa5ae 100644
--- a/swarm/storage/netstore_test.go
+++ b/swarm/storage/netstore_test.go
@@ -40,6 +40,7 @@ type mockNetFetcher struct {
offerCalled bool
quit <-chan struct{}
ctx context.Context
+ hopCounts []uint8
}
func (m *mockNetFetcher) Offer(ctx context.Context, source *enode.ID) {
@@ -47,7 +48,7 @@ func (m *mockNetFetcher) Offer(ctx context.Context, source *enode.ID) {
m.sources = append(m.sources, source)
}
-func (m *mockNetFetcher) Request(ctx context.Context) {
+func (m *mockNetFetcher) Request(ctx context.Context, hopCount uint8) {
m.requestCalled = true
var peers []Address
m.peers.Range(func(key interface{}, _ interface{}) bool {
@@ -55,6 +56,7 @@ func (m *mockNetFetcher) Request(ctx context.Context) {
return true
})
m.peersPerRequest = append(m.peersPerRequest, peers)
+ m.hopCounts = append(m.hopCounts, hopCount)
}
type mockNetFetchFuncFactory struct {
@@ -412,7 +414,8 @@ func TestNetStoreGetCallsRequest(t *testing.T) {
chunk := GenerateRandomChunk(ch.DefaultSize)
- ctx, cancel := context.WithTimeout(context.Background(), 200*time.Millisecond)
+ ctx := context.WithValue(context.Background(), "hopcount", uint8(5))
+ ctx, cancel := context.WithTimeout(ctx, 200*time.Millisecond)
defer cancel()
// We call get for a not available chunk, it will timeout because the chunk is not delivered
@@ -426,6 +429,10 @@ func TestNetStoreGetCallsRequest(t *testing.T) {
if !fetcher.requestCalled {
t.Fatal("Expected NetFetcher.Request to be called")
}
+
+ if fetcher.hopCounts[0] != 5 {
+ t.Fatalf("Expected NetFetcher.Request be called with hopCount 5, got %v", fetcher.hopCounts[0])
+ }
}
// TestNetStoreGetCallsOffer tests if Get created a request on the NetFetcher for an unavailable chunk