Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(lib/blocktree): reduce the entries in the runtimes mapping #3151

Merged
merged 52 commits into from
Jun 7, 2023
Merged
Show file tree
Hide file tree
Changes from 49 commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
b972e1c
Stop fork-pruned instances before removing
qdm12 Jan 23, 2023
d524c02
Prune in-memory runtimes on canonical chain
qdm12 Jan 23, 2023
43f2478
Refactor test
qdm12 Feb 8, 2023
1501d92
Rework logic
qdm12 Feb 15, 2023
5398c36
Add tests and fix bugs
qdm12 Feb 27, 2023
295303e
Keep track of already stopped runtimes
qdm12 Feb 27, 2023
7267344
feat: decrease the amount of instances while importing
EclesioMeloJunior Mar 6, 2023
3743a76
Merge branch 'qdm12/hashtoruntime' into eclesio/runtimes-lookup
EclesioMeloJunior Mar 6, 2023
0dc9581
Merge branch 'development' into qdm12/hashtoruntime
EclesioMeloJunior Mar 6, 2023
8071b3a
feat: use a slice and avoid implement a new pruner
EclesioMeloJunior Mar 8, 2023
8a2466a
chore: remove unneeded deltas, adding more metrics to grafana dashboard
EclesioMeloJunior Mar 9, 2023
a74d590
chore: remove unneeded comments, remove unneeded `hashToRuntime` fields
EclesioMeloJunior Mar 10, 2023
d6bda7b
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior Mar 10, 2023
1947ba8
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior Mar 10, 2023
dcd7cab
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior Mar 13, 2023
47c357f
Merge branch 'eclesio/runtimes-lookup' of github.com:ChainSafe/gossam…
EclesioMeloJunior Mar 13, 2023
f891c0a
chore: solve `TestService_HandleRuntimeChanges` failures
EclesioMeloJunior Mar 14, 2023
dbf7318
chore: fix linting
EclesioMeloJunior Mar 14, 2023
200add3
chore: fix `Test_hashToRuntime_onFinalisation` + add `Test_hashToRunt…
EclesioMeloJunior Mar 14, 2023
44567c3
chore: fix `lib/blocktree` unit tests
EclesioMeloJunior Mar 14, 2023
92a3e53
chore: fix `dot/state` unit tests
EclesioMeloJunior Mar 14, 2023
c052671
chore: solve `dot/digest` integration tests
EclesioMeloJunior Mar 14, 2023
e5e94fd
Merge branch 'qdm12/hashtoruntime' into eclesio/runtimes-lookup
EclesioMeloJunior Mar 14, 2023
42a428c
chore: add unit test to `lib/blocktree`
EclesioMeloJunior Mar 14, 2023
5fa3b67
chore: fix `TestVerifyForkBlocksWithRespectiveEpochData`
EclesioMeloJunior Mar 14, 2023
f1b24fe
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior Mar 20, 2023
76f8de8
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior Mar 20, 2023
1363316
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior Mar 21, 2023
863f291
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior Mar 28, 2023
2400d13
chore: add `go_memstats_heap_released_bytes` to grafana dashboard
EclesioMeloJunior Mar 28, 2023
1e12102
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior Mar 28, 2023
e1268ea
chore: add error wrappers
EclesioMeloJunior Mar 28, 2023
be64275
Merge branch 'eclesio/runtimes-lookup' of github.com:ChainSafe/gossam…
EclesioMeloJunior Mar 28, 2023
da520cb
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior May 31, 2023
4383ede
chore: fix lint warns
EclesioMeloJunior May 31, 2023
e2a1da6
chore: integrate `runtime.GetRuntime` on `TestService_HandleRuntimeCh…
EclesioMeloJunior May 31, 2023
3c5aa03
chore: return if no entries in the mapping
EclesioMeloJunior May 31, 2023
1c77111
chore: change the panic message
EclesioMeloJunior May 31, 2023
b4856a0
chore: remove unneded method `closestAncestorWithInstance`
EclesioMeloJunior Jun 1, 2023
a83f6e0
chore: address comments
EclesioMeloJunior Jun 1, 2023
2fdaefe
chore: fixes `Test_GetRuntime_StoreRuntime` unit test
EclesioMeloJunior Jun 1, 2023
e146edb
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior Jun 1, 2023
bc9341f
chore: resolve a shadow declaration
EclesioMeloJunior Jun 1, 2023
7eef1b8
chore: remove panic assertion of `Test_hashToRuntime_onFinalisation` …
EclesioMeloJunior Jun 1, 2023
f3fb273
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior Jun 1, 2023
4842ba6
chore: make improvements in `Test_BlockTree_GetBlockRuntime` test
EclesioMeloJunior Jun 2, 2023
d7f88fb
Merge branch 'eclesio/runtimes-lookup' of github.com:ChainSafe/gossam…
EclesioMeloJunior Jun 2, 2023
cb0cd35
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior Jun 5, 2023
0a28459
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior Jun 6, 2023
54e8dee
chore: move `defer` to below early return
EclesioMeloJunior Jun 6, 2023
f7f4e16
Merge branch 'eclesio/runtimes-lookup' of github.com:ChainSafe/gossam…
EclesioMeloJunior Jun 6, 2023
f171d25
Merge branch 'development' into eclesio/runtimes-lookup
EclesioMeloJunior Jun 7, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ services:
- ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
# The following line can be uncommented to persist metrics data.
# - gossamer-prometheus:/prometheus
ports:
- 9090:9090/tcp # HTTP Web interface at http://localhost:9090/
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved
expose:
- 9090/tcp # Prometheus metrics for Grafana

