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
eb48e051
Unverified
Commit
eb48e051
authored
Jun 07, 2023
by
OptimismBot
Committed by
GitHub
Jun 07, 2023
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #5913 from ethereum-optimism/seb/batcher-fix-frames-metrics
op-batcher: Fix num_frames metrics
parents
6e714be7
c54120ca
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
79 additions
and
21 deletions
+79
-21
channel.go
op-batcher/batcher/channel.go
+7
-3
channel_builder.go
op-batcher/batcher/channel_builder.go
+12
-1
channel_builder_test.go
op-batcher/batcher/channel_builder_test.go
+50
-7
channel_manager.go
op-batcher/batcher/channel_manager.go
+2
-2
channel_test.go
op-batcher/batcher/channel_test.go
+8
-8
No files found.
op-batcher/batcher/channel.go
View file @
eb48e051
...
...
@@ -115,7 +115,7 @@ func (s *channel) isTimedOut() bool {
// pendingChannelIsFullySubmitted returns true if the channel has been fully submitted.
func
(
s
*
channel
)
isFullySubmitted
()
bool
{
return
s
.
IsFull
()
&&
len
(
s
.
pendingTransactions
)
+
s
.
Num
Frames
()
==
0
return
s
.
IsFull
()
&&
len
(
s
.
pendingTransactions
)
+
s
.
Pending
Frames
()
==
0
}
func
(
s
*
channel
)
NoneSubmitted
()
bool
{
...
...
@@ -170,8 +170,12 @@ func (s *channel) OutputBytes() int {
return
s
.
channelBuilder
.
OutputBytes
()
}
func
(
s
*
channel
)
NumFrames
()
int
{
return
s
.
channelBuilder
.
NumFrames
()
func
(
s
*
channel
)
TotalFrames
()
int
{
return
s
.
channelBuilder
.
TotalFrames
()
}
func
(
s
*
channel
)
PendingFrames
()
int
{
return
s
.
channelBuilder
.
PendingFrames
()
}
func
(
s
*
channel
)
OutputFrames
()
error
{
...
...
op-batcher/batcher/channel_builder.go
View file @
eb48e051
...
...
@@ -119,6 +119,8 @@ type channelBuilder struct {
blocks
[]
*
types
.
Block
// frames data queue, to be send as txs
frames
[]
frameData
// total frames counter
numFrames
int
// total amount of output data of all frames created yet
outputBytes
int
}
...
...
@@ -382,6 +384,7 @@ func (c *channelBuilder) outputFrame() error {
data
:
buf
.
Bytes
(),
}
c
.
frames
=
append
(
c
.
frames
,
frame
)
c
.
numFrames
++
c
.
outputBytes
+=
len
(
frame
.
data
)
return
err
// possibly io.EOF (last frame)
}
...
...
@@ -394,6 +397,12 @@ func (c *channelBuilder) Close() {
}
}
// TotalFrames returns the total number of frames that were created in this channel so far.
// It does not decrease when the frames queue is being emptied.
func
(
c
*
channelBuilder
)
TotalFrames
()
int
{
return
c
.
numFrames
}
// HasFrame returns whether there's any available frame. If true, it can be
// popped using NextFrame().
//
...
...
@@ -403,7 +412,9 @@ func (c *channelBuilder) HasFrame() bool {
return
len
(
c
.
frames
)
>
0
}
func
(
c
*
channelBuilder
)
NumFrames
()
int
{
// PendingFrames returns the number of pending frames in the frames queue.
// It is larger zero iff HasFrames() returns true.
func
(
c
*
channelBuilder
)
PendingFrames
()
int
{
return
len
(
c
.
frames
)
}
...
...
op-batcher/batcher/channel_builder_test.go
View file @
eb48e051
...
...
@@ -397,13 +397,13 @@ func TestChannelBuilder_NextFrame(t *testing.T) {
cb
.
PushFrame
(
frameData
)
// There should only be 1 frame in the channel builder
require
.
Equal
(
t
,
1
,
cb
.
Num
Frames
())
require
.
Equal
(
t
,
1
,
cb
.
Pending
Frames
())
// We should be able to increment to the next frame
constructedFrame
:=
cb
.
NextFrame
()
require
.
Equal
(
t
,
expectedTx
,
constructedFrame
.
id
)
require
.
Equal
(
t
,
expectedBytes
,
constructedFrame
.
data
)
require
.
Equal
(
t
,
0
,
cb
.
Num
Frames
())
require
.
Equal
(
t
,
0
,
cb
.
Pending
Frames
())
// The next call should panic since the length of frames is 0
require
.
PanicsWithValue
(
t
,
"no next frame"
,
func
()
{
cb
.
NextFrame
()
})
...
...
@@ -450,7 +450,7 @@ func TestChannelBuilder_OutputFramesWorks(t *testing.T) {
cb
,
err
:=
newChannelBuilder
(
channelConfig
)
require
.
NoError
(
t
,
err
)
require
.
False
(
t
,
cb
.
IsFull
())
require
.
Equal
(
t
,
0
,
cb
.
Num
Frames
())
require
.
Equal
(
t
,
0
,
cb
.
Pending
Frames
())
// Calling OutputFrames without having called [AddBlock]
// should return no error
...
...
@@ -466,7 +466,7 @@ func TestChannelBuilder_OutputFramesWorks(t *testing.T) {
// Check how many ready bytes
// There should be more than the max frame size ready
require
.
Greater
(
t
,
uint64
(
cb
.
co
.
ReadyBytes
()),
channelConfig
.
MaxFrameSize
)
require
.
Equal
(
t
,
0
,
cb
.
Num
Frames
())
require
.
Equal
(
t
,
0
,
cb
.
Pending
Frames
())
// The channel should not be full
// but we want to output the frames for testing anyways
...
...
@@ -476,7 +476,7 @@ func TestChannelBuilder_OutputFramesWorks(t *testing.T) {
require
.
NoError
(
t
,
cb
.
OutputFrames
())
// There should be many frames in the channel builder now
require
.
Greater
(
t
,
cb
.
Num
Frames
(),
1
)
require
.
Greater
(
t
,
cb
.
Pending
Frames
(),
1
)
for
_
,
frame
:=
range
cb
.
frames
{
require
.
Len
(
t
,
frame
.
data
,
int
(
channelConfig
.
MaxFrameSize
))
}
...
...
@@ -515,7 +515,7 @@ func TestChannelBuilder_OutputFramesMaxFrameIndex(t *testing.T) {
cb
,
err
:=
newChannelBuilder
(
channelConfig
)
require
.
NoError
(
t
,
err
)
require
.
False
(
t
,
cb
.
IsFull
())
require
.
Equal
(
t
,
0
,
cb
.
Num
Frames
())
require
.
Equal
(
t
,
0
,
cb
.
Pending
Frames
())
for
{
lBlock
:=
types
.
NewBlock
(
&
types
.
Header
{
BaseFee
:
common
.
Big0
,
...
...
@@ -684,6 +684,49 @@ func TestFramePublished(t *testing.T) {
require
.
Equal
(
t
,
uint64
(
1000
),
cb
.
timeout
)
}
func
TestChannelBuilder_PendingFrames_TotalFrames
(
t
*
testing
.
T
)
{
const
tnf
=
8
rng
:=
rand
.
New
(
rand
.
NewSource
(
time
.
Now
()
.
UnixNano
()))
require
:=
require
.
New
(
t
)
cfg
:=
defaultTestChannelConfig
cfg
.
CompressorConfig
.
TargetFrameSize
=
1000
cfg
.
MaxFrameSize
=
1000
cfg
.
CompressorConfig
.
TargetNumFrames
=
tnf
cfg
.
CompressorConfig
.
Kind
=
"shadow"
cb
,
err
:=
newChannelBuilder
(
cfg
)
require
.
NoError
(
err
)
// initial builder should be empty
require
.
Zero
(
cb
.
PendingFrames
())
require
.
Zero
(
cb
.
TotalFrames
())
// fill up
for
{
block
,
_
:=
dtest
.
RandomL2Block
(
rng
,
4
)
_
,
err
:=
cb
.
AddBlock
(
block
)
if
cb
.
IsFull
()
{
break
}
require
.
NoError
(
err
)
}
require
.
NoError
(
cb
.
OutputFrames
())
nf
:=
cb
.
TotalFrames
()
// require 1 < nf < tnf
// (because of compression we won't necessarily land exactly at tnf, that's ok)
require
.
Greater
(
nf
,
1
)
require
.
LessOrEqual
(
nf
,
tnf
)
require
.
Equal
(
nf
,
cb
.
PendingFrames
())
// empty queue
for
pf
:=
nf
-
1
;
pf
>=
0
;
pf
--
{
require
.
True
(
cb
.
HasFrame
())
_
=
cb
.
NextFrame
()
require
.
Equal
(
cb
.
PendingFrames
(),
pf
)
require
.
Equal
(
cb
.
TotalFrames
(),
nf
)
}
}
func
TestChannelBuilder_InputBytes
(
t
*
testing
.
T
)
{
require
:=
require
.
New
(
t
)
rng
:=
rand
.
New
(
rand
.
NewSource
(
time
.
Now
()
.
UnixNano
()))
...
...
@@ -726,7 +769,7 @@ func TestChannelBuilder_OutputBytes(t *testing.T) {
require
.
NoError
(
cb
.
OutputFrames
())
require
.
True
(
cb
.
IsFull
())
require
.
Greater
(
cb
.
Num
Frames
(),
1
)
require
.
Greater
(
cb
.
Pending
Frames
(),
1
)
var
flen
int
for
cb
.
HasFrame
()
{
...
...
op-batcher/batcher/channel_manager.go
View file @
eb48e051
...
...
@@ -269,7 +269,7 @@ func (s *channelManager) outputFrames() error {
s
.
metr
.
RecordChannelClosed
(
s
.
currentChannel
.
ID
(),
len
(
s
.
blocks
),
s
.
currentChannel
.
Num
Frames
(),
s
.
currentChannel
.
Total
Frames
(),
inBytes
,
outBytes
,
s
.
currentChannel
.
FullErr
(),
...
...
@@ -282,7 +282,7 @@ func (s *channelManager) outputFrames() error {
s
.
log
.
Info
(
"Channel closed"
,
"id"
,
s
.
currentChannel
.
ID
(),
"blocks_pending"
,
len
(
s
.
blocks
),
"num_frames"
,
s
.
currentChannel
.
Num
Frames
(),
"num_frames"
,
s
.
currentChannel
.
Total
Frames
(),
"input_bytes"
,
inBytes
,
"output_bytes"
,
outBytes
,
"full_reason"
,
s
.
currentChannel
.
FullErr
(),
...
...
op-batcher/batcher/channel_test.go
View file @
eb48e051
...
...
@@ -88,7 +88,7 @@ func TestChannelNextTxData(t *testing.T) {
},
}
channel
.
channelBuilder
.
PushFrame
(
frame
)
require
.
Equal
(
t
,
1
,
channel
.
Num
Frames
())
require
.
Equal
(
t
,
1
,
channel
.
Pending
Frames
())
// Now the nextTxData function should return the frame
returnedTxData
,
err
=
m
.
nextTxData
(
channel
)
...
...
@@ -96,7 +96,7 @@ func TestChannelNextTxData(t *testing.T) {
expectedChannelID
:=
expectedTxData
.
ID
()
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
expectedTxData
,
returnedTxData
)
require
.
Equal
(
t
,
0
,
channel
.
Num
Frames
())
require
.
Equal
(
t
,
0
,
channel
.
Pending
Frames
())
require
.
Equal
(
t
,
expectedTxData
,
channel
.
pendingTransactions
[
expectedChannelID
])
}
...
...
@@ -123,13 +123,13 @@ func TestChannelTxConfirmed(t *testing.T) {
},
}
m
.
currentChannel
.
channelBuilder
.
PushFrame
(
frame
)
require
.
Equal
(
t
,
1
,
m
.
currentChannel
.
Num
Frames
())
require
.
Equal
(
t
,
1
,
m
.
currentChannel
.
Pending
Frames
())
returnedTxData
,
err
:=
m
.
nextTxData
(
m
.
currentChannel
)
expectedTxData
:=
txData
{
frame
}
expectedChannelID
:=
expectedTxData
.
ID
()
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
expectedTxData
,
returnedTxData
)
require
.
Equal
(
t
,
0
,
m
.
currentChannel
.
Num
Frames
())
require
.
Equal
(
t
,
0
,
m
.
currentChannel
.
Pending
Frames
())
require
.
Equal
(
t
,
expectedTxData
,
m
.
currentChannel
.
pendingTransactions
[
expectedChannelID
])
require
.
Len
(
t
,
m
.
currentChannel
.
pendingTransactions
,
1
)
...
...
@@ -171,20 +171,20 @@ func TestChannelTxFailed(t *testing.T) {
},
}
m
.
currentChannel
.
channelBuilder
.
PushFrame
(
frame
)
require
.
Equal
(
t
,
1
,
m
.
currentChannel
.
Num
Frames
())
require
.
Equal
(
t
,
1
,
m
.
currentChannel
.
Pending
Frames
())
returnedTxData
,
err
:=
m
.
nextTxData
(
m
.
currentChannel
)
expectedTxData
:=
txData
{
frame
}
expectedChannelID
:=
expectedTxData
.
ID
()
require
.
NoError
(
t
,
err
)
require
.
Equal
(
t
,
expectedTxData
,
returnedTxData
)
require
.
Equal
(
t
,
0
,
m
.
currentChannel
.
Num
Frames
())
require
.
Equal
(
t
,
0
,
m
.
currentChannel
.
Pending
Frames
())
require
.
Equal
(
t
,
expectedTxData
,
m
.
currentChannel
.
pendingTransactions
[
expectedChannelID
])
require
.
Len
(
t
,
m
.
currentChannel
.
pendingTransactions
,
1
)
// Trying to mark an unknown pending transaction as failed
// shouldn't modify state
m
.
TxFailed
(
frameID
{})
require
.
Equal
(
t
,
0
,
m
.
currentChannel
.
Num
Frames
())
require
.
Equal
(
t
,
0
,
m
.
currentChannel
.
Pending
Frames
())
require
.
Equal
(
t
,
expectedTxData
,
m
.
currentChannel
.
pendingTransactions
[
expectedChannelID
])
// Now we still have a pending transaction
...
...
@@ -192,5 +192,5 @@ func TestChannelTxFailed(t *testing.T) {
m
.
TxFailed
(
expectedChannelID
)
require
.
Empty
(
t
,
m
.
currentChannel
.
pendingTransactions
)
// There should be a frame in the pending channel now
require
.
Equal
(
t
,
1
,
m
.
currentChannel
.
Num
Frames
())
require
.
Equal
(
t
,
1
,
m
.
currentChannel
.
Pending
Frames
())
}
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