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
ae11545b
Commit
ae11545b
authored
7 years ago
by
Nick Johnson
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
eth, les: Refactor downloader peer to use structs
parent
05509579
Changes
7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
319 additions
and
300 deletions
+319
-300
downloader.go
eth/downloader/downloader.go
+44
-47
downloader_test.go
eth/downloader/downloader_test.go
+136
-126
peer.go
eth/downloader/peer.go
+58
-72
queue.go
eth/downloader/queue.go
+5
-5
statesync.go
eth/downloader/statesync.go
+2
-2
handler.go
eth/handler.go
+1
-1
handler.go
les/handler.go
+73
-47
No files found.
eth/downloader/downloader.go
View file @
ae11545b
This diff is collapsed.
Click to expand it.
eth/downloader/downloader_test.go
View file @
ae11545b
This diff is collapsed.
Click to expand it.
eth/downloader/peer.go
View file @
ae11545b
This diff is collapsed.
Click to expand it.
eth/downloader/queue.go
View file @
ae11545b
...
...
@@ -41,7 +41,7 @@ var (
// fetchRequest is a currently running data retrieval operation.
type
fetchRequest
struct
{
Peer
*
peer
// Peer to which the request was sent
Peer
*
peer
Connection
// Peer to which the request was sent
From
uint64
// [eth/62] Requested chain element index (used for skeleton fills only)
Hashes
map
[
common
.
Hash
]
int
// [eth/61] Requested hashes with their insertion index (priority)
Headers
[]
*
types
.
Header
// [eth/62] Requested headers, sorted by request order
...
...
@@ -391,7 +391,7 @@ func (q *queue) countProcessableItems() int {
// ReserveHeaders reserves a set of headers for the given peer, skipping any
// previously failed batches.
func
(
q
*
queue
)
ReserveHeaders
(
p
*
peer
,
count
int
)
*
fetchRequest
{
func
(
q
*
queue
)
ReserveHeaders
(
p
*
peer
Connection
,
count
int
)
*
fetchRequest
{
q
.
lock
.
Lock
()
defer
q
.
lock
.
Unlock
()
...
...
@@ -432,7 +432,7 @@ func (q *queue) ReserveHeaders(p *peer, count int) *fetchRequest {
// ReserveBodies reserves a set of body fetches for the given peer, skipping any
// previously failed downloads. Beside the next batch of needed fetches, it also
// returns a flag whether empty blocks were queued requiring processing.
func
(
q
*
queue
)
ReserveBodies
(
p
*
peer
,
count
int
)
(
*
fetchRequest
,
bool
,
error
)
{
func
(
q
*
queue
)
ReserveBodies
(
p
*
peer
Connection
,
count
int
)
(
*
fetchRequest
,
bool
,
error
)
{
isNoop
:=
func
(
header
*
types
.
Header
)
bool
{
return
header
.
TxHash
==
types
.
EmptyRootHash
&&
header
.
UncleHash
==
types
.
EmptyUncleHash
}
...
...
@@ -445,7 +445,7 @@ func (q *queue) ReserveBodies(p *peer, count int) (*fetchRequest, bool, error) {
// ReserveReceipts reserves a set of receipt fetches for the given peer, skipping
// any previously failed downloads. Beside the next batch of needed fetches, it
// also returns a flag whether empty receipts were queued requiring importing.
func
(
q
*
queue
)
ReserveReceipts
(
p
*
peer
,
count
int
)
(
*
fetchRequest
,
bool
,
error
)
{
func
(
q
*
queue
)
ReserveReceipts
(
p
*
peer
Connection
,
count
int
)
(
*
fetchRequest
,
bool
,
error
)
{
isNoop
:=
func
(
header
*
types
.
Header
)
bool
{
return
header
.
ReceiptHash
==
types
.
EmptyRootHash
}
...
...
@@ -462,7 +462,7 @@ func (q *queue) ReserveReceipts(p *peer, count int) (*fetchRequest, bool, error)
// Note, this method expects the queue lock to be already held for writing. The
// reason the lock is not obtained in here is because the parameters already need
// to access the queue, so they already need a lock anyway.
func
(
q
*
queue
)
reserveHeaders
(
p
*
peer
,
count
int
,
taskPool
map
[
common
.
Hash
]
*
types
.
Header
,
taskQueue
*
prque
.
Prque
,
func
(
q
*
queue
)
reserveHeaders
(
p
*
peer
Connection
,
count
int
,
taskPool
map
[
common
.
Hash
]
*
types
.
Header
,
taskQueue
*
prque
.
Prque
,
pendPool
map
[
string
]
*
fetchRequest
,
donePool
map
[
common
.
Hash
]
struct
{},
isNoop
func
(
*
types
.
Header
)
bool
)
(
*
fetchRequest
,
bool
,
error
)
{
// Short circuit if the pool has been depleted, or if the peer's already
// downloading something (sanity check not to corrupt state)
...
...
This diff is collapsed.
Click to expand it.
eth/downloader/statesync.go
View file @
ae11545b
...
...
@@ -37,7 +37,7 @@ type stateReq struct {
tasks
map
[
common
.
Hash
]
*
stateTask
// Download tasks to track previous attempts
timeout
time
.
Duration
// Maximum round trip time for this to complete
timer
*
time
.
Timer
// Timer to fire when the RTT timeout expires
peer
*
peer
// Peer that we're requesting from
peer
*
peer
Connection
// Peer that we're requesting from
response
[][]
byte
// Response data of the peer (nil for timeouts)
}
...
...
@@ -246,7 +246,7 @@ func (s *stateSync) Cancel() error {
// and timeouts.
func
(
s
*
stateSync
)
loop
()
error
{
// Listen for new peer events to assign tasks to them
newPeer
:=
make
(
chan
*
peer
,
1024
)
newPeer
:=
make
(
chan
*
peer
Connection
,
1024
)
peerSub
:=
s
.
d
.
peers
.
SubscribeNewPeers
(
newPeer
)
defer
peerSub
.
Unsubscribe
()
...
...
This diff is collapsed.
Click to expand it.
eth/handler.go
View file @
ae11545b
...
...
@@ -265,7 +265,7 @@ func (pm *ProtocolManager) handle(p *peer) error {
defer
pm
.
removePeer
(
p
.
id
)
// Register the peer in the downloader. If the downloader considers it banned, we disconnect
if
err
:=
pm
.
downloader
.
RegisterPeer
(
p
.
id
,
p
.
version
,
p
.
Head
,
p
.
RequestHeadersByHash
,
p
.
RequestHeadersByNumber
,
p
.
RequestBodies
,
p
.
RequestReceipts
,
p
.
RequestNodeData
);
err
!=
nil
{
if
err
:=
pm
.
downloader
.
RegisterPeer
(
p
.
id
,
p
.
version
,
p
);
err
!=
nil
{
return
err
}
// Propagate existing transactions. new transactions appearing
...
...
This diff is collapsed.
Click to expand it.
les/handler.go
View file @
ae11545b
...
...
@@ -838,57 +838,83 @@ func (self *ProtocolManager) NodeInfo() *eth.EthNodeInfo {
// downloaderPeerNotify implements peerSetNotify
type
downloaderPeerNotify
ProtocolManager
func
(
d
*
downloaderPeerNotify
)
registerPeer
(
p
*
peer
)
{
pm
:=
(
*
ProtocolManager
)(
d
)
type
peerConnection
struct
{
manager
*
ProtocolManager
peer
*
peer
}
requestHeadersByHash
:=
func
(
origin
common
.
Hash
,
amount
int
,
skip
int
,
reverse
bool
)
error
{
reqID
:=
genReqID
()
rq
:=
&
distReq
{
getCost
:
func
(
dp
distPeer
)
uint64
{
peer
:=
dp
.
(
*
peer
)
return
peer
.
GetRequestCost
(
GetBlockHeadersMsg
,
amount
)
},
canSend
:
func
(
dp
distPeer
)
bool
{
return
dp
.
(
*
peer
)
==
p
},
request
:
func
(
dp
distPeer
)
func
()
{
peer
:=
dp
.
(
*
peer
)
cost
:=
peer
.
GetRequestCost
(
GetBlockHeadersMsg
,
amount
)
peer
.
fcServer
.
QueueRequest
(
reqID
,
cost
)
return
func
()
{
peer
.
RequestHeadersByHash
(
reqID
,
cost
,
origin
,
amount
,
skip
,
reverse
)
}
},
}
_
,
ok
:=
<-
pm
.
reqDist
.
queue
(
rq
)
if
!
ok
{
return
ErrNoPeers
}
return
nil
func
(
pc
*
peerConnection
)
Head
()
(
common
.
Hash
,
*
big
.
Int
)
{
return
pc
.
peer
.
HeadAndTd
()
}
func
(
pc
*
peerConnection
)
RequestHeadersByHash
(
origin
common
.
Hash
,
amount
int
,
skip
int
,
reverse
bool
)
error
{
reqID
:=
genReqID
()
rq
:=
&
distReq
{
getCost
:
func
(
dp
distPeer
)
uint64
{
peer
:=
dp
.
(
*
peer
)
return
peer
.
GetRequestCost
(
GetBlockHeadersMsg
,
amount
)
},
canSend
:
func
(
dp
distPeer
)
bool
{
return
dp
.
(
*
peer
)
==
pc
.
peer
},
request
:
func
(
dp
distPeer
)
func
()
{
peer
:=
dp
.
(
*
peer
)
cost
:=
peer
.
GetRequestCost
(
GetBlockHeadersMsg
,
amount
)
peer
.
fcServer
.
QueueRequest
(
reqID
,
cost
)
return
func
()
{
peer
.
RequestHeadersByHash
(
reqID
,
cost
,
origin
,
amount
,
skip
,
reverse
)
}
},
}
requestHeadersByNumber
:=
func
(
origin
uint64
,
amount
int
,
skip
int
,
reverse
bool
)
error
{
reqID
:=
genReqID
()
rq
:=
&
distReq
{
getCost
:
func
(
dp
distPeer
)
uint64
{
peer
:=
dp
.
(
*
peer
)
return
peer
.
GetRequestCost
(
GetBlockHeadersMsg
,
amount
)
},
canSend
:
func
(
dp
distPeer
)
bool
{
return
dp
.
(
*
peer
)
==
p
},
request
:
func
(
dp
distPeer
)
func
()
{
peer
:=
dp
.
(
*
peer
)
cost
:=
peer
.
GetRequestCost
(
GetBlockHeadersMsg
,
amount
)
peer
.
fcServer
.
QueueRequest
(
reqID
,
cost
)
return
func
()
{
peer
.
RequestHeadersByNumber
(
reqID
,
cost
,
origin
,
amount
,
skip
,
reverse
)
}
},
}
_
,
ok
:=
<-
pm
.
reqDist
.
queue
(
rq
)
if
!
ok
{
return
ErrNoPeers
}
return
nil
_
,
ok
:=
<-
pc
.
manager
.
reqDist
.
queue
(
rq
)
if
!
ok
{
return
ErrNoPeers
}
return
nil
}
func
(
pc
*
peerConnection
)
RequestHeadersByNumber
(
origin
uint64
,
amount
int
,
skip
int
,
reverse
bool
)
error
{
reqID
:=
genReqID
()
rq
:=
&
distReq
{
getCost
:
func
(
dp
distPeer
)
uint64
{
peer
:=
dp
.
(
*
peer
)
return
peer
.
GetRequestCost
(
GetBlockHeadersMsg
,
amount
)
},
canSend
:
func
(
dp
distPeer
)
bool
{
return
dp
.
(
*
peer
)
==
pc
.
peer
},
request
:
func
(
dp
distPeer
)
func
()
{
peer
:=
dp
.
(
*
peer
)
cost
:=
peer
.
GetRequestCost
(
GetBlockHeadersMsg
,
amount
)
peer
.
fcServer
.
QueueRequest
(
reqID
,
cost
)
return
func
()
{
peer
.
RequestHeadersByNumber
(
reqID
,
cost
,
origin
,
amount
,
skip
,
reverse
)
}
},
}
_
,
ok
:=
<-
pc
.
manager
.
reqDist
.
queue
(
rq
)
if
!
ok
{
return
ErrNoPeers
}
return
nil
}
func
(
pc
*
peerConnection
)
RequestBodies
(
hashes
[]
common
.
Hash
)
error
{
panic
(
"RequestBodies not supported in light client mode sync"
)
}
func
(
pc
*
peerConnection
)
RequestReceipts
(
hashes
[]
common
.
Hash
)
error
{
panic
(
"RequestReceipts not supported in light client mode sync"
)
}
func
(
pc
*
peerConnection
)
RequestNodeData
(
hashes
[]
common
.
Hash
)
error
{
panic
(
"RequestNodeData not supported in light client mode sync"
)
}
pm
.
downloader
.
RegisterPeer
(
p
.
id
,
ethVersion
,
p
.
HeadAndTd
,
requestHeadersByHash
,
requestHeadersByNumber
,
nil
,
nil
,
nil
)
func
(
d
*
downloaderPeerNotify
)
registerPeer
(
p
*
peer
)
{
pm
:=
(
*
ProtocolManager
)(
d
)
pc
:=
&
peerConnection
{
manager
:
pm
,
peer
:
p
,
}
pm
.
downloader
.
RegisterPeer
(
p
.
id
,
ethVersion
,
pc
)
}
func
(
d
*
downloaderPeerNotify
)
unregisterPeer
(
p
*
peer
)
{
...
...
This diff is collapsed.
Click to expand it.
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