Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
nebula
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
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
exchain
nebula
Commits
c446b09f
Unverified
Commit
c446b09f
authored
Jun 14, 2023
by
Adrian Sutton
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
op-node: Add thread-safe method to check if p2p sync has a request for a block in-flight
parent
4c66cb35
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
38 additions
and
8 deletions
+38
-8
sync.go
op-node/p2p/sync.go
+33
-2
sync_test.go
op-node/p2p/sync_test.go
+5
-6
No files found.
op-node/p2p/sync.go
View file @
c446b09f
...
...
@@ -100,6 +100,12 @@ type peerRequest struct {
complete
*
atomic
.
Bool
}
type
inFlightCheck
struct
{
num
uint64
result
chan
bool
}
type
SyncClientMetrics
interface
{
ClientPayloadByNumberEvent
(
num
uint64
,
resultCode
byte
,
duration
time
.
Duration
)
PayloadsQuarantineSize
(
n
int
)
...
...
@@ -198,8 +204,9 @@ type SyncClient struct {
// inFlight requests are not repeated
inFlight
map
[
uint64
]
*
atomic
.
Bool
requests
chan
rangeRequest
peerRequests
chan
peerRequest
requests
chan
rangeRequest
peerRequests
chan
peerRequest
inFlightChecks
chan
inFlightCheck
results
chan
syncResult
...
...
@@ -235,6 +242,7 @@ func NewSyncClient(log log.Logger, cfg *rollup.Config, newStream newStreamFn, rc
requests
:
make
(
chan
rangeRequest
),
// blocking
peerRequests
:
make
(
chan
peerRequest
,
128
),
results
:
make
(
chan
syncResult
,
128
),
inFlightChecks
:
make
(
chan
inFlightCheck
,
128
),
globalRL
:
rate
.
NewLimiter
(
globalServerBlocksRateLimit
,
globalServerBlocksBurst
),
resCtx
:
ctx
,
resCancel
:
cancel
,
...
...
@@ -328,6 +336,14 @@ func (s *SyncClient) mainLoop() {
ctx
,
cancel
:=
context
.
WithTimeout
(
s
.
resCtx
,
maxResultProcessing
)
s
.
onResult
(
ctx
,
res
)
cancel
()
case
check
:=
<-
s
.
inFlightChecks
:
s
.
log
.
Info
(
"Checking in flight"
,
"num"
,
check
.
num
)
complete
,
ok
:=
s
.
inFlight
[
check
.
num
]
if
!
ok
{
check
.
result
<-
false
}
else
{
check
.
result
<-
!
complete
.
Load
()
}
case
<-
s
.
resCtx
.
Done
()
:
s
.
log
.
Info
(
"stopped P2P req-resp L2 block sync client"
)
return
...
...
@@ -335,6 +351,21 @@ func (s *SyncClient) mainLoop() {
}
}
func
(
s
*
SyncClient
)
isInFlight
(
ctx
context
.
Context
,
num
uint64
)
(
bool
,
error
)
{
check
:=
inFlightCheck
{
num
:
num
,
result
:
make
(
chan
bool
,
1
)}
select
{
case
s
.
inFlightChecks
<-
check
:
case
<-
ctx
.
Done
()
:
return
false
,
errors
.
New
(
"context cancelled when publishing in flight check"
)
}
select
{
case
res
:=
<-
check
.
result
:
return
res
,
nil
case
<-
ctx
.
Done
()
:
return
false
,
errors
.
New
(
"context cancelled while waiting for in flight check response"
)
}
}
// onRangeRequest is exclusively called by the main loop, and has thus direct access to the request bookkeeping state.
// This function transforms requested block ranges into work for each peer.
func
(
s
*
SyncClient
)
onRangeRequest
(
ctx
context
.
Context
,
req
rangeRequest
)
{
...
...
op-node/p2p/sync_test.go
View file @
c446b09f
...
...
@@ -271,12 +271,11 @@ func TestMultiPeerSync(t *testing.T) {
// Wait till the failed request is recognized as marked as done, so the re-request actually runs.
ctx
,
cancelFunc
=
context
.
WithTimeout
(
context
.
Background
(),
30
*
time
.
Second
)
defer
cancelFunc
()
for
clB
.
inFlight
[
25
]
!=
nil
&&
!
clB
.
inFlight
[
25
]
.
Load
()
{
select
{
case
<-
ctx
.
Done
()
:
t
.
Fatal
(
"Did not complete request for block 25 in timely manner"
)
default
:
// Carry on, timeout not yet reached
for
{
isInFlight
,
err
:=
clB
.
isInFlight
(
ctx
,
25
)
require
.
NoError
(
t
,
err
)
if
!
isInFlight
{
break
}
time
.
Sleep
(
time
.
Second
)
}
...
...
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