diff --git a/go.mod b/go.mod index af4cb3f4e..3f93e7064 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 // indirect golang.org/x/sync v0.0.0-20210220032951-036812b2e83c google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c - google.golang.org/grpc v1.38.0 + google.golang.org/grpc v1.40.0 gopkg.in/yaml.v2 v2.4.0 ) diff --git a/x/wasm/keeper/keeper.go b/x/wasm/keeper/keeper.go index 00aa91f35..fd8d99097 100644 --- a/x/wasm/keeper/keeper.go +++ b/x/wasm/keeper/keeper.go @@ -4,6 +4,7 @@ import ( "encoding/binary" "fmt" "path/filepath" + "sync" "github.com/tendermint/tendermint/libs/log" "golang.org/x/sync/semaphore" @@ -36,6 +37,7 @@ type Keeper struct { wasmVM types.WasmerEngine wasmReadVMPool []types.WasmerEngine wasmReadVMSemaphore *semaphore.Weighted + wasmReadVMMutex *sync.Mutex querier types.Querier msgParser types.MsgParser @@ -98,6 +100,7 @@ func NewKeeper( wasmVM: writeWasmVM, wasmReadVMPool: wasmReadVMPool, wasmReadVMSemaphore: semaphore.NewWeighted(int64(numReadVms)), + wasmReadVMMutex: &sync.Mutex{}, accountKeeper: accountKeeper, bankKeeper: bankKeeper, treasuryKeeper: treasuryKeeper, diff --git a/x/wasm/keeper/pool.go b/x/wasm/keeper/pool.go index bd58820c7..518cea890 100644 --- a/x/wasm/keeper/pool.go +++ b/x/wasm/keeper/pool.go @@ -6,19 +6,26 @@ import ( "github.com/terra-money/core/x/wasm/types" ) +var n = 0 + func (k Keeper) getWasmVM(ctx context.Context) (types.WasmerEngine, error) { err := k.wasmReadVMSemaphore.Acquire(ctx, 1) if err != nil { return nil, err } + k.wasmReadVMMutex.Lock() wasmVM := k.wasmReadVMPool[0] k.wasmReadVMPool = k.wasmReadVMPool[1:] + k.wasmReadVMMutex.Unlock() return wasmVM, nil } func (k Keeper) putWasmVM(wasmVM types.WasmerEngine) { + k.wasmReadVMMutex.Lock() k.wasmReadVMPool = append(k.wasmReadVMPool, wasmVM) + k.wasmReadVMMutex.Unlock() + k.wasmReadVMSemaphore.Release(1) }