Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
G
Geth-Modification
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张蕾
Geth-Modification
Commits
0da3b17a
Unverified
Commit
0da3b17a
authored
Sep 28, 2018
by
Viktor Trón
Committed by
GitHub
Sep 28, 2018
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #17747 from ethersphere/max-stream-peer-servers
Add stream peer servers limit
parents
d8d86692
86f68cf0
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
276 additions
and
75 deletions
+276
-75
config.go
cmd/swarm/config.go
+33
-21
main.go
cmd/swarm/main.go
+7
-0
config.go
swarm/api/config.go
+36
-34
common_test.go
swarm/network/stream/common_test.go
+2
-2
delivery_test.go
swarm/network/stream/delivery_test.go
+4
-4
messages.go
swarm/network/stream/messages.go
+6
-4
peer.go
swarm/network/stream/peer.go
+11
-0
stream.go
swarm/network/stream/stream.go
+3
-0
streamer_test.go
swarm/network/stream/streamer_test.go
+173
-10
swarm.go
swarm/swarm.go
+1
-0
No files found.
cmd/swarm/config.go
View file @
0da3b17a
...
@@ -59,27 +59,28 @@ var (
...
@@ -59,27 +59,28 @@ var (
//constants for environment variables
//constants for environment variables
const
(
const
(
SWARM_ENV_CHEQUEBOOK_ADDR
=
"SWARM_CHEQUEBOOK_ADDR"
SWARM_ENV_CHEQUEBOOK_ADDR
=
"SWARM_CHEQUEBOOK_ADDR"
SWARM_ENV_ACCOUNT
=
"SWARM_ACCOUNT"
SWARM_ENV_ACCOUNT
=
"SWARM_ACCOUNT"
SWARM_ENV_LISTEN_ADDR
=
"SWARM_LISTEN_ADDR"
SWARM_ENV_LISTEN_ADDR
=
"SWARM_LISTEN_ADDR"
SWARM_ENV_PORT
=
"SWARM_PORT"
SWARM_ENV_PORT
=
"SWARM_PORT"
SWARM_ENV_NETWORK_ID
=
"SWARM_NETWORK_ID"
SWARM_ENV_NETWORK_ID
=
"SWARM_NETWORK_ID"
SWARM_ENV_SWAP_ENABLE
=
"SWARM_SWAP_ENABLE"
SWARM_ENV_SWAP_ENABLE
=
"SWARM_SWAP_ENABLE"
SWARM_ENV_SWAP_API
=
"SWARM_SWAP_API"
SWARM_ENV_SWAP_API
=
"SWARM_SWAP_API"
SWARM_ENV_SYNC_DISABLE
=
"SWARM_SYNC_DISABLE"
SWARM_ENV_SYNC_DISABLE
=
"SWARM_SYNC_DISABLE"
SWARM_ENV_SYNC_UPDATE_DELAY
=
"SWARM_ENV_SYNC_UPDATE_DELAY"
SWARM_ENV_SYNC_UPDATE_DELAY
=
"SWARM_ENV_SYNC_UPDATE_DELAY"
SWARM_ENV_LIGHT_NODE_ENABLE
=
"SWARM_LIGHT_NODE_ENABLE"
SWARM_ENV_MAX_STREAM_PEER_SERVERS
=
"SWARM_ENV_MAX_STREAM_PEER_SERVERS"
SWARM_ENV_DELIVERY_SKIP_CHECK
=
"SWARM_DELIVERY_SKIP_CHECK"
SWARM_ENV_LIGHT_NODE_ENABLE
=
"SWARM_LIGHT_NODE_ENABLE"
SWARM_ENV_ENS_API
=
"SWARM_ENS_API"
SWARM_ENV_DELIVERY_SKIP_CHECK
=
"SWARM_DELIVERY_SKIP_CHECK"
SWARM_ENV_ENS_ADDR
=
"SWARM_ENS_ADDR"
SWARM_ENV_ENS_API
=
"SWARM_ENS_API"
SWARM_ENV_CORS
=
"SWARM_CORS"
SWARM_ENV_ENS_ADDR
=
"SWARM_ENS_ADDR"
SWARM_ENV_BOOTNODES
=
"SWARM_BOOTNODES"
SWARM_ENV_CORS
=
"SWARM_CORS"
SWARM_ENV_PSS_ENABLE
=
"SWARM_PSS_ENABLE"
SWARM_ENV_BOOTNODES
=
"SWARM_BOOTNODES"
SWARM_ENV_STORE_PATH
=
"SWARM_STORE_PATH"
SWARM_ENV_PSS_ENABLE
=
"SWARM_PSS_ENABLE"
SWARM_ENV_STORE_CAPACITY
=
"SWARM_STORE_CAPACITY"
SWARM_ENV_STORE_PATH
=
"SWARM_STORE_PATH"
SWARM_ENV_STORE_CACHE_CAPACITY
=
"SWARM_STORE_CACHE_CAPACITY"
SWARM_ENV_STORE_CAPACITY
=
"SWARM_STORE_CAPACITY"
SWARM_ACCESS_PASSWORD
=
"SWARM_ACCESS_PASSWORD"
SWARM_ENV_STORE_CACHE_CAPACITY
=
"SWARM_STORE_CACHE_CAPACITY"
GETH_ENV_DATADIR
=
"GETH_DATADIR"
SWARM_ACCESS_PASSWORD
=
"SWARM_ACCESS_PASSWORD"
GETH_ENV_DATADIR
=
"GETH_DATADIR"
)
)
// These settings ensure that TOML keys use the same names as Go struct fields.
// These settings ensure that TOML keys use the same names as Go struct fields.
...
@@ -207,6 +208,9 @@ func cmdLineOverride(currentConfig *bzzapi.Config, ctx *cli.Context) *bzzapi.Con
...
@@ -207,6 +208,9 @@ func cmdLineOverride(currentConfig *bzzapi.Config, ctx *cli.Context) *bzzapi.Con
currentConfig
.
SyncUpdateDelay
=
d
currentConfig
.
SyncUpdateDelay
=
d
}
}
// any value including 0 is acceptable
currentConfig
.
MaxStreamPeerServers
=
ctx
.
GlobalInt
(
SwarmMaxStreamPeerServersFlag
.
Name
)
if
ctx
.
GlobalIsSet
(
SwarmLightNodeEnabled
.
Name
)
{
if
ctx
.
GlobalIsSet
(
SwarmLightNodeEnabled
.
Name
)
{
currentConfig
.
LightNodeEnabled
=
true
currentConfig
.
LightNodeEnabled
=
true
}
}
...
@@ -308,6 +312,14 @@ func envVarsOverride(currentConfig *bzzapi.Config) (config *bzzapi.Config) {
...
@@ -308,6 +312,14 @@ func envVarsOverride(currentConfig *bzzapi.Config) (config *bzzapi.Config) {
}
}
}
}
if
max
:=
os
.
Getenv
(
SWARM_ENV_MAX_STREAM_PEER_SERVERS
);
max
!=
""
{
m
,
err
:=
strconv
.
Atoi
(
max
)
if
err
!=
nil
{
utils
.
Fatalf
(
"invalid environment variable %s: %v"
,
SWARM_ENV_MAX_STREAM_PEER_SERVERS
,
err
)
}
currentConfig
.
MaxStreamPeerServers
=
m
}
if
lne
:=
os
.
Getenv
(
SWARM_ENV_LIGHT_NODE_ENABLE
);
lne
!=
""
{
if
lne
:=
os
.
Getenv
(
SWARM_ENV_LIGHT_NODE_ENABLE
);
lne
!=
""
{
if
lightnode
,
err
:=
strconv
.
ParseBool
(
lne
);
err
!=
nil
{
if
lightnode
,
err
:=
strconv
.
ParseBool
(
lne
);
err
!=
nil
{
currentConfig
.
LightNodeEnabled
=
lightnode
currentConfig
.
LightNodeEnabled
=
lightnode
...
...
cmd/swarm/main.go
View file @
0da3b17a
...
@@ -116,6 +116,12 @@ var (
...
@@ -116,6 +116,12 @@ var (
Usage
:
"Duration for sync subscriptions update after no new peers are added (default 15s)"
,
Usage
:
"Duration for sync subscriptions update after no new peers are added (default 15s)"
,
EnvVar
:
SWARM_ENV_SYNC_UPDATE_DELAY
,
EnvVar
:
SWARM_ENV_SYNC_UPDATE_DELAY
,
}
}
SwarmMaxStreamPeerServersFlag
=
cli
.
IntFlag
{
Name
:
"max-stream-peer-servers"
,
Usage
:
"Limit of Stream peer servers, 0 denotes unlimited"
,
EnvVar
:
SWARM_ENV_MAX_STREAM_PEER_SERVERS
,
Value
:
10000
,
// A very large default value is possible as stream servers have very small memory footprint
}
SwarmLightNodeEnabled
=
cli
.
BoolFlag
{
SwarmLightNodeEnabled
=
cli
.
BoolFlag
{
Name
:
"lightnode"
,
Name
:
"lightnode"
,
Usage
:
"Enable Swarm LightNode (default false)"
,
Usage
:
"Enable Swarm LightNode (default false)"
,
...
@@ -542,6 +548,7 @@ pv(1) tool to get a progress bar:
...
@@ -542,6 +548,7 @@ pv(1) tool to get a progress bar:
SwarmSwapAPIFlag
,
SwarmSwapAPIFlag
,
SwarmSyncDisabledFlag
,
SwarmSyncDisabledFlag
,
SwarmSyncUpdateDelay
,
SwarmSyncUpdateDelay
,
SwarmMaxStreamPeerServersFlag
,
SwarmLightNodeEnabled
,
SwarmLightNodeEnabled
,
SwarmDeliverySkipCheckFlag
,
SwarmDeliverySkipCheckFlag
,
SwarmListenAddrFlag
,
SwarmListenAddrFlag
,
...
...
swarm/api/config.go
View file @
0da3b17a
...
@@ -50,26 +50,27 @@ type Config struct {
...
@@ -50,26 +50,27 @@ type Config struct {
Swap
*
swap
.
LocalProfile
Swap
*
swap
.
LocalProfile
Pss
*
pss
.
PssParams
Pss
*
pss
.
PssParams
//*network.SyncParams
//*network.SyncParams
Contract
common
.
Address
Contract
common
.
Address
EnsRoot
common
.
Address
EnsRoot
common
.
Address
EnsAPIs
[]
string
EnsAPIs
[]
string
Path
string
Path
string
ListenAddr
string
ListenAddr
string
Port
string
Port
string
PublicKey
string
PublicKey
string
BzzKey
string
BzzKey
string
NodeID
string
NodeID
string
NetworkID
uint64
NetworkID
uint64
SwapEnabled
bool
SwapEnabled
bool
SyncEnabled
bool
SyncEnabled
bool
SyncingSkipCheck
bool
SyncingSkipCheck
bool
DeliverySkipCheck
bool
DeliverySkipCheck
bool
LightNodeEnabled
bool
MaxStreamPeerServers
int
SyncUpdateDelay
time
.
Duration
LightNodeEnabled
bool
SwapAPI
string
SyncUpdateDelay
time
.
Duration
Cors
string
SwapAPI
string
BzzAccount
string
Cors
string
privateKey
*
ecdsa
.
PrivateKey
BzzAccount
string
privateKey
*
ecdsa
.
PrivateKey
}
}
//create a default config with all parameters to set to defaults
//create a default config with all parameters to set to defaults
...
@@ -80,20 +81,21 @@ func NewConfig() (c *Config) {
...
@@ -80,20 +81,21 @@ func NewConfig() (c *Config) {
FileStoreParams
:
storage
.
NewFileStoreParams
(),
FileStoreParams
:
storage
.
NewFileStoreParams
(),
HiveParams
:
network
.
NewHiveParams
(),
HiveParams
:
network
.
NewHiveParams
(),
//SyncParams: network.NewDefaultSyncParams(),
//SyncParams: network.NewDefaultSyncParams(),
Swap
:
swap
.
NewDefaultSwapParams
(),
Swap
:
swap
.
NewDefaultSwapParams
(),
Pss
:
pss
.
NewPssParams
(),
Pss
:
pss
.
NewPssParams
(),
ListenAddr
:
DefaultHTTPListenAddr
,
ListenAddr
:
DefaultHTTPListenAddr
,
Port
:
DefaultHTTPPort
,
Port
:
DefaultHTTPPort
,
Path
:
node
.
DefaultDataDir
(),
Path
:
node
.
DefaultDataDir
(),
EnsAPIs
:
nil
,
EnsAPIs
:
nil
,
EnsRoot
:
ens
.
TestNetAddress
,
EnsRoot
:
ens
.
TestNetAddress
,
NetworkID
:
network
.
DefaultNetworkID
,
NetworkID
:
network
.
DefaultNetworkID
,
SwapEnabled
:
false
,
SwapEnabled
:
false
,
SyncEnabled
:
true
,
SyncEnabled
:
true
,
SyncingSkipCheck
:
false
,
SyncingSkipCheck
:
false
,
DeliverySkipCheck
:
true
,
MaxStreamPeerServers
:
10000
,
SyncUpdateDelay
:
15
*
time
.
Second
,
DeliverySkipCheck
:
true
,
SwapAPI
:
""
,
SyncUpdateDelay
:
15
*
time
.
Second
,
SwapAPI
:
""
,
}
}
return
return
...
...
swarm/network/stream/common_test.go
View file @
0da3b17a
...
@@ -84,7 +84,7 @@ func createGlobalStore() (string, *mockdb.GlobalStore, error) {
...
@@ -84,7 +84,7 @@ func createGlobalStore() (string, *mockdb.GlobalStore, error) {
return
globalStoreDir
,
globalStore
,
nil
return
globalStoreDir
,
globalStore
,
nil
}
}
func
newStreamerTester
(
t
*
testing
.
T
)
(
*
p2ptest
.
ProtocolTester
,
*
Registry
,
*
storage
.
LocalStore
,
func
(),
error
)
{
func
newStreamerTester
(
t
*
testing
.
T
,
registryOptions
*
RegistryOptions
)
(
*
p2ptest
.
ProtocolTester
,
*
Registry
,
*
storage
.
LocalStore
,
func
(),
error
)
{
// setup
// setup
addr
:=
network
.
RandomAddr
()
// tested peers peer address
addr
:=
network
.
RandomAddr
()
// tested peers peer address
to
:=
network
.
NewKademlia
(
addr
.
OAddr
,
network
.
NewKadParams
())
to
:=
network
.
NewKademlia
(
addr
.
OAddr
,
network
.
NewKadParams
())
...
@@ -114,7 +114,7 @@ func newStreamerTester(t *testing.T) (*p2ptest.ProtocolTester, *Registry, *stora
...
@@ -114,7 +114,7 @@ func newStreamerTester(t *testing.T) (*p2ptest.ProtocolTester, *Registry, *stora
delivery
:=
NewDelivery
(
to
,
netStore
)
delivery
:=
NewDelivery
(
to
,
netStore
)
netStore
.
NewNetFetcherFunc
=
network
.
NewFetcherFactory
(
delivery
.
RequestFromPeers
,
true
)
.
New
netStore
.
NewNetFetcherFunc
=
network
.
NewFetcherFactory
(
delivery
.
RequestFromPeers
,
true
)
.
New
streamer
:=
NewRegistry
(
addr
.
ID
(),
delivery
,
netStore
,
state
.
NewInmemoryStore
(),
nil
)
streamer
:=
NewRegistry
(
addr
.
ID
(),
delivery
,
netStore
,
state
.
NewInmemoryStore
(),
registryOptions
)
teardown
:=
func
()
{
teardown
:=
func
()
{
streamer
.
Close
()
streamer
.
Close
()
removeDataDir
()
removeDataDir
()
...
...
swarm/network/stream/delivery_test.go
View file @
0da3b17a
...
@@ -39,7 +39,7 @@ import (
...
@@ -39,7 +39,7 @@ import (
)
)
func
TestStreamerRetrieveRequest
(
t
*
testing
.
T
)
{
func
TestStreamerRetrieveRequest
(
t
*
testing
.
T
)
{
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -75,7 +75,7 @@ func TestStreamerRetrieveRequest(t *testing.T) {
...
@@ -75,7 +75,7 @@ func TestStreamerRetrieveRequest(t *testing.T) {
}
}
func
TestStreamerUpstreamRetrieveRequestMsgExchangeWithoutStore
(
t
*
testing
.
T
)
{
func
TestStreamerUpstreamRetrieveRequestMsgExchangeWithoutStore
(
t
*
testing
.
T
)
{
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -127,7 +127,7 @@ func TestStreamerUpstreamRetrieveRequestMsgExchangeWithoutStore(t *testing.T) {
...
@@ -127,7 +127,7 @@ func TestStreamerUpstreamRetrieveRequestMsgExchangeWithoutStore(t *testing.T) {
// upstream request server receives a retrieve Request and responds with
// upstream request server receives a retrieve Request and responds with
// offered hashes or delivery if skipHash is set to true
// offered hashes or delivery if skipHash is set to true
func
TestStreamerUpstreamRetrieveRequestMsgExchange
(
t
*
testing
.
T
)
{
func
TestStreamerUpstreamRetrieveRequestMsgExchange
(
t
*
testing
.
T
)
{
tester
,
streamer
,
localStore
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
localStore
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -221,7 +221,7 @@ func TestStreamerUpstreamRetrieveRequestMsgExchange(t *testing.T) {
...
@@ -221,7 +221,7 @@ func TestStreamerUpstreamRetrieveRequestMsgExchange(t *testing.T) {
}
}
func
TestStreamerDownstreamChunkDeliveryMsgExchange
(
t
*
testing
.
T
)
{
func
TestStreamerDownstreamChunkDeliveryMsgExchange
(
t
*
testing
.
T
)
{
tester
,
streamer
,
localStore
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
localStore
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
...
swarm/network/stream/messages.go
View file @
0da3b17a
...
@@ -84,11 +84,13 @@ func (p *Peer) handleSubscribeMsg(ctx context.Context, req *SubscribeMsg) (err e
...
@@ -84,11 +84,13 @@ func (p *Peer) handleSubscribeMsg(ctx context.Context, req *SubscribeMsg) (err e
defer
func
()
{
defer
func
()
{
if
err
!=
nil
{
if
err
!=
nil
{
if
e
:=
p
.
Send
(
context
.
TODO
(),
SubscribeErrorMsg
{
// The error will be sent as a subscribe error message
// and will not be returned as it will prevent any new message
// exchange between peers over p2p. Instead, error will be returned
// only if there is one from sending subscribe error message.
err
=
p
.
Send
(
context
.
TODO
(),
SubscribeErrorMsg
{
Error
:
err
.
Error
(),
Error
:
err
.
Error
(),
});
e
!=
nil
{
})
log
.
Error
(
"send stream subscribe error message"
,
"err"
,
err
)
}
}
}
}()
}()
...
...
swarm/network/stream/peer.go
View file @
0da3b17a
...
@@ -18,6 +18,7 @@ package stream
...
@@ -18,6 +18,7 @@ package stream
import
(
import
(
"context"
"context"
"errors"
"fmt"
"fmt"
"sync"
"sync"
"time"
"time"
...
@@ -46,6 +47,10 @@ func (e *notFoundError) Error() string {
...
@@ -46,6 +47,10 @@ func (e *notFoundError) Error() string {
return
fmt
.
Sprintf
(
"%s not found for stream %q"
,
e
.
t
,
e
.
s
)
return
fmt
.
Sprintf
(
"%s not found for stream %q"
,
e
.
t
,
e
.
s
)
}
}
// ErrMaxPeerServers will be returned if peer server limit is reached.
// It will be sent in the SubscribeErrorMsg.
var
ErrMaxPeerServers
=
errors
.
New
(
"max peer servers"
)
// Peer is the Peer extension for the streaming protocol
// Peer is the Peer extension for the streaming protocol
type
Peer
struct
{
type
Peer
struct
{
*
protocols
.
Peer
*
protocols
.
Peer
...
@@ -204,6 +209,11 @@ func (p *Peer) setServer(s Stream, o Server, priority uint8) (*server, error) {
...
@@ -204,6 +209,11 @@ func (p *Peer) setServer(s Stream, o Server, priority uint8) (*server, error) {
if
p
.
servers
[
s
]
!=
nil
{
if
p
.
servers
[
s
]
!=
nil
{
return
nil
,
fmt
.
Errorf
(
"server %s already registered"
,
s
)
return
nil
,
fmt
.
Errorf
(
"server %s already registered"
,
s
)
}
}
if
p
.
streamer
.
maxPeerServers
>
0
&&
len
(
p
.
servers
)
>=
p
.
streamer
.
maxPeerServers
{
return
nil
,
ErrMaxPeerServers
}
os
:=
&
server
{
os
:=
&
server
{
Server
:
o
,
Server
:
o
,
stream
:
s
,
stream
:
s
,
...
@@ -346,6 +356,7 @@ func (p *Peer) removeClient(s Stream) error {
...
@@ -346,6 +356,7 @@ func (p *Peer) removeClient(s Stream) error {
return
newNotFoundError
(
"client"
,
s
)
return
newNotFoundError
(
"client"
,
s
)
}
}
client
.
close
()
client
.
close
()
delete
(
p
.
clients
,
s
)
return
nil
return
nil
}
}
...
...
swarm/network/stream/stream.go
View file @
0da3b17a
...
@@ -60,6 +60,7 @@ type Registry struct {
...
@@ -60,6 +60,7 @@ type Registry struct {
delivery
*
Delivery
delivery
*
Delivery
intervalsStore
state
.
Store
intervalsStore
state
.
Store
doRetrieve
bool
doRetrieve
bool
maxPeerServers
int
}
}
// RegistryOptions holds optional values for NewRegistry constructor.
// RegistryOptions holds optional values for NewRegistry constructor.
...
@@ -68,6 +69,7 @@ type RegistryOptions struct {
...
@@ -68,6 +69,7 @@ type RegistryOptions struct {
DoSync
bool
DoSync
bool
DoRetrieve
bool
DoRetrieve
bool
SyncUpdateDelay
time
.
Duration
SyncUpdateDelay
time
.
Duration
MaxPeerServers
int
// The limit of servers for each peer in registry
}
}
// NewRegistry is Streamer constructor
// NewRegistry is Streamer constructor
...
@@ -87,6 +89,7 @@ func NewRegistry(localID enode.ID, delivery *Delivery, syncChunkStore storage.Sy
...
@@ -87,6 +89,7 @@ func NewRegistry(localID enode.ID, delivery *Delivery, syncChunkStore storage.Sy
delivery
:
delivery
,
delivery
:
delivery
,
intervalsStore
:
intervalsStore
,
intervalsStore
:
intervalsStore
,
doRetrieve
:
options
.
DoRetrieve
,
doRetrieve
:
options
.
DoRetrieve
,
maxPeerServers
:
options
.
MaxPeerServers
,
}
}
streamer
.
api
=
NewAPI
(
streamer
)
streamer
.
api
=
NewAPI
(
streamer
)
delivery
.
getPeer
=
streamer
.
getPeer
delivery
.
getPeer
=
streamer
.
getPeer
...
...
swarm/network/stream/streamer_test.go
View file @
0da3b17a
...
@@ -20,6 +20,7 @@ import (
...
@@ -20,6 +20,7 @@ import (
"bytes"
"bytes"
"context"
"context"
"errors"
"errors"
"strconv"
"testing"
"testing"
"time"
"time"
...
@@ -28,7 +29,7 @@ import (
...
@@ -28,7 +29,7 @@ import (
)
)
func
TestStreamerSubscribe
(
t
*
testing
.
T
)
{
func
TestStreamerSubscribe
(
t
*
testing
.
T
)
{
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -42,7 +43,7 @@ func TestStreamerSubscribe(t *testing.T) {
...
@@ -42,7 +43,7 @@ func TestStreamerSubscribe(t *testing.T) {
}
}
func
TestStreamerRequestSubscription
(
t
*
testing
.
T
)
{
func
TestStreamerRequestSubscription
(
t
*
testing
.
T
)
{
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -127,7 +128,7 @@ func (self *testServer) Close() {
...
@@ -127,7 +128,7 @@ func (self *testServer) Close() {
}
}
func
TestStreamerDownstreamSubscribeUnsubscribeMsgExchange
(
t
*
testing
.
T
)
{
func
TestStreamerDownstreamSubscribeUnsubscribeMsgExchange
(
t
*
testing
.
T
)
{
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -220,7 +221,7 @@ func TestStreamerDownstreamSubscribeUnsubscribeMsgExchange(t *testing.T) {
...
@@ -220,7 +221,7 @@ func TestStreamerDownstreamSubscribeUnsubscribeMsgExchange(t *testing.T) {
}
}
func
TestStreamerUpstreamSubscribeUnsubscribeMsgExchange
(
t
*
testing
.
T
)
{
func
TestStreamerUpstreamSubscribeUnsubscribeMsgExchange
(
t
*
testing
.
T
)
{
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -287,7 +288,7 @@ func TestStreamerUpstreamSubscribeUnsubscribeMsgExchange(t *testing.T) {
...
@@ -287,7 +288,7 @@ func TestStreamerUpstreamSubscribeUnsubscribeMsgExchange(t *testing.T) {
}
}
func
TestStreamerUpstreamSubscribeUnsubscribeMsgExchangeLive
(
t
*
testing
.
T
)
{
func
TestStreamerUpstreamSubscribeUnsubscribeMsgExchangeLive
(
t
*
testing
.
T
)
{
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -353,7 +354,7 @@ func TestStreamerUpstreamSubscribeUnsubscribeMsgExchangeLive(t *testing.T) {
...
@@ -353,7 +354,7 @@ func TestStreamerUpstreamSubscribeUnsubscribeMsgExchangeLive(t *testing.T) {
}
}
func
TestStreamerUpstreamSubscribeErrorMsgExchange
(
t
*
testing
.
T
)
{
func
TestStreamerUpstreamSubscribeErrorMsgExchange
(
t
*
testing
.
T
)
{
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -397,7 +398,7 @@ func TestStreamerUpstreamSubscribeErrorMsgExchange(t *testing.T) {
...
@@ -397,7 +398,7 @@ func TestStreamerUpstreamSubscribeErrorMsgExchange(t *testing.T) {
}
}
func
TestStreamerUpstreamSubscribeLiveAndHistory
(
t
*
testing
.
T
)
{
func
TestStreamerUpstreamSubscribeLiveAndHistory
(
t
*
testing
.
T
)
{
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -462,7 +463,7 @@ func TestStreamerUpstreamSubscribeLiveAndHistory(t *testing.T) {
...
@@ -462,7 +463,7 @@ func TestStreamerUpstreamSubscribeLiveAndHistory(t *testing.T) {
}
}
func
TestStreamerDownstreamCorruptHashesMsgExchange
(
t
*
testing
.
T
)
{
func
TestStreamerDownstreamCorruptHashesMsgExchange
(
t
*
testing
.
T
)
{
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -527,7 +528,7 @@ func TestStreamerDownstreamCorruptHashesMsgExchange(t *testing.T) {
...
@@ -527,7 +528,7 @@ func TestStreamerDownstreamCorruptHashesMsgExchange(t *testing.T) {
}
}
func
TestStreamerDownstreamOfferedHashesMsgExchange
(
t
*
testing
.
T
)
{
func
TestStreamerDownstreamOfferedHashesMsgExchange
(
t
*
testing
.
T
)
{
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -626,7 +627,7 @@ func TestStreamerDownstreamOfferedHashesMsgExchange(t *testing.T) {
...
@@ -626,7 +627,7 @@ func TestStreamerDownstreamOfferedHashesMsgExchange(t *testing.T) {
}
}
func
TestStreamerRequestSubscriptionQuitMsgExchange
(
t
*
testing
.
T
)
{
func
TestStreamerRequestSubscriptionQuitMsgExchange
(
t
*
testing
.
T
)
{
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
)
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
nil
)
defer
teardown
()
defer
teardown
()
if
err
!=
nil
{
if
err
!=
nil
{
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
...
@@ -752,3 +753,165 @@ func TestStreamerRequestSubscriptionQuitMsgExchange(t *testing.T) {
...
@@ -752,3 +753,165 @@ func TestStreamerRequestSubscriptionQuitMsgExchange(t *testing.T) {
t
.
Fatal
(
err
)
t
.
Fatal
(
err
)
}
}
}
}
// TestMaxPeerServersWithUnsubscribe creates a registry with a limited
// number of stream servers, and performs a test with subscriptions and
// unsubscriptions, checking if unsubscriptions will remove streams,
// leaving place for new streams.
func
TestMaxPeerServersWithUnsubscribe
(
t
*
testing
.
T
)
{
var
maxPeerServers
=
6
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
&
RegistryOptions
{
MaxPeerServers
:
maxPeerServers
,
})
defer
teardown
()
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
streamer
.
RegisterServerFunc
(
"foo"
,
func
(
p
*
Peer
,
t
string
,
live
bool
)
(
Server
,
error
)
{
return
newTestServer
(
t
),
nil
})
node
:=
tester
.
Nodes
[
0
]
for
i
:=
0
;
i
<
maxPeerServers
+
10
;
i
++
{
stream
:=
NewStream
(
"foo"
,
strconv
.
Itoa
(
i
),
true
)
err
=
tester
.
TestExchanges
(
p2ptest
.
Exchange
{
Label
:
"Subscribe message"
,
Triggers
:
[]
p2ptest
.
Trigger
{
{
Code
:
4
,
Msg
:
&
SubscribeMsg
{
Stream
:
stream
,
Priority
:
Top
,
},
Peer
:
node
.
ID
(),
},
},
Expects
:
[]
p2ptest
.
Expect
{
{
Code
:
1
,
Msg
:
&
OfferedHashesMsg
{
Stream
:
stream
,
HandoverProof
:
&
HandoverProof
{
Handover
:
&
Handover
{},
},
Hashes
:
make
([]
byte
,
HashSize
),
From
:
1
,
To
:
1
,
},
Peer
:
node
.
ID
(),
},
},
})
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
err
=
tester
.
TestExchanges
(
p2ptest
.
Exchange
{
Label
:
"unsubscribe message"
,
Triggers
:
[]
p2ptest
.
Trigger
{
{
Code
:
0
,
Msg
:
&
UnsubscribeMsg
{
Stream
:
stream
,
},
Peer
:
node
.
ID
(),
},
},
})
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
}
}
// TestMaxPeerServersWithoutUnsubscribe creates a registry with a limited
// number of stream servers, and performs subscriptions to detect subscriptions
// error message exchange.
func
TestMaxPeerServersWithoutUnsubscribe
(
t
*
testing
.
T
)
{
var
maxPeerServers
=
6
tester
,
streamer
,
_
,
teardown
,
err
:=
newStreamerTester
(
t
,
&
RegistryOptions
{
MaxPeerServers
:
maxPeerServers
,
})
defer
teardown
()
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
streamer
.
RegisterServerFunc
(
"foo"
,
func
(
p
*
Peer
,
t
string
,
live
bool
)
(
Server
,
error
)
{
return
newTestServer
(
t
),
nil
})
node
:=
tester
.
Nodes
[
0
]
for
i
:=
0
;
i
<
maxPeerServers
+
10
;
i
++
{
stream
:=
NewStream
(
"foo"
,
strconv
.
Itoa
(
i
),
true
)
if
i
>=
maxPeerServers
{
err
=
tester
.
TestExchanges
(
p2ptest
.
Exchange
{
Label
:
"Subscribe message"
,
Triggers
:
[]
p2ptest
.
Trigger
{
{
Code
:
4
,
Msg
:
&
SubscribeMsg
{
Stream
:
stream
,
Priority
:
Top
,
},
Peer
:
node
.
ID
(),
},
},
Expects
:
[]
p2ptest
.
Expect
{
{
Code
:
7
,
Msg
:
&
SubscribeErrorMsg
{
Error
:
ErrMaxPeerServers
.
Error
(),
},
Peer
:
node
.
ID
(),
},
},
})
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
continue
}
err
=
tester
.
TestExchanges
(
p2ptest
.
Exchange
{
Label
:
"Subscribe message"
,
Triggers
:
[]
p2ptest
.
Trigger
{
{
Code
:
4
,
Msg
:
&
SubscribeMsg
{
Stream
:
stream
,
Priority
:
Top
,
},
Peer
:
node
.
ID
(),
},
},
Expects
:
[]
p2ptest
.
Expect
{
{
Code
:
1
,
Msg
:
&
OfferedHashesMsg
{
Stream
:
stream
,
HandoverProof
:
&
HandoverProof
{
Handover
:
&
Handover
{},
},
Hashes
:
make
([]
byte
,
HashSize
),
From
:
1
,
To
:
1
,
},
Peer
:
node
.
ID
(),
},
},
})
if
err
!=
nil
{
t
.
Fatal
(
err
)
}
}
}
swarm/swarm.go
View file @
0da3b17a
...
@@ -180,6 +180,7 @@ func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err e
...
@@ -180,6 +180,7 @@ func NewSwarm(config *api.Config, mockStore *mock.NodeStore) (self *Swarm, err e
DoSync
:
config
.
SyncEnabled
,
DoSync
:
config
.
SyncEnabled
,
DoRetrieve
:
true
,
DoRetrieve
:
true
,
SyncUpdateDelay
:
config
.
SyncUpdateDelay
,
SyncUpdateDelay
:
config
.
SyncUpdateDelay
,
MaxPeerServers
:
config
.
MaxStreamPeerServers
,
})
})
// Swarm Hash Merklised Chunking for Arbitrary-length Document/File storage
// Swarm Hash Merklised Chunking for Arbitrary-length Document/File storage
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment