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
015688be
Commit
015688be
authored
Apr 21, 2023
by
Felipe Andrade
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
addressing final comments
parent
94191239
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
55 additions
and
130 deletions
+55
-130
consensus_poller.go
proxyd/consensus_poller.go
+16
-31
consensus_poller_test.go
proxyd/consensus_poller_test.go
+0
-74
consensus_tracker.go
proxyd/consensus_tracker.go
+11
-9
consensus_test.go
proxyd/integration_tests/consensus_test.go
+14
-14
metrics.go
proxyd/metrics.go
+14
-2
No files found.
proxyd/consensus_poller.go
View file @
015688be
...
@@ -34,7 +34,7 @@ type ConsensusPoller struct {
...
@@ -34,7 +34,7 @@ type ConsensusPoller struct {
type
backendState
struct
{
type
backendState
struct
{
backendStateMux
sync
.
Mutex
backendStateMux
sync
.
Mutex
latestBlockNumber
string
latestBlockNumber
hexutil
.
Uint64
latestBlockHash
string
latestBlockHash
string
lastUpdate
time
.
Time
lastUpdate
time
.
Time
...
@@ -54,7 +54,7 @@ func (cp *ConsensusPoller) GetConsensusGroup() []*Backend {
...
@@ -54,7 +54,7 @@ func (cp *ConsensusPoller) GetConsensusGroup() []*Backend {
}
}
// GetConsensusBlockNumber returns the agreed block number in a consensus
// GetConsensusBlockNumber returns the agreed block number in a consensus
func
(
ct
*
ConsensusPoller
)
GetConsensusBlockNumber
()
string
{
func
(
ct
*
ConsensusPoller
)
GetConsensusBlockNumber
()
hexutil
.
Uint64
{
return
ct
.
tracker
.
GetConsensusBlockNumber
()
return
ct
.
tracker
.
GetConsensusBlockNumber
()
}
}
...
@@ -198,28 +198,28 @@ func (cp *ConsensusPoller) UpdateBackend(ctx context.Context, be *Backend) {
...
@@ -198,28 +198,28 @@ func (cp *ConsensusPoller) UpdateBackend(ctx context.Context, be *Backend) {
changed
:=
cp
.
setBackendState
(
be
,
latestBlockNumber
,
latestBlockHash
)
changed
:=
cp
.
setBackendState
(
be
,
latestBlockNumber
,
latestBlockHash
)
if
changed
{
if
changed
{
backendLatestBlockBackend
.
WithLabelValues
(
be
.
Name
)
.
Set
(
blockToFloat
(
latestBlockNumber
)
)
RecordBackendLatestBlock
(
be
,
latestBlockNumber
)
log
.
Info
(
"backend state updated"
,
"name"
,
be
.
Name
,
"state"
,
bs
)
log
.
Info
(
"backend state updated"
,
"name"
,
be
.
Name
,
"state"
,
bs
)
}
}
}
}
// UpdateBackendGroupConsensus resolves the current group consensus based on the state of the backends
// UpdateBackendGroupConsensus resolves the current group consensus based on the state of the backends
func
(
cp
*
ConsensusPoller
)
UpdateBackendGroupConsensus
(
ctx
context
.
Context
)
{
func
(
cp
*
ConsensusPoller
)
UpdateBackendGroupConsensus
(
ctx
context
.
Context
)
{
var
lowestBlock
string
var
lowestBlock
hexutil
.
Uint64
var
lowestBlockHash
string
var
lowestBlockHash
string
currentConsensusBlockNumber
:=
cp
.
GetConsensusBlockNumber
()
currentConsensusBlockNumber
:=
cp
.
GetConsensusBlockNumber
()
for
_
,
be
:=
range
cp
.
backendGroup
.
Backends
{
for
_
,
be
:=
range
cp
.
backendGroup
.
Backends
{
backendLatestBlockNumber
,
backendLatestBlockHash
:=
cp
.
getBackendState
(
be
)
backendLatestBlockNumber
,
backendLatestBlockHash
:=
cp
.
getBackendState
(
be
)
if
lowestBlock
==
""
||
backendLatestBlockNumber
<
lowestBlock
{
if
lowestBlock
==
0
||
backendLatestBlockNumber
<
lowestBlock
{
lowestBlock
=
backendLatestBlockNumber
lowestBlock
=
backendLatestBlockNumber
lowestBlockHash
=
backendLatestBlockHash
lowestBlockHash
=
backendLatestBlockHash
}
}
}
}
// no block to propose (i.e. initializing consensus)
// no block to propose (i.e. initializing consensus)
if
lowestBlock
==
""
{
if
lowestBlock
==
0
{
return
return
}
}
...
@@ -247,7 +247,7 @@ func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) {
...
@@ -247,7 +247,7 @@ func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) {
continue
continue
}
}
actualBlockNumber
,
actualBlockHash
,
err
:=
cp
.
fetchBlock
(
ctx
,
be
,
proposedBlock
)
actualBlockNumber
,
actualBlockHash
,
err
:=
cp
.
fetchBlock
(
ctx
,
be
,
proposedBlock
.
String
()
)
if
err
!=
nil
{
if
err
!=
nil
{
log
.
Warn
(
"error updating backend"
,
"name"
,
be
.
Name
,
"err"
,
err
)
log
.
Warn
(
"error updating backend"
,
"name"
,
be
.
Name
,
"err"
,
err
)
continue
continue
...
@@ -257,7 +257,7 @@ func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) {
...
@@ -257,7 +257,7 @@ func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) {
}
}
blocksDontMatch
:=
(
actualBlockNumber
!=
proposedBlock
)
||
(
actualBlockHash
!=
proposedBlockHash
)
blocksDontMatch
:=
(
actualBlockNumber
!=
proposedBlock
)
||
(
actualBlockHash
!=
proposedBlockHash
)
if
blocksDontMatch
{
if
blocksDontMatch
{
if
blockAheadOrEqual
(
currentConsensusBlockNumber
,
actualBlockNumber
)
{
if
currentConsensusBlockNumber
>=
actualBlockNumber
{
log
.
Warn
(
"backend broke consensus"
,
"name"
,
be
.
Name
,
"blockNum"
,
actualBlockNumber
,
"proposedBlockNum"
,
proposedBlock
,
"blockHash"
,
actualBlockHash
,
"proposedBlockHash"
,
proposedBlockHash
)
log
.
Warn
(
"backend broke consensus"
,
"name"
,
be
.
Name
,
"blockNum"
,
actualBlockNumber
,
"proposedBlockNum"
,
proposedBlock
,
"blockHash"
,
actualBlockHash
,
"proposedBlockHash"
,
proposedBlockHash
)
broken
=
true
broken
=
true
}
}
...
@@ -271,7 +271,7 @@ func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) {
...
@@ -271,7 +271,7 @@ func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) {
hasConsensus
=
true
hasConsensus
=
true
}
else
{
}
else
{
// walk one block behind and try again
// walk one block behind and try again
proposedBlock
=
hexAdd
(
proposedBlock
,
-
1
)
proposedBlock
-=
1
proposedBlockHash
=
""
proposedBlockHash
=
""
log
.
Info
(
"no consensus, now trying"
,
"block:"
,
proposedBlock
)
log
.
Info
(
"no consensus, now trying"
,
"block:"
,
proposedBlock
)
}
}
...
@@ -283,7 +283,7 @@ func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) {
...
@@ -283,7 +283,7 @@ func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) {
}
}
cp
.
tracker
.
SetConsensusBlockNumber
(
proposedBlock
)
cp
.
tracker
.
SetConsensusBlockNumber
(
proposedBlock
)
consensusLatestBlock
.
Set
(
blockToFloat
(
proposedBlock
)
)
RecordGroupConsensusLatestBlock
(
cp
.
backendGroup
,
proposedBlock
)
cp
.
consensusGroupMux
.
Lock
()
cp
.
consensusGroupMux
.
Lock
()
cp
.
consensusGroup
=
consensusBackends
cp
.
consensusGroup
=
consensusBackends
cp
.
consensusGroupMux
.
Unlock
()
cp
.
consensusGroupMux
.
Unlock
()
...
@@ -292,24 +292,24 @@ func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) {
...
@@ -292,24 +292,24 @@ func (cp *ConsensusPoller) UpdateBackendGroupConsensus(ctx context.Context) {
}
}
// fetchBlock Convenient wrapper to make a request to get a block directly from the backend
// fetchBlock Convenient wrapper to make a request to get a block directly from the backend
func
(
cp
*
ConsensusPoller
)
fetchBlock
(
ctx
context
.
Context
,
be
*
Backend
,
block
string
)
(
blockNumber
string
,
blockHash
string
,
err
error
)
{
func
(
cp
*
ConsensusPoller
)
fetchBlock
(
ctx
context
.
Context
,
be
*
Backend
,
block
string
)
(
blockNumber
hexutil
.
Uint64
,
blockHash
string
,
err
error
)
{
var
rpcRes
RPCRes
var
rpcRes
RPCRes
err
=
be
.
ForwardRPC
(
ctx
,
&
rpcRes
,
"67"
,
"eth_getBlockByNumber"
,
block
,
false
)
err
=
be
.
ForwardRPC
(
ctx
,
&
rpcRes
,
"67"
,
"eth_getBlockByNumber"
,
block
,
false
)
if
err
!=
nil
{
if
err
!=
nil
{
return
""
,
""
,
err
return
0
,
""
,
err
}
}
jsonMap
,
ok
:=
rpcRes
.
Result
.
(
map
[
string
]
interface
{})
jsonMap
,
ok
:=
rpcRes
.
Result
.
(
map
[
string
]
interface
{})
if
!
ok
{
if
!
ok
{
return
""
,
""
,
fmt
.
Errorf
(
fmt
.
Sprintf
(
"unexpected response type checking consensus on backend %s"
,
be
.
Name
)
)
return
0
,
""
,
fmt
.
Errorf
(
"unexpected response type checking consensus on backend %s"
,
be
.
Name
)
}
}
blockNumber
=
jsonMap
[
"number"
]
.
(
string
)
blockNumber
=
hexutil
.
Uint64
(
hexutil
.
MustDecodeUint64
(
jsonMap
[
"number"
]
.
(
string
))
)
blockHash
=
jsonMap
[
"hash"
]
.
(
string
)
blockHash
=
jsonMap
[
"hash"
]
.
(
string
)
return
return
}
}
func
(
cp
*
ConsensusPoller
)
getBackendState
(
be
*
Backend
)
(
blockNumber
string
,
blockHash
string
)
{
func
(
cp
*
ConsensusPoller
)
getBackendState
(
be
*
Backend
)
(
blockNumber
hexutil
.
Uint64
,
blockHash
string
)
{
bs
:=
cp
.
backendState
[
be
]
bs
:=
cp
.
backendState
[
be
]
bs
.
backendStateMux
.
Lock
()
bs
.
backendStateMux
.
Lock
()
blockNumber
=
bs
.
latestBlockNumber
blockNumber
=
bs
.
latestBlockNumber
...
@@ -318,7 +318,7 @@ func (cp *ConsensusPoller) getBackendState(be *Backend) (blockNumber string, blo
...
@@ -318,7 +318,7 @@ func (cp *ConsensusPoller) getBackendState(be *Backend) (blockNumber string, blo
return
return
}
}
func
(
cp
*
ConsensusPoller
)
setBackendState
(
be
*
Backend
,
blockNumber
string
,
blockHash
string
)
(
changed
bool
)
{
func
(
cp
*
ConsensusPoller
)
setBackendState
(
be
*
Backend
,
blockNumber
hexutil
.
Uint64
,
blockHash
string
)
(
changed
bool
)
{
bs
:=
cp
.
backendState
[
be
]
bs
:=
cp
.
backendState
[
be
]
bs
.
backendStateMux
.
Lock
()
bs
.
backendStateMux
.
Lock
()
changed
=
bs
.
latestBlockHash
!=
blockHash
changed
=
bs
.
latestBlockHash
!=
blockHash
...
@@ -328,18 +328,3 @@ func (cp *ConsensusPoller) setBackendState(be *Backend, blockNumber string, bloc
...
@@ -328,18 +328,3 @@ func (cp *ConsensusPoller) setBackendState(be *Backend, blockNumber string, bloc
bs
.
backendStateMux
.
Unlock
()
bs
.
backendStateMux
.
Unlock
()
return
return
}
}
// hexAdd Convenient way to convert hex block to uint64, increment, and convert back to hex
func
hexAdd
(
hexVal
string
,
incr
int64
)
string
{
return
hexutil
.
EncodeUint64
(
uint64
(
int64
(
hexutil
.
MustDecodeUint64
(
hexVal
))
+
incr
))
}
// blockAheadOrEqual Convenient way to check if `baseBlock` is ahead or equal than `checkBlock`
func
blockAheadOrEqual
(
baseBlock
string
,
checkBlock
string
)
bool
{
return
hexutil
.
MustDecodeUint64
(
baseBlock
)
>=
hexutil
.
MustDecodeUint64
(
checkBlock
)
}
// blockToFloat Convenient way to convert a hex block to float64
func
blockToFloat
(
hexVal
string
)
float64
{
return
float64
(
hexutil
.
MustDecodeUint64
(
hexVal
))
}
proxyd/consensus_poller_test.go
deleted
100644 → 0
View file @
94191239
package
proxyd
import
(
"testing"
)
func
Test_blockToFloat
(
t
*
testing
.
T
)
{
type
args
struct
{
hexVal
string
}
tests
:=
[]
struct
{
name
string
args
args
want
float64
}{
{
"0xf1b3"
,
args
{
"0xf1b3"
},
float64
(
61875
)},
}
for
_
,
tt
:=
range
tests
{
t
.
Run
(
tt
.
name
,
func
(
t
*
testing
.
T
)
{
if
got
:=
blockToFloat
(
tt
.
args
.
hexVal
);
got
!=
tt
.
want
{
t
.
Errorf
(
"blockToFloat() = %v, want %v"
,
got
,
tt
.
want
)
}
})
}
}
func
Test_hexAdd
(
t
*
testing
.
T
)
{
type
args
struct
{
hexVal
string
incr
int64
}
tests
:=
[]
struct
{
name
string
args
args
want
string
}{
{
"0x1"
,
args
{
"0x1"
,
1
},
"0x2"
},
{
"0x2"
,
args
{
"0x2"
,
-
1
},
"0x1"
},
{
"0xf"
,
args
{
"0xf"
,
1
},
"0x10"
},
{
"0x10"
,
args
{
"0x10"
,
-
1
},
"0xf"
},
}
for
_
,
tt
:=
range
tests
{
t
.
Run
(
tt
.
name
,
func
(
t
*
testing
.
T
)
{
if
got
:=
hexAdd
(
tt
.
args
.
hexVal
,
tt
.
args
.
incr
);
got
!=
tt
.
want
{
t
.
Errorf
(
"hexAdd() = %v, want %v"
,
got
,
tt
.
want
)
}
})
}
}
func
Test_blockAheadOrEqual
(
t
*
testing
.
T
)
{
type
args
struct
{
baseBlock
string
checkBlock
string
}
tests
:=
[]
struct
{
name
string
args
args
want
bool
}{
{
"0x1 vs 0x1"
,
args
{
"0x1"
,
"0x1"
},
true
},
{
"0x2 vs 0x1"
,
args
{
"0x2"
,
"0x1"
},
true
},
{
"0x1 vs 0x2"
,
args
{
"0x1"
,
"0x2"
},
false
},
{
"0xff vs 0x100"
,
args
{
"0xff"
,
"0x100"
},
false
},
{
"0x100 vs 0xff"
,
args
{
"0x100"
,
"0xff"
},
true
},
}
for
_
,
tt
:=
range
tests
{
t
.
Run
(
tt
.
name
,
func
(
t
*
testing
.
T
)
{
if
got
:=
blockAheadOrEqual
(
tt
.
args
.
baseBlock
,
tt
.
args
.
checkBlock
);
got
!=
tt
.
want
{
t
.
Errorf
(
"blockAheadOrEqual() = %v, want %v"
,
got
,
tt
.
want
)
}
})
}
}
proxyd/consensus_tracker.go
View file @
015688be
...
@@ -5,37 +5,39 @@ import (
...
@@ -5,37 +5,39 @@ import (
"fmt"
"fmt"
"sync"
"sync"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/go-redis/redis/v8"
"github.com/go-redis/redis/v8"
)
)
// ConsensusTracker abstracts how we store and retrieve the current consensus
// ConsensusTracker abstracts how we store and retrieve the current consensus
// allowing it to be stored locally in-memory or in a shared Redis cluster
// allowing it to be stored locally in-memory or in a shared Redis cluster
type
ConsensusTracker
interface
{
type
ConsensusTracker
interface
{
GetConsensusBlockNumber
()
string
GetConsensusBlockNumber
()
hexutil
.
Uint64
SetConsensusBlockNumber
(
blockNumber
string
)
SetConsensusBlockNumber
(
blockNumber
hexutil
.
Uint64
)
}
}
// InMemoryConsensusTracker store and retrieve in memory, async-safe
// InMemoryConsensusTracker store and retrieve in memory, async-safe
type
InMemoryConsensusTracker
struct
{
type
InMemoryConsensusTracker
struct
{
consensusBlockNumber
string
consensusBlockNumber
hexutil
.
Uint64
mutex
sync
.
Mutex
mutex
sync
.
Mutex
}
}
func
NewInMemoryConsensusTracker
()
ConsensusTracker
{
func
NewInMemoryConsensusTracker
()
ConsensusTracker
{
return
&
InMemoryConsensusTracker
{
return
&
InMemoryConsensusTracker
{
consensusBlockNumber
:
""
,
// empty string semantics means unknown
consensusBlockNumber
:
0
,
mutex
:
sync
.
Mutex
{},
mutex
:
sync
.
Mutex
{},
}
}
}
}
func
(
ct
*
InMemoryConsensusTracker
)
GetConsensusBlockNumber
()
string
{
func
(
ct
*
InMemoryConsensusTracker
)
GetConsensusBlockNumber
()
hexutil
.
Uint64
{
defer
ct
.
mutex
.
Unlock
()
defer
ct
.
mutex
.
Unlock
()
ct
.
mutex
.
Lock
()
ct
.
mutex
.
Lock
()
return
ct
.
consensusBlockNumber
return
ct
.
consensusBlockNumber
}
}
func
(
ct
*
InMemoryConsensusTracker
)
SetConsensusBlockNumber
(
blockNumber
string
)
{
func
(
ct
*
InMemoryConsensusTracker
)
SetConsensusBlockNumber
(
blockNumber
hexutil
.
Uint64
)
{
defer
ct
.
mutex
.
Unlock
()
defer
ct
.
mutex
.
Unlock
()
ct
.
mutex
.
Lock
()
ct
.
mutex
.
Lock
()
...
@@ -61,10 +63,10 @@ func (ct *RedisConsensusTracker) key() string {
...
@@ -61,10 +63,10 @@ func (ct *RedisConsensusTracker) key() string {
return
fmt
.
Sprintf
(
"consensus_latest_block:%s"
,
ct
.
backendGroup
)
return
fmt
.
Sprintf
(
"consensus_latest_block:%s"
,
ct
.
backendGroup
)
}
}
func
(
ct
*
RedisConsensusTracker
)
GetConsensusBlockNumber
()
string
{
func
(
ct
*
RedisConsensusTracker
)
GetConsensusBlockNumber
()
hexutil
.
Uint64
{
return
ct
.
client
.
Get
(
ct
.
ctx
,
ct
.
key
())
.
Val
(
)
return
hexutil
.
Uint64
(
hexutil
.
MustDecodeUint64
(
ct
.
client
.
Get
(
ct
.
ctx
,
ct
.
key
())
.
Val
())
)
}
}
func
(
ct
*
RedisConsensusTracker
)
SetConsensusBlockNumber
(
blockNumber
string
)
{
func
(
ct
*
RedisConsensusTracker
)
SetConsensusBlockNumber
(
blockNumber
hexutil
.
Uint64
)
{
ct
.
client
.
Set
(
ct
.
ctx
,
ct
.
key
(),
blockNumber
,
0
)
ct
.
client
.
Set
(
ct
.
ctx
,
ct
.
key
(),
blockNumber
,
0
)
}
}
proxyd/integration_tests/consensus_test.go
View file @
015688be
...
@@ -56,7 +56,7 @@ func TestConsensus(t *testing.T) {
...
@@ -56,7 +56,7 @@ func TestConsensus(t *testing.T) {
h2
.
ResetOverrides
()
h2
.
ResetOverrides
()
// unknown consensus at init
// unknown consensus at init
require
.
Equal
(
t
,
"
"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"
0x0"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
())
// first poll
// first poll
for
_
,
be
:=
range
bg
.
Backends
{
for
_
,
be
:=
range
bg
.
Backends
{
...
@@ -65,7 +65,7 @@ func TestConsensus(t *testing.T) {
...
@@ -65,7 +65,7 @@ func TestConsensus(t *testing.T) {
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
// consensus at block 0x1
// consensus at block 0x1
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
()
)
})
})
t
.
Run
(
"advance consensus"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"advance consensus"
,
func
(
t
*
testing
.
T
)
{
...
@@ -78,7 +78,7 @@ func TestConsensus(t *testing.T) {
...
@@ -78,7 +78,7 @@ func TestConsensus(t *testing.T) {
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
// all nodes start at block 0x1
// all nodes start at block 0x1
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
()
)
// advance latest on node2 to 0x2
// advance latest on node2 to 0x2
h2
.
AddOverride
(
&
ms
.
MethodTemplate
{
h2
.
AddOverride
(
&
ms
.
MethodTemplate
{
...
@@ -95,7 +95,7 @@ func TestConsensus(t *testing.T) {
...
@@ -95,7 +95,7 @@ func TestConsensus(t *testing.T) {
// consensus should stick to 0x1, since node1 is still lagging there
// consensus should stick to 0x1, since node1 is still lagging there
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
()
)
// advance latest on node1 to 0x2
// advance latest on node1 to 0x2
h1
.
AddOverride
(
&
ms
.
MethodTemplate
{
h1
.
AddOverride
(
&
ms
.
MethodTemplate
{
...
@@ -111,7 +111,7 @@ func TestConsensus(t *testing.T) {
...
@@ -111,7 +111,7 @@ func TestConsensus(t *testing.T) {
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
// should stick to 0x2, since now all nodes are at 0x2
// should stick to 0x2, since now all nodes are at 0x2
require
.
Equal
(
t
,
"0x2"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"0x2"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
()
)
})
})
t
.
Run
(
"broken consensus"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"broken consensus"
,
func
(
t
*
testing
.
T
)
{
...
@@ -124,7 +124,7 @@ func TestConsensus(t *testing.T) {
...
@@ -124,7 +124,7 @@ func TestConsensus(t *testing.T) {
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
// all nodes start at block 0x1
// all nodes start at block 0x1
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
()
)
// advance latest on both nodes to 0x2
// advance latest on both nodes to 0x2
h1
.
AddOverride
(
&
ms
.
MethodTemplate
{
h1
.
AddOverride
(
&
ms
.
MethodTemplate
{
...
@@ -145,7 +145,7 @@ func TestConsensus(t *testing.T) {
...
@@ -145,7 +145,7 @@ func TestConsensus(t *testing.T) {
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
// at 0x2
// at 0x2
require
.
Equal
(
t
,
"0x2"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"0x2"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
()
)
// make node2 diverge on hash
// make node2 diverge on hash
h2
.
AddOverride
(
&
ms
.
MethodTemplate
{
h2
.
AddOverride
(
&
ms
.
MethodTemplate
{
...
@@ -161,7 +161,7 @@ func TestConsensus(t *testing.T) {
...
@@ -161,7 +161,7 @@ func TestConsensus(t *testing.T) {
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
// should resolve to 0x1, since 0x2 is out of consensus at the moment
// should resolve to 0x1, since 0x2 is out of consensus at the moment
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
()
)
// later, when impl events, listen to broken consensus event
// later, when impl events, listen to broken consensus event
})
})
...
@@ -176,7 +176,7 @@ func TestConsensus(t *testing.T) {
...
@@ -176,7 +176,7 @@ func TestConsensus(t *testing.T) {
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
// all nodes start at block 0x1
// all nodes start at block 0x1
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
()
)
// advance latest on both nodes to 0x2
// advance latest on both nodes to 0x2
h1
.
AddOverride
(
&
ms
.
MethodTemplate
{
h1
.
AddOverride
(
&
ms
.
MethodTemplate
{
...
@@ -197,7 +197,7 @@ func TestConsensus(t *testing.T) {
...
@@ -197,7 +197,7 @@ func TestConsensus(t *testing.T) {
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
// at 0x2
// at 0x2
require
.
Equal
(
t
,
"0x2"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"0x2"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
()
)
// advance latest on both nodes to 0x3
// advance latest on both nodes to 0x3
h1
.
AddOverride
(
&
ms
.
MethodTemplate
{
h1
.
AddOverride
(
&
ms
.
MethodTemplate
{
...
@@ -218,7 +218,7 @@ func TestConsensus(t *testing.T) {
...
@@ -218,7 +218,7 @@ func TestConsensus(t *testing.T) {
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
// at 0x3
// at 0x3
require
.
Equal
(
t
,
"0x3"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"0x3"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
()
)
// make node2 diverge on hash for blocks 0x2 and 0x3
// make node2 diverge on hash for blocks 0x2 and 0x3
h2
.
AddOverride
(
&
ms
.
MethodTemplate
{
h2
.
AddOverride
(
&
ms
.
MethodTemplate
{
...
@@ -239,7 +239,7 @@ func TestConsensus(t *testing.T) {
...
@@ -239,7 +239,7 @@ func TestConsensus(t *testing.T) {
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
// should resolve to 0x1
// should resolve to 0x1
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
()
)
})
})
t
.
Run
(
"fork in advanced block"
,
func
(
t
*
testing
.
T
)
{
t
.
Run
(
"fork in advanced block"
,
func
(
t
*
testing
.
T
)
{
...
@@ -252,7 +252,7 @@ func TestConsensus(t *testing.T) {
...
@@ -252,7 +252,7 @@ func TestConsensus(t *testing.T) {
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
// all nodes start at block 0x1
// all nodes start at block 0x1
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
()
)
// make nodes 1 and 2 advance in forks
// make nodes 1 and 2 advance in forks
h1
.
AddOverride
(
&
ms
.
MethodTemplate
{
h1
.
AddOverride
(
&
ms
.
MethodTemplate
{
...
@@ -293,7 +293,7 @@ func TestConsensus(t *testing.T) {
...
@@ -293,7 +293,7 @@ func TestConsensus(t *testing.T) {
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
bg
.
Consensus
.
UpdateBackendGroupConsensus
(
ctx
)
// should resolve to 0x1, the highest common ancestor
// should resolve to 0x1, the highest common ancestor
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
())
require
.
Equal
(
t
,
"0x1"
,
bg
.
Consensus
.
GetConsensusBlockNumber
()
.
String
()
)
})
})
}
}
...
...
proxyd/metrics.go
View file @
015688be
...
@@ -5,6 +5,8 @@ import (
...
@@ -5,6 +5,8 @@ import (
"strconv"
"strconv"
"strings"
"strings"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promauto"
)
)
...
@@ -243,10 +245,12 @@ var (
...
@@ -243,10 +245,12 @@ var (
Help
:
"Count of errors taking frontend rate limits"
,
Help
:
"Count of errors taking frontend rate limits"
,
})
})
consensusLatestBlock
=
promauto
.
NewGauge
(
prometheus
.
GaugeOpts
{
consensusLatestBlock
=
promauto
.
NewGauge
Vec
(
prometheus
.
GaugeOpts
{
Namespace
:
MetricsNamespace
,
Namespace
:
MetricsNamespace
,
Name
:
"consensus_latest_block"
,
Name
:
"
group_
consensus_latest_block"
,
Help
:
"Consensus latest block"
,
Help
:
"Consensus latest block"
,
},
[]
string
{
"backend_group_name"
,
})
})
backendLatestBlockBackend
=
promauto
.
NewGaugeVec
(
prometheus
.
GaugeOpts
{
backendLatestBlockBackend
=
promauto
.
NewGaugeVec
(
prometheus
.
GaugeOpts
{
...
@@ -316,3 +320,11 @@ func RecordCacheMiss(method string) {
...
@@ -316,3 +320,11 @@ func RecordCacheMiss(method string) {
func
RecordBatchSize
(
size
int
)
{
func
RecordBatchSize
(
size
int
)
{
batchSizeHistogram
.
Observe
(
float64
(
size
))
batchSizeHistogram
.
Observe
(
float64
(
size
))
}
}
func
RecordBackendLatestBlock
(
be
*
Backend
,
blockNumber
hexutil
.
Uint64
)
{
backendLatestBlockBackend
.
WithLabelValues
(
be
.
Name
)
.
Set
(
float64
(
blockNumber
))
}
func
RecordGroupConsensusLatestBlock
(
group
*
BackendGroup
,
blockNumber
hexutil
.
Uint64
)
{
consensusLatestBlock
.
WithLabelValues
(
group
.
Name
)
.
Set
(
float64
(
blockNumber
))
}
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