Expand Down
176 changes: 116 additions & 60 deletions docker/grafana/provisioning/dashboards/gossamer.json
Original file line number Diff line number Diff line change
Expand Up @@ -155,65 +155,6 @@
"title": "Threads",
"type": "stat"
},
{
"datasource": {
"type": "prometheus",
"uid": "prometheus_id"
},
"fieldConfig": {
"defaults": {
"color": {
"mode": "fixed"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
},
"unit": "bytes"
},
"overrides": []
},
"gridPos": {
"h": 6,
"w": 3,
"x": 6,
"y": 1
},
"id": 38,
"options": {
"colorMode": "value",
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"reduceOptions": {
"calcs": [
"lastNotNull"
],
"fields": "",
"values": false
},
"textMode": "auto"
},
"pluginVersion": "9.0.4",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "prometheus_id"
},
"expr": "process_resident_memory_bytes{instance=~\".*gossamer.*\"}",
"refId": "A"
}
],
"title": "Memory usage",
EclesioMeloJunior marked this conversation as resolved.
Show resolved Hide resolved
"type": "stat"
},
{
"datasource": {
"type": "prometheus",
Expand Down Expand Up @@ -309,6 +250,30 @@
"range": true,
"refId": "B"
},
{
"datasource": {
"type": "prometheus",
"uid": "prometheus_id"
},
"editorMode": "code",
"expr": "go_memstats_heap_idle_bytes{instance=~\".*gossamer.*\"}",
"hide": false,
"legendFormat": "Heap Idle Bytes",
"range": true,
"refId": "C"
},
{
"datasource": {
"type": "prometheus",
"uid": "prometheus_id"
},
"editorMode": "code",
"expr": "go_memstats_heap_released_bytes{instance=~\".*gossamer.*\"}",
"hide": false,
"legendFormat": "Heap Idle Bytes",
"range": true,
"refId": "D"
},
{
"datasource": {
"type": "prometheus",
Expand All @@ -319,12 +284,103 @@
"hide": false,
"legendFormat": "Stack",
"range": true,
"refId": "C"
"refId": "E"
}
],
"title": "Memory usage",
"type": "timeseries"
},
{
"datasource": {
"uid": "prometheus_id",
"type": "prometheus"
},
"fieldConfig": {
"defaults": {
"custom": {
"drawStyle": "line",
"lineInterpolation": "linear",
"barAlignment": 0,
"lineWidth": 1,
"fillOpacity": 0,
"gradientMode": "none",
"spanNulls": false,
"showPoints": "auto",
"pointSize": 5,
"stacking": {
"mode": "none",
"group": "A"
},
"axisPlacement": "auto",
"axisLabel": "",
"axisColorMode": "text",
"scaleDistribution": {
"type": "linear"
},
"axisCenteredZero": false,
"hideFrom": {
"tooltip": false,
"viz": false,
"legend": false
},
"thresholdsStyle": {
"mode": "off"
}
},
"color": {
"mode": "palette-classic"
},
"mappings": [],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
},
"unit": "bytes"
},
"overrides": []
},
"gridPos": {
"h": 9,
"w": 12,
"x": 0,
"y": 16
},
"id": 40,
"options": {
"tooltip": {
"mode": "multi",
"sort": "none"
},
"legend": {
"showLegend": true,
"displayMode": "list",
"placement": "bottom",
"calcs": []
}
},
"pluginVersion": "9.0.4",
"targets": [
{
"datasource": {
"type": "prometheus",
"uid": "prometheus_id"
},
"refId": "A",
"editorMode": "builder",
"expr": "gossamer_inmemory_runtimes_total{instance=~\".*gossamer.*\"}",
"legendFormat": "Runtimes",
"range": true
}
],
"title": "In Memory Runtimes",
"type": "timeseries",
"description": ""
},
{
"gridPos": {
"h": 1,
Expand Down
2 changes: 2 additions & 0 deletions docker/prometheus/prometheus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ scrape_configs:
- job_name: gossamer
metrics_path: /metrics
static_configs:
# for mac users, change to host.docker.internal:9876 if you want to
dimartiro marked this conversation as resolved.
Show resolved Hide resolved
# communicate prometheus container with gossamer running locally
- targets: ["gossamer:9876"]
5 changes: 3 additions & 2 deletions dot/core/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,13 +212,14 @@ func (s *Service) handleBlock(block *types.Block, state *rtstorage.TrieState) er
logger.Debugf("imported block %s and stored state trie with root %s",
block.Header.Hash(), state.MustRoot())

rt, err := s.blockState.GetRuntime(block.Header.ParentHash)
parentRuntimeInstance, err := s.blockState.GetRuntime(block.Header.ParentHash)
if err != nil {
return err
}

// check for runtime changes
if err := s.blockState.HandleRuntimeChanges(state, rt, block.Header.Hash()); err != nil {
err = s.blockState.HandleRuntimeChanges(state, parentRuntimeInstance, block.Header.Hash())
if err != nil {
logger.Criticalf("failed to update runtime code: %s", err)
return err
}
Expand Down
119 changes: 72 additions & 47 deletions dot/core/service_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -497,86 +497,111 @@ func TestService_GetMetadata(t *testing.T) {
}

func TestService_HandleRuntimeChanges(t *testing.T) {
const (
updatedSpecVersion = uint32(262)
updateNodeRuntimeWasmPath = "../../tests/polkadotjs_test/test/node_runtime.compact.wasm"
)
s := NewTestService(t, nil)
genesisHeader, err := s.blockState.BestBlockHeader()
require.NoError(t, err)

bestBlockHash := s.blockState.BestBlockHash()
rt, err := s.blockState.GetRuntime(bestBlockHash)
genesisBlockHash := genesisHeader.Hash()
genesisStateRoot := genesisHeader.StateRoot

ts, err := s.storageState.TrieState(&genesisStateRoot) // Pass genesis root
require.NoError(t, err)

v, err := rt.Version()
firstBlockHash := createBlockUsingOldRuntime(t, genesisBlockHash, ts, s.blockState)
updateNodeRuntimeWasmPath, err := runtime.GetRuntime(context.Background(), runtime.WESTEND_RUNTIME_v0929)
require.NoError(t, err)

currSpecVersion := v.SpecVersion // genesis runtime version.
hash := s.blockState.BestBlockHash() // genesisHash
secondBlockHash := createBlockUsingNewRuntime(t, genesisBlockHash, updateNodeRuntimeWasmPath, ts, s.blockState)

digest := types.NewDigest()
err = digest.Add(types.PreRuntimeDigest{
ConsensusEngineID: types.BabeEngineID,
Data: common.MustHexToBytes("0x0201000000ef55a50f00000000"),
})
// firstBlockHash runtime should not be updated
genesisRuntime, err := s.blockState.GetRuntime(genesisBlockHash)
require.NoError(t, err)

newBlock1 := &types.Block{
Header: types.Header{
ParentHash: hash,
Number: 1,
Digest: types.NewDigest()},
Body: *types.NewBody([]types.Extrinsic{[]byte("Old Runtime")}),
}
firstBlockRuntime, err := s.blockState.GetRuntime(firstBlockHash)
require.NoError(t, err)

newBlockRTUpdate := &types.Block{
Header: types.Header{
ParentHash: hash,
Number: 1,
Digest: digest,
},
Body: *types.NewBody([]types.Extrinsic{[]byte("Updated Runtime")}),
}
genesisRuntimeVersion, err := genesisRuntime.Version()
require.NoError(t, err)

ts, err := s.storageState.TrieState(nil) // Pass genesis root
firstBlockRuntimeVersion, err := firstBlockRuntime.Version()
require.NoError(t, err)

parentRt, err := s.blockState.GetRuntime(hash)
require.Equal(t, genesisRuntimeVersion, firstBlockRuntimeVersion)

secondBlockRuntime, err := s.blockState.GetRuntime(secondBlockHash)
require.NoError(t, err)

v, err = parentRt.Version()
const updatedSpecVersion = uint32(9290)
secondBlockRuntimeVersion, err := secondBlockRuntime.Version()
require.NoError(t, err)

require.Equal(t, v.SpecVersion, currSpecVersion)
require.Equal(t, updatedSpecVersion, secondBlockRuntimeVersion.SpecVersion)
}

bhash1 := newBlock1.Header.Hash()
err = s.blockState.HandleRuntimeChanges(ts, parentRt, bhash1)
func createBlockUsingOldRuntime(t *testing.T, bestBlockHash common.Hash, trieState *rtstorage.TrieState,
blockState BlockState) (blockHash common.Hash) {
parentRt, err := blockState.GetRuntime(bestBlockHash)
require.NoError(t, err)

testRuntime, err := os.ReadFile(updateNodeRuntimeWasmPath)
primaryDigestData := types.NewBabePrimaryPreDigest(0, uint64(0), [32]byte{}, [64]byte{})
digest := types.NewDigest()
preRuntimeDigest, err := primaryDigestData.ToPreRuntimeDigest()
require.NoError(t, err)
err = digest.Add(*preRuntimeDigest)
require.NoError(t, err)

ts.Put(common.CodeKey, testRuntime)
rtUpdateBhash := newBlockRTUpdate.Header.Hash()
newBlock := &types.Block{
Header: types.Header{
ParentHash: bestBlockHash,
Number: 1,
Digest: digest,
},
Body: *types.NewBody([]types.Extrinsic{[]byte("Old Runtime")}),
}
err = blockState.AddBlock(newBlock)
require.NoError(t, err)

// update runtime for new block
err = s.blockState.HandleRuntimeChanges(ts, parentRt, rtUpdateBhash)
newBlockHash := newBlock.Header.Hash()
err = blockState.HandleRuntimeChanges(trieState, parentRt, newBlockHash)
require.NoError(t, err)

// bhash1 runtime should not be updated
rt, err = s.blockState.GetRuntime(bhash1)
return newBlockHash
}

func createBlockUsingNewRuntime(t *testing.T, bestBlockHash common.Hash, newRuntimePath string,
trieState *rtstorage.TrieState, blockState BlockState) (blockHash common.Hash) {
parentRt, err := blockState.GetRuntime(bestBlockHash)
require.NoError(t, err)

v, err = rt.Version()
testRuntime, err := os.ReadFile(newRuntimePath)
require.NoError(t, err)
require.Equal(t, v.SpecVersion, currSpecVersion)

rt, err = s.blockState.GetRuntime(rtUpdateBhash)
trieState.Put(common.CodeKey, testRuntime)

primaryDigestData := types.NewBabePrimaryPreDigest(0, uint64(1), [32]byte{}, [64]byte{})
digest := types.NewDigest()
preRuntimeDigest, err := primaryDigestData.ToPreRuntimeDigest()
require.NoError(t, err)
err = digest.Add(*preRuntimeDigest)
require.NoError(t, err)

newBlockRuntimeUpdate := &types.Block{
Header: types.Header{
ParentHash: bestBlockHash,
Number: 1,
Digest: digest,
},
Body: *types.NewBody([]types.Extrinsic{[]byte("Updated Runtime")}),
}

err = blockState.AddBlock(newBlockRuntimeUpdate)
require.NoError(t, err)

v, err = rt.Version()
newBlockRTUpdateHash := newBlockRuntimeUpdate.Header.Hash()
err = blockState.HandleRuntimeChanges(trieState, parentRt, newBlockRTUpdateHash)
require.NoError(t, err)

require.Equal(t, v.SpecVersion, updatedSpecVersion)
return newBlockRTUpdateHash
}

func TestService_HandleCodeSubstitutes(t *testing.T) {
Expand Down
Loading