Skip to content

Commit 39c9e09

Browse files
authored
Merge pull request #526 from CosmWasm/aw/pinned-metrics
Add bindings for the pinned metrics
2 parents 75fd983 + 1ecdacb commit 39c9e09

File tree

15 files changed

+375
-9
lines changed

15 files changed

+375
-9
lines changed

flake.lock

Lines changed: 85 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

flake.nix

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
{
2+
description = "Devshell flake";
3+
4+
inputs = {
5+
flake-utils.url = "github:numtide/flake-utils";
6+
nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
7+
rust-overlay = {
8+
inputs = {
9+
flake-utils.follows = "flake-utils";
10+
nixpkgs.follows = "nixpkgs";
11+
};
12+
url = "github:oxalica/rust-overlay";
13+
};
14+
};
15+
16+
outputs = { self, nixpkgs, flake-utils, rust-overlay } @ inputs:
17+
flake-utils.lib.eachDefaultSystem (system:
18+
let
19+
overlays = [ (import rust-overlay) ];
20+
pkgs = import nixpkgs {
21+
inherit overlays system;
22+
};
23+
in
24+
{
25+
formatter = pkgs.nixpkgs-fmt;
26+
27+
devShells.default = pkgs.mkShell {
28+
buildInputs = with pkgs; [
29+
go
30+
gofumpt
31+
golangci-lint
32+
rust-bin.stable.latest.default
33+
];
34+
};
35+
}
36+
);
37+
}

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ go 1.21
44

55
require (
66
github.com/google/btree v1.0.0
7+
github.com/shamaton/msgpack/v2 v2.2.0
78
github.com/stretchr/testify v1.8.1
89
golang.org/x/sys v0.16.0
910
)
1011

1112
require (
1213
github.com/davecgh/go-spew v1.1.1 // indirect
13-
github.com/kr/pretty v0.1.0 // indirect
14+
github.com/kr/pretty v0.3.1 // indirect
1415
github.com/pmezard/go-difflib v1.0.0 // indirect
1516
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
1617
gopkg.in/yaml.v3 v3.0.1 // indirect

go.sum

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
1+
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
12
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
23
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
34
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
45
github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo=
56
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
6-
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
7-
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
8-
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
9-
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
10-
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
7+
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
8+
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
9+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
10+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
11+
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
1112
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1213
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
14+
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
15+
github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
16+
github.com/shamaton/msgpack/v2 v2.2.0 h1:IP1m01pHwCrMa6ZccP9B3bqxEMKMSmMVAVKk54g3L/Y=
17+
github.com/shamaton/msgpack/v2 v2.2.0/go.mod h1:6khjYnkx73f7VQU7wjcFS9DFjs+59naVWJv1TB7qdOI=
1318
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
1419
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
1520
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=

internal/api/bindings.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,8 @@ struct AnalysisReport analyze_code(struct cache_t *cache,
441441

442442
struct Metrics get_metrics(struct cache_t *cache, struct UnmanagedVector *error_msg);
443443

444+
struct UnmanagedVector get_pinned_metrics(struct cache_t *cache, struct UnmanagedVector *error_msg);
445+
444446
/**
445447
* frees a cache reference
446448
*

internal/api/lib.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,21 @@ func GetMetrics(cache Cache) (*types.Metrics, error) {
190190
}, nil
191191
}
192192

193+
func GetPinnedMetrics(cache Cache) (*types.PinnedMetrics, error) {
194+
errmsg := uninitializedUnmanagedVector()
195+
metrics, err := C.get_pinned_metrics(cache.ptr, &errmsg)
196+
if err != nil {
197+
return nil, errorWithMessage(err, errmsg)
198+
}
199+
200+
var pinnedMetrics types.PinnedMetrics
201+
if err := pinnedMetrics.UnmarshalMessagePack(copyAndDestroyUnmanagedVector(metrics)); err != nil {
202+
return nil, err
203+
}
204+
205+
return &pinnedMetrics, nil
206+
}
207+
193208
func Instantiate(
194209
cache Cache,
195210
checksum []byte,

internal/api/lib_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package api
22

33
import (
4+
"bytes"
45
"crypto/sha256"
56
"encoding/hex"
67
"encoding/json"
@@ -382,6 +383,85 @@ func TestGetMetrics(t *testing.T) {
382383
require.InEpsilon(t, 3700000, metrics.SizeMemoryCache, 0.25)
383384
}
384385

386+
func TestGetPinnedMetrics(t *testing.T) {
387+
cache, cleanup := withCache(t)
388+
defer cleanup()
389+
390+
// GetMetrics 1
391+
metrics, err := GetPinnedMetrics(cache)
392+
require.NoError(t, err)
393+
assert.Equal(t, &types.PinnedMetrics{PerModule: make([]types.PerModuleEntry, 0)}, metrics)
394+
395+
// Store contract 1
396+
wasm, err := os.ReadFile("../../testdata/hackatom.wasm")
397+
require.NoError(t, err)
398+
checksum, err := StoreCode(cache, wasm)
399+
require.NoError(t, err)
400+
401+
err = Pin(cache, checksum)
402+
require.NoError(t, err)
403+
404+
// Store contract 2
405+
cyberpunkWasm, err := os.ReadFile("../../testdata/cyberpunk.wasm")
406+
require.NoError(t, err)
407+
cyberpunkChecksum, err := StoreCode(cache, cyberpunkWasm)
408+
require.NoError(t, err)
409+
410+
err = Pin(cache, cyberpunkChecksum)
411+
require.NoError(t, err)
412+
413+
findMetrics := func(list []types.PerModuleEntry, checksum types.Checksum) *types.PerModuleMetrics {
414+
found := (*types.PerModuleMetrics)(nil)
415+
416+
for _, structure := range list {
417+
if bytes.Equal(structure.Checksum, checksum) {
418+
found = &structure.Metrics
419+
break
420+
}
421+
}
422+
423+
return found
424+
}
425+
426+
// GetMetrics 2
427+
metrics, err = GetPinnedMetrics(cache)
428+
require.NoError(t, err)
429+
assert.Equal(t, 2, len(metrics.PerModule))
430+
431+
hackatomMetrics := findMetrics(metrics.PerModule, checksum)
432+
cyberpunkMetrics := findMetrics(metrics.PerModule, cyberpunkChecksum)
433+
434+
assert.Equal(t, uint32(0), hackatomMetrics.Hits)
435+
assert.NotEqual(t, uint32(0), hackatomMetrics.Size)
436+
assert.Equal(t, uint32(0), cyberpunkMetrics.Hits)
437+
assert.NotEqual(t, uint32(0), cyberpunkMetrics.Size)
438+
439+
// Instantiate 1
440+
gasMeter := NewMockGasMeter(TESTING_GAS_LIMIT)
441+
igasMeter := types.GasMeter(gasMeter)
442+
store := NewLookup(gasMeter)
443+
api := NewMockAPI()
444+
querier := DefaultQuerier(MOCK_CONTRACT_ADDR, types.Array[types.Coin]{types.NewCoin(100, "ATOM")})
445+
env := MockEnvBin(t)
446+
info := MockInfoBin(t, "creator")
447+
msg1 := []byte(`{"verifier": "fred", "beneficiary": "bob"}`)
448+
_, _, err = Instantiate(cache, checksum, env, info, msg1, &igasMeter, store, api, &querier, TESTING_GAS_LIMIT, TESTING_PRINT_DEBUG)
449+
require.NoError(t, err)
450+
451+
// GetMetrics 3
452+
metrics, err = GetPinnedMetrics(cache)
453+
require.NoError(t, err)
454+
assert.Equal(t, 2, len(metrics.PerModule))
455+
456+
hackatomMetrics = findMetrics(metrics.PerModule, checksum)
457+
cyberpunkMetrics = findMetrics(metrics.PerModule, cyberpunkChecksum)
458+
459+
assert.Equal(t, uint32(1), hackatomMetrics.Hits)
460+
assert.NotEqual(t, uint32(0), hackatomMetrics.Size)
461+
assert.Equal(t, uint32(0), cyberpunkMetrics.Hits)
462+
assert.NotEqual(t, uint32(0), cyberpunkMetrics.Size)
463+
}
464+
385465
func TestInstantiate(t *testing.T) {
386466
cache, cleanup := withCache(t)
387467
defer cleanup()

libwasmvm/Cargo.lock

Lines changed: 26 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

libwasmvm/Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ backtraces = []
2929
cosmwasm-std = { git = "https://github.com/CosmWasm/cosmwasm.git", rev = "v2.1.0-rc.1", features = ["staking", "stargate", "iterator"] }
3030
cosmwasm-vm = { git = "https://github.com/CosmWasm/cosmwasm.git", rev = "v2.1.0-rc.1", features = ["staking", "stargate", "iterator"] }
3131
errno = "0.3.8"
32+
rmp-serde = "1.1.2"
33+
serde = { version = "1.0.103", features = ["derive"] }
3234
serde_json = "1.0.91"
3335
thiserror = "1.0.38"
3436
hex = "0.4.3"

libwasmvm/bindings.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,8 @@ struct AnalysisReport analyze_code(struct cache_t *cache,
441441

442442
struct Metrics get_metrics(struct cache_t *cache, struct UnmanagedVector *error_msg);
443443

444+
struct UnmanagedVector get_pinned_metrics(struct cache_t *cache, struct UnmanagedVector *error_msg);
445+
444446
/**
445447
* frees a cache reference
446448
*

0 commit comments

Comments
 (0)