From de50a78098ef3996648ae277e2518d767307bcec Mon Sep 17 00:00:00 2001 From: zu1k Date: Fri, 13 Aug 2021 22:17:53 +0800 Subject: [PATCH 01/25] Changing the config to fit multiple wasm --- demo/wasm/code/golang/wasm.go | 5 + demo/wasm/config.json | 32 ++++-- pkg/wasm/abi.go | 21 ++++ pkg/wasm/config.go | 11 +- pkg/wasm/config_test.go | 6 +- pkg/wasm/dispatch.go | 44 ++++++++ pkg/wasm/exports.go | 5 + pkg/wasm/factory.go | 193 ++++++++++++++++++---------------- pkg/wasm/filter.go | 185 +++++++++++++++++++++----------- pkg/wasm/proxywasm/abi.go | 13 +++ pkg/wasm/watcher.go | 4 +- 11 files changed, 349 insertions(+), 170 deletions(-) create mode 100644 pkg/wasm/dispatch.go create mode 100644 pkg/wasm/exports.go create mode 100644 pkg/wasm/proxywasm/abi.go diff --git a/demo/wasm/code/golang/wasm.go b/demo/wasm/code/golang/wasm.go index d1fcf36cab..6d5806f452 100644 --- a/demo/wasm/code/golang/wasm.go +++ b/demo/wasm/code/golang/wasm.go @@ -70,3 +70,8 @@ func proxyOnMemoryAllocate(size uint) *byte { buf := make([]byte, size) return &buf[0] } + +//export ID +func ID() string { + return "id_1" +} diff --git a/demo/wasm/config.json b/demo/wasm/config.json index d992f33afe..461c35b827 100644 --- a/demo/wasm/config.json +++ b/demo/wasm/config.json @@ -45,14 +45,32 @@ "stream_filters": [ { "type": "Layotto", - "config": { - "name": "wasm_demo", - "instance_num": 1, - "vm_config": { - "engine": "wasmer", - "path": "demo/wasm/code/golang/wasm.wasm" + "config": [ + { + "name": "id_1", + "instance_num": 1, + "vm_config": { + "engine": "wasmer", + "path": "demo/wasm/code/golang/wasm_1_1.wasm" + } + }, + { + "name": "id_1", + "instance_num": 2, + "vm_config": { + "engine": "wasmer", + "path": "demo/wasm/code/golang/wasm_1_2.wasm" + } + }, + { + "name": "id_2", + "instance_num": 1, + "vm_config": { + "engine": "wasmer", + "path": "demo/wasm/code/golang/wasm_2.wasm" + } } - } + ] } ] } diff --git a/pkg/wasm/abi.go b/pkg/wasm/abi.go index 4737040ded..00fb4e545e 100644 --- a/pkg/wasm/abi.go +++ b/pkg/wasm/abi.go @@ -42,3 +42,24 @@ type AbiV2Impl struct { func (a *AbiV2Impl) Name() string { return AbiV2 } + +func (a *AbiV2Impl) GetABIExports() interface{} { + return a.ABIContext.GetABIExports() +} + +func (a *AbiV2Impl) ProxyGetID() (string, error) { + ff, err := a.Instance.GetExportsFunc("proxy_id") + if err != nil { + return "", err + } + + res, err := ff.Call() + if err != nil { + a.Instance.HandleError(err) + return "", err + } + + a.Imports.Wait() + + return res.(string), nil +} diff --git a/pkg/wasm/config.go b/pkg/wasm/config.go index f69d347968..9b1c16935e 100644 --- a/pkg/wasm/config.go +++ b/pkg/wasm/config.go @@ -25,16 +25,17 @@ import ( "mosn.io/mosn/pkg/log" ) -type filterConfig struct { +type filterConfigItem struct { FromWasmPlugin string `json:"from_wasm_plugin,omitempty"` VmConfig *v2.WasmVmConfig `json:"vm_config,omitempty"` InstanceNum int `json:"instance_num,omitempty"` RootContextID int32 `json:"root_context_id,omitempty"` UserData map[string]string `json:"-"` + PluginName string `json:"-"` } -func parseFilterConfig(cfg map[string]interface{}) (*filterConfig, error) { - config := filterConfig{ +func parseFilterConfigItem(cfg map[string]interface{}) (*filterConfigItem, error) { + config := filterConfigItem{ UserData: make(map[string]string), RootContextID: 1, // default value is 1 } @@ -63,7 +64,7 @@ func parseFilterConfig(cfg map[string]interface{}) (*filterConfig, error) { return &config, nil } -func checkVmConfig(config *filterConfig) error { +func checkVmConfig(config *filterConfigItem) error { if config.FromWasmPlugin != "" { config.VmConfig = nil config.InstanceNum = 0 @@ -81,7 +82,7 @@ func checkVmConfig(config *filterConfig) error { return nil } -func parseUserData(rawConfigBytes []byte, config *filterConfig) error { +func parseUserData(rawConfigBytes []byte, config *filterConfigItem) error { if len(rawConfigBytes) == 0 || config == nil { log.DefaultLogger.Errorf("[proxywasm][config] fail to parse user data, invalid param, raw: %v, config: %v", string(rawConfigBytes), config) diff --git a/pkg/wasm/config_test.go b/pkg/wasm/config_test.go index 6f42134af6..e45fc2b4a6 100644 --- a/pkg/wasm/config_test.go +++ b/pkg/wasm/config_test.go @@ -29,7 +29,7 @@ func TestXProxyWasmConfigFromGlobalPlugin(t *testing.T) { "user_config2": "user_value2", } - config, err := parseFilterConfig(configMap) + config, err := parseFilterConfigs(configMap) assert.Nil(t, err) assert.Nil(t, config.VmConfig) assert.Equal(t, config.InstanceNum, 0) @@ -42,7 +42,7 @@ func TestXProxyWasmConfigWithoutUserData(t *testing.T) { "instance_num": 2, } - config, err := parseFilterConfig(configMap) + config, err := parseFilterConfigs(configMap) assert.Nil(t, err) assert.Nil(t, config.VmConfig) assert.Equal(t, config.InstanceNum, 0) @@ -63,7 +63,7 @@ func TestXProxyWasmConfigWithVM(t *testing.T) { "user_config4": "user_value4", } - config, err := parseFilterConfig(configMap) + config, err := parseFilterConfigs(configMap) assert.Nil(t, err) assert.Equal(t, config.FromWasmPlugin, "") assert.NotNil(t, config.VmConfig) diff --git a/pkg/wasm/dispatch.go b/pkg/wasm/dispatch.go new file mode 100644 index 0000000000..15260a110b --- /dev/null +++ b/pkg/wasm/dispatch.go @@ -0,0 +1,44 @@ +package wasm + +import ( + "errors" + "math/rand" +) + +type Group struct { + count int + plugins []*WasmPlugin +} + +type Router struct { + routes map[string]Group +} + +var route = Router{ + routes: make(map[string]Group), +} + +// RegisterRoute register a group with id +// unsafe for concurrent +func RegisterRoute(id string, plugin *WasmPlugin) { + if group, found := route.routes[id]; found { + group.count += 1 + group.plugins = append(group.plugins, plugin) + route.routes[id] = group + } else { + route.routes[id] = Group{ + count: 1, + plugins: []*WasmPlugin{plugin}, + } + } +} + +func GetRandomPluginByID(id string) (*WasmPlugin, error) { + group, ok := route.routes[id] + if !ok { + return nil, errors.New("id is not registered") + } + + idx := rand.Intn(group.count) + return group.plugins[idx], nil +} diff --git a/pkg/wasm/exports.go b/pkg/wasm/exports.go new file mode 100644 index 0000000000..5fafbe619f --- /dev/null +++ b/pkg/wasm/exports.go @@ -0,0 +1,5 @@ +package wasm + +type Exports interface { + ProxyGetID() (string, error) +} diff --git a/pkg/wasm/factory.go b/pkg/wasm/factory.go index 2d14653e4c..dd4069fc8b 100644 --- a/pkg/wasm/factory.go +++ b/pkg/wasm/factory.go @@ -19,8 +19,6 @@ package wasm import ( "context" "errors" - "fmt" - "reflect" "mosn.io/api" v2 "mosn.io/mosn/pkg/config/v2" @@ -29,9 +27,7 @@ import ( "mosn.io/mosn/pkg/wasm" "mosn.io/mosn/pkg/wasm/abi" "mosn.io/mosn/pkg/wasm/abi/proxywasm010" - "mosn.io/pkg/buffer" "mosn.io/pkg/utils" - "mosn.io/proxy-wasm-go-host/common" "mosn.io/proxy-wasm-go-host/proxywasm" ) @@ -41,63 +37,79 @@ func init() { api.RegisterStream(LayottoWasm, createProxyWasmFilterFactory) } +// FilterConfigFactory contains multi wasm-plugin configs +// its pointer implemente api.StreamFilterChainFactory type FilterConfigFactory struct { proxywasm010.DefaultImportsHandler - pluginName string - config *filterConfig + //pluginName string + config []*filterConfigItem // contains multi wasm config + RootContextID int32 // TODO - vmConfigBytes buffer.IoBuffer - pluginConfigBytes buffer.IoBuffer + //vmConfigBytes buffer.IoBuffer + //pluginConfigBytes buffer.IoBuffer } -func createProxyWasmFilterFactory(conf map[string]interface{}) (api.StreamFilterChainFactory, error) { - config, err := parseFilterConfig(conf) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to parse config, err: %v", err) - return nil, err - } - - var pluginName string +var _ api.StreamFilterChainFactory = &FilterConfigFactory{} - if config.FromWasmPlugin == "" { - pluginName = utils.GenerateUUID() +func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilterChainFactory, error) { + factory := &FilterConfigFactory{ + config: make([]*filterConfigItem, 0, len(confs)), + RootContextID: 1, + } - v2Config := v2.WasmPluginConfig{ - PluginName: pluginName, - VmConfig: config.VmConfig, - InstanceNum: config.InstanceNum, + for configID, confIf := range confs { + conf, ok := confIf.(map[string]interface{}) + if !ok { + log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory config not a map, configID: %s", configID) + return nil, errors.New("config not a map") } - err = wasm.GetWasmManager().AddOrUpdateWasm(v2Config) + config, err := parseFilterConfigItem(conf) if err != nil { - log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to add plugin, err: %v", err) + log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to parse config, configID: %s, err: %v", configID, err) return nil, err } - addWatchFile(config, pluginName) - } else { - pluginName = config.FromWasmPlugin - } - pw := wasm.GetWasmManager().GetWasmPluginWrapperByName(pluginName) - if pw == nil { - return nil, errors.New("plugin not found") - } + var pluginName string + if config.FromWasmPlugin == "" { + pluginName = utils.GenerateUUID() + + v2Config := v2.WasmPluginConfig{ + PluginName: pluginName, + VmConfig: config.VmConfig, + InstanceNum: config.InstanceNum, + } + + err = wasm.GetWasmManager().AddOrUpdateWasm(v2Config) + if err != nil { + log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to add plugin, err: %v", err) + return nil, err + } + addWatchFile(config, pluginName) + } else { + pluginName = config.FromWasmPlugin + } + config.PluginName = pluginName - config.VmConfig = pw.GetConfig().VmConfig + pw := wasm.GetWasmManager().GetWasmPluginWrapperByName(pluginName) + if pw == nil { + return nil, errors.New("plugin not found") + } - factory := &FilterConfigFactory{ - pluginName: pluginName, - config: config, - } + config.VmConfig = pw.GetConfig().VmConfig + + pw.RegisterPluginHandler(factory) - pw.RegisterPluginHandler(factory) + // TODO: register route + + } return factory, nil } func (f *FilterConfigFactory) CreateFilterChain(context context.Context, callbacks api.StreamFilterChainFactoryCallbacks) { - filter := NewFilter(context, f.pluginName, f.config.RootContextID, f) + filter := NewFilter(context, f) if filter == nil { return } @@ -106,56 +118,57 @@ func (f *FilterConfigFactory) CreateFilterChain(context context.Context, callbac callbacks.AddStreamSenderFilter(filter, api.BeforeSend) } -func (f *FilterConfigFactory) GetRootContextID() int32 { - return f.config.RootContextID -} - -func (f *FilterConfigFactory) GetVmConfig() common.IoBuffer { - if f.vmConfigBytes != nil { - return f.vmConfigBytes - } - - vmConfig := *f.config.VmConfig - typeOf := reflect.TypeOf(vmConfig) - valueOf := reflect.ValueOf(&vmConfig).Elem() - - if typeOf.Kind() != reflect.Struct || typeOf.NumField() == 0 { - return nil - } - - m := make(map[string]string) - for i := 0; i < typeOf.NumField(); i++ { - m[typeOf.Field(i).Name] = fmt.Sprintf("%v", valueOf.Field(i).Interface()) - } - - b := proxywasm.EncodeMap(m) - if b == nil { - return nil - } - - f.vmConfigBytes = buffer.NewIoBufferBytes(b) - - return f.vmConfigBytes -} - -func (f *FilterConfigFactory) GetPluginConfig() common.IoBuffer { - if f.pluginConfigBytes != nil { - return f.pluginConfigBytes - } - - b := proxywasm.EncodeMap(f.config.UserData) - if b == nil { - return nil - } - - f.pluginConfigBytes = buffer.NewIoBufferBytes(b) - - return f.pluginConfigBytes -} +//func (f *FilterConfigFactory) GetRootContextID() int32 { +// return f.RootContextID +//} + +//func (f *FilterConfigFactory) GetVmConfig() common.IoBuffer { +// if f.vmConfigBytes != nil { +// return f.vmConfigBytes +// } +// +// vmConfig := *f.config.VmConfig +// typeOf := reflect.TypeOf(vmConfig) +// valueOf := reflect.ValueOf(&vmConfig).Elem() +// +// if typeOf.Kind() != reflect.Struct || typeOf.NumField() == 0 { +// return nil +// } +// +// m := make(map[string]string) +// for i := 0; i < typeOf.NumField(); i++ { +// m[typeOf.Field(i).Name] = fmt.Sprintf("%v", valueOf.Field(i).Interface()) +// } +// +// b := proxywasm.EncodeMap(m) +// if b == nil { +// return nil +// } +// +// f.vmConfigBytes = buffer.NewIoBufferBytes(b) +// +// return f.vmConfigBytes +//} +// +//func (f *FilterConfigFactory) GetPluginConfig() common.IoBuffer { +// if f.pluginConfigBytes != nil { +// return f.pluginConfigBytes +// } +// +// b := proxywasm.EncodeMap(f.config.UserData) +// if b == nil { +// return nil +// } +// +// f.pluginConfigBytes = buffer.NewIoBufferBytes(b) +// +// return f.pluginConfigBytes +//} func (f *FilterConfigFactory) OnConfigUpdate(config v2.WasmPluginConfig) { - f.config.InstanceNum = config.InstanceNum - f.config.VmConfig = config.VmConfig + // TODO: update the correct wasm + //f.config.InstanceNum = config.InstanceNum + //f.config.VmConfig = config.VmConfig } func (f *FilterConfigFactory) OnPluginStart(plugin types.WasmPlugin) { @@ -167,7 +180,7 @@ func (f *FilterConfigFactory) OnPluginStart(plugin types.WasmPlugin) { instance.Lock(a) defer instance.Unlock() - err := exports.ProxyOnContextCreate(f.config.RootContextID, 0) + err := exports.ProxyOnContextCreate(f.RootContextID, 0) if err != nil { log.DefaultLogger.Errorf("[proxywasm][factory] OnPluginStart fail to create root context id, err: %v", err) return true @@ -178,7 +191,7 @@ func (f *FilterConfigFactory) OnPluginStart(plugin types.WasmPlugin) { vmConfigSize = vmConfigBytes.Len() } - _, err = exports.ProxyOnVmStart(f.config.RootContextID, int32(vmConfigSize)) + _, err = exports.ProxyOnVmStart(f.RootContextID, int32(vmConfigSize)) if err != nil { log.DefaultLogger.Errorf("[proxywasm][factory] OnPluginStart fail to create root context id, err: %v", err) return true @@ -189,7 +202,7 @@ func (f *FilterConfigFactory) OnPluginStart(plugin types.WasmPlugin) { pluginConfigSize = pluginConfigBytes.Len() } - _, err = exports.ProxyOnConfigure(f.config.RootContextID, int32(pluginConfigSize)) + _, err = exports.ProxyOnConfigure(f.RootContextID, int32(pluginConfigSize)) if err != nil { log.DefaultLogger.Errorf("[proxywasm][factory] OnPluginStart fail to create root context id, err: %v", err) return true diff --git a/pkg/wasm/filter.go b/pkg/wasm/filter.go index 896c47d2fb..54c2ec4eef 100644 --- a/pkg/wasm/filter.go +++ b/pkg/wasm/filter.go @@ -39,14 +39,8 @@ type Filter struct { factory *FilterConfigFactory - pluginName string - plugin types.WasmPlugin - instance types.WasmInstance - abi types.ABI - exports proxywasm.Exports - - rootContextID int32 - contextID int32 + router Router + plugins []*WasmPlugin receiverFilterHandler api.StreamReceiverFilterHandler senderFilterHandler api.StreamSenderFilterHandler @@ -56,6 +50,17 @@ type Filter struct { buffer api.IoBuffer } +type WasmPlugin struct { + pluginName string // 单个wasm文件的name + plugin types.WasmPlugin // 单个wasm文件,包括多个instance + instance types.WasmInstance // 一个instance + abi types.ABI // 单个wasm文件对应的abi + exports proxywasm.Exports // 单个wasm文件导出的方法 + + rootContextID int32 + contextID int32 +} + var contextIDGenerator int32 func newContextID(rootContextID int32) int32 { @@ -67,76 +72,114 @@ func newContextID(rootContextID int32) int32 { } } -func NewFilter(ctx context.Context, pluginName string, rootContextID int32, factory *FilterConfigFactory) *Filter { - pluginWrapper := wasm.GetWasmManager().GetWasmPluginWrapperByName(pluginName) - if pluginWrapper == nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter wasm plugin not exists, plugin name: %v", pluginName) - return nil +func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { + filter := &Filter{ + ctx: ctx, + factory: factory, + buffer: buffer.NewIoBuffer(100), } - plugin := pluginWrapper.GetPlugin() - instance := plugin.GetInstance() + configs := factory.config + plugins := make([]*WasmPlugin, 0, len(configs)) + for _, pluginConfig := range configs { + pluginWrapper := wasm.GetWasmManager().GetWasmPluginWrapperByName(pluginConfig.PluginName) + if pluginWrapper == nil { + log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter wasm plugin not exists, plugin name: %v", pluginConfig.PluginName) + return nil + } - filter := &Filter{ - ctx: ctx, - factory: factory, - pluginName: pluginName, - plugin: plugin, - instance: instance, - rootContextID: rootContextID, - contextID: newContextID(rootContextID), - buffer: buffer.NewIoBuffer(100), - } + plugin := pluginWrapper.GetPlugin() + instance := plugin.GetInstance() - filter.LayottoHandler.Instance = instance + pluginABI := abi.GetABI(instance, AbiV2) + if pluginABI == nil { + log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter abi not found in instance") + plugin.ReleaseInstance(instance) + return nil + } - filter.abi = abi.GetABI(instance, AbiV2) - if filter.abi == nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter abi not found in instance") - plugin.ReleaseInstance(instance) + // TODO: 确定这里做了什么事,调用顺序有影响吗 + pluginABI.SetABIImports(filter) - return nil - } + exports := pluginABI.GetABIExports().(proxywasm.Exports) + if exports == nil { + log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to get exports part from abi") + plugin.ReleaseInstance(instance) - filter.abi.SetABIImports(filter) + return nil + } - filter.exports = filter.abi.GetABIExports().(proxywasm.Exports) - if filter.exports == nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to get exports part from abi") - plugin.ReleaseInstance(instance) + contextID := newContextID(pluginConfig.RootContextID) - return nil - } + err := exports.ProxyOnContextCreate(contextID, pluginConfig.RootContextID) + if err != nil { + log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to create context id: %v, rootContextID: %v, err: %v", + contextID, pluginConfig.RootContextID, err) + return nil + } - filter.instance.Lock(filter.abi) - defer filter.instance.Unlock() + instance.Lock(pluginABI) + defer instance.Unlock() + + wasmPlugin := &WasmPlugin{ + pluginName: pluginConfig.PluginName, + plugin: plugin, + instance: instance, + abi: pluginABI, + exports: exports, + rootContextID: pluginConfig.RootContextID, + contextID: contextID, + } + plugins = append(plugins, wasmPlugin) - err := filter.exports.ProxyOnContextCreate(filter.contextID, filter.rootContextID) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to create context id: %v, rootContextID: %v, err: %v", - filter.contextID, filter.rootContextID, err) - return nil + // TODO: 获取id,注册路由 + { + exports := pluginABI.GetABIExports().(Exports) + if exports == nil { + log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to get exports part from abi") + plugin.ReleaseInstance(instance) + + return nil + } + + contextID := newContextID(pluginConfig.RootContextID) + + id, err := exports.ProxyGetID() + if err != nil { + log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to create context id: %v, rootContextID: %v, err: %v", + contextID, pluginConfig.RootContextID, err) + return nil + } + + RegisterRoute(id, wasmPlugin) + } } + filter.plugins = plugins + + // TODO: 确定这个的作用 + //filter.LayottoHandler.Instance = instance return filter } func (f *Filter) OnDestroy() { f.destroyOnce.Do(func() { - f.instance.Lock(f.abi) + for _, plugin := range f.plugins { + plugin.instance.Lock(plugin.abi) - _, err := f.exports.ProxyOnDone(f.contextID) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][filter] OnDestroy fail to call ProxyOnDone, err: %v", err) - } + _, err := plugin.exports.ProxyOnDone(plugin.contextID) + if err != nil { + log.DefaultLogger.Errorf("[proxywasm][filter] OnDestroy fail to call ProxyOnDone, err: %v", err) + } - err = f.exports.ProxyOnDelete(f.contextID) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][filter] OnDestroy fail to call ProxyOnDelete, err: %v", err) - } + err = plugin.exports.ProxyOnDelete(plugin.contextID) + if err != nil { + log.DefaultLogger.Errorf("[proxywasm][filter] OnDestroy fail to call ProxyOnDelete, err: %v", err) + } - f.instance.Unlock() - f.plugin.ReleaseInstance(f.instance) + plugin.instance.Unlock() + plugin.plugin.ReleaseInstance(plugin.instance) + } }) } @@ -162,15 +205,28 @@ func headerMapSize(headers api.HeaderMap) int { } func (f *Filter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffer.IoBuffer, trailers api.HeaderMap) api.StreamFilterStatus { - f.instance.Lock(f.abi) - defer f.instance.Unlock() + // TODO: should diapatch by header + id, ok := headers.Get("id") + if !ok { + log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestHeaders no id in headers") + return api.StreamFilterStop + } + + plugin, err := GetRandomPluginByID(id) + if err != nil { + log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestHeaders id, err: %v", err) + return api.StreamFilterStop + } + + plugin.instance.Lock(plugin.abi) + defer plugin.instance.Unlock() endOfStream := 1 if (buf != nil && buf.Len() > 0) || trailers != nil { endOfStream = 0 } - action, err := f.exports.ProxyOnRequestHeaders(f.contextID, int32(headerMapSize(headers)), int32(endOfStream)) + action, err := plugin.exports.ProxyOnRequestHeaders(plugin.contextID, int32(headerMapSize(headers)), int32(endOfStream)) if err != nil || action != proxywasm.ActionContinue { log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestHeaders err: %v", err) return api.StreamFilterStop @@ -182,7 +238,7 @@ func (f *Filter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffe } if buf != nil && buf.Len() > 0 { - action, err = f.exports.ProxyOnRequestBody(f.contextID, int32(buf.Len()), int32(endOfStream)) + action, err = plugin.exports.ProxyOnRequestBody(plugin.contextID, int32(buf.Len()), int32(endOfStream)) if err != nil || action != proxywasm.ActionContinue { log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestBody err: %v", err) return api.StreamFilterStop @@ -190,7 +246,7 @@ func (f *Filter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffe } if trailers != nil { - action, err = f.exports.ProxyOnRequestTrailers(f.contextID, int32(headerMapSize(trailers))) + action, err = plugin.exports.ProxyOnRequestTrailers(plugin.contextID, int32(headerMapSize(trailers))) if err != nil || action != proxywasm.ActionContinue { log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestTrailers err: %v", err) return api.StreamFilterStop @@ -205,14 +261,17 @@ func (f *Filter) Append(ctx context.Context, headers api.HeaderMap, buf buffer.I return api.StreamFilterContinue } +// TODO: get the plugin content ID corresponding to the caller wasm plugin func (f *Filter) GetRootContextID() int32 { - return f.rootContextID + return f.factory.RootContextID } +// TODO: get the plugin vm config corresponding to the caller wasm plugin func (f *Filter) GetVmConfig() common.IoBuffer { return f.factory.GetVmConfig() } +// TODO: get the plugin config corresponding to the caller wasm plugin func (f *Filter) GetPluginConfig() common.IoBuffer { return f.factory.GetPluginConfig() } diff --git a/pkg/wasm/proxywasm/abi.go b/pkg/wasm/proxywasm/abi.go new file mode 100644 index 0000000000..c4528bdedf --- /dev/null +++ b/pkg/wasm/proxywasm/abi.go @@ -0,0 +1,13 @@ +package proxywasm + +import "github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm/types" + +//export proxy_id +func proxyID(contextID uint32) types.Action { + //ctx, ok := currentState.httpStreams[contextID] + //if !ok { + // panic("invalid context on proxy_id") + //} + //currentState.setActiveContextID(contextID) + //return ctx.OnHttpRequestBody(bodySize, endOfStream) +} diff --git a/pkg/wasm/watcher.go b/pkg/wasm/watcher.go index a476150bf9..00185647f8 100644 --- a/pkg/wasm/watcher.go +++ b/pkg/wasm/watcher.go @@ -14,7 +14,7 @@ import ( var ( watcher *fsnotify.Watcher - configs = make(map[string]*filterConfig) + configs = make(map[string]*filterConfigItem) pluginNames = make(map[string]string) ) @@ -66,7 +66,7 @@ func runWatcher() { } } -func addWatchFile(cfg *filterConfig, pluginName string) { +func addWatchFile(cfg *filterConfigItem, pluginName string) { path := cfg.VmConfig.Path if err := watcher.Add(path); err != nil { log.DefaultLogger.Errorf("[proxywasm] [watcher] addWatchFile fail to watch wasm file, err: %v", err) From 1dc94b56126a2df039dc36246d1aed1e3bdb8188 Mon Sep 17 00:00:00 2001 From: zu1k Date: Fri, 13 Aug 2021 23:43:38 +0800 Subject: [PATCH 02/25] expand Exports --- demo/go.mod | 1 + demo/go.sum | 5 +- demo/wasm/code/golang/wasm.go | 2 +- go.mod | 1 - pkg/wasm/abi.go | 4 +- pkg/wasm/exports.go | 5 + pkg/wasm/factory.go | 6 +- pkg/wasm/filter.go | 27 +--- pkg/wasm/proxywasm/abi.go | 13 -- pkg/wasm/watcher.go | 290 +++++++++++++++++----------------- 10 files changed, 167 insertions(+), 187 deletions(-) delete mode 100644 pkg/wasm/proxywasm/abi.go diff --git a/demo/go.mod b/demo/go.mod index bf0fce75c2..113526a0df 100644 --- a/demo/go.mod +++ b/demo/go.mod @@ -10,6 +10,7 @@ require ( google.golang.org/protobuf v1.26.0-rc.1 mosn.io/layotto/sdk/go-sdk v0.0.0-20210604030858-e880c02bcf44 mosn.io/layotto/spec v0.0.0-20210707123820-584778d048d3 + mosn.io/proxy-wasm-go-host v0.1.0 ) replace ( diff --git a/demo/go.sum b/demo/go.sum index f5e5a2234a..bcacce7b9d 100644 --- a/demo/go.sum +++ b/demo/go.sum @@ -43,6 +43,7 @@ github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5Cc github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tetratelabs/proxy-wasm-go-sdk v0.1.2-0.20210520063156-d39281baed90 h1:Ze9Uyy8LL0+mcF4UWFKoL2mx3MzptgxeG9nJqSZiK8E= github.com/tetratelabs/proxy-wasm-go-sdk v0.1.2-0.20210520063156-d39281baed90/go.mod h1:qZ+4i6e2wHlhnhgpH0VG4QFzqd2BEvQbQFU0npt2e2k= +github.com/wasmerio/wasmer-go v1.0.3/go.mod h1:0gzVdSfg6pysA6QVp6iVRPTagC6Wq9pOE8J86WKb2Fk= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -98,5 +99,5 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -mosn.io/layotto/spec v0.0.0-20210707123820-584778d048d3 h1:8GbrNw6AOi4+DrQGG5TbxMNPPRQJ0uXjkSCP2qeKc08= -mosn.io/layotto/spec v0.0.0-20210707123820-584778d048d3/go.mod h1:ex31WL9Vx1PadpZmN4CZpw/57xzBeKIwqMI5fYXi7RY= +mosn.io/proxy-wasm-go-host v0.1.0 h1:WtXMiOpuDyx3Vruf/BUAiu4bo30rSPx68E5vxEBTT6g= +mosn.io/proxy-wasm-go-host v0.1.0/go.mod h1:wBRY9Xjf77GZhvAuEc6nQXZ6dQK39kNU2ok/+Z8mSU8= diff --git a/demo/wasm/code/golang/wasm.go b/demo/wasm/code/golang/wasm.go index 6d5806f452..769bb8242f 100644 --- a/demo/wasm/code/golang/wasm.go +++ b/demo/wasm/code/golang/wasm.go @@ -71,7 +71,7 @@ func proxyOnMemoryAllocate(size uint) *byte { return &buf[0] } -//export ID +//export proxy_get_id func ID() string { return "id_1" } diff --git a/go.mod b/go.mod index 8077a7e237..decc704a05 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.14 require ( github.com/dapr/components-contrib v1.2.0 github.com/dapr/kit v0.0.1 - github.com/fsnotify/fsnotify v1.4.9 github.com/gammazero/workerpool v1.1.2 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 diff --git a/pkg/wasm/abi.go b/pkg/wasm/abi.go index 00fb4e545e..546dca9068 100644 --- a/pkg/wasm/abi.go +++ b/pkg/wasm/abi.go @@ -39,6 +39,8 @@ type AbiV2Impl struct { v1.ABIContext } +var _ types.ABIHandler = &AbiV2Impl{} + func (a *AbiV2Impl) Name() string { return AbiV2 } @@ -48,7 +50,7 @@ func (a *AbiV2Impl) GetABIExports() interface{} { } func (a *AbiV2Impl) ProxyGetID() (string, error) { - ff, err := a.Instance.GetExportsFunc("proxy_id") + ff, err := a.Instance.GetExportsFunc("proxy_get_id") if err != nil { return "", err } diff --git a/pkg/wasm/exports.go b/pkg/wasm/exports.go index 5fafbe619f..b5f4e552e3 100644 --- a/pkg/wasm/exports.go +++ b/pkg/wasm/exports.go @@ -1,5 +1,10 @@ package wasm +import "mosn.io/proxy-wasm-go-host/proxywasm" + type Exports interface { + proxywasm.Exports + + // ProxyGetID return the id ProxyGetID() (string, error) } diff --git a/pkg/wasm/factory.go b/pkg/wasm/factory.go index dd4069fc8b..f48233c030 100644 --- a/pkg/wasm/factory.go +++ b/pkg/wasm/factory.go @@ -86,7 +86,8 @@ func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilte log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to add plugin, err: %v", err) return nil, err } - addWatchFile(config, pluginName) + // TODO: watch file for reload + //addWatchFile(config, pluginName) } else { pluginName = config.FromWasmPlugin } @@ -100,9 +101,6 @@ func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilte config.VmConfig = pw.GetConfig().VmConfig pw.RegisterPluginHandler(factory) - - // TODO: register route - } return factory, nil diff --git a/pkg/wasm/filter.go b/pkg/wasm/filter.go index 54c2ec4eef..5c676979b9 100644 --- a/pkg/wasm/filter.go +++ b/pkg/wasm/filter.go @@ -101,7 +101,7 @@ func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { // TODO: 确定这里做了什么事,调用顺序有影响吗 pluginABI.SetABIImports(filter) - exports := pluginABI.GetABIExports().(proxywasm.Exports) + exports := pluginABI.GetABIExports().(Exports) if exports == nil { log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to get exports part from abi") plugin.ReleaseInstance(instance) @@ -133,26 +133,13 @@ func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { plugins = append(plugins, wasmPlugin) // TODO: 获取id,注册路由 - { - exports := pluginABI.GetABIExports().(Exports) - if exports == nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to get exports part from abi") - plugin.ReleaseInstance(instance) - - return nil - } - - contextID := newContextID(pluginConfig.RootContextID) - - id, err := exports.ProxyGetID() - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to create context id: %v, rootContextID: %v, err: %v", - contextID, pluginConfig.RootContextID, err) - return nil - } - - RegisterRoute(id, wasmPlugin) + id, err := exports.ProxyGetID() + if err != nil { + log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to create context id: %v, rootContextID: %v, err: %v", + contextID, pluginConfig.RootContextID, err) + return nil } + RegisterRoute(id, wasmPlugin) } filter.plugins = plugins diff --git a/pkg/wasm/proxywasm/abi.go b/pkg/wasm/proxywasm/abi.go deleted file mode 100644 index c4528bdedf..0000000000 --- a/pkg/wasm/proxywasm/abi.go +++ /dev/null @@ -1,13 +0,0 @@ -package proxywasm - -import "github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm/types" - -//export proxy_id -func proxyID(contextID uint32) types.Action { - //ctx, ok := currentState.httpStreams[contextID] - //if !ok { - // panic("invalid context on proxy_id") - //} - //currentState.setActiveContextID(contextID) - //return ctx.OnHttpRequestBody(bodySize, endOfStream) -} diff --git a/pkg/wasm/watcher.go b/pkg/wasm/watcher.go index 00185647f8..86069fa58a 100644 --- a/pkg/wasm/watcher.go +++ b/pkg/wasm/watcher.go @@ -1,147 +1,147 @@ package wasm -import ( - "os" - "path/filepath" - "strings" - - v2 "mosn.io/mosn/pkg/config/v2" - "mosn.io/mosn/pkg/log" - "mosn.io/mosn/pkg/wasm" - - "github.com/fsnotify/fsnotify" -) - -var ( - watcher *fsnotify.Watcher - configs = make(map[string]*filterConfigItem) - pluginNames = make(map[string]string) -) - -func init() { - var err error - watcher, err = fsnotify.NewWatcher() - if err != nil { - log.DefaultLogger.Errorf("[proxywasm] [watcher] init fail to create watcher: %v", err) - return - } - go runWatcher() -} - -func runWatcher() { - for { - select { - case event, ok := <-watcher.Events: - if !ok { - log.DefaultLogger.Errorf("[proxywasm] [watcher] runWatcher exit") - return - } - log.DefaultLogger.Debugf("[proxywasm] [watcher] runWatcher got event, %s", event) - - if pathIsWasmFile(event.Name) { - if event.Op&fsnotify.Chmod == fsnotify.Chmod || - event.Op&fsnotify.Rename == fsnotify.Rename { - continue - } else if event.Op&fsnotify.Remove == fsnotify.Remove { - // rewatch the file if it exists - // remove this file then nename other file to this name will cause this case - if fileExist(event.Name) { - _ = watcher.Add(event.Name) - } - continue - } else if event.Op&fsnotify.Create == fsnotify.Create { - if fileExist(event.Name) { - _ = watcher.Add(event.Name) - } - } - reloadWasm(event.Name) - } - case err, ok := <-watcher.Errors: - if !ok { - log.DefaultLogger.Errorf("[proxywasm] [watcher] runWatcher exit") - return - } - log.DefaultLogger.Errorf("[proxywasm] [watcher] runWatcher got errors, err: %v", err) - } - } -} - -func addWatchFile(cfg *filterConfigItem, pluginName string) { - path := cfg.VmConfig.Path - if err := watcher.Add(path); err != nil { - log.DefaultLogger.Errorf("[proxywasm] [watcher] addWatchFile fail to watch wasm file, err: %v", err) - return - } - - dir := filepath.Dir(path) - if err := watcher.Add(dir); err != nil { - log.DefaultLogger.Errorf("[proxywasm] [watcher] addWatchFile fail to watch wasm dir, err: %v", err) - return - } - - configs[path] = cfg - pluginNames[path] = pluginName - log.DefaultLogger.Infof("[proxywasm] [watcher] addWatchFile start to watch wasm file and its dir: %s", path) -} - -func reloadWasm(fullPath string) { - found := false - - for path, config := range configs { - if strings.HasSuffix(fullPath, path) { - found = true - pluginName := pluginNames[path] - - err := wasm.GetWasmManager().UninstallWasmPluginByName(pluginName) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm fail to uninstall plugin, err: %v", err) - } - - v2Config := v2.WasmPluginConfig{ - PluginName: pluginName, - VmConfig: config.VmConfig, - InstanceNum: config.InstanceNum, - } - err = wasm.GetWasmManager().AddOrUpdateWasm(v2Config) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm fail to add plugin, err: %v", err) - return - } - - pw := wasm.GetWasmManager().GetWasmPluginWrapperByName(pluginName) - if pw == nil { - log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm plugin not found") - return - } - - factory := &FilterConfigFactory{ - pluginName: pluginName, - config: config, - } - pw.RegisterPluginHandler(factory) - - log.DefaultLogger.Infof("[proxywasm] [watcher] reloadWasm reload wasm success: %s", path) - } - } - - if !found { - log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm WasmPluginConfig not found: %s", fullPath) - } -} - -func fileExist(file string) bool { - _, err := os.Stat(file) - if err != nil && !os.IsExist(err) { - return false - } - return true -} - -func pathIsWasmFile(fullPath string) bool { - for path, _ := range configs { - if strings.HasSuffix(fullPath, path) { - return true - } - } - return false -} +//import ( +// "os" +// "path/filepath" +// "strings" +// +// v2 "mosn.io/mosn/pkg/config/v2" +// "mosn.io/mosn/pkg/log" +// "mosn.io/mosn/pkg/wasm" +// +// "github.com/fsnotify/fsnotify" +//) +// +//var ( +// watcher *fsnotify.Watcher +// configs = make(map[string]*filterConfigItem) +// pluginNames = make(map[string]string) +//) +// +//func init() { +// var err error +// watcher, err = fsnotify.NewWatcher() +// if err != nil { +// log.DefaultLogger.Errorf("[proxywasm] [watcher] init fail to create watcher: %v", err) +// return +// } +// go runWatcher() +//} +// +//func runWatcher() { +// for { +// select { +// case event, ok := <-watcher.Events: +// if !ok { +// log.DefaultLogger.Errorf("[proxywasm] [watcher] runWatcher exit") +// return +// } +// log.DefaultLogger.Debugf("[proxywasm] [watcher] runWatcher got event, %s", event) +// +// if pathIsWasmFile(event.Name) { +// if event.Op&fsnotify.Chmod == fsnotify.Chmod || +// event.Op&fsnotify.Rename == fsnotify.Rename { +// continue +// } else if event.Op&fsnotify.Remove == fsnotify.Remove { +// // rewatch the file if it exists +// // remove this file then nename other file to this name will cause this case +// if fileExist(event.Name) { +// _ = watcher.Add(event.Name) +// } +// continue +// } else if event.Op&fsnotify.Create == fsnotify.Create { +// if fileExist(event.Name) { +// _ = watcher.Add(event.Name) +// } +// } +// reloadWasm(event.Name) +// } +// case err, ok := <-watcher.Errors: +// if !ok { +// log.DefaultLogger.Errorf("[proxywasm] [watcher] runWatcher exit") +// return +// } +// log.DefaultLogger.Errorf("[proxywasm] [watcher] runWatcher got errors, err: %v", err) +// } +// } +//} +// +//func addWatchFile(cfg *filterConfigItem, pluginName string) { +// path := cfg.VmConfig.Path +// if err := watcher.Add(path); err != nil { +// log.DefaultLogger.Errorf("[proxywasm] [watcher] addWatchFile fail to watch wasm file, err: %v", err) +// return +// } +// +// dir := filepath.Dir(path) +// if err := watcher.Add(dir); err != nil { +// log.DefaultLogger.Errorf("[proxywasm] [watcher] addWatchFile fail to watch wasm dir, err: %v", err) +// return +// } +// +// configs[path] = cfg +// pluginNames[path] = pluginName +// log.DefaultLogger.Infof("[proxywasm] [watcher] addWatchFile start to watch wasm file and its dir: %s", path) +//} +// +//func reloadWasm(fullPath string) { +// found := false +// +// for path, config := range configs { +// if strings.HasSuffix(fullPath, path) { +// found = true +// pluginName := pluginNames[path] +// +// err := wasm.GetWasmManager().UninstallWasmPluginByName(pluginName) +// if err != nil { +// log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm fail to uninstall plugin, err: %v", err) +// } +// +// v2Config := v2.WasmPluginConfig{ +// PluginName: pluginName, +// VmConfig: config.VmConfig, +// InstanceNum: config.InstanceNum, +// } +// err = wasm.GetWasmManager().AddOrUpdateWasm(v2Config) +// if err != nil { +// log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm fail to add plugin, err: %v", err) +// return +// } +// +// pw := wasm.GetWasmManager().GetWasmPluginWrapperByName(pluginName) +// if pw == nil { +// log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm plugin not found") +// return +// } +// +// factory := &FilterConfigFactory{ +// pluginName: pluginName, +// config: config, +// } +// pw.RegisterPluginHandler(factory) +// +// log.DefaultLogger.Infof("[proxywasm] [watcher] reloadWasm reload wasm success: %s", path) +// } +// } +// +// if !found { +// log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm WasmPluginConfig not found: %s", fullPath) +// } +//} +// +//func fileExist(file string) bool { +// _, err := os.Stat(file) +// if err != nil && !os.IsExist(err) { +// return false +// } +// return true +//} +// +//func pathIsWasmFile(fullPath string) bool { +// for path, _ := range configs { +// if strings.HasSuffix(fullPath, path) { +// return true +// } +// } +// return false +//} From 9c9c7c484a85a992ff27065576ce8bbeb262642c Mon Sep 17 00:00:00 2001 From: zu1k Date: Sat, 14 Aug 2021 01:00:49 +0800 Subject: [PATCH 03/25] try to export func ID --- demo/wasm/code/golang/wasm.go | 2 +- .../code/golang/{wasm.wasm => wasm_1_1.wasm} | Bin 256122 -> 256374 bytes demo/wasm/code/golang/wasm_1_2.wasm | Bin 0 -> 256374 bytes demo/wasm/code/golang/wasm_2.wasm | Bin 0 -> 256374 bytes demo/wasm/config.json | 10 +++++----- pkg/wasm/abi.go | 12 ++++++++++-- pkg/wasm/factory.go | 2 ++ 7 files changed, 18 insertions(+), 8 deletions(-) rename demo/wasm/code/golang/{wasm.wasm => wasm_1_1.wasm} (58%) mode change 100755 => 100644 create mode 100644 demo/wasm/code/golang/wasm_1_2.wasm create mode 100644 demo/wasm/code/golang/wasm_2.wasm diff --git a/demo/wasm/code/golang/wasm.go b/demo/wasm/code/golang/wasm.go index 769bb8242f..c3d1c7ce1d 100644 --- a/demo/wasm/code/golang/wasm.go +++ b/demo/wasm/code/golang/wasm.go @@ -56,7 +56,7 @@ func (ctx *myHttpContext) OnHttpRequestHeaders(numHeaders int, endOfStream bool) } } - result, err := proxywasm.CallForeignFunction("SayHello", []byte(`{"service_name":"helloworld","name":"`+name+`"}`)) + result, err := proxywasm.CallForeignFunction("SayHello", []byte(`{"service_name":"helloworld","name":"`+name+`_1_2"}`)) if err != nil { proxywasm.LogErrorf("call foreign func failed: %v", err) } diff --git a/demo/wasm/code/golang/wasm.wasm b/demo/wasm/code/golang/wasm_1_1.wasm old mode 100755 new mode 100644 similarity index 58% rename from demo/wasm/code/golang/wasm.wasm rename to demo/wasm/code/golang/wasm_1_1.wasm index 378d0f250cd88c029fca4f5a8f4192760473273f..b4ba57ba49e64d4879d84bd3041b0f850198eaf3 GIT binary patch delta 50217 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 delta 49917 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 diff --git a/demo/wasm/code/golang/wasm_1_2.wasm b/demo/wasm/code/golang/wasm_1_2.wasm new file mode 100644 index 0000000000000000000000000000000000000000..8d710d224b07c069de5532dbf8c441637ed62648 GIT binary patch literal 256374 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

p% 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°u{r(iPh7*I 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

u$#;{wl(=z;2eDI872>4uFOur9=39^bEXjE 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�m54w$;aCjvcs#7`(z0NKM7bzBca@Yo^B)54Q>D>y)6-Z4{!z&$yuht~#4X-C$OkS&g|n zG|y4p_UYHU^bOxjzuKj5{9gJhm;U1S(ywsoFMlunGME19_tGyRUHjxFfXgJ*dx>>3 zv#@ipa}gL(YX`&G_Ca6V5KkD&pG5bgeJF z>PHV-Y~LzdPzx_sXTfk=!L&}W1u$TzYgq8_GTyh1aQs0Pjm`(LrH$SEhzorth{<(Zo7WBbguKW7d9EQ;aJB7xER*-Cd@@9nTwQN6teF{Ld6h1ZstrJV72Nl4fp1y99-KigpSh2H7cd19hUL z`wwfuTwh(v13F>3d=b%$#R;ifX>@)CRAVuEufg?r^Q0`I+aC3HEF!`-v|!{s-aF`i z<$ZlmPB7!2&!>}8DT64~@fmi5VMOFsGrxM=*V#%||DPv@SK(c_`m>(8KAG zby~N;!kgb?TCF$g--|Ac5!}}{0-7GH%I`+Mm1X3Pog)XfyXiiY*2GLeZ2Va6#~s?S zy@sjN31D}OoqU;NnwsU>2Bm9reGav z_~1$@klZPf2UU%9O|IlazGNdYy8Uoe@(xOZ7>}srBd(-*EG<2$b2^sne6>%P-1YH- zCY+;Ar{3<#LSm)3uAh!Ngh%41;|I>BH3K0IViiM5LvRaCEltslZ)pkQv@~$|`L$w1 z@O%!B(QAoxOwdwn2YDzvau~Gvng&=*$CFD~`;}Lkoh2~6&oh*k#@Pox_JcUjL+UL? z2ryO!O(?i{riQB+UPsOzJx`P#T@x@B&43qVxt7WcSl3zg<~iQd|JADh8Qy{kw;}%q zyiGu*Foie?<0i%v(48mf9ocUWSd@#UZ-D5d#zy`3ZzpNKO&3`t=aU`3tCUU=;au}3 zrRd!S5?9~wy}K~#-4N3f%w=OQ6O)qS<(rs_E&;^fa7f^A}!XJ08N=y>{hP1o99h>xf3p3`37VGHstu zGFW2s#cLo`w$cKFKbK^>^ma`Kcy&6z07G081YImdE!MRrJg{P%0lEXC4#y&nq6>yF zj)sxs$lrQ_evv8@(*c+t)2W(UD9uzpA>G$aWTYoedcFf_cG06J6&;vWT?XK0b)!7o zf}o_kg?d8}<@_3!?%BEjW z+#Rtw+fVJg^nw0sqKnB+eayCy05?le^Il%lsr%yWO!uH_rt1$%n`M&yt|fv@FHWqJ zW8XThu!fDKv4-~mz6tyb(Aadm)&^T_N3qyY4EbvLy(MH)b+dz;)Jx*%39^Izijq@o zH>mncwAH~}P8GRWgG(&l!yQCpCflN5c(Dz4vPHXU;$8sPSyy*D^HxDvVIHQ#U?BE6 zEd-9u(54iE>p|$Q8Wi@65Lu%EeN|unb_LGN*d%6(xEyO+>`=_$6&71I(nCpwg8|d@ zp4Uq*_W*le6L=QOla=-z%TrpK4yfJf({beJg-svpRE5Pmy&KE`TXl)$C>+L3B#Rh% zT)$5YN|R$DA&^OU0vXq*z%n~u0gfs{TCyu_?tHRPZ42k50RM6hToy6&xI$t8VtS#R zp!P+gj4jaNZae}nUzg5H4HYJD=FL#ZE5<(+5`l#_;jQO(r1eB;>{4ELb@Gtu%6eE} zJN!WnH(|d4AJ(#oLQVT#V>=wBWbM%|8Exfw*K3YTY3p{z?z=_g?_U7!La6RzE1|?a z5OMao`}OK>8I_ov2idqf&`Ws94l2He;jmRcq&%3CQV?at^Pk^J>vlbF8o@d0rZKjsRwb^-kfdi&^byBD6rRXA@aHniW#$h0 zNVZ2b(B!R1X+M~Q%n{8xdC(}_NyxqaTJ0Wp{c*G5f;}tE$ zotMCR4_tZDGpmn!&m|dfh&{tz(i=@aq^Kh&LZrtJI78fr19{Rnr_8lrwW~j+`m0ch z(4~5RG)vvqeLe-YcQ(t7sq8N8elzQceTbz4!F5IftZER}gbtE---WSvz<-BL>hkI` zAjg;*;w7YJ!wb{O>S|s+hq%(=?<{v6-ZFDYzE0;lpCvixOgLlY6ITBQ<$_1(RA#P5 zaw8{aLv3Myo86mijHJw5Njk*fMI&QHE_6b|bc$Dd2OYHzH3r>9RA7s;&4)&={bK3Q zpn;uWNH{seT%20n>KF$(Oq_y<%1nM|lFe|K)toA$$?PiISq#7;9Id*L;yn3nxHtKb z?x3ol;&G4zH)~m{qVcCtzf#$h5k`dWV__$%A#5L;Mp(SGP$x2>E0P?U_(~SteqnHF zTy)|$h30r2z5_$I1=6< zp2FyeeaZ|V0-cJ$uOo!r*@gj+Gqpk@q||Uqkx#0dVSP?D!Qi<0#JiW&(IFj^ikXjS znL5s(m3)?Q0=nfDZ=K;Q^WC9^51Av#(K%$nbI5k~dRTzz;}gg2}VWk98x+ zu?KP-o#^LS$$Hzb%OGl8wY*6zW+ zT4tJEex`0UeRGNwj+wgCZ^8R?`C+V}H)ZBAz|DHO zgQ^)?Q&i+0I_{>H^VSZ7T;BTtEhxV>;qtEIlwB4PiO%cT|GpGwUX&*zO6%R0aO9?_33>e|&fx>ya7FxzbQCmC13VHFc8;i`is{^LF*-cHGI zj4e{9Tm;c%JwGFwy&94Oc@6*;y}OnjlHNVYSQ8FyoO?tqxnYXg0rxrh5#(Fnyl3{eG+qN7wNVWE~?O3&Cl`q!v$%p#(g6F za&=~C!E_Iu>(qxHeDWqL#t?TH%VKtsc}S1D zu@pFXNO^3zoh27gw7ZI;z&GV}4?^{wF%QOYgxZ#0sS!wgBBFPMYcb?l%pLC$D z$ht?BnZ`k)X}cniF%hZxLbZZya~sMj@aU0a-5S3=s~(yASk?@_Dz{~MWGB0>RCG>_ zkI3CF5&Wvi7JXt1K3QoyT?{fom$>#vT#vZs0fCRGGJu z|Jt8yA;JtCpqL?c@{L+=t0c0r;2u@vR{G}%QOX7v+XOm}5jKI2W2|EV8L2LfbSKI0 zz%y0eMWpEhN$0wWMuUxEyTuW4TWw!-Bo0D-+1ATc1410Gpxh5)Hb_*~!2qNH zok5PN61Z37J_seToA8xI0)EDGHmj>!)T=j43ti5_)y-khYV-f#=!seTSQ zvcO3|*8+DKtqq>5jnqKR z{$j3c_57Ubye^K47msFK{m65p(x3EsZj#LVgqpmS7Rd9c&vS?JH2FMtdfDpX8qFm5 z_JV`Nl?y2Oio8-UU7*tzaG_5jCD>17GLrVI947PKaaRz?=&Fv;4D0VwD@B*iIm%|y+(92@}iOOA@$$S;&6)vKhCH}gf z<(0bkf?}IZ14?{f=vhweQ>KA3U{SLxa}AtNE_=H#b(P147gXp<3c;3gEeo3*=n(}{F?cXDrxj6Tfxco~^Dbp{P>N4itV#JrH zS{7c_P|o2tXMxRfy2tBT#o)nnRF^eHqO#UI^`D>{559CFH%!e-;G@rf8Tp}(uTj0K zU9}MW{E|aL4%J?V(T<^~sn#iM^Z<9FoCxqL>y2_i!aMM|I%v^5vtfZ8?UKY{6YJ9j zu0;!gI;=3W#GO%zhocgAs>DT zL$Ag-(+i#-@CL+eQ`m#PXGvZ1ehpiLdr|i{gnCpOK;S&7x86eGz9+IEh9A2d98}C~ z;m8SOa)rumt|{X|g3e|rjS|avs)Zs!DjxJqZ{#BXuxCSYwAZ^w1KF(H&cj%k4Viq1 zzYYcIN`$4M)81$3nl^*pJ)G#YO0sxC&Lnq|`32N1tkbK|Wryz7$t6xw)bUYO2Q z;;6{U$eApm?}iZRZt?=GR!wM!i#89I+qt6_f!`gd80hq=_I z(S;`8&2JSj7wamlZMuF7y?7l`sR|b1_kc2_-gZoJxrVz%>`czv=@LVjgAeA{i2k5Vr6=3_H4#bI-g4=-1Q~*d!@kLKx!v*KlW#gC_7=2 z(^66*y>CjC&>Kn!7avG))GRU5hP&vPkL0k%`JgV@o}i{~h$yz!+=PDv-Dt+~0gSqa zIilnSD({9r5lX$Q=a;5C8tf!SsL)LFT`d%CB<8zX=)2m;fXdY8dLB}G5W5AN@h(m3 zYy*4}lko@0uo;QHAlLj6dq2*#yT*AYxtkg7+?u(g(CMwnd|)kxkNH*UZg8ShdG`eg zogmjKgl z_V{D0ZaR6Z<%k4ULh8+333p1pP?tNXmy}LhK#h6s(9UwDm_d+E^H-+ARG66{P6HxYXt`YoVt}LoRqGmV&=~KZ=WhAA-$K#v zo(JKAggi)Jd9{XDDY{|Nmt$W^`OAp7r4KzL_7!?Ze@`KAFR-Ljy`?1>853?`7nz5m z2OK(`w|SK9EB`e)T=Cb0>tTMt33*rnYBYyOkTZnj5K+Me-l(G%?rDqj4gv7<2u+7P|+}vUaZl z!Nq5S=q$zxUEoInF5z+R`KuW}T5@*-NZkn#*3PJLkO$kESx6oO*LkTC)2M}j0|tjZ4j4xUKm^yuxGqAw?Z@a6)lQ^UMjG%0PjU~>>(v8IzXoYzDF0n z!N@!)zG|gg*IcTDhujF*7Pd0TJO?f!YbLDBTfl|Z&YRmPuJdiWlZy`rb#%p_1NE+a z7rQ!@VAl$+4;;Y@j1Q!>>My7gGw05A7pAld@$xvXdfHszOgrx~5bj~K$$l^(bLlU` zX$*rA$X(?&YYjxBkaO5V=!8kD&!q^}R~4kUTW&->++gx)z8uhTBGj7KZ*s(?vN_6jKjUxHwYncRbA<; zdj5y1YM?5x_Zq6oHTaL}Vz(D#AV^0+8u^)SqJ0iZ3U$~LH`YRsLdUn=4WG}=1vi+w zo2hyLTR3FpaR3WlXz=iQmKf;0npkgPoOqqkJUtivzzyo!Q^G0G^*rGest^pg1%k?3 z9!oA@$1H}nZc#R%v_f#*43uc$Vh`8X=E}$6VmDWMW~E&fYOOP92-qdGEH0@p%z@r* z1~I$HK{^P7@rBNeO#<|nd4nJqhR~C4TEWyvNl5qa2}jt zeu%Ia24jE%_E7XcE&40x36DuHA@Pqkmpe)7CHw|h!B-H${g=h-yr>HVPxGSZtT7S7 zihPH>+Rx08%fVYr599t$=lvGVYfWU+ve`|Bqoh~@2DB1~fdtq3qWDPSr`AZ8Uc{J} zSZKzJ9-FTHXJ{XNKOJv2XORPVzDtT@ zWSh;|%JDXFxt`=Tn{&wlcD_l9TvIwWn)6Aamz$yapaYu((0N&1zDySsgKDoUvXZ?G z%KxmM8z8A^F5=ANv<-0!@^g4;ajd5V=v=d~iBG}NfUb!fZi`0n4-m0M;D^wukyyD6 zM%qpsL}k)(*h8L6PE0G;^raM6Bc_pbjn`4*)701rzQ}E?g&0PDqzY%E)n`^B71)Ky z9tc$kz6;=)*j5%ciRtFbFU{v!#JUj?|9KXdh=oFj3uRz>Uaz?qvrqzBy=+OF&}mU} zC898|UWeCaHZGU5@k>|%cyoo%WfV?tmVzv+g)s zaTh0sFl~ernV2%}xa80(cVL$A2NTh(?JX{O?$r3# z_yD@A(Ja!DK8RDGyBxMid)!qQQg=$Ov0V?)3DdkI@h1+tAV;~`)kkxjpT;`rTGuXU z(k||H=QUoz7#&-$!u|oWpYDa}kCD_F>m71O13+A3=p4k?;UL z!2UQ?5$+~*T1zgOz^O=i+mCagtwWq-`vio*o$K8C7?Iv&W;EM%fMYR#ud=^L*<(}oNN&Vt(D3fdq)wwGeOw7u7q16~!uvG@|Vl`&^HqlTgI7$Nx29<`mAz5R)5XJ ziBPU?vLj3LDQmSHtz^8`vlt-mkY+1i!ZT9bHov46v!v+%w|x45f!9(6(!>&PkNKt= z=S?C=Y^7XJ?R@Z0)+~_obB4kMFO$xUt*EdJWwkTL$c2XYA4#!q>UiB#osm1uPDIt2 zkH`p6K;<6YS-B2elzDqsK-nmqi0wD*&oiGQ6C6~w6CsPyN zH8|};SAD~8Vk#hZfe9vxcXCJ_GjFi>!6dCPEFP{>&2YV7A$RaNu!%knhKHpoU2QbD z-g3U$(vnUxv5VnHj)4NuT}w-re!3M%SCeOI#LrN?7|)q##EK3jsu4fqM|>Ucq7gq$ z3cb9{_xWW8$@nkFi3CP~Rez<<`sm{W(21+@8rq5eko_1o%{M7IOsV5YMIQ-8=Oh7u zkTVSb98`LQ=HC+b^1zM_bQ(0fLHx&4AgtrN+$N|m!9^?%`d825w0IWhO3&ixI2%K| z!m&6nIu_@OG>h}OSnG{?eZm6dC;I=j417zW#URu-9=-Uo1WSPUYyRZm#qbBvK;0T7 z8iwWqZ!gCmobUJpkaUrt@SSIeYCSuI>&b9s1I`<#`hfb%o*rAUdJ9K&`JM@)jhtBZq(1)HKIy1`u0qoG3rh>cBYxy6sLm$vl zSe)a<(S0Qr=WH=M!r@%>x!k2=J-nc^%rwNY9SDx!;ZUICcQ(QAU~O)DYgTxE=k18! zfg0%ZeU8a}yq(FtiOqu35pmz{q?X_|eN+GbeyNXrsnaP1&_5xD_LZ;lbfsVl#iaXqMwS#<=0K@F{rP12 ztAU=vaIA*YXpt>BRe~8EXq<+Pn=!YtDL{Pcy$ZFvTQDA=E?0}+I=LabWWnlgkC1o==h}NF()$Q}NxKb44buONgjsI$PGMe9j z7|xoyhCVvmRX=CDdPdST$v4tR*|MJS&R+7)r_AH@hL^XXLD0)b{ma{Ej+c-4m$yeR zn;0ys@h+^XY4a3R9;i#9jL8b;4YVEipwEN!-y?SOz6BXXRG-Z(;I>9gF2!8S!3xj9 zgCSUDV5QFykMbT=pH_8YJXra@Y@%mj?93HR_oTMpz@jCfdmS-wyW#zwIg@(hYT90OhN!~-zJBUfPot)63T!Cv}S z&d#7go~&1guo#dWVFzlt8=maS$XO~Wm+%|Kox4Kbqy2!C=rR)^i;(3n_o7}LKaG6Y+xMY%@O8a&0c>)UJ3j>@9t9a6eGg?OdTE@b=I=^#2 zEhkc<*SRb7AxO{3^p}Sca62dCYuVONEo@{5?E=fG4=M1)3~ZuYd{-PMyMS0=NSE*# zo4e5#1jD*8n=l(v72urU+%sPDeAvarXhw!--->rcMbFD=5Z}t?sFi-`HdsAybLqD5 zXFzSl)VwW9e{OYfMciF;@{X_j9JVMH*oVMEyoh)64v5R#cE5P*pnX39-nP{1e4|SLw<$<<#R1;_~ z=_05Hgg$52&4vTaL92+;EIX{_KDy4K$&)|sdfR!C?G}veY!kBc!|4y%W+2aJVnWY` zNEUJNnmCst*bjC~X!9Aop|8r6aGl=Cx-Jd6s$+@C#To?L zlCDr+3k1DVXd3-E-3IvW? z?zYk@Hy_av{O#%IQu>)PUu&1=*_|5t#&3yBh_M9ONLfte0wWfC_ug$#e%`QInmpj3 z3k3&iZ!+o=fYYwpunc)D9fWfHa!7sh3%}FaU##9pbUvJKn8wn^1M& zckoGc?&(wp1QM~;I(_m>OfYk@is|<53>&G5W*bPzq8aLv^QC!~zRF; z8vq$uSI{+48}1E#c$#6E!NDZdQE~R!?C%P3o zVsfQ#SzmL^c6-8QB(QW|BSG5vd=aCIeH#AX?P)7~+8Z2N*MKizNNi~O0$esDz(tdr zx^kr&IUjMAMZ86P!iCHi_^+?xS>_AohC7ITMRiEToNg{;jpeZAY2H5MO(9#aYgSp` zCjl^>E`aEyyc@^G8ue?iHbC@6shO^jYVZ|3U8*OJ0=fly7CoeGE_<}$YAoHf&nfyk zswA})aN*yAjPBG`hfr9z2^34GrIw}CqJCZK+kxRh8jyHn+=PiwDygV0s))GWq0*A7 ztDYssW_zKKP8V}vbz+Z2BHhAgy;xjOjwS36jN==`&Yg+Cy?+Ct2OYP0?Ep?-&MbDK zmwvYLk|n8=HI({-7#&}R98&W;WT>|?SZ_ozouGQ|; zhscYE>sigf;d%I_}UMI^^6UFEd%kee4+*&VqdsJI*v9m)>Zps%`iWZ?q17Lc*79wejqL)ev`Fc|~s%PtjmKW%Pz(tV7}_Zistdw7Oc;bDs9 zp6pz>GZrZDPz&4Uv|1ZLGy5-x-{?+Q`!U=_+40OvQo+EL_){b}-)KQgz~j^(eW);( zGRJ`IRnUeD>fqJffmd;0-N)-=kMQJu&3Jlk#^{KaG9SY7V6-c$>sSlm$9np&eHEMI zUU;AAsg`WN=i^WAcJ0Y!c7M}b^&+%ZSKy6Yq8fPCVj8UDMJzC=`+bg4hirTeL(P&# zf51^0G+$+A>B3g>(hGb$QE0e~thU;?K;H|%b}cjCvZ=FLGLG&tIZL!ve8aXu?&Da{ zNN8M_xnsti84jD9ZdTt}d@Lf7&i2CL%Bq4-V6zCqd2mV${4LK>oezh!9Yk84fzj*n~7uLd67N&Vx2jOB~5)ce(ZwzOplzv+I4yP;7`V#;S6 zxntw6OE{_RBj$-ka2~#lS&MAp6pwKr!be6PYX)t?c$@V*kPm4Roq^em=bOsc(-w2G zX})x}ER_VhpEsBwdVf2W@oGI)_avfKgDX>v1UZkHMjQmW)>E2Ve-D)tCLh9kkOj3C zS2U`Zp+V;X$$l3NZFiurO(b{#A4|mhd&$7onLaJZ^xw-1yd16sZFDVn2vFHTSh#tV zrDq!@iwHRd5FsT#4R8SoS)ZHHY2ugwAjOKg>@SnuL8L{JtUJQI0=QEWU=TGcIF!Aa zOw2k2fi81Rc@~eF^}BGfD|F9Y8;Lkg`$Lr0SFJd&IateNBDhe2In~@rPm0XL^t&)z z4~0N1;!zyx6qf}~87mHB$>V%k$Yk9%pRut*p29m-zPD-R2CuHyD^Tk(8Z+S1&BWUk z#KWZ^mM!8=FmF3s#NZe81|Nq#bU2Tbq{W6Wi|2(iaSgF~Y<;uS#`t4h&YWy_aRShI z98PFgR;yT{?gt7!kMNC*ow-n`gr`>ii_drjUT7cXYLsfn*~y|ypdf^-t40+^?_eH+ zm)egZif`kK45C+e=$T879m?H;O|UCg-`hB3mWaK^siYscg7g37*IGvC5Y`V}EBOQG z&Y}Zh{<6s(K75nDVUaUn?Uzw<4lIUlc)yo4J7}c(>Qup`;8$^;Ipgp*m(lCT4QO5V-GeZDVQB1hONPLQoUUuUtKGB%R-uo^b`zbwuW@k%$>(L z|3A;%58S<3zQcEwzJHj{9a?P1uOIzBPe#fAeo%0S95d%mo6L#6_RrRU>+Rok0&tU# zs62eq)TwQEk1Ec`c`7QW%;GCVmDAH-qEhpvq%@aF)9eT;JI_K=3me-y-S5=YE@{uM2CG7 ztlYz2jcV!4^63$b=AZ^5`BZ8%9NCJQsqoIGvkpx_=vwhKNMPq)&iz$=k(FqrZ<+iK z`t!LL7XD#LE&xrL!<_!32d!1mFvPx?4pugKGOtD_K^7gk=#$y#5o)xL8a+ad_K6yO zD{8c!MhEyt2b9qUED+mc51Or@*&ZqSLFZV=18Mj$-*7(~K0IpJ((vThw;S!i^k}(| zA!D>67tv^GL!+e)w`&zgpPy7++tPLUK}2;Oq01dI1`*YzL0I-=20`a41eAW`{1**W z*SVXbehqa1iRvm-T|)(sG67_0RM#u6u3~eQ>N?2PH7uj9QJbT>MrYP_pz7iRshBxX zb&Zbdde+s|liSXy>$k41F&T9|ny#xfv#$MASE=gSPj!_>b;%C}$11D?)O9zG9}IGz zs4`vWP~Jkv@Lu5b*_qr1B)>IowF|Bf^r_BV^9{vAjt?y56STs?e{!70;Ex>R+Dc`R zPB5uM8woCRft9SOBRd{5Lx@a7`!J-$Ol&ekQf8u#ETFy`DVO4|$p^T0sKWfE!VE)( zs7N^H$*0)OaqL)ZcV4Rvg!5@BDnr`rP1h$Y6BSFrfvYY4_qe1=_MT#Um)mX=@z6pA zv7n4xy-~;nhhlj7h9hV>m`b>c9n(jtsYE9o8je!v%JY~xijRTVVGv&G>h_zD3VO!fTIZ+V9LV}0W z^}Oh3UWrwZ#N9rq;Cg;282wRa!UUmU4=&H_=o?u)YvAM2 z0l^6F4%Hcl>x!=-MOmHiuasA+ordQ{p#@-^Xz3_nx-(~cc{|NaMbk@)=}gthc{Z0D zl6CQVFu2flegn-{;JI0W=O$Jb=`9XjY=5^z?gLU8z9<(Yp5f!-guJ<$eC`dxWW%veFSH?xL0(M>DA)5@O!`&ifk1A^a?-@r zc)o#uFX)y)WDxT4?nT-#Z6qL~oiW?=^(2^ zQreRo?=uiQJFH0@(x`~-QfsGv616rgv$emdHMXgk`HNZ`mTnFA$&A+aqP6{LZLgHs z-?cW1*8bpIE1|W6Tx)w}v^Mk8sI@Vft&LY}f~8If0M&GBe8Vc;T3QRV@5os zcyKN5MT`6U7Jo*IzipCkkN5r#9u06J-x+W$-aeU4>KhwoA2s<4HMvi^$%osU9Dor> zP2Q*`pQK5BSqqR-yX%Jo>iscVy&EqCmph}`eLjzxT`woxwrRY5p&FKNEmjXypQwRi z>9)uE(Tcjfu7+2t;n!&x*8x@}P16h4AJ_C_YWkLiIw;{vWHdhLi>UEu)OgQePtRVi zUda9STm`SjSJSvwL9AB3vW`V+R)w5D5M9wN?{fC->Bu|h-C}q^FGTl*#_1L8U|m8T z!em_zt)Odz%tX%*4N*sXn?q$g<1<>W@J!jxa_NUOOq|+~BLp-JpE~W25l@`YOikFT zUJuSjJg~tT-uqKuTRBqcw8mvB@9G2V1?tS%3xj{@G%7^%LHPw2n8Dbk%%RXUGZ^EZ zIn?P{*Lc_ArWlm*4!#nPzXw{gI_Ka)?;mBDoM*zj2$PRogl`(GAKi4iK=Rayq zs@D92;pm^30!%c6>)2hAP3BNx1c>!Htpli&af^XSeuXPbLPXLvhl^xyzE6qYPdQ%_ zVB@6=$G9%QQPa>aq2W^89UM<>}HiiV2mvZHpF$bTqxw>tZs;JoOFK zn3=2<**g*=-bN14nez)IM*PEhr1sIu^}fhBAUOO(@8Ee7r^E zuz`~7J%gbZhXS&}DRZdP67F2*4}@r(uY4Pgb9m-B57szgN#Myf&f(EGxfhKpi&*-M zlV(REmGS;yJ8;)%oCk++@vUt|8Rzbq{r#V>U-}9{7X7V(toSFtDjX}U0q$pUnsYR-rjNdHETU2puhXk-^pTsAt>!be-EJ% z`|iHx5KsDpnDgluJgE=!)aie#hBT+gy9ctDe}uT+^M+sW`R85NMSur7)FadbdjH7X zB!~ZJm}^~k^m*HMv3d1%*BwP32uP6Mz68p_G=JM}e3)r|1l@Cm(Z4UF@HR~JJv7l6 z9x90j{whj-8^9wx|Fo=wg6QC{)B62IFxgj=*&1>``n+uq;DZHhS}>1b#z0x%OxiO3 zX7nrtGvqz&CL}uDNQ-&|O}x6MMbmkcQBypNF-OnwB8wzM+)NV}zh>=C*WNimCHi)P{M4bQsTTasrB$6Ea*p*^SCcMfnw&ep|8=`Z zTgk~zveHYc9(K4r-)*mTlPog`AFV+JpO}xi)m20tqmPLcF7vuo`pI=M>g5LF$scMr zl6h#B)!}4aK?mN013R_aQZ$nzoS>UE-e_k@bw0(oxBy$2*0F9seXO--H^P~zdOq|@%?Al>9d4$??kIY=8?YQ*7M$LO}Z0)I6_E*LIT6oaG+^>Z_4(5I>>~=8o>v4zg@tqbQU} zn8Am94ok&i-sRf2%i`p>w1S9rwDd-zUfi1ZKh5L=STj)iX`s#dbT1Potd6K-oLz46FP%P?B8z3G=GMv}i#vLEHGKRSIqRHT4Pce^xYHq?2^Q9E#f=BRuZS}c z_cd&`G;KcVHq(r*yGoNMPo~(C%8(vz_cl+|>{3zuNov4YT%C`5)G*({B<^6mx;+P3 zYqXc+Mpg>M0&)3jC@H@YfzzeM-L*{7UIl(>Vm~7GWJfK%RbMo^jGcaOr51PR+gVB% zo_YAx+_7W@^R`NVXMoGjOBCU{GmTQv!Aj)YZqS*1%Vy3RNzz$NSL#`%znraf(+=0w z$IR&UsCx05N~^puLC|y&+3xq?>lHB=c}i9rF*-yN!LEn$ZO8=9XoVKNXpm`Vkf;Am z(tUT(0lp+v7;6wxoHqOtU^+QMSE#N*t#&V6O|d;M)4`Ju$C- zsuq&0-{_H;(rT;ZMAGW9922S57&drMp=N|RhZtCo=>l(!Q z!{PLxu{cW>(G{1Q`gOFG_IRm`WWDOnlQc8>v(av?O~f0A<0hI(IY%-QyGlT_5OiuH zAC=6*$aODB7qSJT!gzp+-R~JJ3|#O}*}5Ue_GUq7oVOZpWMc_#?;(k`dS+pxwV?LH zF-Da$fdFSP|1GpuQIuTOHsV?~QCZYk7`*gW&d$GkC)GM6JYcPYyMk@?Ak$^QkTUkya1D+mm>cpKEgkaQwz8Z8pSpc`s?W8xCb}%Pps3pL2c*!7?`jK zL~5pP*MdsB-(9g&!iDEZNUc(pyjk$4%T5u6HEQZJefji8JFXt+wwsg9<)m6os*A^c zRg|{)1m&k3i%$^MLE=U5;9w810Ll0*%rJEO=~=vm7{0EtR_bYIBJJ8^$4Io;@7B|- zHjY)RX4>jdswR>K8Uf_{b}4_q!uPCvanGwh&0F* zjjIK)%}TEef!Ni`H3IDGw2%d?REv#a_|D}5WCp9FWq3=Fdof;a_-dl@6^ASuUlqUG z;x~A^8H{K~{A`HdP4Qb4oxwrT747@qv*M>{!K`T6Y|H04EPnc#i4Kbv92T|C`|R@q z`@ASRFKU_>{hoK{(~)Riq7-9L@#rf8eWfnoVmvAW&2gXQxM=+Gj)41`#N>#%8Ta_c zecp+54Gh-~_F>=EnS?|dm*OXI#(vB&+_g(gq?kuBjbawXB#Jql_k%UxZ>{*j^2TXMz|lvqq+Egkng zKB$A2o9ZowaU3$%+T9dv--4piY9sa?jz*#K5{WHrxD6bhqC+VpowdeBrzXpGVVLF@ zL^RrMCM`N@dF&?=?63kb2GvR{0V{S{#^PpQR0-)Ki=$(4P3Gvuel130Nox&QM0zbw z>sh}pLG4bv*~XUTtLetIrp(cW04at&8tcP2Fl<@BMq;pKXyb7U;swTHbQxoa%(0*L zXgux)9UqVTE0D=4cVjsY2W7k#*PA%_Im9(N1LGiwc0CazG!B6&&YB_qcC(2Sg2&N@ z7%!$`9J^aerivoV1`H(Io(`h%jV^{jmYP8SyUic`J-+C-=#L>Yv^av8%ZT9P4!8sBgk{!Uu zT3;*>eB(G0EwpQpP&Y*VNa(lPVx=C6duXGt=uooUg&xq&$)U818EFX=Q%xMQA&!6m z<8aibT3Ag`aEfI-)pCbEl$eiejrfGV_nq<6N;ghPUr3U+0`PqI7m;N&g7)8?{R-80|}aW@*385lAqA(-r?pxh+R#9ii#`?AU4R77pjcptXOCj`rywJD|h#%wC5Vzw=32`4_H;h;lZ zF>$jv2Z!SZHq(^jb~s+ff(wQO2Rs}Mb9@ZS^=L6pqZud-+`IrNmcik=sQGX|tBDyt zyphIrY(>$0ALqAz5*-3VUh|md)&jOZ*NDbzsa&FSjcRnLkG(A1IS4$}!v-gq7QqhV z)LbJ9Uk(O`lK9k=%MKWAKcYRzSZS|?%aBUrB)A!3KGI0U-Bhx!xh!52V>g#I~5=l7}lnZk5WyR#YlsuUek_$3&K}0T*kaGfZUOo=R?7TT$~e&b5e0ZDBe^iE{eo?kvEix^Qk$3xF8Sb#NoU&To8r}vhZ|K z6rR3}Bs?7m!qc@t4latpQVI@*;F(Yco(V+Yf&^>;UI3nf&f77WnNa-ANxuc*H!u4Z zMc=&STO#=8<=%3!w@m7tEfadnWnL%P=0#qYP$uyP0&gJi7RB9JA?@ac-PxS1TNHK6 zB;7JWH;{9sm>WvD-$cj_W!!>@OVVXg!X;=>6T!5;a0=SWLrwf ziMDfrWE%>$dAYV!tSw5lWkPL1rY#X^HJXH)FO|XI%NXN7U(XbskIhPdbpLl3>FAs7=&hmhVTusYlTKNHNhQ7 zTT*l3lJre-t_a`rKqKwXE0HcR3u~BsC-~kW%xo-WB4d~7uv_?}kWi8+yd;U{y9rLS zxDlr2((=GL2!jgklDJ!nj`Z6wdMd&fpuNMC_{J?HYsiI3nu0b5=;T7Ez^Z|)ETcs- z9ST(QmG){6`e|H?iPdSdL3@L{p+48|YdT80S~PpgE+C(DjMO#U+Dg)Z<)>^!*&vK= zLRY0^6;M?PQ59*bKvG4D$`RD%=;^ZL1(&UzZ;5_3A)h?;T!wfmL=0|)Z%#>NgmhUt z+MJ9oLq+8S(FW`91s9iORZ+O#EPy)QLdiH=Nz()EhUW&v>gKx3xKJk}6}9N~L#xO( zAH$r)n_M`M<$(m4al^-7o@w!?SAg-SKPJ)VY*19(q#r<{xv|{{^5j$*gd{wr6Qp>| zC4A-HDn0Ap#RKaRGtey0PiH2A89z%&QP?gln4Fk=DK z7CbtS`(5clC9i7G%;OdoX$R6qf-}GPA}Df^@uB_&t0wx@B#Tv8RKoByJ*g8l~*!h24Vfc~foKs|97L(cJG8k1MbkYz5z3Uv03;pG~nQvFfi7-;^;nKY*p*hl2jO zkK4#fzl#g19!)?3a#&wzw|jI10yU_v|IKSSiJO_K^?EQI@A7Z36UsO>vDl_^Qxgh@ z255o}0(=k9qKum|KtWzfqWx|;!Tyo0J8`OMkuf=>Sy~px_J5WCmwEJHfDtInP>{fK zuucX`(PHsjhpe7twpP+$+v%hVO`*5yrs{J^ux>v@Cf@iTCw9D@=&v5dJEx#h6j9zz z+w=iDQoM?nQy_O7GCQt-dAA@<<~=AZWFMvB{&lUT_+KU#3vc3q#b~QqsimtJ3feCS z;%XvZfHw}j1Xsym%$DPK6%MTHbcuN2!RFjS<^ybHZ$bRJLY+{Lse1#^_K`H3JZW}e zJKWWz(2mqK5!aq|OcuQfp?}A5{nNrX-aK@0odv$o>NhL6P!u-eF5lepV>t5Yg8ny( zk{PqD{ouI$`2bHux8LbuA16|xx?vxT5p%}n+N9r>r3?r4lM7{@UXV3(=_?Fe1;VbE z&yw5|XK%j@bLKiVDYVtk*75K`t%9#ZcS}7rJ-F9aZmj*ckMzl)pstn`oVdkZ=#l*d zGj7wF;1L0u&`Zb|pC0x&jNSG+mU2fmlV-cCU)bPbAer*pEO-n^IjEOlH1=oBfFQEX z2GvLat-fO8<7$=P9uf*P6q8fT)5*P)jA7AMmJdT*<=0BKwcLFYl1EXCqN-d+Xvm1q zFoSeZn4GnGT0T%M$ZB{?T4mE!{jbIAvSCMtTz7&~Gj;EMdNZae;kT(wCQEPSSB<>Y z>NlBqVM9AF{ncc%o>p;q%4j(Q-HQDU%|IW5V*~$WQ0CwP6L0SHii4rYH24^A;}RKT zp?3q|MK%%S+a_%hIMZ6YP5UaWTtP&*iLTS#e?ogW{aA-K2W&XwA00dug&0eX?|2Ty z{ii2Ft#p|Tw(YnWHdVomJ6>o(T87pQKPGYY47>j}bWH$&V8_g3F8yeWCrAG@?3|u@ z85>*;&)1+4s79Ri%+G|jc47q6sMvjIKIA?ZO%pPm&sdyy;tp0nEw^}C#%40Cc(zj=bZp=Wtjs}(uoLDhewE@8Oo?u zAPv%ktTm{=Y#sRjo?WW^Net3lKB|={6=ZGR5fRz}HfPK$E@H&)tX5SZd%&8nHA4T; z*~T<8;`ZA%x3egKTOoHj1M6C;fu3S@Qq`RB3v$4zX)2q+`($XX{du5ELMA_nhRLo1 zH>#>Cp3VUIiYttbCB?A;?{<3%v_yvm909S{l7x@v-T>fVy#EC#ZLNUL*eZ;&=u-@= z$6$opP%z(Z*Qs-cTDm z)ybV|W0zXrtxn?KooXG^X>nr^?Qc9m>Nlzj)Z?Sh7XJZ$?vC}ERu|}PNY}6*km~jk z{4)lzURags>=W2(s|n}t?1Z34dSjJ6p_X^4<=tv|kHo=aN!y@iYYwmFa~3eJ)^k~o z_$e60V798H^x;|;+pJ(zRm_>~T`o%w7nCymfF3LoOCS3Qji=Qw=uT00NLX^Bh7nM< zkGSK#ZF8r?V`B*oPu`Z9x2+|;18D*s%Ly!(A|9Ov9V>FslP@)2UxOyBrkKIwV#mow z6@FApkkMAVwSg0TrVN|0f)KxtrKh(V>n63`leSL4uG)+SwVRo)W@uGRTa6#fV`tDR z4PtwcV3SqS@{Z_i`d{WL^qLhD#{MO6=LLNSy)-MFlTd7nqOnu-ZIoDk-p5I~G6ji{w=TR|0|Vf50#+9`GnNLR zD5D)%KX?n%2`OvlEtq7{YI1b(z&_MXoQ!rvo0w*FD8iT2)a+_U@5dm=K28*|Nq1BWteRf^vMS@Dy{v<<<=0?|*iBas^x82T5}Wf6 zDJz^ts0~q>-Yha-B;f@*nN+Bb3|G{9k43AAQ0q>7-FtQibrV-{WQ&hCp&~k1;P?n5 z#2TIx-g}=#Xf-k0M@FHNTWgKusDby~W5mQ*voZ#y3S^P85|*ulTQUDWv5Q#sE-)-S zcU^}`9KVT7*03N}>57YPz92e+h$m7gooHbpZ9?}QdLFw;acUFdY}#qyfk}#L6O$W+xcXQh^9?bCYvaNs;6MxJ**9c(YCUW~utE%b z*P9N;aHQ96&rsW4(g8e!h_R-zYUu*ZmYAX$w;!wx(;{0of<0OBS^wVq2H4d3B(Qx1 zg8gXj-0w645GSDlif|PM5PP^DNPJ){b65!$N7w5npk{!ai&rW(l}U^#X9X`-2k4g+ zQ%K)2j>WSK%F6~pCR(abQ*K0X3ZhYIf$P#T9H60QSTKv|`xW4+utEno%vzwu#rvIA z4OVyu!GVAm7N_g%ijanFmSwO;`&i{jX4vdS)4zd)4 zC)GWXspWyl7$>xnqPEGNk0 zh*Y=eb+_2g`9v_waex*Pi^J}bV7om)b^^qZR`G*HR;bHhgN(lRyDfh3u7C2Xw33Wt z2sB;Tw{eNd;xU-qJZOX@Fybn7pv1`&TetP_w0#6a3jn3!FVuXeHw!zbn>p#T-qHU=jOO88Tgi8>cG~ zX;yH-(SxT7y65oQ;sE1oL?n$*vg0dnos?266&fuXtc)T3fu9@#YP#*7^Lc-Zj5~b{>*=c242dJ|IOTK1e4?F!v%-%f)sLAwB`-n;O zit<=lg&$#2T+!~%Hv$Wcgb|VeYo%nE)77tFRu-vvaMHzj#HelDQ8!4Rq?kEctz%Ej z)IThJ2sSX2h2D?Vv_?BXX=KuZWo5JTnH%n~+zFon+eb(rPym)ITj;3kvpO9NZD$>5 zw8{9vVRxzcv6&hqtlE_r<*TkDCf>-3;PSR&57O1z{?mq6(tT2*`Bs}TNi*zRDfIMo z2O$+M+eh?Po`>ShKSi4-U$GSu^?iH+Rj64pRfmlxZ#A4yD69|i`Kt7WTZ9(-v3YZ+ zvctIJEa1q{4tO8P!yy=H(~*3Fn}B?RRn6t$T3u0qYSBFpW@$4IJWA{R-n=tD=~i$1 z2<3qeI$u;1l2vF~K26#Pf2nJr^K_vC1V#T_Putio6fK1CXESNt zT~-&d(A^se91zR|0-ckD+R}vFy^fx)Nk#-0wRDSVi{(DK%Uapyvgp!~ zP+%mS1Jd24<|)XuLWWf0#_on90+T*>5yyX!Wd~CZT)aT$?8h`t+N>QoNt2H7~*XWu5BRs zhz9ypqfRSLqZdd}?s+|1PC@6|ghR@t{5T-cxv|ii%d!-{i`g^*mo&ax4jY%5pi3k> z5OOYQ#&|ycsYjoc$Ptl;VTr8NG|6}%Ik66+dOOlh_RM5gh@ujE#@NE|vW8}&?uRVs^ZR^oZ-RU3ck;D&Vl_uTPY4cIK3k&Mzd zNr;?$e4=T%;^3%{&7$>SvkoWS&VsIR)Qi|@-{7c;L^Y;RGazaJCpL;&avBOH{ne-q z8-PK|cFVqN{m#|t*inNg?3TlR6+2~X+O$hn#df3bo8%pfpJI$XY3(DeVz`3kgb^o1;~)e{aWH2fJCwmkzz95gctw2A zXlJxL+Bq=d(XlC9EVG;50ot|@uhX6eovK!%>NCOsh(KT16$~!iy|Q4>$_ei9T&t9m zK|LPf%)|L`{Lgl(4E7r^+}^_;SxMDPo>}Pxs?XniLMBj^4k$PRkt6^^06bN~wel)m zNrIv4GakMgRm#E~pPB}9G=Qii&RYJ1>!6Iim{qHsix0_c2}}d@Qh)g%#dhnB)+CC#+Ss4rRB z{xRbrz?GHx0*B~SR$|->;zWhpSnKl`uD3GYS#TeVLmLfUV%(9N(~u2KNc0 zYtTYSU#U}v)?pM!O@d(@?v;%VCY=AWuOK>k0Qo-p2jViBsX|(Uq-B2X+6^;-z~BJw zaGE-`vY}Q^vIzj}m)InLhL1)igCdVi1n56)3Sb_7&b1)CvW-leezhnAuByy)0{cJO zl9HwUJn3+P51RvrSf2wQaPRJ)XrM-P8JE=Qn$j|8q#jqeT}g2>PX>qtg)(cBFWupT zr_s^pA^HVf6kp22_=)e+F{Tjh;3A*JKC;l!HjOYoB2f#@m3vsS6)h_wb)L)_(~KT# z<6d2#1?CUvD^$aSD*YUiM3@Z6JLMT!+4t+uk_`->WBP}U8TXX@FFBAk=KQs^k`Cfp* zQ?zDbm1E8RPmqe*M~~*^N`egk(AQ_rov|4~Z$3%7Ooy}|w)lvZlcHH0_?P0E$Ve6rmdrDpU{Ll>}I(AE^zf8<8yAeTMIKYj13^A!+iTE&q zGE+xzc?EI=V3N;idY?q;Ab~YcEWJORPZE03_vWj?I>_r(Kb$Y`^QeV<`5<=8ca^m^ zv`zY*O|t;AQnwh=H4IMD$-ap2wlG2Q4Yw0 zCee`Po!5$Tt~#x0UBsZ|^Eh17A|F&$LNwBtV zmr4o=HS&>?d7CmS)oV+drv;tri;7)hw!(VmKanHh2AMV=COO-&#J%M^|3cs06LeSY zaGCcXe}QFci*f&;F#k~j6W0oV3Bq=x?JDPq*eIC@tA^Mp83(6AelNz*R!{ST+S3<^ zYRr)9gY?HhZN&zlC3+#fucV;Xj{jBJpt8>U10@r|I_2LiX|+{jze_F(HxS$iOAX(Z z8$wN!{?_J5*?`F#g+nDx7SC)xRZ^Zg$%jj+o;RGI!CG*`X9gC_LH!pw2Ch58%=R0l zIEi0uU`FipLAi(LN;^yED8uey?~5=pYB&CFQGalwQcvPnLVxL{f;M}*(|#KZca2HMD1pVgmX%&Ye}e8$WdF-5tq zZdX4)=6F}54#>8Rkm@Kl7qwo8#$qUWVNBFJ9YPa`D{{Gxk_kIbkUD%9!0HZkZi}kj ztkkFQ3jx^Ja8%o$Ycul?BNrKTYM2c@G|8_&zYwHhk|5c>Er8iTTki;*3a#|lG|+7BkQMcr_#QU|aqA25S6 z!r`;NY`-|<)t`#5J?eV<#lg2eVZV@bpV|&gRHwGhHTJQ8fr=Q&QJ?;+{emw@M27l( z`FVurob&3CViTqhCY;!>+fT$1+oRrYzbJ1-E!&oGh_9!_*KTDeXoLfhyZ17CtsW6MA5i5Oh9`!a*HrL2uzdk3@ z9#pRrX%DKO5^4L?og!_YI$-N#<6D^B;uMXe%)3OU-Rh(E%R~l!y_Fz(! z`VaWKMIF6EssE0&UHHo1od)sB;*t#DQBH2FUKq9%8UNrBDdfNFfU0Ej;?q>O)uj2B<7 z)Sux0P=A3_Al*VPz0@bTJ6PhNHn-8Sn2qe8ZxAV@lj!3wNVSF~W=ph60$e?DmrtjC z-#pm(6j-(`<}PRt-{OJhlGeV%`z<~&(o)7aX;V$9X| z`#?|*N-@aT;77fbgiuqHX$1*4KS)Ofs|fN>Wd9PPmjm;A-ml%}A%&~v6QDJloeU`P zRInpwh~Alu^8K%>2+VlFTzi=>$;vu@j)LR2!-va6yy(QruoajqnD+}rbY*X!Gmk;2 zv{}vn`r0uPIP$Og`o%f&SMFbhm~1gZ_fTe>a9e)R$rLJs)}5XpKP#3W@UYdD`mC6| z@U`!sg9EzipfUDpVszlUL;Wg?(fL(`cM+uhNz@S*ee=oAc;eeZPPRH`2XqJ{ zanzX6{*vguG}m~OfHS4R%;T>FSycUlBw~HG3Ra8q4cO@D}JMELLmap>~NCLCY3O-H!U{(&2J1wC8etp$FxES4zfKz1x!m zr6Uijhr}Y)kHWtwR*-cSF^5xtZM31eGFy?i3ns=iq}ThSV%hn?bU`q}s-XTg`-c8O zLCl)BY5R~du~1BF*wXV2V$yYfZ~XCdV!rT-fpysG<)y=AoB_N#&%isljkvYQe8|G( zPC2r~y><2KlVU7O;^}==GzxrEL=gNDk>WM>e%D!;t8;X{L*G`0Lv|8Z&oh6Zs2KH@!bJ zhr!Q^b~1I-#)wnas|CrR6>39N>KB=fe)xzO9pPqTMlk){)5H&z&}pXLSgVW1FN z@%wBIcus3#UcTP;h@~oyTKQ>L&X;3 z5pp3q0add+#lM8Jz#rg?MRXf}QOMZ+t1b99k*t!j_gRXMO@Gd6_bY%^&!HH=S%F;!je|(cHy3ZgXj7TorC1C15 zVGOsZ_q{=>|93Yobs$`rJD8D3d(}P|KM%;fZWCQ;AIEc5CTgaenQ=<@P3*tAU+ zepq{;HVcj_>JrX=?$ZTdI2Cl$cxdW#&aO)ss2l{;^XQf zwoRLlhTXVRABJ3J!9J|VemTe-p5?rlHQ|8#|6n27;=) z&j(G=Ar;Px_Q6r14s&-}^o1PJZ`}eR2^%&Ig2`qqPk~611H+(GG@#b%5S-s4N*CU^u`IaR%O#PD!%&{(dh7 zZPSq&PQSv}Iq&_PUX&OD2fa&>lx-vRfaM+JPKy?afF`F!@8AxL9zL3AVrS%R86W9i z5@hcK;9d|*Chy|DE?JKYKXWFSbrDPDY(OSt->yTTT@))_`bj@8`fYSKk#sYA9%79h z7laWIahT4DA%+15{MfJ)+Wi8d9!TM>_^cc(8Cl{|&}lB(s}osJ+2=Q%wZlZ8a?j(?<6>D+tC#S2-6heI2=QNifU2yX(cE zCioQ!zWZvw94r$7Z}@UO)STp8IAc1h*|69-BI7pyS|}~-)FQs_E%I|!O^cQXD}qEq zTP#A%+oyx?MBO9twABSsvyR5JS7yl6uoz4iLuad84?5h+$AfxWY8Vo_YX>b1A5P<( zEIn&t{+$);RX9lAUu2be%KwtA`EXU86J4?qsOrI}o5*OF1plTMhH*T;8lY{c9fCx4 z^o6enIofJT;FHlz&f;|LhC&D1IxRWfqzx``3d&BK(S*Y}Ejv>hjO!wl3$~DpD{)2u zZ3v6AvQFb#eONS^!nd3X*qIKVH5_!@L{U2<*sTrjG%YJNvE@$Xmq8e_Z%MX^eaN2| zwNWsMt+ItK!s6)y8}lB{>!N8oX4Tmo?FZpZrvo~+fh(_-Vhch#-x7RR)jh#?qV@*g ztLjp);AEJ)(~?Jsh)ELxhE!dU`6%|$sY0LO1|DZ~n7%IswfSIxiviBIss`Vg+AkNJ zjcj@@SgsURc}enk4mWdFl4aS(bTL3;qbu*1eRA=qwhGcOarR!9wX-eedAX>9m^NF3 z4smqX9b(uv^WT3~R3U@k?2rq`gc}OJcEMBhO3byQXC0LFN zHM(E)*ahmmB=8xH*#+4o8&2lyVrX$Ls>^jL6lKrKY>C>DU-m{}bup--7~biO7*`)) z@2prOMol9K(`q@d6{{anRq6rXqKLTIpw!lYclhwq!vXs=k(1Ahf%D;2wuXH(QNAyU zrEhd*=OjBV+a50n)^XXrV28xyb)@^HvVfyZo)@!fRB3fFRCw0!BA{Ok$XKc^7R6lR zV7Ol(u<=M)S6 zl;mJ-t>;?`M_lX8mqe9OK|nquSgWT0S(x*wGqP1KUgdP@+|hF`j<|R#Xe3{#oCze1 zD!g%~RoH!~i*l=XO4L&_w^7_Jg=9u2Cv{46iQ~!d5WB4n;Q7Zw5@AVJotMqeoqx`Y z4jbjwemN0ZSG7Y9x>55Di;^zLV!%JH6)nLrYDxCp={$ExG)3|6bihSSocTW$)Uo11 zwY^0!d%EU6^1tE4#>WZFuv7bSy|I+wFzoSkO$1G%~(7A=V# zMTV=N4ytt;!yVz;Ut5k_V6nquVBi6-G?40fiIDF3PKUE&RfbyyuHf?OQn2ZqfcIOF z$Qil!$#BI>VMC3+^`hvlQAAx5BBs`iToP0kZPuN$f@+K&=|a#J6Y=9iy< zdE-AzCiy6_Y^Rg$CbKw@v z;ppqKw??UVD#&Nmri)@fQbVcVR z;RaW7(;~Bp1wAcSMsPl_hs&*wJ#ji1OQ&J`pE(-z2Z@V80jCI?mJ{W*W_8&-t>5{4 z4mBPDHsP>#hnWAOrNgw?x`iJ7lI)OEJ)V^!;zkO8nvj*}`|(PxpG1dH*_yf_vXGX* zUs#=yBvUjm8J26rE8ouv`gGCL{|Bs*tcEYbwcb`a7*-qkXF;Y_bwPH?sT9x3;nf!% zOX14YTHU`7u)$10^v3GOu9H_;;~5+K*=BlW?{tWs)$13;(mm+4;dRO0X*8{3;Y^Ug zmkC?N;)JmMadB$nvyQqXmwLOJs;9*EHcw`%MxnMOSvB2foepaAs-Lp~oG%qF=J?Yh z@CL!T&&g?)H#!$(t%o;RTw<|0ec{C-a7KD;E3qZPLX48IwqWRxyBBt3K}bCAq$h%4i85IY|Td9ikVQ8 z_`5|t{dT3M@asPOHRi7mo1bt7K%rywOJtfnZS)<4UItYC3I1+T|Lg5atz)C1j0pGz zOI2%#`p1A6)Z1Mm)1;2ie9!^$CdY+k{yhyv5M`JttDeiFZBxI`rQ)c%&m|gz*kcU7~E<1vSRj`2UH$2#ksZWC$T7Y%a`A4D-WSZos3N{nomD2Ok4?sAu zAmllq{sj!&Hw0di*bM@LUFp~}>SLE_DEp**220Umggv#0H#Uw1UWU3XuFnBr@p3hZxQHo{nJ5>{uB$ymef9@NLQmh z&9dK8k_l}F8Kmkqkd1}ws7HM<1*>>WfCn)gJG&}!aBDjfMhL{aoh0buK_#vljLWZduIok)C;z>UNqcE9JCV~xh~6B@Q{fl{w~pa9iHhQ zMGLWlVI!$SnjaTL@8ceRkC-t$g>9-QH*bvk?oG(ud(Q0&)?*#;{$V+FYG<~8jNR4t zy-QKL>CW z5jbI^KmQj~yG8xYJK)dhZn&HPdka0vj%DgNPXhTb!{6;AIfu1h2HPrePOEAV`!u{G z!>LSQmOU7%L>7g3uB@i?(30QI$SQ0#1|BMN%zp^}tn=G$L5)nF$J8MZyvHQ^`#MOaVG%eU{@x-G&WHb*w;q($k-jLN zF!-r@cODE8oBcfBhh;>$O$47^=nQ@8xWZ)3>l=gzP`ZE?*~RnxDjUQX_5nvd2O9x;eqBA||bV z+ohodPr?y(Pe^b`sHh*X9naYF{a5j6#8tAu2?t*f=?4ovLzL6MF-?QpzHs$>a6|oO#~|#IVUJ|L70{yye)L&4lqBT7jD;4$Or=4#9HWzXrG|0W z9&(I>tLL~(uL?T@>5UIONz9=S?5wdcsUT`@Ldp3=W$ z^GY!4IkBF?fl0jw8_yOs`XQxa5DYoscm7mPGBt3`{VWJ*0K5;CJSD{L`)@pm-# z^k7RR7n1YDRiQ8THLx}q(SyUXP_wGu3Hbe&5tqh=h2I&~ z(~!Lf?;*R_T7ZL$4fP)f>)S$UG=L+}lnmY~%luiI_6Q&-$udym=fbOmIy9f|q zT!B447>w1LI0=`d_9No;mECCg}+UT|X+t>dCk z$Ff=J!SnG8uY*&>mCnYC=zkR2dL0fH@R zH`{&-S9CXQ3rcz4`7a%|ew)d|w_YsHJ@t(@$wVDh^rjmu%(&aU`Ih{WBUj+J+~%Op zl{CR`z1hKy>uGqFy6t+~WcJ^+?Ire8J9fJLR#(R1La94SsvsBWcfPEcola-Q@$~Q= z_ugl_;Lz!g-{qEu^*i>mJBzqbh_#w8-&RaxxB9OrX&Ct{ySoILb&UUQFR^XX?$2LY z7**0ZzRF`TqvsvX-{VKgq_GS9SKsAYX~58@vjTyf7=F9&gH6@SyYDE}Pj1EUE!4py zvHeEdc;`z0zG6<&UhXJ>*)#iV3abJwy#J1T%U!caifG7<`vZmE7)Sd%Z_lH$p67QJ zQtXWEE+8|i(LIIA*=7G;KkH^F^`d&PFp@OG4;7$C!PCF<)!&k%+c^Y93EuVK2=};a+@3MvBdr78*Z`b z=6`m;_((}5V0sl&J&Za&)*9#bkgb?kJ~S8%-YPNOi{533kuH zOJ~dTLf$w$oU2KCzMXSz(*wu;Dd(@#j$x1ZMDKQX!Of5^0qGxCBb9Bo5)E~JD;IAE z0Q*=mYU$BC!W3~gcTp@IF(p_NZSiHT^+Ro&ZA;EHAic{ah_JK^ zxQU^=;m2{eYIpM0f6TMUAs_QIUB_x24+&grg8PlzTVg}2=G8$z5% zPQEk*jGf$giGTpv6QaF9W3Kd0g~<7`>K$g_ZG##3&ak-Y#CL~KvweM!m^mQPbMdaB zT$?N3JCtj5<>Zq?W@0+Hk_s-1zR#v`tK>Dfg#hp zV8Q(0kenuef%QW}FGg7xF7=0p4m|hMR$0K*cMsjJ#rbwC0wcz|O&2ot^w5ni$;LYU zk)fL$3@lMABi}Q$%>i+TNHV{fg?pcSJ8{Vh5uGB5(a~Z1$XqK>(fljX#JdEG z@n?q2aT|%XLXg-G55gWuE018__hxji&v?H^B zbAM?m(=wXnL#jeavO^^jl}>h~{I%-I4lm|k(*ss0J-8z_lk8|)E2?8p2ldpkJbTOz z9ZYsi#xj;9J9@R(WJh=OrarA!>(D{{2Us~73B8f6mYatT98lUgWC^dz&R$PDmwxz; zeRto!@7_D^-*?x23%B3Dcjx}QcYgRAIv>3A_7Cs9dtqmiT%g4C9eclX-|hSE{%?2g zyZt+NE+pv%%5|)qmB@GAyMN;Tz4txvUAOPP?>m!B@9X`Y@3-Hz^Nu@r?!Enz z{yXm8yUz>EdVvqzv3vLJAG~kx&bz!haVOuXwtwgCAGq({g`E#9B+dM(^vSf9WzDSJ$~v7k56w=q*_>## z`8Un7cDvi{rIWp>F34%&Njsg1{za=u zE?#}fMCZ~q-EODd>2#-CYuB~gGwp7B{p^NId);<7C9^%z>on7}*~(fS|C_cmdQN*2 zw9{&~CiL$_qnX~HQY=ps3PO5eak0^Bf2py)b^-@Uhcq1&y*9Zc)@q!(4+_TLlB|BG~0l?jeMc=vaHXz$MCk#tR!d+*K< z3w!qpk>LM((@_t1-uK~q_bu$*dB;7s-+9Nv9m)5n8>?!yZ=>3`e_;20`*tQjkj4oF z$`9RNZ{Y{iVbwzQ<-GboRD)sf&OIO6xvwOpeaR=%OR5&iZ{Km>o!^!GNV@L44-0$m zxO?|b=Qm`t1*`bxC)26w{m%RD-I+X@&Wtj4?%qkAr_$9`7AX19 zP9VC2aUZMIUAX%LyON(S`@Q2k?!J9Lqi0%g-+cQw-o82cnX+Fo=iPTEPp942KHhjT z&63{dyJ_oCwk_LMWYO(i{g>NVg_xDD(bF(jKj)6eYVtQ!?Yd6pU2kr%PdOI#1Fp?|DIQsYn4}*c5K9dbTwI zli@+fay~z3g=CO{tyYoE4=JLg?Wh`dLT909hPC_mR#Wn^t(6%G+yjtM4 z9s0uUvRWCr%xT1LU-&gJH1mKFfG%aK1^DD-J1c_DC+4U8GzR*3tufH+wZ=hTbsp$q zKBu#ONviKilK*0ilo-~gB;T6kPF{_z3EZnZNUrHmt*uGRpW0iKwm)^YCLMp8*qTiE zQ+I39^{3ueD8X8p+?q`K)6~{v%AcmUCe!{jvo)E4S!&F>j6cukEP-Y`@HGH#>>ZhX z8JB-`9Z3ezuZaS0;2$XiA`?qg_KKwUl`P8-r3c0RCQJ($0~uN*a55woUqg>uM-@Vk?JxonJ&~al|IAGs1 ztF7!tu-XiJOJ-BPC2Jt89-wi3&cZ@`YJ_#_#tN?WWVI)KPbMjRe^qUF^>kPDbZ6NV z&^PvkwR?xnUBfI$N*3ue!`AlV;i9!P5H&WTZKPgWw64zi7}n00PyOl%o{C=!O4Iv} zd0M;N^Z?j@Hcj(GMKVYwf0={Cb()?a2Sa(XYle9;EvC+_Kq?YM=JJ|?NHu)jR5poj zA?H8@3lbTc&_k^6qvzNE;Xi(Oeot5g-w%ivMLp!Edo(hpWu~Y0HznyX3WEVyD0s9~?M_Q!swYquK z;ghD)gaFkZ=gU3aNQ0Ri=O;z|d%IX0##MV}ME(sA10pOJ*Y^ zN}Aq9vuH|hwF*dUKJuazBIwPEmemHm5QP&mSQh$8TB={&QRV~UFR6fsuqq6h` z7L-U?S{1mc>`NFP=Ab*5VPf4-3Q~?uj%j}i&_PyqAlCK5r4SLlP}j(Y!ZeL#L&Hh$ zg*gB^VZ$Z`p}ZT(ZtJ0FzIV#>G=whZPQpLD zo--3o%$8X<9QyMPDcsNqM*-#%s?aEsiGg03WPo$%TY%464!@cT)4FYc^0W$Y`AzFyv_H2Kxl&tv$?Dx?bGq+WXOC>(vhha z`qS*l%JCL@??GV8+~qH_DNydpB!O{WPxch~0^nVK(`=FLjWQI5&qG_R*a*oDGES{w zLqBBQyOK$ZyjZ}CbQ4U*<=d01^A3e04GEauH;)R}7*{KXS|wy>|4|KXP^U-u{_Cg> zU#0t{Z1iAqAKElrL+cmM_x?jR!rJDMY>3b($u=?|aIyhjXU_YefsxH+Pk$by3M+hG zJHN%>Rc1>T6|rnER#MX60(lFV-&X%q!X56LpPpzYS&}r;B$p8vHqM7m|A#fGVO)#N z&8scO8o4L@t0np;Cw$=@H1r9T6|(z}IVyk)NDN5Y+Z-peU=38H*GVeOWoriwM6X^U zlDVwIYu2mRBeP*htylj?6{z*x=pAp`YPLvB|Am?P&|qqW%g2SwA)3mOD+MJ)37hYp zV&VoZdu>X3O=o$M0%kb_e9BpfX{px&%LrOTEr5q?VZQ%A2^o4#1}zy2F73nPe?Wi! zQ9T7rk0%8JeW3>Ui-x0nRvB~IQGGxIhKwd!$QA!nwECY`<0eqGh)nUL^-O$=CrbcN$+mD(mvP}ui^O`P%)}957mpx{yl7X@{xB)2u+*XHE z1Fm30DhbvaI5|io<5$!%5LB%I{5z9v=wob{cUp@;@;M+eGH!+b!WMs5+XmvG)&Gov zUuI~jS+sVI%$)GQe4GZtR20fZbKp3FOhoo20+{U zd_n0(k!td3XNwaE4W<$qY5#;^VxH4oTJuK=P+vw!*BdEhvD9ezfYVs;xkrA$D&M1K zko;vunLSLC=;R4aP;Z!opZ*>VuigJO>oO_Q{=e2!|JU^|9QPA70dgYQHB6)2g|4?` z*A}TH$W@+PNzy`|sK1f)NJCLck5oKcFq=`Lg*D8SRnFHU#|xwa#=40cvcr|jq(lmz zUr0*)Dzd1O5^1=Kg8d)S7{b|~TS7ayoJo<#d~i*XhHL0;E?ZrGqx1L;^i|R&4cA(+ zNr@+uBZBQjG9NLK^j=9vLKdMvhN2A&FS|Nhy&Nh1aisJk*OiF5XMWlwW-6Q62Qm2OJmh3hm8%j5=8rDmiSRoNd8mZ=-Q;pdSc|bd*k!ter zrDVRy=dvr~3U@A>E3)^%lR5MxVAa~@c^WHUKAY$VP9xj z-T$OM4A#*k)LbH*AM%UGs?|-Hu5L@K6*n+NPwgIP`>|GmQIvxJEjYuZc_sJ)!CIJ=F6De6xJz+XVQO86OnHV zjnZ$BjkEz~#`>g{q^*|!LmL0fTdl0w3n_~e5-s@~vNafY|ELiYC>EN(Wfl&ST!(?A z1mGVjjX_6Ma}jsrdX`El_-gcj%t(lWkc!i~qH8g)f z@GsTQAhFpThI4g{0aZ<6k90=f`(1fl;zHrva=p6S73!TNjjOZwFGp!jo*7PW)98fP z@jrm(5>9ySWSt~y_&-^rkv1~k@@6AzwH=`(eel}qX=;S!Nyl=B1j8>5GqR|Z?Fxo? zDv1_lIrFhwwg=cMC#fMLR`UVlxootTQc$L$5|n0L+~StOW~wk^Hw|1?YHLMPhyaPR zn3_~(wl>(TSp`XRrq45s=Hv8|I|o=KYvXv33H6B@8^t`M7={xUp4L(6y!XX7F$G|h z)jq3}%V$+9D3=2^sht{QtT!`>LEHcJg;N?lwM(k#JzO&=zuFaP zX-~R3udhad?+sU@Pzl)V|DeDLvbST#PkP3lDJX3ufNRS+^51PDw6;{O83RsK^e*Z7 zOG``DQneDEt{yMgysh4APCL!)$Wb7irF(iG7_%!YD``|#zBT;e#!Mr6ax{%BOf!1q zFK4B(R*-th|U<>jedn|YvAbC`kll!dltJ_}!7 zTB>F~D>3?W`DohCAlmEr0y<`AOZI+8+pV75?8&?M1`}WF*uiWo>E4leO(h@~GZ zX;o9t%B>Mzq^Qrb1QB$MVPf<{?wL|0z)lU9GLstmNZOn$(|q;)o=Fdw^{A{8c#4y)Wr>>IXB{#Iad-m zZl5jLQ8mJ>1B<5VN|L6TSjY6CiRD9aD^nRbO~XD$O5p|;{CMvg0+a@QEyR1xpH&V zI7tol2wD8JbYD68Q{?;TwQjU-#)tEwb+zcYupup`6_2axN?rD@Lj+>`WwQTlS&0`` zjHyk~^StVD8x50M?5c1Xv#hh;8B;z7(g!1VF0&WpdKL%b!B&C?Tk9G0p)4ZAY$-l3 zs1NaX%Zbe(Xo=bl@VVA0F5AXbLy1uf?JKpAXBu%r&QlDqZa!c%X#gfoc`BkTt=ko! z`80B{*2?;N3#l}dd;q25Dw=O_p?ZRe8D zxG(ax&yY#HNs7bp0tY~(?;cCb8H=)lS*xrEwjSC%FWM?g!%*=lT8!|RMBi@K9!0* z>Vry03_I-OAg-&?iF|G$$AuxLfG|>80bs|2P~@}jaNW}6{O%Mum|z6zFRK%$yvYL}X+Jxc-h%^?zLsMdb=G)zN9 zI8T*`E5{);O6*3#T^k3TpRa#Vh2%&5vm#KVh7AfZdBNt-S4L;7`KXMl=IQYj!R-we z?WlI*kj};-)iE;yV&(38pTTKCWYfyZ0BKb!gYoUmaV;PwkAhHw`wbV5%jAj+ZC^?r z#6O?qjV4=l7Z&Dk`^O7&)=(1Wr)!Kc66Q6nA>CuEf@(A)m61L@u3=O*2hl63fb^N| z*F3!anvb1dLqvOl8k-;9zL^?u#4?B^CRVH?h|;TAvRw#fsk!tU(>E!wIeC);Z`eie z`MhT6FJG7eIRXVYrX}Ys%=C?gS?I~=w$*EAWMJ5+YMxG8pRqo12DSAWOI)F5vl84P zIHo~gjz8MhVeCYCwu6ytO^nRaLK%+HLK$A~Q^l2AX@974R68!46d2@zuVwx~-pXs` z32kW8YS1xri~yz-&QyStEO&YMEy01aP)wiz6z`C$F}KCyN>L>pBCX}B1)?qMT( z_GUnJW@7F(Vz@6d;n#^-2yz%NaHY9BE%HU!IKR9_K_rSuc;j|cYWtRF)fnU%$FkX< z#@k@GRgo@+uJbx(Mft{kj<;389nv@RktO)({&V@r9@7++*1-OeL#L<_-pE(>HTdE1 zx*pYZ4j4s!K59PJFJ^=${XeelqEI(IM{NE&*4+WqW`Wp};}_vDMX_J1kTDGA>!;Wm z$m@=>^C;dNWhk_-f#Rz*kVT={-oXmAR4;|dI8~pwatB(j{_}`%RPjF-4ITbijfNf= z^RqT0FPkTe`F8`g(iB2tCG6eexJY{dRdm!ZscG?>w1&53Dm>HS6QtoN8&Oe3r1ceE zvdqz(^p=|cZ<IR*WS%iJ zqlNpW4!*D*wnEwbAJOhIK|P{Z+J!hAXB8C7#K>6bBK_yk{~Ov~Z(87=y_s?L4at8> z7ri#rJx9RN`^U&NbJ`X!i~>pu+h!6^i?Ny0O-ZN!tm#JViMYvUPsHrNQx%K!zICO> zzxL*K)0~-80ODb4_?%cf_g@e&*xjps*0TfQxYQ|w+X!OD zD<*dsydZfAgOM-jcTeH1? zwc-KkA)_Z9h#)*O1&D?LH8xXeZKi4T)DW1aM)eRwvGM(%`0m-@eop?wSWI1hN|No z%v=OB_WRGdqKx9r_hO^e?Mf1D_AGzlNQ^xX=9>HnxuLqxPU%7<6J80&t4uuNDV z1xXDeLiG4WYO7rWglJKGP6!6g^-tRLXST^C+3UfS41g^rCq05mC~mQJ&v{`2ZeVCi z^et+buNLq1%jMS%{&nrZYHFFu@=@N-Mr={r!KL_*Sxg!W9IehxY7vts;Z=C%M!HZ0 zNEThTnY>}OH@Qp!aP-;sB!jI{!(1fsOs+M`cnpeC>WHv3TV?2Omo2Fn5>BK^@ukQ7ZuKvkZ)wx;$4@RTO0=6)Q1JF< zFF?Ryd?0wEY&i`Z_Olw;yq6Y#p8+&O_r}@ru1vxk?}xYf7qKRk>;ATE6dct1quN^j z)UvgF_AXzx*Vgi|M=h?*m+kVs*Bp6sk&H7@s7RFu(X3GZg?GGLM*wsVK)WACI_}`s zsx>Sv2@jWxQm`iapED}V6+%qBUq6NfI=PdvI{c)S?|VT;ShEx7jEpGN@oES}kq20S z8)S>*;uE)Nd=a0L<%{j;bI+l=@R&F{yk$8^CqO(c6(vmK8f9#JBbcd^XX_miq%TPQ3X@LW`sB>l$z&KP>xx&=5$M-?WATY5>NrZZAzx} z&m>0%7YH@^j2DX%)TBTt-o(6zv<+7jGCmY06`~ZR~_ZA*C zaq?*WRkV7)*-F=!ww3}y@;Iv8cGr%xyN2&tBaBhcF+%tTp{*NJjNLTJz%R=i&s7<%9$s2iWTP!fe&=zd*l3oASX@@3@#!e>T?yz+`Ph$6`(R; zV^}WB!6l?{A)(71$y$qnX3x>%pp9I+9!<;H5|N1Y#hkCx3;T~AI5Fi8(`i>tGlfM{ z^gU@Ki)oN!KE*}e)GBZ4Vr#^Z%I2lS)M_H4+Z;R|PC#Dfcpa{v9a>kHkb@3@ZilnG znGNV}xS`;yL3L@dwwQ$+y~xyVHW{tNtV&p@hgvJvU?DMU#1hj^|3yultxM8^Lv1!M zKmoz)$wj$R~!2^XPk!L39J6GBBtk=5g@MEBOY9~}nlv3`qnQe5i_ z4*w_87d2^mW+W<0$?{+7uwGn+6r4bkct_76x*051109K?efbbY3m78mSB=|w=iWy$ z&db^y*h#GjoihV1K(>Y#13F3!__?B3JYi65({|`YuY7}F8rQMSYUI>n)|()T?i%?v z>jx>Mxu&Qs+FF_uAf3_@1>cXbGwke!3M5(#SM`a4<228WqRk{%Wh&t#@0enE(DF>$ zC^ETM;tUiqA#~>lg0O~rFH6i`00qp>iYNflCDS5BK|x-kfR&97dj#h z3bKfT%uzs5j<7LFMZ*cxXkl_U`w%OR9cdtO8VTxpU#R8Vh+vI!F)gW15Jv<&Hwjh>+ZIyBVHo-iK0 zU2B#2r!(LGhyYnHn##6`f+mM{W{*_0y0PUiRmqV9#uX@OZBLRK=26XZ5-4?h#? z`b4IhJ?W$&!;!?x(N$EEnl&=>Vc%UE)}=?Mc0KS5&RzfH

p% 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°u{r(iPh7*I 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

u$#;{wl(=z;2eDI872>4uFOur9=39^bEXjE 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

&3=^c@Kj%An>)gM_k!=D!6A zWxnRW2MOh1&5s2Muq z4l?|tAYo{P;U@a@>kT8^C_}M|iP-nx}1_?vG4L>JH z7#e8!xk19vD8tVS5{9N4zAi`@syF=nAYte@!!HODhR!hj!XRPje8blV2}4&Keo>Gx zbg$tT2MI$@7=B5RF!Z9~mj($#Um}ppe1~NahJH8ltwF+2`(BPeE)NohN(_HpkT4W7 z{DVQl&^W_C6(kJJHhf(!VW`pY>v9Q0>kWTSE@9{&hQBD6Fm#*Yx8)Lso-_RRT*A=5 z48Jp%F!Y<@AI~KWb;2z*neSf6B@7KR{1>@|p(%!cwgX}46vMyUfiQH1;eYBt7}{a@ zKRXbHUN(GUN5at8hVR^wFyzBMRVn|Xj)b9n!(Y>pFjQgqM>`URCK!HiN5ar5!@u5< zFm#ULKkG;s3LE~rj)bB64gX6=!q6**ACyNJ`oi!t@(4r8xGO65J&;EjDl+`@d4!>A z!@rqF7^*S+=Xr#orH20^k1({(@L%Q;hR!woS9ye?D-8d29%1MX!+(=U7}{<4Z}SL4 zuNwZlJi^e&hToS*81nUY?EgNGFjQdpAMyx86^8#Yk1#aK@IU1dh87zB=RCsD>4yI$ zk1({&@W18}hMqS3zw-z~pBw(SJi<^ysbkOYd4!>S!~c;-7^*P*pLv9#k%s>(k1%wM z;jMha&`QJG`Gld3hWF(YhVC-FKc6u4jNudV2}5riK9Els`o-{x`GldwGRNLF`GlcD z!zbkvhWI8z=^x4YgrSLsPst|?EjD~=K4IuI!>8pFhAu)N^UI1LVdzE#{kZ?g&L<4* zG<;S*;Snz(IGFNDod`ppAb1lSd*4x=35W7dv)n&li@gORex~g8&VzL+2t82My>#7`n>HXBQBL?l%1V0>aRfhF?-Z75Md-D(b%KQlRw zz!aoNNT{mEKk0IV@xHJwc7w)zm-OmQWeXFk9UNX5rZ z!uT%_##p6S14>IJSckj-d>(VV-zM~5N_-uHdwkYV{+_K38DHeJHD5#NVZ`9MbVC2r zz@mc3eqIJ{*N?p+sk9CLGkKC#ng%E(x0>&_|fMXRKwN#jN-W?4ORp@8Lj6`4^pp zf;wTP;3K>adw8M#7CkAS4WD)kE{;7nhf?`H`3C~oFlj$P@=Aow*nxCkk}Y7a8J~gu zX)xF#x-z3rSNxWdY>z{$Ef_R)0)Cy3LSaywaOM;|dkspe7K8o?T`@@5pd_nivb3`y z5o4;O##D#%43v-QJBd z@=i(!=xX_SYSLc)dFl;VF%15Y`p-$c)%H)+WRH#3bUxv70C*DKEW%32hgck(^Bo=b zi_MOa`-5UOWBTvFZBhj$&ISC0FgFJf+Qdb(PzU}9E9qA$w&+aoV$vUKp5$!%Xtw5T z`&hT!F3he$>Y3Y%c)Bl|w=Gz!>C>10cfrZ7yt0KZyLvJc>50Q_|7$!YkOJb>{^2p%CNJt*~2mn&A6KPX0A5_bQ(fPw@6q^;ovV<;Q2@z5(0(rkKL=#HIyh@H5+4KyfR|p-?q3j+@OdG2 zLp!@eD8k4mXdvK_5cl|Pr^tIzWC9#(>NO9=k^JedA{A##ap^W^oT7(NJSSRzhGdj} zFip9Qb9fQY@7d}7IU>s0MBGkr(Y27tPw{d!oA7 -H=)1l0Z z!zAM{utBnIS?A1-gjs||O^`@Nd74q!WRx#_kJ*X%p^G2tnRff0zry$xi0IiF#h(aJ zG7(?{0DjQ)&XC)yg~9eunqF14Fm?o9}RRz#tsxGbzVkmGJXOp)z$&q6=$qc z>n2g&2-Z~#{$|+!H<8=~NwiWKPlJ_D0h}h%&%utNbG8VZg!53BZ+d{0tj-YWFtDP0 zCRr`Z*8pz6S2Ff5D&!6#Op?KvGmJP}-_SdTSVvgy1mb+vIf}TOy!$C~#ck166n$;QZEVF}%aBxB{R;Mgj1p|{yQ4EDUc=<+ z6@*v6fG3Xn{VN&U1a#cjP_e{o+ZO)_zSu&V;#3Af1SO-9x+}qafZha~01hU25MUU= zK7jEAnK;+(2+m1XBP`W;DOoP_ho(R&rO83xm6v-~oX98T~ke7ZKn)2B^;H z1^6Wrn8ceidj13*{?Mc6>i~5C*ar<+r0@5Gi_^mQ!o8%#-Qwb#aPBTH7B(ne*ey;J ze+oRH8YTv#_1s$k}HBo16JbzOwT9H|}FUDqY3!R4&$^}&imp>-nof(;02E?g?-= z68r#gFF_%+cN3fr@I1ja0B;lU6znsCZvprOUQH)d%$D=cPS+o&uiH1i>H)(@fv@fE z9Wc3Yd^tF)3dt(4z<_5xvV$)CcUIboKf#3?qqt})(sO3Q2gK;qqLtt|J2|}7?j10s z#DVVlMj4%N6kBbtSc*QS^G#}a5bP!417sWxS(}irj0WYiWelv5xl`%`J&u5E>HTZO zmTc+zYh>On+E;;ri3KY0Z^~!(*EKWo47Ixnyv*5WDjxazS+Exj`=6>IKQ zel&Ql@QJ&XpATMY^O&wGT<#Me7uiT!I%*|`A1uQs%GBCowKQ)hCZt~>fTh0h6j({} zPvl&yTQh-ary&39k*9y6bnb0nWdl|tNSlURGB< zwQ`tjNi$xIwmLnq5Wn1lVW!WnfL$d297(Brcg31;jwI~CXSSb%>;3cX?Bd736u*D~ zJG=Sy_zj^e!!wW>$$zXXL&ch*e!sCOh-%Z-{u9;JLxE*qc#^m}qXB%&we1wZY>rhg zQirQi9Le9{DpIi)*&s!@b}m-xNo%kX$222z(k>(>B~{9ba3+eDGh=1(dqzE}uH=d3 zQ9b37q-8B?1m<1(0!>ynlK^e^`YPM&yo|D3zU_&kuY7pM7NR)M7nG&S8+wik^M@ujP`Wd zOG0E(q=`fG7jB}ZT)qgKADR81Kg?3{Xau{8R zPt--39mmA8Z#g)J-N9K*b6g8+j&$Z#;yL+PO5pF}-5gHafz#D1`&jS>#mpyguIkW3 zf%62rw==Rgk_}qUk4$;3YX3%jhvp*NxtrDh0d5s;(Mx0L#J4&n5#Ob_E3qzOa^WO! zpXS+z@%O2YSfkf)awLA2#`8sUfk!ld*`hq|iho7(8O(h2qbpXWj4w9y7{rnSAG#V^ zu$)l_KIAqi$Q3Q{A)D!c<77Ff4eXP%SE>2;yttMr75_n|7xCG*%rA2>3;$7K8wh`q zSaHU$0#`Ej-=ZMZ|4m}0_P;SU=XfgkwDN0-^+J(0Z)Ws*WFV-Hkml{ESR7ZP&XO+B z)}=p6bvVBThDrCa`k#sdNP%h67j5mB%4Ba-0j_3ZX;weO-JOo1^_NCf{)kO&YH#es$n>0`7j_=9L!rXE>q8yp9 z4Br}?@Q8s3?Ee>H;5ht&}~;s28A}P|B?g z`$R(9Qf^EHwo5qx@B%7yuqs(o9!Y%>kpn?;vR(QjP053TRr-#BcIoE^`bxhw&|mta zfeEF*85k(Fk(1<*Sej^Ho6sAH--*JhCxDZbUDW&1A2lJvn@N1wK7QwH$gUf-&g;Qzw&6 zX|E={r=`R}1F0GkYry?x6dG5u<=RijGXHc4r?uU+!hp>E&bVX0n&rYiMOUTRhO4u~w(s zVaiySDM{1NxFCCxj0W|kVjT>NWNysf&a4;7tXs4Y6=S>Fi-pf54s;TS^zMjlHYsot zZ>=~x6~RGS-%k>?N)8YnonE<6zXxO5HV?Lt>{%{*6stY6q)c_qEV(h&V**P0){iuE z?3|vb!MNFoko!B>#>|8@N%KWM{pBBLhbZw)(F? zPNcwMcW%mPZi^*1d_40KyonTcpl7rR_ePCK_8wQQ6nB0Y2FtXwM^b9d_DIdLu7d1V zdVWvz4vzh{+QlUXm;*&@#~0$H+e-XP65pc_E=nY^9X_@*dcK3qsu58<7D12q5j_AD zSYo&B`8!1W!1Uw`{r?0g832$1y%N5wKS=O5fNlU&IVaG=ff;t^f?L28-jAT>GRPkz z_dJ8Q7_|pcpAdWsu#cb}y2>8})c{H8k%c+zmh1@+Ty0sm0GOUIcpAQ%1G2Al`Al)v z5~LQNU1>iDD6iv(o{V}KG*^oMicW{{0s8M+=`|VGfal~C(096ZYPbg9!*-Q98Re1e zjjl2kYwz1=^9)7H(~m7{du^2Rtp4lJH%NhJ-TgzEY}ph%t9uQePzIipRJmMI0xxMV zTxN; zYnkNl=;>TmS&`!Vs1ySC7(n?82&UeQ3rr8Q_kLjaEO-b^!5#$G)K?I`#`ury!h(+( z{~hD49(?`yx6FA1W*5F4_Zvj?TnX@RfRbAQ_%WlBy#Q?qHXVYqE`kRE_${K6L$OEf zOE3fA5P+^+i?g28Wi4=7yMl5Z1yd59(qREN2EuJ{ZL7Egf}X39u83SYf|6U93xL%r z;~Bhm48V+;6X0}`eW%OuinHE8Dj73(%3PxT_D-kYR#s!b1G4u?LT6K?O!f|x00Ea6 zO|?%_$=xB_e1rbPz1W7rO|lZ62OCIsm1}`hob?mzkTF{2YXd`SW6J&D2wNH?hU`qOWj0T)IVj@TkKa_?^>p28HKSig0i`=ISen3#pH$9i9 zG6*6l>4KG|8@VzDRSZTlI1)k0tq>kV@D{)#Mz11QQH}MMU>3kR1m6Q(MENxgZbQ&x zAL=rJ!?)SrwwMot_8g5&@UR_Z8(_$4%8LCRd!EU(H18UkcN+q$2WxNv6}tMnO#K|Q z!YyQ~{OMC?fO!H;(y4ZKMH?htiim>a5EQOQz{ETwcu)1)jr$FezmS<|_q9ec-!slc zYUnY$E(hZ3zbm3$mo!&I(lIDw0j%b$Yj8{*i2rTz+=_juzeB}l2o9&9%lmg=f4T`5 z3&EiCbga0p8XulVWXGM(R# z`HW=OaNUyY917*CgEOHm?y0vQt*@g=Ep4l+{bJh^bB-@HG1 zIri#nSzW7OEnvZ!2nx?YbSnvb*0)EJ=<`HC{5`tcP z289et5Y#*~47&h;u0s)gj-=?VR_c!8iuaL#AMa904|EKXJW*Wnmq&7NL^7hH1erzC zTx29K7FUe+NN$QqMpUfyNOnae^D4F(35>|w@&axzqgK*6d&8%sKy|ds2-M4@)$Aj^ zzCd!>+77=Q=`wm?{mh<+G$Sa@m zFs4mG18~7{3{FK*@gmZnOTgEzUj$HdA;8rDu>A`3q_2(b!(lhco+hKD93?4~`%?C_ zL#ttXrxAGa7K!ayVtXT4_6>Ws7<(C5o;29=$XcBa+=l+?bB5Cl!)AouiDsKGuOLC|(2o@)U>Q498B-3Bl{de==Ru{mohWRk1O za`@WbK%y`6gWD1_B2bn%8N++L?R@!x)yu{T=*>mejvQ&S0qaE1LTf^ zFA0VL6cQ{0=nYUffZWC4h7&vvFoEEEfEfVjQ!CzZ&AgYvI+8suI`axVpkOq9%1}uO zEwu9Nf8a4GgcR5nt(d^Hfk?&&!2-LuQ+4#vDYJD#r;pvh>YLHIIW{k_Vhd)ErP5A@?=lOY_M{|`4-b= zoCG#{(wT7$SZS#*WhCq!i={4rwBOUtqA$Tp+Cg%HX>~eeJ4Pe+qnI@U;U`d4Qs8q} zPg5*APsB&g^nqD`?0A4#Nx3cP#CM;FeB@rkx6&Jna%MOs|EX6U`ht&|T{I4?_$O8F z^mShip5K`bbnww7MTs+UdPj%l=_yM$@MFp6D}OY2sdi^cKXulzI6-Ci`qu7LkunaK z!VyuhhQWFU=P|e#LEkixJdp2e*pgd4RtW z^gIIRB?Kb?wi3(*xPstPfEx*Fj>KppXasl!pl~mP*BN}o;2Q?NA*eZU67CPetimkX z)(LGkfwm37@BDzRz5@_0WXz#mE0U4_D8_c(4&{FT#PY=6QARk~TqmMvP^C7sS2{KWe z`2?i^jRe0eiXY{5}zMmJwp!5T!s;;j(gbPL7^End~DU_1DN z+ZgO%@C1Vw5fr|IpypZ>@EJKi<5ja8++P4z-_+x9UddV<*Rh}za6vBy{TWmvsQD0@ zV+ky{bt*vNJaSb>;Sn%`DF7!BtOPin@-5^xgS(vE4GivP)LumGB1oBnJHQ0J0Nx;& z4Dd0*B>?*f_5u7!&~_^J6l(xV0fGcm0lE>a11KZ75ul3TDS(j#p8*_6(0&^B_XI}( zECT4#4c?n@FFwuld9M5DWCFKRig$6aMfhpqg7?^(2BX0geHH&(J;3tAb0QT_! zTL97sZUf-cDK*ambR%d}V_BsH{Qw3K%m5fhum)f}!B&9j0EG+4-3hLV+{xrRp%Q13 z+lpZ7EeL)=Ju-*coeJb`$cxZ^2C)UNGx!&S?+_IJfuQCu2$SJ~!uH~Zu9qxDi$8$o zflo5lWmH@V7vG4uiqin@1+YZrI;db8vNG0YR6Ogb%uqREJC$DPUG3jG8lwypxW_ev zI#|}hdt^4umZ|O@UG4LV-$bJ#H_X9y_$#C)1uCOUjzFv3Q^PHbgs;VN>b2#k6%J#y zU5#A!AQ!Xo@K49BK#<)}ipg4!8B$I$l$S5$K_-(pzmVtPqHWNdftl6t4}s@IZuqys z*Q%WB&&aKvU@*!~N7?qlc1AJZ*p11&_%NI^g6vIlM=@U(S;2BW)n0TthQ8|xkL$XY z)&3wPB-yWXxwM0F*GjNF*Ji)|P-m1VS-!#S<*^_8Eh<~pqma-!r{^~-T0f`fg&rQm zmtoN)*{9pCdql1?cr9v!6cxSTW{u+FD+}Ei!FegNd#wJiB=kRL5hvJ`J&snPRdIc(h4U{QcpFWZy@2mzoG8e1= z%cud#-sN_lGI||mm!J7s{Xc^i$$rAEsf=nqp_=k@+E=lE6Y#YG0rYn3VDvIHD~^Oi z8R|m;1vqgT{+7PEzv}1;y+v*35>;(CYzLyMpAFlQsA@=mM>&tEYNKKEiBe6Tax&L; zIxcH~?1JmA!ZNY|<|xc;Ak5{Z;LLS|9RyxT*iqp1gn0sY66O z4#LdcDWS9g{}0V!Rw-qG8z91`BL*6nmNLx1wkhKcY*$(f$g9B#xO2Zrv(-1%cg6OQ zKdt8WSTg&sztdiIJ&QwS?GRDb9@O?99pRr+qV|Uk!p}}Y_CYk?mZ$m@XR=Oq4@Re- zLya;z!AgA{jy#q1lw_|LKgvgQ6bI`i zTApvBGwc#Vt9=uqPXi@%A#VrwL~!smfgEx!v(mq1Y{5I6Zh1cvNW89R>fKxEZp|L6urH!TI>IY<#I_q7efR1$Vdr`ZmKnd+=i5jBtm3fS%A-%Ss zLx~0LX+g$qV8x2|w8CX(zj+Y9i|mt8LPE!`#V3O=KLdd^`h0|K-orIWFbR2GtoG|+ z+ohm@6laU86uWYiiU-=iit0$k15%_`=3huWr50I6D#J30uVHX2f|BQ8=i>xl1Mnf0 z@&^!zk?$j!7}?!p0|oRz#(^l2jt@xlyWAwD zFZ#eK-BTwkbt~eXI{3oNQ1TX*-b>n>{ZnE7_bk0v2__76`T_!D06g!Z%{qG1! z$p@-6Qm$aD|G}fNP=Hd7w`V1y;BL1?ncVw`Pqr6Akn;!ei8enxm1E0CFRhst*}n%2*jAncE2q=q4#BwU7m=ZdZv-KxwJ+&|xM&dX?HsVsB-# zB9@%VTUV()=%dVg7<-_^?tqP{B@)X`d#ZjOu>B{{Af?o(Q_HZeQ5-y2pd{w~%9Nw% zG_CSXpKd2){;1ZGI%rS&NM)UbqT$fsh{`W4n`^2!!IK4bEH>Pj(xe($3Nl@(EweQM1 zap{$~XP1KYzy;?qxEMjCDhoRf%?WBT{jGf3} z27?6%tgas*ocpET0&nw1R!vSFu4yB#rVqfc)JwP++(K}f0DU`EVLfAp8`@PIj>z8N zt*+U3<8m=_VIOU?A!}wnR1Ke*kzw`iiHM{W2+vL{I2gF%6PP&^pyqynaRA7B8vYeh z>CLo?xrkl_zF-xCic?Y2I)IvM0nQ;PosZKNg0%qG5L^#%8^L1$I|xQBz=r_=3SVOI z9-|r%^(DcT06!Bv1mL>_;8TEffWi*s0t<0%oS-{E8KXlChBImiqQ;Y(&R_w9CIns1 zM{xEx@Cm(eR6=IKc0?51j=<{jFv3H>b7WH!+7>)d+1r%i==Wm)S$>RW29wk`r{}}y zWPwC5efS%9ew!_+qIWre=3ag}f<9RY)*=>DM9(&}ais!$Nq2xUs#K914{jvEPJkl; zdTc>(ITNk7b9*jD>{S$h1#mM!`F-R%qD$^3s04V9U=qNalz+_NJ4RiMsNV_h1!&U- z(b)_-Gw8*jg2AB(aP+-3gg(d`3>;EnV@}!$zUDB1rwQr+UL|-Q-~)m`0KNjS`iwyi zuSv?Xo(Etc91XtbDG>8R7bQy(vz*{Ufa3wmPb0S*+(rPa4<97@mdOVf6yHeEF=)7Z z2-W~RLLF!K@%z6pS%FFHOFFM5Xioy=zC;OyNca*9pg_!rC={67pwhl z81gQSImopd3J%I#ra!sit|;-Km>EmWt&Ey0ztFO#oQ+}~bA4eJR-D723xe|g2ukjP zrGv>GfIuuw`N6TY++*o>$O~y{-)>g>1IFPp2Pko{%TmF*ZV!&mx`SJ^v^r{OwK}#5 z#YP;ZVD8uCUPB<}erwFF@|Zgj&K^K>2g2OH!_+Hi?r4{} zg0=BSx7he&qBf3E8>ju~vXLbe*D_eb;8+CZXCo-t2OBRS$7dkK##fLI*h(Dkv5~*2 zoIo2#6j;5#8i%n0viXW8oG8nsGQoQOG)0y-o+H@;)5l}Jwx>qUhU}@dQO*zSnc{P< zbapNGbJmo>KSeC}g;{QKTL$?E%KIWHXa`l|2#S;;fq%6XfT!LNz3kXI6 zGy;^Lh@j8?2%bYKdu37Asdr(<{5Mok>8!%Ef`#A+THo@!o+#V3#a8?G(NN#8u}WQyCD`RG zZLG3rW0gg^NmjpTV?|E`vnr#FCDVFl*#wj^fXS>W9sa;`F1SJo` z+%L)fOztgkzAS)$1EdplSd2?w0OhYhE`$Dj=?!!0^yAuc-= zq6M;w+lktGsBzlJ>gHA(P0KbxR7g?xG^_o=6L4z`lp|eCJGSEB#z=Im+j4RuuE>#h z5TO;3>7%CpG^Thpg7R|^lvJXA7m~Y*++=V!6Ep(cM{pj%Zpu$#@EiiE!i>M1n)Y#5 zK}7#DqJ!O{W47P|+5kFXKu=LS+_KdP6>hcBG;b$`SQ-?ejmSMReexR09|Uzl|$ zzKX%k2uePsZwL~XV3Y!s--keI_ZgD0ljL-8uMDI41LQ0`$=8FTj(OIUdNAK<_I8-k z;x7=C6d^;tTB2kEKpH^#Pl&b-pPpb_ob${qeFA*31=Kz#wPBxL*p*$^tB4~7i+E-j z}O{S)dQx(N}P ze2C9C>=wjEU*cJIl^=5e1lEmq#7H1>17S0a_}d1Q-cm$O%9$|K_yyb7H@dK6MrJdJdj@*r)0dOe*lSF;adf6L^vS@uBj zc;)4Y;E{A4f_$XJr_ob(q2x!vgO(-SJ!7{^ZWs2wR7jzEpI-uwqXIfIgU3#K1tM!m5=BDjdk;v z)Xi-!JF0fc$~w7sVq)gh&YN^xLv!tFi`z>RJE^&`zG1z2&34s+!+e`Uj5C!eoeDJCtcpIhg|4|W;2iUy8cQoEqZs&qx8 zfXQ%))UHNq_YQ`@I-nV#l?_d`^XtkcEQ5PsZ$Cseu54(oUs_i-OQPo2&aIOV37cw2 zX3U5lUEbUXgj;_gpEVm}A_*PkMsW4Z%BD2dGtbAsH67P57lkZaB3acnHZIe2xsq-n zT5>zmvDM}r*Q~bo5K(4(ToOR%VDrykvaGhbvcHuGo`nPQ;LPi@YC7V?8+p77P7H6T zUDBtywrO$MWCT_Rh?qv+?dz3KYObBT*g6slrsfN4n-(suU2at)uet_w7Bpy|IrR;- zjmMQOsc&vxQa7SuUVUwYRgFa6%%nMMQH2#qE43bnjPRUETt;*17dW}x4e1>EW=kZ^ z%I3P&RzY0uP0h@j2f7I=U7C+G5#deDe8kN6#5|3d1D%*>F(!Q0Pl)-V3$~l!yw;1W z%5j;*cmf5^T|8`IZGFS|Ig2m~EI-m2;jAX<>QqZq8fAXvBth-A zp(RX`1#_iZ)|=?i(`Uwv&yQRt(VuXFb!n`R>o{Mj1J8(W8jme2VTV7i8%$hThpDar z)3q_m@#xT%@OQJtPk$MSdTTTWdTlcX^}jVUxaNK|veU#1{s$|X@laJXN2gxy#+}|K zDxO34Y3tOthtPqbCNFAN^tV|X$^uLbrvFKt4K;LN2 zU$$i4gxdN>>z`0HktX@!v2jTJ1&a3QO|G4@q)xu?JALMXEl3V!GT;MO-bj(lM-3`duMNBPbbjE=d>8dhQJGPizd?GjnncmWX90$&$MH&BGSf)izsvEs}|?Tira8Yov8bG$}^n&)`fpd|jqdcgnT+ zI&%{j&G_?(xhS2l!89t8)#!%#%aARuvx9urcPC(XUuao;a7wJNYvjh^_!BMuMsohr z=CYB?8kg2Kb3c#@J;qFu)dLYdP(CA;FSq!MvdEZ0T+^~fC?cqv$8~fF3Y$K2dOzbu zzEyxJLAvqb56`enc(!bOta-V2$)<<@{vSO}ml4n8w^E}FqT(+!v z*fPvktDEIV^Z!K_jnOQ0dgcI*ol!AQ{})v(Ym$8fFD3mKhM|4yYL}YY@ezRkJQK&s z6YA<3WdqE+>Hl>u=*p4_FM|E&nUsxU=W*JKJ+d3fXI*gze&qwi>C6lO6vUMoF}j5K zti$falgH@Ek09p1D0+C^{MwaEn%x%gx|W3?y{_EvONCrx}D;j8e-e<7mjhsxFH7#7F9THGxi;N7#Vh5Rz4`f z`pRd8iKq$AN(ckUVRX62Zw9HZ%JB4yQ_4C-oEni5ovoY|h|B3!NM4WV620T-CdTR7 za0}NdEtQDpT(r>k=oY0S3miCuimPcwn%>tfgN*suVWKI@#pFZX0g!O$sxFby^?S-Z z6S{pM#TAeiETWVL4f9#$;a>P}G;z1aIq1Jw%}SSMe2G{~EsSc%IwI=RBi=T99pz(z zvWh@#d;ah3VEmJVrPpH>nG9|^hnR4v#OXv@8I6cG;zYp|bgd^hXl;|Bh zOjMy9`T)@h5!qHC?pd^aq6Z=}6ekD0Kx_7bdmhwsO|nqtKR|5r4CK)^k}J^)C)c*& zM}gY-)wYfvZ?O!Mi{Hw!!U3om)x0>>Jt)jnB-o;qCtoy&|GxogC5cSBc5&(cU+KyZ zCLNdf!U;geh7NHybcVDVMBDj)BuH)72GQwsqK_f@<&8UWJ*o; zhno4~Aquh`I3pQU~+@Nuc;tXBT33 z0Lcv?rsDtG9nAk{i-%*&Vya<~j8Ok$Y9hK;Im_DzsC$Y_n&jyrl(Gzy*1I53`T?Xr zYR)Lfat`{9Qc8Y~NQn;BaTK#iQuhl;zHf1qQA){=5h>A;&Q#|u^*uDx!LXtl6yFCZ zO{D2Yt}9NSDDmh++Hje-kLar8o4z4>cjV!qMda z>m1DgkAPZEwFF*mi1?Ujn{qKVVhLP^!XVT)X339ezUBXEAoUW_ zq6h~d2kWw`H|BkC?$Or_o_X;9I#9f)|EE;vx0>ooNFHic`W_`{FRn%>|g&z$0BD5kp-x!w+fFA|_62YpuD_rIGv_x01$ zfo{l&{^fs;IW3*2Ji-CU!Sc?o`0v`5k72Y!E?P$HmfkI;ztho&^FYMC@xKhDBZJ7< z*u|`av3ZO^X*D39)z33xsKm8M}PpKjCF0a%4obhHV=Nw*#VG+S1*Cj4j@l z{-4U=D^wO}J~5+^DNlp}C#!XM*$;pm^gg9?!PSA(b|RzeJ^iBYa!6M>y57-F>E)1I z;YhvfHKn}t$IH&FYrGZrBHevX+W4IRgoJli{Z@HlTm`t`!DB7SK4?_{TtHXoSfsk>M(T05l(ls!bDS)i`n4P=Nlk7!_kdz zcuKZ7QmJh2X7@UxC`Q)~Q}+-@*IRMwc7UX#N`3xtIS?jw zsfyQl>QWDPsalaz!nuuZh)>%el7WuYYw=_>PU{Y)G~U5j_*$s@I_P4Fke!~KcO4F9 zoKvV3CYr2VOy6R{21u4ibcxPzbiL;Or@AX$IeFdBoOsIenU)hX>L}fUQFFeIoR|fN zQa>aCXI$ar9f)W1@m+$togv|^Z|$Q*y(7A=O#^JGM7(o~5Yx4o5AQnGgW@LFX#jPKJ;1EDwPc-FEw;aF%L zsgqyK`7c$=A?c@5ECfVG*SpiEF7Gz~uDUTDfYO&C;VlF0NJK{0y90P<<1@-StjRKI;&VdzlZ1|Akr#tOt;T z^D(7YgS!o+eh?7?O24kgnF{bu5bNso%l|CB!AYBl-FDxwcgM}tw?clq<_)`u?o|$F zXGEr4@A(%~?qB*6(!QcO!N){jD%U~{c;)B-5Nq!p=`5$0OX_WDN_l>GyY`?Ka^}tW z>p|Roqj))tSN~tg?uR8iTD4{rBx6*HHI0a`8)U0?inDGJBugT?L`FA1PWN3%-*!;)9Uvbfn(2lv46|t5VK5d}Kpgo2X2=7+*1`@sLc6=n^@nV=-$Fb$R=w z${ByDp0P@4JtUkZTJk#O&5%6-irW%xfyd{dGV`1YSz#h)8ABK3vmPrVGNM(=K}N(= zaSl%JrCH|610`ch=o>x>|F3ZHjrjkWgYi!ePM%D2Cb+XfI?RaJQ1SWSfU(Gqv=$V* zC82Eaeq{GRb{|N~AnM~ZkoUqN^LZH3T@hU(qw8I`62__*Plg8V;eQU3Slg(#1o7O* zYxzXfWF5U{=zE~cV=KsSwe1#u41f=Q39|`6H(ikQ^J8xU5((4rpikX-aB4P+vD38C z`#aL5!v1nB>1~H2VBtEa@Jjui;O+*g=|qkru?M4dN#aOq5~T>owU>yNvyyh0roSs3 zHHmnmQu8EYwW#R}_XH{xj+(swJ~6_r0dnq^p#-9*M8*<`o>2}mqW18PmQIwb9Ard& zBQn0=(z!Md84i(@`?tLq*K%a$-z4)rcTiO-od}v4oBHXi2nqnmZ+}QmQv2$OsUsfr=mVb zgQ#nViTKgq;&n&*&<+z7DTj1K;~iN-_%fi&BQhe>gA&4gCu&ez0_liK zoOaQEF*zb5s*lLd1KJdk5p9pi_5wW@krDkXB1=oa3=h)!5p`D%br=IQHXyOIr|@Yg+!z9RoxFD`2++LyeE0g$Osdxte3o3E-C#3$^O!eVG@yZHO7k9y#(&M%yF3& zCb~+w81tW;hDR`vQ#(+cNfh>mpbW%Tv*ZDz3gu$X9Qq!uOZ5;(YKI$vnj;*59Gr9S zg>EIddJub&Kg`|yo64aSB5o@v^Uh>USp^AGreK!E(sp@b%sDG{4u_nV-;$t1yEiA0 zV=9Tk^6c$p?tH}!mqV44G)?gKBdR_F$+Id&=0wKac-@yADW}cr&<6k1c0f9!N0p1& zbFqwcNHQb3MBN?TlrXZC!#Fe7CH3y!n9~?Y$AaQEj1-y+Y;0dUTo1Lipq8tB3naIx z6uLyMn}3f>>fH=Ign`5^mkJVJj{rCV#6o@H6M(qKR1QE6)-*2RdXy1eJ6cnvib;RBJ2bK3=t!cAdc5Q~Q<&}!vS31MnXorbX97klu>7E10c`Ai2(QZdKKHo1P`8uLY)XCY4cy+(1MKy4o z1mcMSul31^0V7V0jRY?TyC_rgit!?lT2I6z^sl#bQ1>H9K6Z4iFwwV;Zkw=sw}R0Y zz;E9`%*Xq%AoD4<_1YfGw8Fi>aja6eP54Npn(U-Z49^Ez7~xQu9LDy&;J63Xd{l;| z)T!AE$nzyo-10{g+@~~_JcaqOV}kd@ow`A|p4)5|V~2^}R?bTEG%$6mA>nBcCnx?t z5tPAn-Dwt&lUq!48uVH;^e70Xg0yfVQ+RwY2s_f)ojeUQGAZOVY{kw3smo&>_XV=a zKv%=5s`uI{^QnN~kk*9bA(+#eu*PZ27OQzQgfq0E(ItplZuTMQp_jqnYe6_2YsddL zgRm8CyE%dAE)XuUq;aMp<|YoCgCz2s6UcoJ(oKfOft7=;!~D68bJl&>Lc|pGm3LC1 zE{|71o`J^*ChNmphkMhpdiACPrcl=k6Ae`k3nh>VCA{+N$HOf)GX1CWFD zX0Du-cnyiUdKX(t&w}I}N9qd`U9DWq{e|JN4FrTL)6xiSAGir#b*~7+r2gP$ALvg^7%AeEIH4*dJ!M zGP>SvGHuuhDHlcB;N3M)IvEnK;gs5PdSh~mFO{1bM+#jqav1w5#a_b6No6{@vK-6= z@(_<&F&CUE$Ga({?kSL-25Q;j_!c)g#oKf-a=EI-oUT7kFLXVi(wO$3bOR*pcX89t zeuY;oMG_p@cFb^Q1aF3W#yB@!OF`;=BD3kX!*_uDRb-rXh|IGrc9{B}dxc}3>QU`W^zT`yJvUr&>kWmo zQ3X~Q%@(b%FuW2tTTR0irr1n*&upz$AI1?Gx5evn@jczqwZcTL>+*-p?`o--zK9NT zDs6{}4pt6R4v}$)w<|X`skQ&cKTrQ*1o!=($RiOk8Kj+xs7^UJ_5`4Zg`;DMoCmQ` zXQG!y#t!fb&=CNb3}P7DQeC0)-aD z4R{KNLNHN;F?*by3-mU@TokPyciTYeazw0BDHglOfSyne76Hh?NtC+0USSqSZ@;7T zL`Wl3(oQgYKyPaS>f2V}f_RrS1ukIwpAg=t*lJ z!OI4dgQ6UC8w!KAB%a!2r~d&IyCJ@Pi>~)$p-g{!%ixE{dqYy`NWIO< zuXi)u$spbkz&|-?yIZCgM`NW8=yPj8tXX`%l*;SxT9ndX<3KIvObIUuNO!*)Ch%+GBs2O>?1e0>OedQ#@XIg-IIK_C+g{aF5``uNFVIJ#=zK}Q% z9>Wtvhp2AMSrv1d1Iav?W647co5Ct-#l+M}G$+ZIOmj)*Q1J8gXTpzd=nsdv~@ z`Y%YocG7y?P3fPIaMq8n4yB#ZjSE1O#;4tjZuyRO+L+S>rajAXF*=@i9Jz(exJ~#P zsNMU2hBlCwZ0MZ4LLz0L!VHt_xn}BXn4l*Lvj56;vVcNResRyOr zu|a9HmfjQlgs1e!13YKqSm1v>TjC;2R0oQmcbJZnGeDeUufczwVY77anM=kqh{n+k zMBfX8fIjB;!IRlNrSoR}QVCQ|GiPuWq3pWBLT1>&1pktL&j zZvx5aehFX<93D5+>;Gn1vtiYIvCLa1%6>-tUm$oRX8z-cko%$R8B+e{B>tc0VE)&O z(XksKrs56nqu@Q6<;SOE69b~Vy;p&$dM?y%2E{iUrHzRgI3P8S=nCap$mugkcxk`o zoVsG_tOSWkS0-cm1<@q$WXD3cKyABGEreRPR#k_l;)DgH_7U;@o-Jp43Z&~JxH=a5doRIKm$$i&P$_hYCbg=2HYDddy8bZHRgSKAO5#_T zd7ul%d6%-Dh%W)rqJ;2+$V1Px=rN+*POjcXk16YsikE+w(mO>{dKM(-sWj#S4yC&x zdEAkr-vG7jLF&E^>Dv)q06EyJD6N8hhp3IPm}sP9alB3R=!A$ak@F-+%zDp!=RnFy zO8X8`gK{x_hq{{}+3M(e7t1X#=+n(Nz-FCS3Zd6ibUB_*0XjXxIaQP8f+^|4b0j5O zgXmJ_V){CDH$t*GqDy3Sz5Ri@??d_rh!4c!pB(fjWnY5(8pL}0!$dzQhu%T-Z$}ni z&-j!qL;Dqg9HtcG1zZd%^q6o3E}XIvhee#S9H>z^t}jIEm4g$wf}AHDoyjJ+CBnIj zWUg6|a4>3v67^Lsra`HD4J5qVt-9`<4&0{QnnrW7;)L>?gTKOm<1DXxnCe|fsX>Q$ zyC$WaM4nM8YDvUgsq0l&Le9h$l} zD(%(Fg7^Oi8MPhr-kb^CHzg~3^J@Vi(osw#No^7>H!CTi~qknn7=^c zg#zmE1}m@K5?_t~95TeO;QxCL{v7{*a4;`>9|5AyZ2Vu~;Fb7)vV+gX|MMMu75;NL zQJ?P{-R0mn@c&~6e~15nI5-Ep?H(ZNSK$8$2T#O*J`c$FwfMim!Kl0(#;aVL*ccq- zR+z|Kfbd?pqmQ{ycnKtf?oEIXK>xD7!60x*M`W)0WQ0!!_qT|Qh>ff1 zt_QjyA|o<0WrkdYH**~Be1&9f7lp$kZ5L~J~j@xuL~5g8F1 zQ)Nd3&4|c|%)_4E`@{5;>7q>Ooen8I4r$pLDD|GL^NaMaqn141ON2Bz=D{|~`$9e# zAW*m ztmZnGW>T2<4|Y1~yv|{|RgfI3Qdk;WegKZ4b6BSLNg$@}>XNpNOM5t^<1{UDCNeo? zgr5V)vCVwF&+jnbCP+A2K#JLm$hlk_)40^-)4?SmPxCY&V!5_BG9WrdIkYfO*mnuX ziIV71l|hpzC7@>c!bEAxK}J*_k+~k3fs9X493PS040NksShyv%UBaMb)3XrIcUNtA)pKDMzh+#!f3=t0`1MEux-$|eKN7LK`G z3dEljt0vJd<&ev>KzX^8QIn{XaI6DSopR75S`d*DZFXcC;U-*-UJ26DW1Hl0xR~Ei zqcka80}Y%$yY3QN-PP%VfRO9&H9 zRnGFh%8%8og5(fK*B2%-x|!kIz}?}<@N5Lo1Iop0rJ2ttNKDGKa8?GU2M{grg^7kJ z*TM=q*_G1!x<2M>q&(RVxbpGdC!*#6m(;t)yYp$$o9;qxfH^m5HDNlDskHYQ$+%1( zh3Ye!FypV+y5XW zPpGto9n2SyB(^pR%d#drltXvBoe#ezEJ)DZUG2NLTePN=5l|!=rQlrXIvd5(vzwb^${mVd7;DFwkaH@~qSr@3I7ZJ5U^$UFYlz<()k3C9_h=sV@GXYAAo=Mx~! za}rREaMUDPrW`a^0BsbG`%t3IDuX7`HOfKrpFp<>N6oi^K8kQZ0ws4g<)r{+MYs@9 zb%fglv^B!r3B=C~sGZLOy%gcz2TJNeo%Imn-kn0=bIHn^~H-2Tc z4SOBe9}cJ#cTkf^-AK(?!yk0YZ>dsl*oe+OH+0s;x7hq!Sn8IDLuy}_3q{=-Q-9;`*8jci*R@K;}u_p=9I4N)=?j5qs#b~iS z@5%fBPI@m&(ccs^cXIcGP^L^HS|($7O@x+k+GyDllUDuBG_;;}c^{CWUH^$Luhjes z;ys!HD4p0w&MA(Kj3dv|j81HeQtk(-ZA8X4?<0@2Ed=R6N7o7y4N|TJ|MF8(a~$3H zQFlT*E^UHhR~MG@CsH-xS`sZDiyFjQ{J)VeL3;kci@$`7ee)U1NQXQVq_rkGUb&d3 z2mXK29qm}y(p0twSvmUQ-Sj)}}Me!^onrI%W279&FuR`?kxJqu!g!)pbAUQ!M-Kr&2B zRWl(YGF8AUG{MbM88kNmnFVkZ1EK*p$dSIsf89SN=jwUpuch`+#O_>C*WSU+FrWYS{i9E60X=JB-~4(VYa z9lx;|?}OwwP>Ze0spp(ls&yseuLH$ryL}%n=c1fNAZTi^v5>5Z=mN;W`GC?V!0iEP{fM4XE@o1sE;hZ9AA(2s z+RSO*FZwJIACQZk-YM&f`0gO}F%dPv#awoyE`KA({W_)I<%rTRA^k?vV&K3aIgAbb zRRZ_^S{t|Yo!=~LEh26QF=wy+lr}-KN~JM5Q+g95x3(zl@Q0>5u2tzHkUZ9^G=SQ) z)f&Z|STSc**}SkI)~Y}ES1vzI-+H-}wq7o!t(VL1#$N@iwnu7|0PEXC+GHNkf(QpC zIoLw{Xz<&mkggGT~OEbGp<u zj!nI>w1FN0eF#b`#f4eWFQCLSqlL5P7`>gX=uJSHCeRwtMW9RiU=;ve19}Lw2lOh) z99=W9=zj3qV~#-9bl!%t8HQL1~EFpWgA%iOrX3%uxe84>TXN z4737tBIsn$IiT}E+d<|qdaDq(KfRw1#yQOZJRku&7G#c}sw`{pKx|G9!TIAL6N}ST zSNuDWeG(%-8EH0vz6SM#%p4aC$1`Cg@GJpnHfS;EM36c5j>L}nFvvlDMq@n%HG|fH zHi67x^lG3t1+)aT9P~HPf1B~aA11bdd2ASi_h4|@NJdBOzk=h1I7@oeI`grbb}UOfMrFplttjP$?pd^O=F!b{==qF?cotarj7!p?-B z5q?id|B9dDJ)u8g2w@CiDd89Y!Ml)<{`FtV`{Th$!ajuG5Go0$o&?NKPUoWBiOeZs z8esupzcZ*uD#YlQe)s1(;Lf}B?|+-VWEs*6;Y>mUA^rQY^f$@#IUziSc_O5L7t^;Z z2{#cQ$mr*fr5^}xEhbz`c;!O&2=Hq(VG3ayA^ki4S@ao%YY3(}or)#p8JKs%afCAn z>EC^qaGdK>d}awx64Jj3mw_{cTL>Q#2C#eYdj<6nstM`elvUu$)zD8u=WE#q2#c-* zMudTPGxvlE_oj2x-~Y?}_fh{gLi$(B^Yw(A2sdY>_g>xJ{D?7axJcWgx?X;zh?4oA#}Q#bw-)=@1$GVhX`j8&Ldn&*!4E{ zSHf08`d1B;b3Z|9YN?>pzj-aJqb>A-u$u4{;TuBM8>}nBn}oG*!e|q2ejA5M!r$Iu zEf6-ni~BdB@IA&$NPWPXA*>@jN=SZ4e+iEeo+j+nnr@Z;{Ybl`{y()l`6u-M$° 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 literal 0 HcmV?d00001 diff --git a/demo/wasm/config.json b/demo/wasm/config.json index 461c35b827..da4d55692f 100644 --- a/demo/wasm/config.json +++ b/demo/wasm/config.json @@ -45,8 +45,8 @@ "stream_filters": [ { "type": "Layotto", - "config": [ - { + "config": { + "id_1_1": { "name": "id_1", "instance_num": 1, "vm_config": { @@ -54,7 +54,7 @@ "path": "demo/wasm/code/golang/wasm_1_1.wasm" } }, - { + "id_1_2": { "name": "id_1", "instance_num": 2, "vm_config": { @@ -62,7 +62,7 @@ "path": "demo/wasm/code/golang/wasm_1_2.wasm" } }, - { + "id_2": { "name": "id_2", "instance_num": 1, "vm_config": { @@ -70,7 +70,7 @@ "path": "demo/wasm/code/golang/wasm_2.wasm" } } - ] + } } ] } diff --git a/pkg/wasm/abi.go b/pkg/wasm/abi.go index 546dca9068..c60cb54654 100644 --- a/pkg/wasm/abi.go +++ b/pkg/wasm/abi.go @@ -37,16 +37,24 @@ func abiImplFactory(instance types.WasmInstance) types.ABI { // easy for extension type AbiV2Impl struct { v1.ABIContext + abc int } -var _ types.ABIHandler = &AbiV2Impl{} +var ( + _ types.ABIHandler = &AbiV2Impl{} + //_ proxywasm.ContextHandler = &AbiV2Impl{} +) func (a *AbiV2Impl) Name() string { return AbiV2 } func (a *AbiV2Impl) GetABIExports() interface{} { - return a.ABIContext.GetABIExports() + return a +} + +func (a *AbiV2Impl) GetExports() interface{} { + return a } func (a *AbiV2Impl) ProxyGetID() (string, error) { diff --git a/pkg/wasm/factory.go b/pkg/wasm/factory.go index f48233c030..4bd2eb1254 100644 --- a/pkg/wasm/factory.go +++ b/pkg/wasm/factory.go @@ -101,6 +101,8 @@ func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilte config.VmConfig = pw.GetConfig().VmConfig pw.RegisterPluginHandler(factory) + + factory.config = append(factory.config, config) } return factory, nil From a207dfa386df97d53ea2783c3286294bf016fb2d Mon Sep 17 00:00:00 2001 From: zu1k Date: Sat, 14 Aug 2021 10:56:39 +0800 Subject: [PATCH 04/25] use export memory to expose ID --- demo/go.mod | 1 - demo/wasm/code/golang/wasm.go | 6 ++---- demo/wasm/code/golang/wasm_1_1.wasm | Bin 256374 -> 256217 bytes demo/wasm/code/golang/wasm_1_2.wasm | Bin 256374 -> 256217 bytes demo/wasm/code/golang/wasm_2.wasm | Bin 256374 -> 256217 bytes pkg/wasm/abi.go | 18 +++--------------- pkg/wasm/filter.go | 2 +- 7 files changed, 6 insertions(+), 21 deletions(-) diff --git a/demo/go.mod b/demo/go.mod index 113526a0df..bf0fce75c2 100644 --- a/demo/go.mod +++ b/demo/go.mod @@ -10,7 +10,6 @@ require ( google.golang.org/protobuf v1.26.0-rc.1 mosn.io/layotto/sdk/go-sdk v0.0.0-20210604030858-e880c02bcf44 mosn.io/layotto/spec v0.0.0-20210707123820-584778d048d3 - mosn.io/proxy-wasm-go-host v0.1.0 ) replace ( diff --git a/demo/wasm/code/golang/wasm.go b/demo/wasm/code/golang/wasm.go index c3d1c7ce1d..4f113d8d3a 100644 --- a/demo/wasm/code/golang/wasm.go +++ b/demo/wasm/code/golang/wasm.go @@ -71,7 +71,5 @@ func proxyOnMemoryAllocate(size uint) *byte { return &buf[0] } -//export proxy_get_id -func ID() string { - return "id_1" -} +//export wasm_id +const ID = "id_1" diff --git a/demo/wasm/code/golang/wasm_1_1.wasm b/demo/wasm/code/golang/wasm_1_1.wasm index b4ba57ba49e64d4879d84bd3041b0f850198eaf3..67c459c468c7db49caa24a381242907556316c45 100644 GIT binary patch delta 1850 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 B`r-fp diff --git a/demo/wasm/code/golang/wasm_1_2.wasm b/demo/wasm/code/golang/wasm_1_2.wasm index 8d710d224b07c069de5532dbf8c441637ed62648..1f189048fad36083ab05470ce9901490d9e98817 100644 GIT binary patch delta 1850 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 B`r-fp diff --git a/demo/wasm/code/golang/wasm_2.wasm b/demo/wasm/code/golang/wasm_2.wasm index 21bd666d49c7ef1ce444526a885cea17af90d169..95d8054b60c410775d31e1c36823f7e6fca3180c 100644 GIT binary patch delta 1850 zcmZ`(Yfx2H6yD!H_rL`%mxl`SQeGp5Kq!j9r3tOQ@>q@!tJj`WyJ zf-UlL5-?K}72782jMKij!OO;2XqU!Vr{X&?g%R&3epNgo8Sl#%0SWNs5A#KQ0!Bd-`3X2l zMZ#=U%UPt`km`C$<&Ng6mbZ_nA{Ro$6(xuf{Wioy%J@XwfomTLwQ9sVlQ2=l*-0@~ z%(Y`XW{F33lp|McN`e<1d`A+-phC7M!JU)$Y6{wsD-TV=1FT(Cz?hT86uDAoOtrwo zA{UU$fTqZWgV4;(p;pG$DYf~3)GRigBx;#w64>>xwvMdoCRJ`4geDey%T+1mv#H4S z3_3;uvm?~5p+_x@omSj3z(K-`;;RgLzaH^J1_F3rfw+~S`dA>H=3*SDMkZ!qA1vZ_ z7E0hRa>|9Uk8L6MFc)KNc0GknlayDT-r^O&Sc4H!)T>&W-+);Q z$|9EzJx>{~7m?A-`eJ3=qufcjN{%hTo$&Bha+&?qw0fN}pv9Mp-W$Q#@h8-JG?1|i zVtN${{S1BbQ+=|bUm8Suak>ioqc5qn2k53_d0!d8Rh%)`9>R_;2JBO?M?vqu=ZigC z5kAhy0>AVm3;d>vI~9_&1O^_Wa5f*zbE?K&1d7Mi^aTRNq8j)iSZu68f=46?wJ;RZ zn}k}z7#l0vYY;c!_8oB78*cwv2I-1AvR#q`@ydwIV4ADkm6G@?=)ZZtmjY2#y6w6#Jvhd)-k zr>g&f^(C4|(*mMt2JI*6qUdyW4%Z>#^%Hmve)7i?*vqk3tUpQDV1(Rr64CGoQ$k;^ zju{%9!`MW5`+H>SNEcJj&~DS@!ZY}Z5B-*QGbZxlAm}X=8E5fv+$<`9kvkixy_pJn zm(kq16)QO0fa?|XF<^y)z6RVa{oByOaa^{wV<~W6Og@h__*oo3k7dNhcPJ+JcfifW z?|&^%bmCq3al>hVm-akA2RIC@pgufoY^r|FIad zcIpQGZ4$+AJ!lTx48_zk+11m+9O+qJ!C0ONY(0~$H}DoXOB6vfFbrd4;Z0<^qEZ~a zkIT3$s~@0o5h`U$5%>0xOIGkLI`7{tomca175Gf-^3a6i6jhzs#k=J^P^|IPg0Wq0 z^VBxw%hctXmySQ=ytlQ3IWC`)j|pzoBjV2gaMnVE_OC delta 2045 zcmY*a3s96*6h7bmcVUHPm*urQ5?P~UP*6b;Sp!6T^>B1-G(|)d$I)^%G0W6St3jO_ zO~RWzrKHS6A+)O!X<1}tjgN61EvM98pi{Si%OcJB9`^WE=U&VBr+jygMz zIh(G-cn=NbH_?C|<@LgC{9%c0X%z(`(!Oxfg6EbN&6&NpXl@B@M^NV)OT)`?RuyN( zIZJp1CD3q7hOqGP_KsIxq70#K^uPeOWo}7Pn(FVt-!6PE6VmY`-r6__>B&_yh;X_l zoXD9ygyFI5Tq4H?BC6GyvpVDWglWAh9E1vyyo!h?vGSy^ajV|dxWm-KisGUSZ*OA^}O zohnN?giN_t3&zM(UJS)y6+R4?k)kUYRb~bE1dTT!DTFH=4I~=MeK9IwR{V>3p-juh zJD4N=*(i@L)#{`8lhw{PUbhjUJK)|YSLUEEwyDM(gbI|(Pln?-O4WuubRushPwHW} zq%5@(Xb4x$RJw%x0ihw~8~ao~2Qg-2bMeOgs#J{E*|j&sNs z*tP05JJC;?+q*b;u@~j)$=rvVa_eODj1QQ}*|Fw-UapI~_?(j@?elpSo zw>WAln&FX$roxATa!3J^;FU89a2g|}cN)B|aoVTJta5)XADxM+Y#K5JW~l?yVFjL4 z?L~+d*sOjmMy?UMjrE3C@3*5ohNw~XpN&;k`&S%}3^oth0ogVWG4{P?L^mj^Nu8Sq zo8ei&AuFtl^&qUz^I+JlujnB(HI#+xRIm@1lar5d$QGv$a@08!+GC0ASL2ENcc`N+ zf#?s}XA@?{nflzj`dm~0w1@SwVG}+aa7j<=#QC1wtgBsklOPJY$v80BgaNY{{-&Wj ze3mS$L~@!r3*v`6vmh?$e7u(WVB#c=3q<$4^Od-Q!SZAkd_4zq$_T-HUVGyH2Z-th zGIy9)CuE46S&b}Lo|g3KlGytYjgpPk$m|Noc7^NAa7Q(Y*mqJ5O7XD#x(5AtxK@K| zjFWHHqTiTF?9`()l6S=6O(uFm)5W^9V+zv(O_yluG&8Hs%&Xm*wI*%WRNCtBI3}sW zI?OjPU4HX6enE+Beh1^RP>LV@$YB!&no3sydEfmw;b= za2!tq7i7;9Sb;0D>I4=sbNDq=uleD$h%lvUPGe#K-|I_1;W3OTR;&U4E)p3sk)bE5UuAQ9-(0*T|Pu0NAm=Z)d zfj>9$z%ucG3=K1SV~$B>~e0$JzsJ;_IG3bf74p} A-v9sr diff --git a/pkg/wasm/abi.go b/pkg/wasm/abi.go index c60cb54654..31c13d998e 100644 --- a/pkg/wasm/abi.go +++ b/pkg/wasm/abi.go @@ -42,7 +42,7 @@ type AbiV2Impl struct { var ( _ types.ABIHandler = &AbiV2Impl{} - //_ proxywasm.ContextHandler = &AbiV2Impl{} + _ Exports = &AbiV2Impl{} ) func (a *AbiV2Impl) Name() string { @@ -53,23 +53,11 @@ func (a *AbiV2Impl) GetABIExports() interface{} { return a } -func (a *AbiV2Impl) GetExports() interface{} { - return a -} - func (a *AbiV2Impl) ProxyGetID() (string, error) { - ff, err := a.Instance.GetExportsFunc("proxy_get_id") - if err != nil { - return "", err - } - - res, err := ff.Call() + mem, err := a.Instance.GetExportsMem("wasm_id") if err != nil { - a.Instance.HandleError(err) return "", err } - a.Imports.Wait() - - return res.(string), nil + return string(mem), nil } diff --git a/pkg/wasm/filter.go b/pkg/wasm/filter.go index 5c676979b9..1d3ba7e4a8 100644 --- a/pkg/wasm/filter.go +++ b/pkg/wasm/filter.go @@ -135,7 +135,7 @@ func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { // TODO: 获取id,注册路由 id, err := exports.ProxyGetID() if err != nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to create context id: %v, rootContextID: %v, err: %v", + log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to get id context id: %v, rootContextID: %v, err: %v", contextID, pluginConfig.RootContextID, err) return nil } From e2ce62d3f468f3fac682f3caa5253efa91980c40 Mon Sep 17 00:00:00 2001 From: zu1k Date: Mon, 16 Aug 2021 14:20:16 +0800 Subject: [PATCH 05/25] support multi wasm --- demo/wasm/code/golang/wasm.go | 21 ++++++++++-- demo/wasm/code/golang/wasm_1_1.wasm | Bin 256217 -> 256589 bytes demo/wasm/code/golang/wasm_1_2.wasm | Bin 256217 -> 256589 bytes demo/wasm/code/golang/wasm_2.wasm | Bin 256217 -> 256589 bytes pkg/wasm/abi.go | 30 +++++++++++++++-- pkg/wasm/dispatch.go | 8 ++--- pkg/wasm/factory.go | 13 +++----- pkg/wasm/filter.go | 48 ++++++++++++++++------------ 8 files changed, 79 insertions(+), 41 deletions(-) diff --git a/demo/wasm/code/golang/wasm.go b/demo/wasm/code/golang/wasm.go index 4f113d8d3a..13cd02cc32 100644 --- a/demo/wasm/code/golang/wasm.go +++ b/demo/wasm/code/golang/wasm.go @@ -17,6 +17,8 @@ package main import ( + "unsafe" + "github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm" "github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm/types" ) @@ -56,7 +58,7 @@ func (ctx *myHttpContext) OnHttpRequestHeaders(numHeaders int, endOfStream bool) } } - result, err := proxywasm.CallForeignFunction("SayHello", []byte(`{"service_name":"helloworld","name":"`+name+`_1_2"}`)) + result, err := proxywasm.CallForeignFunction("SayHello", []byte(`{"service_name":"helloworld","name":"`+name+`_2"}`)) if err != nil { proxywasm.LogErrorf("call foreign func failed: %v", err) } @@ -71,5 +73,18 @@ func proxyOnMemoryAllocate(size uint) *byte { return &buf[0] } -//export wasm_id -const ID = "id_1" +const ID = "id_2" + +//export proxy_get_id +func GetID() *byte { + _ = ID[len(ID)-1] + + id := ID + bt := *(*[]byte)(unsafe.Pointer(&id)) + return &bt[0] +} + +//export proxy_get_id_length +func GetIDLen() uint32 { + return uint32(len(ID)) +} diff --git a/demo/wasm/code/golang/wasm_1_1.wasm b/demo/wasm/code/golang/wasm_1_1.wasm index 67c459c468c7db49caa24a381242907556316c45..ca5073ed7eac45f9b62bbc164325139043375726 100644 GIT binary patch delta 2908 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 Y!KhiZvI?Ik98qmo#Qg|)@)NQBzx{1bI{*Lx diff --git a/demo/wasm/code/golang/wasm_1_2.wasm b/demo/wasm/code/golang/wasm_1_2.wasm index 1f189048fad36083ab05470ce9901490d9e98817..b1cb33d4fd84d0decee98086ff12e0d4505379ab 100644 GIT binary patch delta 2908 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 Y!KhiZvI?Ik98qmo#Qg|)@)NQBzx{1bI{*Lx diff --git a/demo/wasm/code/golang/wasm_2.wasm b/demo/wasm/code/golang/wasm_2.wasm index 95d8054b60c410775d31e1c36823f7e6fca3180c..ea0f6703a81407564d2727ca2ae34d708cb557cf 100644 GIT binary patch delta 2908 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 diff --git a/pkg/wasm/abi.go b/pkg/wasm/abi.go index 31c13d998e..73eda389d2 100644 --- a/pkg/wasm/abi.go +++ b/pkg/wasm/abi.go @@ -16,6 +16,7 @@ package wasm +import "C" import ( "mosn.io/mosn/pkg/types" "mosn.io/mosn/pkg/wasm/abi" @@ -37,7 +38,6 @@ func abiImplFactory(instance types.WasmInstance) types.ABI { // easy for extension type AbiV2Impl struct { v1.ABIContext - abc int } var ( @@ -54,10 +54,34 @@ func (a *AbiV2Impl) GetABIExports() interface{} { } func (a *AbiV2Impl) ProxyGetID() (string, error) { - mem, err := a.Instance.GetExportsMem("wasm_id") + ff, err := a.Instance.GetExportsFunc("proxy_get_id_length") + if err != nil { + return "", err + } + res, err := ff.Call() + if err != nil { + a.Instance.HandleError(err) + return "", err + } + a.Imports.Wait() + length := res.(int32) + + ff, err = a.Instance.GetExportsFunc("proxy_get_id") + if err != nil { + return "", err + } + res, err = ff.Call() + if err != nil { + a.Instance.HandleError(err) + return "", err + } + a.Imports.Wait() + ptr := res.(int32) + + data, err := a.Instance.GetMemory(uint64(ptr), uint64(length)) if err != nil { return "", err } - return string(mem), nil + return string(data), nil } diff --git a/pkg/wasm/dispatch.go b/pkg/wasm/dispatch.go index 15260a110b..f1f385621e 100644 --- a/pkg/wasm/dispatch.go +++ b/pkg/wasm/dispatch.go @@ -14,13 +14,9 @@ type Router struct { routes map[string]Group } -var route = Router{ - routes: make(map[string]Group), -} - // RegisterRoute register a group with id // unsafe for concurrent -func RegisterRoute(id string, plugin *WasmPlugin) { +func (route *Router) RegisterRoute(id string, plugin *WasmPlugin) { if group, found := route.routes[id]; found { group.count += 1 group.plugins = append(group.plugins, plugin) @@ -33,7 +29,7 @@ func RegisterRoute(id string, plugin *WasmPlugin) { } } -func GetRandomPluginByID(id string) (*WasmPlugin, error) { +func (route *Router) GetRandomPluginByID(id string) (*WasmPlugin, error) { group, ok := route.routes[id] if !ok { return nil, errors.New("id is not registered") diff --git a/pkg/wasm/factory.go b/pkg/wasm/factory.go index 4bd2eb1254..4cadb072c7 100644 --- a/pkg/wasm/factory.go +++ b/pkg/wasm/factory.go @@ -42,9 +42,8 @@ func init() { type FilterConfigFactory struct { proxywasm010.DefaultImportsHandler - //pluginName string config []*filterConfigItem // contains multi wasm config - RootContextID int32 // TODO + RootContextID int32 //vmConfigBytes buffer.IoBuffer //pluginConfigBytes buffer.IoBuffer @@ -86,7 +85,7 @@ func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilte log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to add plugin, err: %v", err) return nil, err } - // TODO: watch file for reload + //addWatchFile(config, pluginName) } else { pluginName = config.FromWasmPlugin @@ -99,9 +98,7 @@ func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilte } config.VmConfig = pw.GetConfig().VmConfig - pw.RegisterPluginHandler(factory) - factory.config = append(factory.config, config) } @@ -118,9 +115,9 @@ func (f *FilterConfigFactory) CreateFilterChain(context context.Context, callbac callbacks.AddStreamSenderFilter(filter, api.BeforeSend) } -//func (f *FilterConfigFactory) GetRootContextID() int32 { -// return f.RootContextID -//} +func (f *FilterConfigFactory) GetRootContextID() int32 { + return f.RootContextID +} //func (f *FilterConfigFactory) GetVmConfig() common.IoBuffer { // if f.vmConfigBytes != nil { diff --git a/pkg/wasm/filter.go b/pkg/wasm/filter.go index 1d3ba7e4a8..9a32f0c6ea 100644 --- a/pkg/wasm/filter.go +++ b/pkg/wasm/filter.go @@ -51,11 +51,11 @@ type Filter struct { } type WasmPlugin struct { - pluginName string // 单个wasm文件的name - plugin types.WasmPlugin // 单个wasm文件,包括多个instance - instance types.WasmInstance // 一个instance - abi types.ABI // 单个wasm文件对应的abi - exports proxywasm.Exports // 单个wasm文件导出的方法 + pluginName string + plugin types.WasmPlugin + instance types.WasmInstance + abi types.ABI + exports proxywasm.Exports rootContextID int32 contextID int32 @@ -73,13 +73,17 @@ func newContextID(rootContextID int32) int32 { } func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { + configs := factory.config + filter := &Filter{ ctx: ctx, factory: factory, - buffer: buffer.NewIoBuffer(100), + router: Router{ + routes: make(map[string]Group), + }, + buffer: buffer.NewIoBuffer(100), } - configs := factory.config plugins := make([]*WasmPlugin, 0, len(configs)) for _, pluginConfig := range configs { pluginWrapper := wasm.GetWasmManager().GetWasmPluginWrapperByName(pluginConfig.PluginName) @@ -105,21 +109,11 @@ func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { if exports == nil { log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to get exports part from abi") plugin.ReleaseInstance(instance) - return nil } contextID := newContextID(pluginConfig.RootContextID) - - err := exports.ProxyOnContextCreate(contextID, pluginConfig.RootContextID) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to create context id: %v, rootContextID: %v, err: %v", - contextID, pluginConfig.RootContextID, err) - return nil - } - - instance.Lock(pluginABI) - defer instance.Unlock() + log.DefaultLogger.Infof("[proxywasm][filter] NewFilter pluginName: %s, contextID: %d", pluginConfig.PluginName, contextID) wasmPlugin := &WasmPlugin{ pluginName: pluginConfig.PluginName, @@ -132,6 +126,16 @@ func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { } plugins = append(plugins, wasmPlugin) + instance.Lock(pluginABI) + defer instance.Unlock() + + err := exports.ProxyOnContextCreate(contextID, pluginConfig.RootContextID) + if err != nil { + log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to create context id: %v, rootContextID: %v, err: %v", + contextID, pluginConfig.RootContextID, err) + return nil + } + // TODO: 获取id,注册路由 id, err := exports.ProxyGetID() if err != nil { @@ -139,12 +143,14 @@ func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { contextID, pluginConfig.RootContextID, err) return nil } - RegisterRoute(id, wasmPlugin) + filter.router.RegisterRoute(id, wasmPlugin) } filter.plugins = plugins // TODO: 确定这个的作用 - //filter.LayottoHandler.Instance = instance + if len(plugins) > 0 { + filter.LayottoHandler.Instance = plugins[0].instance + } return filter } @@ -199,7 +205,7 @@ func (f *Filter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffe return api.StreamFilterStop } - plugin, err := GetRandomPluginByID(id) + plugin, err := f.router.GetRandomPluginByID(id) if err != nil { log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestHeaders id, err: %v", err) return api.StreamFilterStop From 5ce2247c8cff8302f3b1023d5b40376c48042090 Mon Sep 17 00:00:00 2001 From: zu1k Date: Mon, 16 Aug 2021 14:37:59 +0800 Subject: [PATCH 06/25] remove debug code --- demo/wasm/code/golang/wasm.go | 3 --- demo/wasm/code/golang/wasm_1_1.wasm | Bin 256589 -> 256249 bytes demo/wasm/code/golang/wasm_1_2.wasm | Bin 256589 -> 256249 bytes demo/wasm/code/golang/wasm_2.wasm | Bin 256589 -> 256249 bytes 4 files changed, 3 deletions(-) diff --git a/demo/wasm/code/golang/wasm.go b/demo/wasm/code/golang/wasm.go index 13cd02cc32..569fd77723 100644 --- a/demo/wasm/code/golang/wasm.go +++ b/demo/wasm/code/golang/wasm.go @@ -48,8 +48,6 @@ type myHttpContext struct { // override func (ctx *myHttpContext) OnHttpRequestHeaders(numHeaders int, endOfStream bool) types.Action { - proxywasm.LogInfo("golang wasm receive a http request") - hs, err := proxywasm.GetHttpRequestHeaders() var name string for _, h := range hs { @@ -63,7 +61,6 @@ func (ctx *myHttpContext) OnHttpRequestHeaders(numHeaders int, endOfStream bool) proxywasm.LogErrorf("call foreign func failed: %v", err) } proxywasm.SetHttpResponseBody(result) - return types.ActionContinue } diff --git a/demo/wasm/code/golang/wasm_1_1.wasm b/demo/wasm/code/golang/wasm_1_1.wasm index ca5073ed7eac45f9b62bbc164325139043375726..15ef5dbb8f0790f802448bb6f76586f4a1bc1a6f 100644 GIT binary patch delta 17332 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 Bm;nF) delta 17443 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 diff --git a/demo/wasm/code/golang/wasm_1_2.wasm b/demo/wasm/code/golang/wasm_1_2.wasm index b1cb33d4fd84d0decee98086ff12e0d4505379ab..65d61ea5b2a9c675aa9b51385b74b32c35828e32 100644 GIT binary patch delta 17332 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 Bm;nF) delta 17443 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 diff --git a/demo/wasm/code/golang/wasm_2.wasm b/demo/wasm/code/golang/wasm_2.wasm index ea0f6703a81407564d2727ca2ae34d708cb557cf..5db7f4e2995bb082e3534e9b149d7270aff8651a 100644 GIT binary patch delta 17332 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 Bm+t@o delta 17443 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 Date: Mon, 16 Aug 2021 14:40:05 +0800 Subject: [PATCH 07/25] remove debug print --- pkg/wasm/abi.go | 1 - pkg/wasm/filter.go | 2 -- 2 files changed, 3 deletions(-) diff --git a/pkg/wasm/abi.go b/pkg/wasm/abi.go index 73eda389d2..30820e4d53 100644 --- a/pkg/wasm/abi.go +++ b/pkg/wasm/abi.go @@ -16,7 +16,6 @@ package wasm -import "C" import ( "mosn.io/mosn/pkg/types" "mosn.io/mosn/pkg/wasm/abi" diff --git a/pkg/wasm/filter.go b/pkg/wasm/filter.go index 9a32f0c6ea..d95a190098 100644 --- a/pkg/wasm/filter.go +++ b/pkg/wasm/filter.go @@ -113,8 +113,6 @@ func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { } contextID := newContextID(pluginConfig.RootContextID) - log.DefaultLogger.Infof("[proxywasm][filter] NewFilter pluginName: %s, contextID: %d", pluginConfig.PluginName, contextID) - wasmPlugin := &WasmPlugin{ pluginName: pluginConfig.PluginName, plugin: plugin, From a10e2d5bbd49a46d2e382ee2cdf2d91384880fa8 Mon Sep 17 00:00:00 2001 From: zu1k Date: Mon, 16 Aug 2021 14:41:28 +0800 Subject: [PATCH 08/25] fix wasm config test --- pkg/wasm/config_test.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/pkg/wasm/config_test.go b/pkg/wasm/config_test.go index e45fc2b4a6..062687e77a 100644 --- a/pkg/wasm/config_test.go +++ b/pkg/wasm/config_test.go @@ -17,8 +17,9 @@ package wasm import ( - "github.com/stretchr/testify/assert" "testing" + + "github.com/stretchr/testify/assert" ) func TestXProxyWasmConfigFromGlobalPlugin(t *testing.T) { @@ -29,7 +30,7 @@ func TestXProxyWasmConfigFromGlobalPlugin(t *testing.T) { "user_config2": "user_value2", } - config, err := parseFilterConfigs(configMap) + config, err := parseFilterConfigItem(configMap) assert.Nil(t, err) assert.Nil(t, config.VmConfig) assert.Equal(t, config.InstanceNum, 0) @@ -42,7 +43,7 @@ func TestXProxyWasmConfigWithoutUserData(t *testing.T) { "instance_num": 2, } - config, err := parseFilterConfigs(configMap) + config, err := parseFilterConfigItem(configMap) assert.Nil(t, err) assert.Nil(t, config.VmConfig) assert.Equal(t, config.InstanceNum, 0) @@ -63,7 +64,7 @@ func TestXProxyWasmConfigWithVM(t *testing.T) { "user_config4": "user_value4", } - config, err := parseFilterConfigs(configMap) + config, err := parseFilterConfigItem(configMap) assert.Nil(t, err) assert.Equal(t, config.FromWasmPlugin, "") assert.NotNil(t, config.VmConfig) From 4b7b95e04bd8322b3cdaf7f741d3d893134fc965 Mon Sep 17 00:00:00 2001 From: zu1k Date: Mon, 16 Aug 2021 14:54:10 +0800 Subject: [PATCH 09/25] fix integration test --- demo/wasm/code/golang/wasm.go | 8 +++++--- demo/wasm/code/golang/wasm_1_1.wasm | Bin 256249 -> 256361 bytes demo/wasm/code/golang/wasm_1_2.wasm | Bin 256249 -> 256361 bytes demo/wasm/code/golang/wasm_2.wasm | Bin 256249 -> 256361 bytes test/integrate/wasm_test.go | 15 +++++++++++---- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/demo/wasm/code/golang/wasm.go b/demo/wasm/code/golang/wasm.go index 569fd77723..3f81881364 100644 --- a/demo/wasm/code/golang/wasm.go +++ b/demo/wasm/code/golang/wasm.go @@ -56,7 +56,7 @@ func (ctx *myHttpContext) OnHttpRequestHeaders(numHeaders int, endOfStream bool) } } - result, err := proxywasm.CallForeignFunction("SayHello", []byte(`{"service_name":"helloworld","name":"`+name+`_2"}`)) + result, err := proxywasm.CallForeignFunction("SayHello", []byte(`{"service_name":"helloworld","name":"`+name+`_`+ID+`"}`)) if err != nil { proxywasm.LogErrorf("call foreign func failed: %v", err) } @@ -72,6 +72,8 @@ func proxyOnMemoryAllocate(size uint) *byte { const ID = "id_2" +// DO NOT MODIFY THE FOLLOWING FUNCTIONS! + //export proxy_get_id func GetID() *byte { _ = ID[len(ID)-1] @@ -82,6 +84,6 @@ func GetID() *byte { } //export proxy_get_id_length -func GetIDLen() uint32 { - return uint32(len(ID)) +func GetIDLen() int32 { + return int32(len(ID)) } diff --git a/demo/wasm/code/golang/wasm_1_1.wasm b/demo/wasm/code/golang/wasm_1_1.wasm index 15ef5dbb8f0790f802448bb6f76586f4a1bc1a6f..3c5474a6e79bc03a104caa2af4dcf543458db141 100644 GIT binary patch delta 5585 zcmcgvdvH|M89(RTy_?-^mh8gv$ivC*qPT*{J0L2vfFZmC>F+ytZ#F2M@sCbV=C|kj z&i9?~bzZrbcc-7&lU^}Y7dw}38Lk)BRT(&G_uZ zxtTOl>gcaka=#X4xniGYiYvi|M9J5Sidn!GW)N2LNUk~H*Zj6zVa^DN|zyag{8cxHQNpjTl4U{*eE}h!%rEXoEqNo zEG#*~wmF_vD&!Q?U5SxV-_^MT31TtDHY2Y-v(M+W0J=YIMy?=%-|0__1l!Pp`0Zg^ zBqUfM4VfUxj}!AMj5q3YGPauY+?YoK%yUPA?p#q}?5=+?T8h{bPRo+yC594tmL!T( z#v`<+s7~dSN=Uq5)p7-Rv#g|1%Ka(f>`1^9W`UG&G+@V!bs`e*qW@fr1YGEMp?9O- zfbn#{riFJHm8XktFQ?E_b43~TX}MyBiaJ-oBnx{Y0Y<5ZuNqIE3G%bXvNIi{o6Jz2 zvqCveF;j4J!h1Jk(}uZc57iXDDooX1TB_BS>eJz7rD|(Y-D;{%u~he2s)gZyDOHhB zjUp9OcS6u^uG$Xp3G(A4xs9~wjF?KFDAw95A@LYeQ>&I(Z4K+Gj&KF~@Lp)M#NNOm zB-MQw0_h>T(xi#}+<5$Kr|3Zu3IAKg>F~Tk%V))Q!+G(uVQxl;7(2&-!qR*k8~ox3 zc@~+6$4#ThDOx%yRz0>^_1KU+Jf}>h!NE3B6=FyX4LGp{T!15u)2dg}w3ZEZ)|@al z=t$^4qIBCp-$~kykYi_40OcCahe?(t$rVZR5_FY$G{~tvG28FP#*9WhC(S+9oec=2 zQmJ|d+^8#vzCjkw8i^{R8|8LTUj9h9N-a({2D3ej&GQu!A-XfWvs@k@Ew1g^_)s6W?a^yHNRPCG@aPerJ|tgcApMPS0=2 zP0J$hGo9Hiy}b!%*cJ4^sK*B`s<#we{GzQ(ox@z=z=4c+OXVj!$W8%1AU-<4e~63r zZQ_IXb06pBa@+wv%)9;+V|K<^$`bFStT!23FW)=B&+{+j+u!mm{(Ste-|{FIwpuyp z5PzH>l4}m}{-WTV{N@lZ;@f53VcuH|Zj{A`!ETfn4nx}IyzEiMBYc@$T?IDng8aIQ z7xN-Hwwm|m4f2(0-dRk%C^uE}_59WNqu=q)oUfL1zvl}@hpY0+_k5=CHOZ%r@cVhK z+pXa(@jUD}2qe$5B3pzb+RX<(XO* zZvlaX4UdqRRodT_At@knZ07SQuC?k`NkI9|2{I2ZfHqHdbQtCDQvRHUBWBEY)cCPud-7zG- zMGim47YJ>o+Cu=<1gk zOZPcIj(I;DTBC;P@|Kglqc)!1E1PHW_IzA?^hw?{)BXx_Tgqjx38ItzE(DY>q-V0| z;2R727l4h`3l<{^lC#&jFLiniV=seWB4lZ*@I6iZO7Ie}Lz~A88_|s>&z#_|fNlaD z%y5uB!$urO>S~1P7(tk-HKVn*NfDsPN`K`P;p<33C#JdpGd!Z&%PILH!`>a_Kuvn{ zL^~DfIPi~|d|#Tl2z&{Ei7YL49TZ4qhR29hG*o&z=8CcR^X&q*^^L-(Uq1@LhU zl*5#aC5f&x)(;??DY4_A#-=c=?oV?n!O?jQuA2XhMyx}FHcMoojoI9#tfCHtqv8ctbSbB{+A+sAsLtH zlSRkYiM4BM{py<}ipliy4I5Xb7Oxrh$0MV!Ef| zIs=qs42ZWa<{*e87IPZJd5cL_bB1|5TSdWQ_dty-(g|?K_JG>k!Y#&nEd}6>$KD3< zj>RNx-e^*=p0U2lqT~fA1FfoArzaI@X2@c8B;){SsaT9Cx5?o?8G`vk%@`mf%8HN0 zo&{HC%AolbC@We$mgiz@s!Q#_4z%OGgtG(6VNZWdl}GlPB0A=L08d*1jbXeQCc0uG z1wI1V&2p67c?4brUz{q#4&l3< z0_ujTeF0U@A6Jmh$3GIz_k*r-tBK-JgM4JF$QIkrsU9zHuc_h|ytoge6GazHDc;zU zsiLcM;zh=uhv|7T{Df#vPwzJvPNm^04A(Mc6i;x@G?9hwo@t_6>gr33UB+Y5Rmk_d zAQ$3Kfj^@j7n8pYmv~6fW8-uBnvfT)ZIRn9^Y-+BS5HHP=&w_c7d-n3vmcn~D--=` z>hX9hIeH~WujJ@S&TFKrP~7c|3C{2qvL!Om7OBL9{6it6F}a{nbVIkf5M|gB|Ef?F zI->6%ML58RfT+d30@8s`ft^6?7-JQ{suOq(fWapj%LB6TKT!}E1v~=epJr?da1F4X zVJr*`2eh+zw1CMCh$zwKVM!Byqc=Fd`~T-S;Wuh#T>djMaNInD8xr_Ac1HZb*mHog z2mh+ID#;B7zeDNH0v7?AXf<*~|CYW790RO&0rWLM)Z?)NtVZ?ybG8O{`;I~tN{28@G4-nj0@Q9zzpD5fYq8o zcfqwV2FM4j)(3~bA21LI16KPZ=*-JV4Cn*g2iy-#yn?$sdX=#bz~6v_z-7Q{)uaHP zJ?;2wd0gh(yz&`k>0oLG> zqKj$`z7t|VDZUNp`@jI^H?VH(132FTd<$4@C4?FH2%ryvp};WUK|SuBD}Jx@jq$DX z#jz;w5--0hp3!++y14cxe=`0q*9v%0pY7P8KeJGuJwY!5HG836G{NT5?RL#4`f{5? zFN&vY+I==YU5-xCdf+qe#T0EOKHuu7+bHuL+H5=?yBykFe5T#+)Lx)R;xnhVHG}f@ z>RnPbpI;Ztkrd}PFVn^9_-m=!I!^a{-!yF<-R}p|v|75y|L)e#;lBQ;jkX^*a%sBu zYZ24r@^mdI@APN`I#4ORdS`%X65kU*Z2Zx?|Tu#kv>%m8(XrpiM_ixd?w7>2q?6&34LbOU7C zplKzuF*jA}qQ((ML>L_xEhrry1s^To3*-$634uV!gO?%c@7!-cHeu+r|Fk#r+k4JE z=bm%!Irs79_^#v&JCiruY!xjl-YvG4)~A1v%{`$(WoRt0LtEg}u2pn+`|8*u zx;BwUTJ2-BZD0bdKy1UWUsQfmUdFtZ0K?!m9xN~hbWOKFLuvX&(@yC4tObJX=$N{R zi<{zqx)pOb@gROHcrf7be68Z(i*9klYJy)>a4%HgD_neHeCVVg&06wBPHPp5i3Ynv zv2`Zd1{wp7RC-4N>BNmhE9jFi&YzJYhU(cU$#tzy+$byg0U_oHhA*a zhxLoH@Ea#{d42e^lf~&xkU0XDCpV)2 zXf=h21gxYUVOOfK3$Pb;7VreUjIt8w4lh3K%WPu7z&mf3Q%J5UQny^lO1n zq0M3yABb~Dy4x@oBe%xM_rhCRGeTd9VBkj;ro;1RO0pSSpA(@oY<)VmD7^#AS4&h| z4~N84ZX6FfvVq+cEp30ZEZfWzu{wSt_8CgI`jSE_Lcf^eb)rxS>SS@M&F(&BKV(d} z-{*+w|4Qj5LElN*^^jw0QUH}2cD+GX#L4nF*#upskZ_AzOh<{qtfCSp6o^_%VVM>T zRPtC3&GKM=jO@bv7;kvbcqAjbJvAbS$Bh;FjmLF@7d14mSGaxj?VsW47~UyPz#@p?7_TLBx}FZ|)_ zItsHg3@=vGgFP*yd6)V{8o3Ir3Qs&cHfwdvI+ekOQ%IKtqxEbESD)Q6VJpNao$kyw z?K*-1P6G(S>G?f5zkK4iksrTEG*v$hN6ro4JKlZ&+~@rgmaWIpD-e#rvh~qFxOnpb zEpJYqT;%0rqwBoNb5H~z?PNhvQJHeV_)?B`=dcbm*Vz!yVn%>kY->f7Z$VyDWx4nq1xhkX7Z z5Aqx2SzLl()bqi7 zj?8M{S^QynV*~%C*wihbZ{X8-f!vQ#?c*LMFE;RN`CyrQjAtd~GtP#Rz0v6`p+f%R z7=M-*$KX0aJXa&RO6SzShW>iqq9{a1(!>KO5cN#HVmxCEq)h>RJ78fgf<=ge#G5G6oTT|Q_@&Y_Q)G^<1oi!NLwQ6}Av}UdWP}A}7t9O>TIE=0Z|6Q)Hwvq)Grr07NCq&2VVF7G$2B zHZm5<6tH(IcC?BN>~a9pSYo6T)H#ELd7^q^GIwM?QuL5TF1kw?tFMCOZB5=jM`YLz zC`~0RA*)@`9bq-B+9L-+b>a{R7RI>IdeBJodW??*%ybaF(BPR3izk}qCL%uKQBgT< zwn()Z0+nJ_j9z>`874jqAdhMrge}CqXqZx&r_B+z&`7IIF1%0ZX{LseU6OR#BENcbp`mO)Xc+Of+4ql!eO z+v96206)$yQ&4a3J#NNc0j`$R-O!sVx85(Ztyhr6HM2x+S|jAg0V4*YraR&>{7`)MP>+Doy4f zh@&Q>;U04VYR*4EG@DEth>5P4UtWxgU!uWy1_3mAKWsPzWNtdXOb z-vAggqG)*(5sP>bTVX6dYvkcx(OM%d;6#GjQR%eb7Qo`ufW}7Y5hEAsKFhru=B5Km zuo|58T&0v|4!~K5&h}0%%3ZUQ9paG$iZXz^jwjRPR

T@%jZ^~2RaOsF%0 z;lp#`YJ%)RM=$BX2jL3+IP}gLi{|8pGk8!}cr9^YU8X$5P~Ty+I~7VzKLIo^sd9oSO#;9s>~ zDd}Ty8I-GlT7V{+jU3TO;}oC*Fq;JZ3h+AcRp zC^?0bLIy;}%E<%=S9yFMv+q zQm^qJ&M~$JH~=&NX1f~)_#@yu;0NF^&!0icXz#xg+n)?>CsU`TvfFZmC>F+ytZ#F2M@sCbV=C|kj z&i9?~bzZrbcc-7&lU^}Y7dw}38Lk)BRT(&G_uZ zxtTOl>gcaka=#X4xniGYiYvi|M9J5Sidn!GW)N2LNUk~H*Zj6zVa^DN|zyag{8cxHQNpjTl4U{*eE}h!%rEXoEqNo zEG#*~wmF_vD&!Q?U5SxV-_^MT31TtDHY2Y-v(M+W0J=YIMy?=%-|0__1l!Pp`0Zg^ zBqUfM4VfUxj}!AMj5q3YGPauY+?YoK%yUPA?p#q}?5=+?T8h{bPRo+yC594tmL!T( z#v`<+s7~dSN=Uq5)p7-Rv#g|1%Ka(f>`1^9W`UG&G+@V!bs`e*qW@fr1YGEMp?9O- zfbn#{riFJHm8XktFQ?E_b43~TX}MyBiaJ-oBnx{Y0Y<5ZuNqIE3G%bXvNIi{o6Jz2 zvqCveF;j4J!h1Jk(}uZc57iXDDooX1TB_BS>eJz7rD|(Y-D;{%u~he2s)gZyDOHhB zjUp9OcS6u^uG$Xp3G(A4xs9~wjF?KFDAw95A@LYeQ>&I(Z4K+Gj&KF~@Lp)M#NNOm zB-MQw0_h>T(xi#}+<5$Kr|3Zu3IAKg>F~Tk%V))Q!+G(uVQxl;7(2&-!qR*k8~ox3 zc@~+6$4#ThDOx%yRz0>^_1KU+Jf}>h!NE3B6=FyX4LGp{T!15u)2dg}w3ZEZ)|@al z=t$^4qIBCp-$~kykYi_40OcCahe?(t$rVZR5_FY$G{~tvG28FP#*9WhC(S+9oec=2 zQmJ|d+^8#vzCjkw8i^{R8|8LTUj9h9N-a({2D3ej&GQu!A-XfWvs@k@Ew1g^_)s6W?a^yHNRPCG@aPerJ|tgcApMPS0=2 zP0J$hGo9Hiy}b!%*cJ4^sK*B`s<#we{GzQ(ox@z=z=4c+OXVj!$W8%1AU-<4e~63r zZQ_IXb06pBa@+wv%)9;+V|K<^$`bFStT!23FW)=B&+{+j+u!mm{(Ste-|{FIwpuyp z5PzH>l4}m}{-WTV{N@lZ;@f53VcuH|Zj{A`!ETfn4nx}IyzEiMBYc@$T?IDng8aIQ z7xN-Hwwm|m4f2(0-dRk%C^uE}_59WNqu=q)oUfL1zvl}@hpY0+_k5=CHOZ%r@cVhK z+pXa(@jUD}2qe$5B3pzb+RX<(XO* zZvlaX4UdqRRodT_At@knZ07SQuC?k`NkI9|2{I2ZfHqHdbQtCDQvRHUBWBEY)cCPud-7zG- zMGim47YJ>o+Cu=<1gk zOZPcIj(I;DTBC;P@|Kglqc)!1E1PHW_IzA?^hw?{)BXx_Tgqjx38ItzE(DY>q-V0| z;2R727l4h`3l<{^lC#&jFLiniV=seWB4lZ*@I6iZO7Ie}Lz~A88_|s>&z#_|fNlaD z%y5uB!$urO>S~1P7(tk-HKVn*NfDsPN`K`P;p<33C#JdpGd!Z&%PILH!`>a_Kuvn{ zL^~DfIPi~|d|#Tl2z&{Ei7YL49TZ4qhR29hG*o&z=8CcR^X&q*^^L-(Uq1@LhU zl*5#aC5f&x)(;??DY4_A#-=c=?oV?n!O?jQuA2XhMyx}FHcMoojoI9#tfCHtqv8ctbSbB{+A+sAsLtH zlSRkYiM4BM{py<}ipliy4I5Xb7Oxrh$0MV!Ef| zIs=qs42ZWa<{*e87IPZJd5cL_bB1|5TSdWQ_dty-(g|?K_JG>k!Y#&nEd}6>$KD3< zj>RNx-e^*=p0U2lqT~fA1FfoArzaI@X2@c8B;){SsaT9Cx5?o?8G`vk%@`mf%8HN0 zo&{HC%AolbC@We$mgiz@s!Q#_4z%OGgtG(6VNZWdl}GlPB0A=L08d*1jbXeQCc0uG z1wI1V&2p67c?4brUz{q#4&l3< z0_ujTeF0U@A6Jmh$3GIz_k*r-tBK-JgM4JF$QIkrsU9zHuc_h|ytoge6GazHDc;zU zsiLcM;zh=uhv|7T{Df#vPwzJvPNm^04A(Mc6i;x@G?9hwo@t_6>gr33UB+Y5Rmk_d zAQ$3Kfj^@j7n8pYmv~6fW8-uBnvfT)ZIRn9^Y-+BS5HHP=&w_c7d-n3vmcn~D--=` z>hX9hIeH~WujJ@S&TFKrP~7c|3C{2qvL!Om7OBL9{6it6F}a{nbVIkf5M|gB|Ef?F zI->6%ML58RfT+d30@8s`ft^6?7-JQ{suOq(fWapj%LB6TKT!}E1v~=epJr?da1F4X zVJr*`2eh+zw1CMCh$zwKVM!Byqc=Fd`~T-S;Wuh#T>djMaNInD8xr_Ac1HZb*mHog z2mh+ID#;B7zeDNH0v7?AXf<*~|CYW790RO&0rWLM)Z?)NtVZ?ybG8O{`;I~tN{28@G4-nj0@Q9zzpD5fYq8o zcfqwV2FM4j)(3~bA21LI16KPZ=*-JV4Cn*g2iy-#yn?$sdX=#bz~6v_z-7Q{)uaHP zJ?;2wd0gh(yz&`k>0oLG> zqKj$`z7t|VDZUNp`@jI^H?VH(132FTd<$4@C4?FH2%ryvp};WUK|SuBD}Jx@jq$DX z#jz;w5--0hp3!++y14cxe=`0q*9v%0pY7P8KeJGuJwY!5HG836G{NT5?RL#4`f{5? zFN&vY+I==YU5-xCdf+qe#T0EOKHuu7+bHuL+H5=?yBykFe5T#+)Lx)R;xnhVHG}f@ z>RnPbpI;Ztkrd}PFVn^9_-m=!I!^a{-!yF<-R}p|v|75y|L)e#;lBQ;jkX^*a%sBu zYZ24r@^mdI@APN`I#4ORdS`%X65kcB)Y-!1|xV1bB%%s}cAO_hg=Hd0hTFbs8(Dk|2g=myBN zLDNcRkxP}jsBwf55k|*F3rfdF!AA@D0(nD19uNp22@gZk-?`s@Y{JlK|7maLxA&ZT z&OPVcbME6y?O=keKy1fvKvaEGQOF5Kn=2^8EvoLnpP=N8UJ@$7>^>oh->{fXorJJmFcX!nYglDkA>oA>nOU?07aB<(!2UAMWd zx?8tSM5pPl0(N7z*=>;mjXodrE1AET@UyCMru`?DHYDEQ9X6*xNsb-Uijvzt;4lQofj zr?bP~Dv9m#=oTa72mCgp7MsDx$+Zb`BWcm8FqGCS)~t9ylpz3>_IM376ohK2A^lqL zQ)shz#rxyjk?wYk#mQ|6^1aB`mdx;1A{6{lh3WA8nUZYA*6T#*3|pU$ElTge^3@X6 z*25w3R2avDj%;ubMN8Y?EX#KDM65}ii2a7rt^Sm-iZCE1`J5k`8L$f@XA16C8KTe)ckZlRFMMMIv8~M@5-qxx7NMz($Icp52;Bc{EIOJ(Ew#fDD zCZCH^HOA*gUO|lYvtZ5yWD(s&w}aLd2nCO-;^bm5*HdYnf`Ax7x8n6|7`6g7c0dFo z*R>U9XBu9tri*~cHEz$$$fC9|0_tpgfiI6#wNIb6g4Tm0Y*xub*A@mW^yBb+6W_+` zp$79FQ*9Oa_)S+sqRYE9AiU%%xH>YvV@&p%xOFOn4X2PU2}bML7+KM=vuGQ{D4p)i zG3`1+K~4h*!s+=vIlp}3x09cMNH$eJjYQA&<2&Dd|J>(&l9p`1(JK&+;F1loKe%{P zKW*g9e7V5K$HdnA_^Fuqz#Ut?mwP!MCpZ1bZ%HdT$(W5XW?z;zJ?CY{N~C=sZ|8I6 zrF}eyXU4Mj^Dq~kb@HVHd4(T|;-{2!-8;_rP$mhpReOnc!4~CQSIYyCNI|UYxzK#cbsRZ}#%*+8hIXJxag#d2Uh|5@&h7S065?9Cc}Su{A4v1vfx z^rSrbNIh0LRlZiw7mL#?()XiaQ{x&?&k?g3~&K{HBabra9v!PvSc-Z|e!8Ck;RlndPJ znp4ZzAjCLD$TQPLKkp>aw*wZ|ELfB%NPNk{>m<#m!7rAcX(DS(705pUHYoCF#6t85 zgJ(|gXF#6?94z7>QxOYs=Y^a#P2_sb+2n>tX)Ywy(?n)EL#hN|1VB`>+yaNzYe9~b zQ-;SwnFRK3#g0;ufn5q<8cUA0gF0t$Fi%u>T;`6>MT#D>$OU%^WA)XLysgRGXNpYQ zL8Yl=v&d>Ebcb0DtM=$2Q0+Jbf<-WHv~D!gydLAj0W%#$&o_8x!{Ujixygu+cvMtQ znIY0`hCroQ6{82APlkz)0LY`-1`!K!FB+y)=4o?8EHu($lk@Kry4Tb&vP+V7n|$>? zk@@c>L;en}ZvY$ojDbC(_W`bWeQAt%SW3NLWP6D|02n@qf`pF{-b{)*-Hu%j7*!-H z!=6}U0r;_YnTC4%?r}5r3UIZg?t$K9x$S1dJGnDs?1c_@7AC zF&KbDS1MbkiwtXmv<;$eg1b8@5<$v-8KreNxiFi4u%o5k&#e4*vnA|2Goh5R`4edss)nW8_ z6&q%WAdbY?xCufVHuA=jJ{c!aU5$cR! z_{eOyDw5sk=q2s{AY7pzi{82UC)5e1HyNh!vbK;IeM*_p4@2*4?Znj$wVw<%yrW7D zy;4K3)HZkZRO6L$ZkZ^=6Z&cyA}E$08{L62F;o<5avLo3sj#lV&mjC}%}1kL~#v8VVcTsFWPz)_$cs5#Bp zdO&M6YlM8Fd~v_wUXDlp{~X8thK&`E!}r&JTEV(AS6xA`1^hR58e8zC16#@-{HxX@ zCA|zTfpRsl3ZRK*BS-YnI0>i(%qBs<0=y2q)nlCKt1U3xvqnFMgUgY{E#7gJk_501 z3V|ZPY**8})L=>(>wuj*v5)Qr%smCUxqfUwY^pDT-M}zxD6r6&T+Xm)D^; z+fGcr(pVRanQaQ_B|rtRvd4G|Zi#dt6SxVWmPS9{b|Z4&AYhBFSRjU5!u@ex7Xy^S zxd5eXGC&!+0icXz#WO(n

    c5*Q26Rro#@LYG_%ZZNvV*25uPQ;YDeUkL>9L0=36 zHT1wJd|lHA{b(Ssl?`S0!1+`l44ADD!mR*(xih#Vro&Z(?Ch8)xA! z$gOs5INph7yEY&1#C;BQljRPF_89(?8tc@a#D7rlI<-ag3XF7V?`6@V)2xGBnpd}q zYOIKJOB%C^qF9$ptKoFx*CcB-bhS@#Yscw-q5Kr>EH3FmsoGv%ywamRMYl5dXnwic zqmAiDX-KnXyR>xOFxL;}@??`o%fWv%wlwV`{)6Ftv$K$w3z|zRz>@?VQiqbT{AvA zac&lklsX1#)!e6rSdQ4Mnc`}2K~eJc;$r5vg&2g@Je*?=_%xp_N0>8$;`lD;1awS= z2_H;sGb(V5JhJs?HF{J*!$TdNdwPc%|tW|8O#nvcxlf@oT zW?I-*jwPfm?Y zKMPBakZrDel?pk*bXQ_@Y3SkHjs&roVyltckkS8hS^(XbJTpg-z~}TOhXWmGL45X* zEgTfgpNve9d(E zJZFV+oMNWn=7#oc#-*r@; zqEm<1(0$y?d4(LmpO5gYKgF1xF_y5@Gdc53#@5UC_Ve@n3;Fi9Jd-~k`|Gzn!iDXa z9CDC9&JW5p2l+rza87=6kQec7GWQVgCx$l3;zM9J$_s}e?S5YNKFq^>xmb~Em~>HYs^RPTtFcGFnsWE|GoY`+Tu$s>ubGd2Jqn+eh5pz;zJR`;hlmEh>S23U0>dZ)=VJ8D35UV?n3K=|x&x~1lA z_3Oze(a`T=(M z83cPo4+awBUTBPX%GuJ1FD0|qlH~USreC7q_dD`C2lU*yghh#(m(aS;%D}&wp!V4e z%K1Z_%PYXmYC90yeG@=2*a~bqMLgZ%$T7PRpn5j%9_W8?SCoK7m;z9 zGDW1fC6}qu%E_X$Uf!y(UXh5dYebP?HRj2RegtBh#T)`rZ!tq~8w~@L+H??4Sxm1) zTxWoij05qu#T)=}#9~f^IBzkn)tqS_&o)u8=si#)i*y29(cPf-v~WwXUdsS@-3}|%?w%8j)WWlEftFrfbXFX3#za@fZgRppU=r;7BhAHY);pfQX$!$c2E zq`*fZyV)*viP~$R@V!&fss9AM%bE~`a*re>(07xPN!51gWkVANH zr+|85YBr$C`Qr-G`S?fN`99ExU238@*eD;FCbGn~bE?P7+jp9{1uyPcbfV~jDa9LG zGEMYwPP)k0^DsSMhMo|e=;{3i!-+I}7{kYyGKwd->vWNc?w;wQXX5Hhj9tcK(nHAi zyCWCkPk}$99v73p4VQRO&|~9udaofbSlc4EUgn+X0k4^k2+`l59xr&-6J|d+-dD%_ z)70bfR&w-8j$X;plbqMeq(X7GGb%X4TgaA5e@CPe74i>-kVfUgLeUf5=0cQVOYEyc zQRs-ge-z;W9|GbS_7#u zc80MKFcQ$t;?V-8G$NvSn~x=p`;D}7eE0v)aolgj%(&ubWZ<}Y2JI5~Id(?)T>yO@5Dj>&0ILywvn7hOU8A?)q$RTW z%n3JHlD^mn!+-|>tKCe`-bUUGJNej0PXN}Qg51g<4|qM!5zrU-9bh%0+io^%JOj%y z92gCZZL>5_p2NQzz@LE60INOJghv;M0`CH5ga7{L87lyO1H1}Yt;+@Mc3>v(E5K^a zpu6K*7zgA7R_l+$KL8jEgaE7k5p>37BnI>c?gQ=zCSAeZ9l6R_8t^yZ0B{+wS`8_H zCwZvN_??*iV`Bx-wc2LL4*@kmBVe`g4aS}Y<^mM}H4pvt!GHJzfWg4@*r3^>w=FUs zB|QjG3AX`MvW);$XgNR?DFUbhbV-&V%U6MNfUd!gxa#P-%e~In!+@h1Jg^r&YJoMl zr0AkrgYSeWP>OE@`aUp#1&ypH`vA_j0N(;uD}%5LJ_6`NU^p-WcuNd)Jhc*X~$4-Yf51(oGJGB?+k@(E1Rdu1f zJ$m;<&Fj;}3M9q3&BJuDI`&$kwvN;No}H|%qx*e-vUZH_@xQyYbGWZR>Y(kzja-_d z{aQpdxgtdi$UEKIpfoClN6$#qQhlbqG}v1p=exB`d?c-MYgh15w8Eo}_ERl9x=7S^ XF~?}f5Ty-WDvcW68@uMwu7C3%bFpiR delta 5468 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 Date: Tue, 17 Aug 2021 12:04:42 +0800 Subject: [PATCH 10/25] Use ProxySetBuffer --- demo/wasm/code/golang/wasm.go | 13 ++++------- go.mod | 1 + go.sum | 2 ++ pkg/wasm/abi.go | 42 ++++++++++++++++++++++------------- 4 files changed, 34 insertions(+), 24 deletions(-) diff --git a/demo/wasm/code/golang/wasm.go b/demo/wasm/code/golang/wasm.go index 3f81881364..f7ef26ceff 100644 --- a/demo/wasm/code/golang/wasm.go +++ b/demo/wasm/code/golang/wasm.go @@ -20,6 +20,7 @@ import ( "unsafe" "github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm" + "github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm/rawhostcall" "github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm/types" ) @@ -70,20 +71,14 @@ func proxyOnMemoryAllocate(size uint) *byte { return &buf[0] } -const ID = "id_2" +const ID = "id_1" // DO NOT MODIFY THE FOLLOWING FUNCTIONS! - //export proxy_get_id -func GetID() *byte { +func GetID() types.Status { _ = ID[len(ID)-1] id := ID bt := *(*[]byte)(unsafe.Pointer(&id)) - return &bt[0] -} - -//export proxy_get_id_length -func GetIDLen() int32 { - return int32(len(ID)) + return rawhostcall.ProxySetBufferBytes(types.BufferTypeCallData, 0, len(ID), &bt[0], len(ID)) } diff --git a/go.mod b/go.mod index decc704a05..cccfd45c1f 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/shirou/gopsutil v3.21.3+incompatible github.com/stretchr/testify v1.7.0 + github.com/tetratelabs/proxy-wasm-go-sdk v0.1.2-0.20210520063156-d39281baed90 github.com/tklauser/go-sysconf v0.3.5 // indirect github.com/urfave/cli v1.22.1 github.com/valyala/fasthttp v1.26.0 diff --git a/go.sum b/go.sum index 1a284a1f7f..50d3d82d55 100644 --- a/go.sum +++ b/go.sum @@ -1093,6 +1093,8 @@ github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69 github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= github.com/testcontainers/testcontainers-go v0.9.0/go.mod h1:b22BFXhRbg4PJmeMVWh6ftqjyZHgiIl3w274e9r3C2E= github.com/tetratelabs/proxy-wasm-go-sdk v0.0.13/go.mod h1:y1ZQT4bQEBnR8Do4nSOzb3roczzPvcAp8UrF6NEYWNY= +github.com/tetratelabs/proxy-wasm-go-sdk v0.1.2-0.20210520063156-d39281baed90 h1:Ze9Uyy8LL0+mcF4UWFKoL2mx3MzptgxeG9nJqSZiK8E= +github.com/tetratelabs/proxy-wasm-go-sdk v0.1.2-0.20210520063156-d39281baed90/go.mod h1:qZ+4i6e2wHlhnhgpH0VG4QFzqd2BEvQbQFU0npt2e2k= github.com/tevid/gohamcrest v1.1.1 h1:ou+xSqlIw1xfGTg1uq1nif/htZ2S3EzRqLm2BP+tYU0= github.com/tevid/gohamcrest v1.1.1/go.mod h1:3UvtWlqm8j5JbwYZh80D/PVBt0mJ1eJiYgZMibh0H/k= github.com/tidwall/gjson v1.2.1/go.mod h1:c/nTNbUr0E0OrXEhq1pwa8iEgc2DOt4ZZqAt1HtCkPA= diff --git a/pkg/wasm/abi.go b/pkg/wasm/abi.go index 30820e4d53..827393668d 100644 --- a/pkg/wasm/abi.go +++ b/pkg/wasm/abi.go @@ -17,9 +17,12 @@ package wasm import ( + sdkTypes "github.com/tetratelabs/proxy-wasm-go-sdk/proxywasm/types" "mosn.io/mosn/pkg/types" "mosn.io/mosn/pkg/wasm/abi" v1 "mosn.io/mosn/pkg/wasm/abi/proxywasm010" + "mosn.io/proxy-wasm-go-host/common" + "mosn.io/proxy-wasm-go-host/proxywasm" ) const AbiV2 = "proxy_abi_version_0_2_0" @@ -31,12 +34,20 @@ func init() { func abiImplFactory(instance types.WasmInstance) types.ABI { abi := &AbiV2Impl{} abi.SetInstance(instance) + ih := &ImportsHandler{ + DefaultImportsHandler: v1.DefaultImportsHandler{}, + ioBuffer: &common.CommonBuffer{}, + } + abi.SetImports(ih) + abi.importsHandler = ih return abi } // easy for extension type AbiV2Impl struct { v1.ABIContext + + importsHandler *ImportsHandler } var ( @@ -53,7 +64,7 @@ func (a *AbiV2Impl) GetABIExports() interface{} { } func (a *AbiV2Impl) ProxyGetID() (string, error) { - ff, err := a.Instance.GetExportsFunc("proxy_get_id_length") + ff, err := a.Instance.GetExportsFunc("proxy_get_id") if err != nil { return "", err } @@ -63,24 +74,25 @@ func (a *AbiV2Impl) ProxyGetID() (string, error) { return "", err } a.Imports.Wait() - length := res.(int32) - ff, err = a.Instance.GetExportsFunc("proxy_get_id") - if err != nil { - return "", err - } - res, err = ff.Call() - if err != nil { + status := sdkTypes.Status(res.(int32)) + if err := sdkTypes.StatusToError(status); err != nil { a.Instance.HandleError(err) return "", err } - a.Imports.Wait() - ptr := res.(int32) - data, err := a.Instance.GetMemory(uint64(ptr), uint64(length)) - if err != nil { - return "", err - } + return string(a.importsHandler.ioBuffer.Bytes()), nil +} + +type ImportsHandler struct { + v1.DefaultImportsHandler + + ioBuffer common.IoBuffer +} + +var _ proxywasm.ImportsHandler = &ImportsHandler{} - return string(data), nil +func (h *ImportsHandler) GetFuncCallData() common.IoBuffer { + h.ioBuffer = &common.CommonBuffer{} + return h.ioBuffer } From ccaadd9cf79f7c25e1079a90abe14475573c9260 Mon Sep 17 00:00:00 2001 From: zu1k Date: Tue, 17 Aug 2021 12:10:53 +0800 Subject: [PATCH 11/25] not work --- pkg/wasm/abi.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pkg/wasm/abi.go b/pkg/wasm/abi.go index 827393668d..0f492936e0 100644 --- a/pkg/wasm/abi.go +++ b/pkg/wasm/abi.go @@ -36,7 +36,6 @@ func abiImplFactory(instance types.WasmInstance) types.ABI { abi.SetInstance(instance) ih := &ImportsHandler{ DefaultImportsHandler: v1.DefaultImportsHandler{}, - ioBuffer: &common.CommonBuffer{}, } abi.SetImports(ih) abi.importsHandler = ih @@ -93,6 +92,6 @@ type ImportsHandler struct { var _ proxywasm.ImportsHandler = &ImportsHandler{} func (h *ImportsHandler) GetFuncCallData() common.IoBuffer { - h.ioBuffer = &common.CommonBuffer{} + h.ioBuffer = common.NewIoBufferBytes(make([]byte, 0)) return h.ioBuffer } From d000d3bd0fb38fdf27ad70475d2a99221f8e3020 Mon Sep 17 00:00:00 2001 From: zu1k Date: Wed, 18 Aug 2021 09:06:49 +0800 Subject: [PATCH 12/25] Use FuncCallData buffer to get id --- pkg/wasm/abi.go | 24 +----------------------- pkg/wasm/filter.go | 2 -- pkg/wasm/imports.go | 14 ++++++++++++++ 3 files changed, 15 insertions(+), 25 deletions(-) diff --git a/pkg/wasm/abi.go b/pkg/wasm/abi.go index 0f492936e0..2a8a01d561 100644 --- a/pkg/wasm/abi.go +++ b/pkg/wasm/abi.go @@ -21,8 +21,6 @@ import ( "mosn.io/mosn/pkg/types" "mosn.io/mosn/pkg/wasm/abi" v1 "mosn.io/mosn/pkg/wasm/abi/proxywasm010" - "mosn.io/proxy-wasm-go-host/common" - "mosn.io/proxy-wasm-go-host/proxywasm" ) const AbiV2 = "proxy_abi_version_0_2_0" @@ -34,19 +32,12 @@ func init() { func abiImplFactory(instance types.WasmInstance) types.ABI { abi := &AbiV2Impl{} abi.SetInstance(instance) - ih := &ImportsHandler{ - DefaultImportsHandler: v1.DefaultImportsHandler{}, - } - abi.SetImports(ih) - abi.importsHandler = ih return abi } // easy for extension type AbiV2Impl struct { v1.ABIContext - - importsHandler *ImportsHandler } var ( @@ -80,18 +71,5 @@ func (a *AbiV2Impl) ProxyGetID() (string, error) { return "", err } - return string(a.importsHandler.ioBuffer.Bytes()), nil -} - -type ImportsHandler struct { - v1.DefaultImportsHandler - - ioBuffer common.IoBuffer -} - -var _ proxywasm.ImportsHandler = &ImportsHandler{} - -func (h *ImportsHandler) GetFuncCallData() common.IoBuffer { - h.ioBuffer = common.NewIoBufferBytes(make([]byte, 0)) - return h.ioBuffer + return string(a.Imports.GetFuncCallData().Bytes()), nil } diff --git a/pkg/wasm/filter.go b/pkg/wasm/filter.go index d95a190098..0be60b3919 100644 --- a/pkg/wasm/filter.go +++ b/pkg/wasm/filter.go @@ -101,8 +101,6 @@ func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { plugin.ReleaseInstance(instance) return nil } - - // TODO: 确定这里做了什么事,调用顺序有影响吗 pluginABI.SetABIImports(filter) exports := pluginABI.GetABIExports().(Exports) diff --git a/pkg/wasm/imports.go b/pkg/wasm/imports.go index 0e66639d7f..8689765ac3 100644 --- a/pkg/wasm/imports.go +++ b/pkg/wasm/imports.go @@ -19,17 +19,24 @@ package wasm import ( "context" "encoding/json" + "github.com/golang/protobuf/proto" "mosn.io/layotto/pkg/grpc" runtimev1pb "mosn.io/layotto/spec/proto/runtime/v1" "mosn.io/mosn/pkg/wasm/abi/proxywasm010" + "mosn.io/proxy-wasm-go-host/common" "mosn.io/proxy-wasm-go-host/proxywasm" ) +// LayottoHandler implement proxywasm.ImportsHandler type LayottoHandler struct { proxywasm010.DefaultImportsHandler + + IoBuffer common.IoBuffer } +var _ proxywasm.ImportsHandler = &LayottoHandler{} + var Layotto grpc.API func (d *LayottoHandler) CallForeignFunction(funcName string, param string) (string, proxywasm.WasmResult) { @@ -70,3 +77,10 @@ type helloRequest struct { ServiceName string `json:"service_name"` Name string `json:"name"` } + +func (d *LayottoHandler) GetFuncCallData() common.IoBuffer { + if d.IoBuffer == nil { + d.IoBuffer = common.NewIoBufferBytes(make([]byte, 0)) + } + return d.IoBuffer +} From f8b82d7940327f3acd1ca2a3a175185a6cc34338 Mon Sep 17 00:00:00 2001 From: zu1k Date: Thu, 19 Aug 2021 16:50:33 +0800 Subject: [PATCH 13/25] Generate router in factory stage --- pkg/wasm/factory.go | 62 ++++++++++++++++++-- pkg/wasm/filter.go | 140 ++++++++++++++------------------------------ 2 files changed, 99 insertions(+), 103 deletions(-) diff --git a/pkg/wasm/factory.go b/pkg/wasm/factory.go index 4cadb072c7..3d32c62b9f 100644 --- a/pkg/wasm/factory.go +++ b/pkg/wasm/factory.go @@ -26,9 +26,7 @@ import ( "mosn.io/mosn/pkg/types" "mosn.io/mosn/pkg/wasm" "mosn.io/mosn/pkg/wasm/abi" - "mosn.io/mosn/pkg/wasm/abi/proxywasm010" "mosn.io/pkg/utils" - "mosn.io/proxy-wasm-go-host/proxywasm" ) const LayottoWasm = "Layotto" @@ -40,21 +38,29 @@ func init() { // FilterConfigFactory contains multi wasm-plugin configs // its pointer implemente api.StreamFilterChainFactory type FilterConfigFactory struct { - proxywasm010.DefaultImportsHandler + LayottoHandler config []*filterConfigItem // contains multi wasm config RootContextID int32 + plugins []*WasmPlugin + router *Router //vmConfigBytes buffer.IoBuffer //pluginConfigBytes buffer.IoBuffer } -var _ api.StreamFilterChainFactory = &FilterConfigFactory{} +var ( + _ api.StreamFilterChainFactory = &FilterConfigFactory{} + // TODO: useless for now + _ types.WasmPluginHandler = &FilterConfigFactory{} +) func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilterChainFactory, error) { factory := &FilterConfigFactory{ config: make([]*filterConfigItem, 0, len(confs)), RootContextID: 1, + plugins: make([]*WasmPlugin, 0, len(confs)), + router: &Router{routes: make(map[string]Group)}, } for configID, confIf := range confs { @@ -98,8 +104,52 @@ func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilte } config.VmConfig = pw.GetConfig().VmConfig - pw.RegisterPluginHandler(factory) factory.config = append(factory.config, config) + + plugin := pw.GetPlugin() + // an instance used for sub tasks, not for user request + instance := plugin.GetInstance() + //defer instance.Release() + defer plugin.ReleaseInstance(instance) + + // handler set instance + factory.LayottoHandler.Instance = instance + // plugin register handler + pw.RegisterPluginHandler(factory) + + // get the ABI of instance + pluginABI := abi.GetABI(instance, AbiV2) + if pluginABI == nil { + log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter abi not found in instance") + plugin.ReleaseInstance(instance) + return nil, errors.New("abi not found in instance") + } + // set the imports of abi + pluginABI.SetABIImports(factory) + + // get wasm exports + exports := pluginABI.GetABIExports().(Exports) + + instance.Lock(pluginABI) + defer instance.Unlock() + + id, err := exports.ProxyGetID() + if err != nil { + log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to get wasm id, PluginName: %v, err: %v", + config.PluginName, err) + return nil, err + } + + wasmPlugin := &WasmPlugin{ + pluginName: config.PluginName, + plugin: plugin, + exports: exports, + abi: pluginABI, + rootContextID: config.RootContextID, + } + + factory.router.RegisterRoute(id, wasmPlugin) + factory.plugins = append(factory.plugins, wasmPlugin) } return factory, nil @@ -172,7 +222,7 @@ func (f *FilterConfigFactory) OnPluginStart(plugin types.WasmPlugin) { plugin.Exec(func(instance types.WasmInstance) bool { a := abi.GetABI(instance, AbiV2) a.SetABIImports(f) - exports := a.GetABIExports().(proxywasm.Exports) + exports := a.GetABIExports().(Exports) instance.Lock(a) defer instance.Unlock() diff --git a/pkg/wasm/filter.go b/pkg/wasm/filter.go index 0be60b3919..2c92a37a63 100644 --- a/pkg/wasm/filter.go +++ b/pkg/wasm/filter.go @@ -24,8 +24,6 @@ import ( "mosn.io/api" "mosn.io/mosn/pkg/log" "mosn.io/mosn/pkg/types" - "mosn.io/mosn/pkg/wasm" - "mosn.io/mosn/pkg/wasm/abi" "mosn.io/mosn/pkg/wasm/abi/proxywasm010" "mosn.io/pkg/buffer" "mosn.io/proxy-wasm-go-host/common" @@ -35,11 +33,10 @@ import ( type Filter struct { LayottoHandler - ctx context.Context - + ctx context.Context factory *FilterConfigFactory - router Router + router *Router plugins []*WasmPlugin receiverFilterHandler api.StreamReceiverFilterHandler @@ -55,10 +52,10 @@ type WasmPlugin struct { plugin types.WasmPlugin instance types.WasmInstance abi types.ABI - exports proxywasm.Exports + exports Exports + // useless for now rootContextID int32 - contextID int32 } var contextIDGenerator int32 @@ -72,80 +69,19 @@ func newContextID(rootContextID int32) int32 { } } +// NewFilter create the filter for a request func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { - configs := factory.config - filter := &Filter{ ctx: ctx, factory: factory, - router: Router{ - routes: make(map[string]Group), - }, - buffer: buffer.NewIoBuffer(100), - } - - plugins := make([]*WasmPlugin, 0, len(configs)) - for _, pluginConfig := range configs { - pluginWrapper := wasm.GetWasmManager().GetWasmPluginWrapperByName(pluginConfig.PluginName) - if pluginWrapper == nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter wasm plugin not exists, plugin name: %v", pluginConfig.PluginName) - return nil - } - - plugin := pluginWrapper.GetPlugin() - instance := plugin.GetInstance() - - pluginABI := abi.GetABI(instance, AbiV2) - if pluginABI == nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter abi not found in instance") - plugin.ReleaseInstance(instance) - return nil - } - pluginABI.SetABIImports(filter) - - exports := pluginABI.GetABIExports().(Exports) - if exports == nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to get exports part from abi") - plugin.ReleaseInstance(instance) - return nil - } - - contextID := newContextID(pluginConfig.RootContextID) - wasmPlugin := &WasmPlugin{ - pluginName: pluginConfig.PluginName, - plugin: plugin, - instance: instance, - abi: pluginABI, - exports: exports, - rootContextID: pluginConfig.RootContextID, - contextID: contextID, - } - plugins = append(plugins, wasmPlugin) - - instance.Lock(pluginABI) - defer instance.Unlock() - err := exports.ProxyOnContextCreate(contextID, pluginConfig.RootContextID) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to create context id: %v, rootContextID: %v, err: %v", - contextID, pluginConfig.RootContextID, err) - return nil - } - - // TODO: 获取id,注册路由 - id, err := exports.ProxyGetID() - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to get id context id: %v, rootContextID: %v, err: %v", - contextID, pluginConfig.RootContextID, err) - return nil - } - filter.router.RegisterRoute(id, wasmPlugin) + router: factory.router, + plugins: factory.plugins, + buffer: buffer.NewIoBuffer(100), } - filter.plugins = plugins - // TODO: 确定这个的作用 - if len(plugins) > 0 { - filter.LayottoHandler.Instance = plugins[0].instance + for _, plugin := range factory.plugins { + plugin.abi.SetABIImports(filter) } return filter @@ -153,22 +89,18 @@ func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { func (f *Filter) OnDestroy() { f.destroyOnce.Do(func() { - for _, plugin := range f.plugins { - plugin.instance.Lock(plugin.abi) - - _, err := plugin.exports.ProxyOnDone(plugin.contextID) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][filter] OnDestroy fail to call ProxyOnDone, err: %v", err) - } - - err = plugin.exports.ProxyOnDelete(plugin.contextID) - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][filter] OnDestroy fail to call ProxyOnDelete, err: %v", err) - } - - plugin.instance.Unlock() - plugin.plugin.ReleaseInstance(plugin.instance) - } + //plugin := f.pluginUsed + //plugin.instance.Lock(plugin.abi) + // + //_, err := plugin.exports.ProxyOnDone(plugin.contextID) + //if err != nil { + // log.DefaultLogger.Errorf("[proxywasm][filter] OnDestroy fail to call ProxyOnDone, err: %v", err) + //} + // + //err = plugin.exports.ProxyOnDelete(plugin.contextID) + //if err != nil { + // log.DefaultLogger.Errorf("[proxywasm][filter] OnDestroy fail to call ProxyOnDelete, err: %v", err) + //} }) } @@ -194,28 +126,42 @@ func headerMapSize(headers api.HeaderMap) int { } func (f *Filter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffer.IoBuffer, trailers api.HeaderMap) api.StreamFilterStatus { - // TODO: should diapatch by header id, ok := headers.Get("id") if !ok { log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestHeaders no id in headers") return api.StreamFilterStop } - plugin, err := f.router.GetRandomPluginByID(id) + wasmPlugin, err := f.router.GetRandomPluginByID(id) if err != nil { log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestHeaders id, err: %v", err) return api.StreamFilterStop } - plugin.instance.Lock(plugin.abi) - defer plugin.instance.Unlock() + plugin := wasmPlugin.plugin + instance := plugin.GetInstance() + defer plugin.ReleaseInstance(instance) + f.LayottoHandler.Instance = instance + wasmPlugin.abi.SetABIImports(f) + exports := wasmPlugin.exports + instance.Lock(wasmPlugin.abi) + defer instance.Unlock() + + contextID := newContextID(wasmPlugin.rootContextID) + + err = exports.ProxyOnContextCreate(contextID, wasmPlugin.rootContextID) + if err != nil { + log.DefaultLogger.Errorf("[proxywasm][filter] NewFilter fail to create context id: %v, rootContextID: %v, err: %v", + contextID, wasmPlugin.rootContextID, err) + return api.StreamFilterStop + } endOfStream := 1 if (buf != nil && buf.Len() > 0) || trailers != nil { endOfStream = 0 } - action, err := plugin.exports.ProxyOnRequestHeaders(plugin.contextID, int32(headerMapSize(headers)), int32(endOfStream)) + action, err := exports.ProxyOnRequestHeaders(contextID, int32(headerMapSize(headers)), int32(endOfStream)) if err != nil || action != proxywasm.ActionContinue { log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestHeaders err: %v", err) return api.StreamFilterStop @@ -227,7 +173,7 @@ func (f *Filter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffe } if buf != nil && buf.Len() > 0 { - action, err = plugin.exports.ProxyOnRequestBody(plugin.contextID, int32(buf.Len()), int32(endOfStream)) + action, err = exports.ProxyOnRequestBody(contextID, int32(buf.Len()), int32(endOfStream)) if err != nil || action != proxywasm.ActionContinue { log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestBody err: %v", err) return api.StreamFilterStop @@ -235,7 +181,7 @@ func (f *Filter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffe } if trailers != nil { - action, err = plugin.exports.ProxyOnRequestTrailers(plugin.contextID, int32(headerMapSize(trailers))) + action, err = exports.ProxyOnRequestTrailers(contextID, int32(headerMapSize(trailers))) if err != nil || action != proxywasm.ActionContinue { log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestTrailers err: %v", err) return api.StreamFilterStop From 1da46368159b2b7962744abf2d1a64d3b6fec71c Mon Sep 17 00:00:00 2001 From: zu1k Date: Thu, 19 Aug 2021 17:14:13 +0800 Subject: [PATCH 14/25] Filter OnDestroy --- demo/wasm/code/golang/wasm_1_1.wasm | Bin 256361 -> 256257 bytes demo/wasm/code/golang/wasm_1_2.wasm | Bin 256361 -> 256257 bytes pkg/wasm/factory.go | 3 +- pkg/wasm/filter.go | 55 +++++++++++++++------------- 4 files changed, 31 insertions(+), 27 deletions(-) diff --git a/demo/wasm/code/golang/wasm_1_1.wasm b/demo/wasm/code/golang/wasm_1_1.wasm index 3c5474a6e79bc03a104caa2af4dcf543458db141..be0865afb746bf0d95e3646e0d44574c5fadb550 100644 GIT binary patch delta 2563 zcmY*a4Nz6b72a?6-pd8vd;BPmKYu`8A}XR5^Web~!H5BhHOZoa%)}LvZOsY6d$7XDY)TZ?8^(XC{xo^Mk zobR07J$vrnfh#c^uEZSv8sc4az0MD$7$%+vUS|qnWyB(Gv<9NTEiTI9t(^u)1FlA@qCMDvwAfb?*J`wasYXFS=I+=gKx-z07j!r zM&@I5dN+kw2jDGW%-1g%Q<@*dOh$Z&_-R>2GF+7P`AEed<>q{h<)2o|?tGjb)1}3g zTnA@tG#T4oMEtkhA4S1?iQlZ2tp%9raderEF7cn$@+R59WLA(8$I6Nz0(e8c6vUTs zU!;s;7j%ZiWVyMJ6pzWSLUdx1ESrvu?^V)f&dAgdMp8KgAze;2 zH-sF{Kdq75p2cB4P$Pp?Xy9Mf$e&eVEQI`|3RmHl-Or&Q&byFO9(Gb@v{O^0s((F) zJdOz}X8}wgM+K^p#IaaCvk*lhwu$tjK%b;%XEI|e)xJeYF)>1(T7nITGnS@lvrg=pM>IpzRhq^)o-K}N^Fz-zhaS;X zzSx29VU)Vmfd+xcWnm{iN0#*M$J5A@EBE7W@*GNL{tbGr_?iEM^Hob1-V{kr>HXi7 z-mgpleb%lfA4F9YD&_X~aTp8av>s%jPS*6`Su9r{_FxULM){9pIy$qsDNFvWpeRsCi3aI~vY zzsC!}QMuy}_%TjOPahrhQMsW{Gd0wQa)ClweiiTWJIB@Ct0)Dg%4yee8bLX9o$j}w z4BS8=iqz^GI40=D&hE!-xYgQzJZ*)V7EzZbx2>aBHCuP@XhNCtL_26O=+9G|o@JjeJ9ytj;bna}`n9|2FR=R5%WBQ>( z%#u$rrXS=;awGLl$wTbTF4a&Up*P?_eIhX>8cx*}bC)^rcN7;BPoE|{abyG=#@wIj z)c*fyb7O#DP|h5{)}+ilS`Sk9&Y^z?d+YUFney`i%<`A$w)Y0~C((g1-Lxmna;j88 z_ZXuvW_-a|M`<-R9|_3tLL#OxNsGSe+FlIMb4WT`DThg-tWAA@G) z&1NJKKM_%$t#L>ryVs1iL~gSs%IxL`8PX`WopRJ$BA9J9T0Aq}tZy-8l@KH1hw-U8 z|4Pwd_Zrc(x?ysw5HBYO(@bvtoKnu@Suk@gQ5Z5@TH<7w`(U~) zagLSKjLoJyWbzg=%p(>OC&IQSdm&NhIn?Rwz2-|hyGOIH)txY6u;U4*X zyr{r>bt+yoRI7>=!fWCqRl8cOn(uvwj+?W%V~ptoT}V$uO?{)B(kK$8)hAX^ztIip hi2CH4eIh-2o6l&hX;_37-y!wuK0$Z#pKggA{{^`dMnV7p delta 2710 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 delta 2710 zcmZ`*3s6+o89v`Rdv`A^yUQZ%@=yUmA&97e>%uC6vc6xWNsAf;6ns=cG1Q5ZMoctQ zwWDK=@gyqZgV1QAHPLvcS{j}DN+)TfHH4^`I8LKx#)=&~wW*2y&n3ooCf%94_xt|; z`ycl|=bqgcFL-WU@ErOE;!U(|=50xRYzCGBFa#L4n`lDGs#P|pW3`cV_yk|Xd-qzp zY{_#gD(BZWRxYfmTwGf}zi|OOfXENl+uBwSG1L$P@rFAKXi8f}A662*sGpo234i3n z18Y_>r;U}^l#GOU0_}2p9zMrQ^7(w^;br-od?ZA#tzrzP{&8*-2x=ztn?NlIrU=-vA4k&Vl4fd zVC*x^_o0-Mr#~cqU6zpy-Ljz&N%&fBC`1P5)$(W|PE(Gbhmg!8s%3KsrS7vjHk0dI z{`hKnhis|+s>yZ-fk?{dw=?!>fOt1_kLhEG=gOx>pa4hJ#u4~CT-}sHY`5h8klav2 zrN_wwMc9inSvCr<#8*&0aUQo_jCtCrNfE14`CH|KQ5c9VDzg~T92K%)H2#7L>jcDv|Qv>&w`Q@2R^z zg{CC;ypFj^mcID0zSz^5yY{R>QFYB=TxK17VulC^AIb*Ib2|Jt??AGvxhW>9P zwqxK>D+v6`_d(!aX}39-l=ZN1jK;J0cVQLVagQg@l|R~ny1vQe5-!wH>*??JXRKu? zakup@x>D!Lt2J9Icx>l*QO+O&fJ__Y9(8O_yuxu{>)n&&!WI>n-|@rgC))ol6-h9F(7(K_>50qr_PZhIfG0CURXQyXJC%BH3FCo08NPy( z2uVj5oxCAg(uE?7QmeY~o}lv~a1B#1SgpB+>Gr^uTAE(Mww3e(=ICvHoq7m3d_?JE zMiZDs3VpWb(!GdgMkioMM&3j!gv`E)jr!qo*N`j?%4PVTKD|$nJll z3wPC@?ql|1`r#W?%hS9OrIbJ?nV`y+^SuW4see4rZ!}?m>iRc7YnZtywg|&6K2UE% z#G&u*rVfK2AXBQi%I4WjgNr>)$21awjOaO)L?PVL4VYxyB&|_|B}HN6qyX$I#QsQLIin!~|PJ<|ZT6Zk`k6 zs#la)Z8+YiiP_i~S^aD7lcT=ok+R(@a-&Z%bA(;|u8F6^aM{Ia`OqukCLe1uU$Q7m zv5VtP)czTk!c7LykB440ufZe5d1g*Di#U4Bda#zclZ~)!rB=lvT`@)Gc!fuP`+(cs zOP4HJoHKt3qg}(;9@P>f>Z($I=pS8O^}_m`akY&TN+;LWE9bMqZ{WO2drmB`aK1~i zoO$14> 0 { - action, err = exports.ProxyOnRequestBody(contextID, int32(buf.Len()), int32(endOfStream)) + action, err = exports.ProxyOnRequestBody(f.contextID, int32(buf.Len()), int32(endOfStream)) if err != nil || action != proxywasm.ActionContinue { log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestBody err: %v", err) return api.StreamFilterStop @@ -181,7 +186,7 @@ func (f *Filter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffe } if trailers != nil { - action, err = exports.ProxyOnRequestTrailers(contextID, int32(headerMapSize(trailers))) + action, err = exports.ProxyOnRequestTrailers(f.contextID, int32(headerMapSize(trailers))) if err != nil || action != proxywasm.ActionContinue { log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestTrailers err: %v", err) return api.StreamFilterStop From a79776f11f7889a2f67eb6946bef15c8b14b63b6 Mon Sep 17 00:00:00 2001 From: zu1k Date: Thu, 19 Aug 2021 17:35:29 +0800 Subject: [PATCH 15/25] Different instances use separate abi --- pkg/wasm/factory.go | 2 -- pkg/wasm/filter.go | 30 +++++++++++++++++++----------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/pkg/wasm/factory.go b/pkg/wasm/factory.go index 9a42cbbedb..33bee24765 100644 --- a/pkg/wasm/factory.go +++ b/pkg/wasm/factory.go @@ -142,8 +142,6 @@ func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilte wasmPlugin := &WasmPlugin{ pluginName: config.PluginName, plugin: plugin, - exports: exports, - abi: pluginABI, rootContextID: config.RootContextID, } diff --git a/pkg/wasm/filter.go b/pkg/wasm/filter.go index a909b87a1d..ed948a05e9 100644 --- a/pkg/wasm/filter.go +++ b/pkg/wasm/filter.go @@ -21,6 +21,8 @@ import ( "sync" "sync/atomic" + "mosn.io/mosn/pkg/wasm/abi" + "mosn.io/api" "mosn.io/mosn/pkg/log" "mosn.io/mosn/pkg/types" @@ -42,6 +44,8 @@ type Filter struct { contextID int32 pluginUsed *WasmPlugin instance types.WasmInstance + abi types.ABI + exports Exports receiverFilterHandler api.StreamReceiverFilterHandler senderFilterHandler api.StreamSenderFilterHandler @@ -54,8 +58,6 @@ type Filter struct { type WasmPlugin struct { pluginName string plugin types.WasmPlugin - abi types.ABI - exports Exports // useless for now rootContextID int32 @@ -84,24 +86,20 @@ func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { buffer: buffer.NewIoBuffer(100), } - for _, plugin := range factory.plugins { - plugin.abi.SetABIImports(filter) - } - return filter } func (f *Filter) OnDestroy() { f.destroyOnce.Do(func() { plugin := f.pluginUsed - f.instance.Lock(plugin.abi) + f.instance.Lock(f.abi) - _, err := plugin.exports.ProxyOnDone(f.contextID) + _, err := f.exports.ProxyOnDone(f.contextID) if err != nil { log.DefaultLogger.Errorf("[proxywasm][filter] OnDestroy fail to call ProxyOnDone, err: %v", err) } - err = plugin.exports.ProxyOnDelete(f.contextID) + err = f.exports.ProxyOnDelete(f.contextID) if err != nil { log.DefaultLogger.Errorf("[proxywasm][filter] OnDestroy fail to call ProxyOnDelete, err: %v", err) } @@ -150,8 +148,18 @@ func (f *Filter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffe instance := plugin.GetInstance() f.instance = instance f.LayottoHandler.Instance = instance - exports := wasmPlugin.exports - instance.Lock(wasmPlugin.abi) + + pluginABI := abi.GetABI(instance, AbiV2) + if pluginABI == nil { + log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive fail to get instance abi") + plugin.ReleaseInstance(instance) + return api.StreamFilterStop + } + pluginABI.SetABIImports(f) + exports := pluginABI.GetABIExports().(Exports) + f.exports = exports + + instance.Lock(pluginABI) defer instance.Unlock() err = exports.ProxyOnContextCreate(f.contextID, wasmPlugin.rootContextID) From e30e8bffdce9c52d91eb879aa9aece3d9621fe13 Mon Sep 17 00:00:00 2001 From: zu1k Date: Thu, 19 Aug 2021 17:44:40 +0800 Subject: [PATCH 16/25] Remove useless code --- pkg/wasm/factory.go | 62 ++++++++------------------------------------- pkg/wasm/filter.go | 4 +-- 2 files changed, 11 insertions(+), 55 deletions(-) diff --git a/pkg/wasm/factory.go b/pkg/wasm/factory.go index 33bee24765..ad656a7f92 100644 --- a/pkg/wasm/factory.go +++ b/pkg/wasm/factory.go @@ -45,15 +45,9 @@ type FilterConfigFactory struct { plugins []*WasmPlugin router *Router - //vmConfigBytes buffer.IoBuffer - //pluginConfigBytes buffer.IoBuffer } -var ( - _ api.StreamFilterChainFactory = &FilterConfigFactory{} - // TODO: useless for now - _ types.WasmPluginHandler = &FilterConfigFactory{} -) +var _ api.StreamFilterChainFactory = &FilterConfigFactory{} func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilterChainFactory, error) { factory := &FilterConfigFactory{ @@ -166,53 +160,17 @@ func (f *FilterConfigFactory) GetRootContextID() int32 { return f.RootContextID } -//func (f *FilterConfigFactory) GetVmConfig() common.IoBuffer { -// if f.vmConfigBytes != nil { -// return f.vmConfigBytes -// } -// -// vmConfig := *f.config.VmConfig -// typeOf := reflect.TypeOf(vmConfig) -// valueOf := reflect.ValueOf(&vmConfig).Elem() -// -// if typeOf.Kind() != reflect.Struct || typeOf.NumField() == 0 { -// return nil -// } -// -// m := make(map[string]string) -// for i := 0; i < typeOf.NumField(); i++ { -// m[typeOf.Field(i).Name] = fmt.Sprintf("%v", valueOf.Field(i).Interface()) -// } -// -// b := proxywasm.EncodeMap(m) -// if b == nil { -// return nil -// } -// -// f.vmConfigBytes = buffer.NewIoBufferBytes(b) -// -// return f.vmConfigBytes -//} -// -//func (f *FilterConfigFactory) GetPluginConfig() common.IoBuffer { -// if f.pluginConfigBytes != nil { -// return f.pluginConfigBytes -// } -// -// b := proxywasm.EncodeMap(f.config.UserData) -// if b == nil { -// return nil -// } -// -// f.pluginConfigBytes = buffer.NewIoBufferBytes(b) -// -// return f.pluginConfigBytes -//} +// FilterConfigFactory implement types.WasmPluginHandler +// for `pw.RegisterPluginHandler(factory)` +var _ types.WasmPluginHandler = &FilterConfigFactory{} func (f *FilterConfigFactory) OnConfigUpdate(config v2.WasmPluginConfig) { - // TODO: update the correct wasm - //f.config.InstanceNum = config.InstanceNum - //f.config.VmConfig = config.VmConfig + for _, plugin := range f.config { + if plugin.PluginName == config.PluginName { + plugin.InstanceNum = config.InstanceNum + plugin.VmConfig = config.VmConfig + } + } } func (f *FilterConfigFactory) OnPluginStart(plugin types.WasmPlugin) { diff --git a/pkg/wasm/filter.go b/pkg/wasm/filter.go index ed948a05e9..bf0941180a 100644 --- a/pkg/wasm/filter.go +++ b/pkg/wasm/filter.go @@ -21,11 +21,10 @@ import ( "sync" "sync/atomic" - "mosn.io/mosn/pkg/wasm/abi" - "mosn.io/api" "mosn.io/mosn/pkg/log" "mosn.io/mosn/pkg/types" + "mosn.io/mosn/pkg/wasm/abi" "mosn.io/mosn/pkg/wasm/abi/proxywasm010" "mosn.io/pkg/buffer" "mosn.io/proxy-wasm-go-host/common" @@ -209,7 +208,6 @@ func (f *Filter) Append(ctx context.Context, headers api.HeaderMap, buf buffer.I return api.StreamFilterContinue } -// TODO: get the plugin content ID corresponding to the caller wasm plugin func (f *Filter) GetRootContextID() int32 { return f.factory.RootContextID } From 6186df718313c57276eaba51c6d9bdafe9ef105e Mon Sep 17 00:00:00 2001 From: zu1k Date: Thu, 19 Aug 2021 18:19:19 +0800 Subject: [PATCH 17/25] hotreload --- demo/wasm/code/golang/wasm_2_reload.wasm | Bin 0 -> 256145 bytes go.mod | 5 +- go.sum | 19 +- pkg/wasm/factory.go | 2 +- pkg/wasm/watcher.go | 282 +++++++++++------------ 5 files changed, 156 insertions(+), 152 deletions(-) create mode 100644 demo/wasm/code/golang/wasm_2_reload.wasm diff --git a/demo/wasm/code/golang/wasm_2_reload.wasm b/demo/wasm/code/golang/wasm_2_reload.wasm new file mode 100644 index 0000000000000000000000000000000000000000..695885c6ddf811cdfa8dc72cf859d9221d9f7fd5 GIT binary patch literal 256145 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

    nxQ!R~ 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 EWdnT)SdE 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 literal 0 HcmV?d00001 diff --git a/go.mod b/go.mod index cccfd45c1f..0cb035b25d 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.14 require ( github.com/dapr/components-contrib v1.2.0 github.com/dapr/kit v0.0.1 + github.com/fsnotify/fsnotify v1.4.9 github.com/gammazero/workerpool v1.1.2 github.com/golang/mock v1.6.0 github.com/golang/protobuf v1.5.2 @@ -21,10 +22,10 @@ require ( google.golang.org/grpc v1.39.0 google.golang.org/grpc/examples v0.0.0-20210526223527-2de42fcbbce3 // indirect google.golang.org/protobuf v1.27.1 - mosn.io/api v0.0.0-20210414070543-8a0686b03540 + mosn.io/api v0.0.0-20210714065837-5b4c2d66e70c mosn.io/layotto/components v0.0.0-20210625065826-9c2ad8dbcf05 mosn.io/layotto/spec v0.0.0-20210707123820-584778d048d3 - mosn.io/mosn v0.23.0 + mosn.io/mosn v0.24.1-0.20210817133744-f3fc4c31ddee mosn.io/pkg v0.0.0-20210604065522-6e8f5a087814 mosn.io/proxy-wasm-go-host v0.0.0-20210312032409-2334f9cf62ec ) diff --git a/go.sum b/go.sum index 50d3d82d55..6ac085eb52 100644 --- a/go.sum +++ b/go.sum @@ -110,6 +110,7 @@ github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798 h1:2T/jmrHeTezcCM58lvEQXs0UpQJCo5SoGAcg+mbSTIg= github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/HdrHistogram/hdrhistogram-go v1.0.1/go.mod h1:BWJ+nMSHY3L41Zj7CA3uXnloDp7xxV0YvstAE7nKTaM= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= @@ -459,6 +460,7 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A= +github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= @@ -794,8 +796,9 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/microcosm-cc/bluemonday v1.0.7/go.mod h1:HOT/6NaBlR0f9XlxD3zolN6Z3N8Lp4pvhp+jLS5ihnI= -github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.25 h1:dFwPR6SfLtrSwgDcIq2bcU/gVutB4sNApq2HBdqcakg= +github.com/miekg/dns v1.1.25/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/minio/highwayhash v1.0.0/go.mod h1:xQboMTeM9nY9v/LlAOxFctujiv5+Aq2hR5dxBpaMbdc= github.com/minio/highwayhash v1.0.1 h1:dZ6IIu8Z14VlC0VpfKofAhCy74wu/Qb5gcn52yWoz/0= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= @@ -1114,6 +1117,8 @@ github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlp github.com/trainyao/go-maglev v0.0.0-20200611125015-4c1ae64d96a8 h1:o6jtI8/BV93ZCw681cNVMjyvLfnBboUP/lBOfmkb4Pg= github.com/trainyao/go-maglev v0.0.0-20200611125015-4c1ae64d96a8/go.mod h1:VBsRn0SDTltC3/SzN6SgXlQtmBk6U5sf0KW+eT+WMbc= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/uber/jaeger-client-go v2.25.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= @@ -1262,6 +1267,7 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191112222119-e1110fd1c708/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1333,6 +1339,7 @@ golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1413,6 +1420,8 @@ golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1505,6 +1514,7 @@ golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1768,11 +1778,12 @@ k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKf k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= mosn.io/api v0.0.0-20210204052134-5b9a826795fd/go.mod h1:TBv4bz2f2RbpgdohbVAFRFVOoN8YyEUiLH3jAh752Qc= -mosn.io/api v0.0.0-20210414070543-8a0686b03540 h1:hdfOaKU2c5jpLCdJC22IQ8kR7qVCUtl6dSq/FsepnuY= mosn.io/api v0.0.0-20210414070543-8a0686b03540/go.mod h1:TBv4bz2f2RbpgdohbVAFRFVOoN8YyEUiLH3jAh752Qc= +mosn.io/api v0.0.0-20210714065837-5b4c2d66e70c h1:DBzFfP1xalj3nnROidazArdP/QxbI1PHSMCKi7sAaQM= +mosn.io/api v0.0.0-20210714065837-5b4c2d66e70c/go.mod h1:TBv4bz2f2RbpgdohbVAFRFVOoN8YyEUiLH3jAh752Qc= mosn.io/mosn v0.22.1-0.20210425073346-b6880db4669c/go.mod h1:YJmivhBjRLif073XgEQRIlEpk15/S4V7cysS2H/40io= -mosn.io/mosn v0.23.0 h1:XwI99UnGFZ336hCxyEoM97MJ5aJI5F127zNKfCRGQ64= -mosn.io/mosn v0.23.0/go.mod h1:9miwkXcUXDYHYIgS+PqyapiRQFpoeNaQDxG2UdGLS3Y= +mosn.io/mosn v0.24.1-0.20210817133744-f3fc4c31ddee h1:rSda+aicdWTQpckhjN0oF6TuakCuOmv14TmNhbB7NLU= +mosn.io/mosn v0.24.1-0.20210817133744-f3fc4c31ddee/go.mod h1:t8FDJezfK6iMVYYSs5G74tZGFkFHPsOfiX/TY9EtIYM= mosn.io/pkg v0.0.0-20210401090620-f0e0d1a3efce/go.mod h1:YEv5sGe7kqo/Yzj7OJI7Udl3iUcagNeo5unGPiUaUfw= mosn.io/pkg v0.0.0-20210604065522-6e8f5a087814 h1:42A6tqajl/hGKkSVLa3mCnaQh8i568Zxgtx0ZECjCmw= mosn.io/pkg v0.0.0-20210604065522-6e8f5a087814/go.mod h1:YEv5sGe7kqo/Yzj7OJI7Udl3iUcagNeo5unGPiUaUfw= diff --git a/pkg/wasm/factory.go b/pkg/wasm/factory.go index ad656a7f92..3ebf336ba4 100644 --- a/pkg/wasm/factory.go +++ b/pkg/wasm/factory.go @@ -86,7 +86,7 @@ func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilte return nil, err } - //addWatchFile(config, pluginName) + addWatchFile(config, factory) } else { pluginName = config.FromWasmPlugin } diff --git a/pkg/wasm/watcher.go b/pkg/wasm/watcher.go index 86069fa58a..0b9615fbe5 100644 --- a/pkg/wasm/watcher.go +++ b/pkg/wasm/watcher.go @@ -1,147 +1,139 @@ package wasm -//import ( -// "os" -// "path/filepath" -// "strings" -// -// v2 "mosn.io/mosn/pkg/config/v2" -// "mosn.io/mosn/pkg/log" -// "mosn.io/mosn/pkg/wasm" -// -// "github.com/fsnotify/fsnotify" -//) -// -//var ( -// watcher *fsnotify.Watcher -// configs = make(map[string]*filterConfigItem) -// pluginNames = make(map[string]string) -//) -// -//func init() { -// var err error -// watcher, err = fsnotify.NewWatcher() -// if err != nil { -// log.DefaultLogger.Errorf("[proxywasm] [watcher] init fail to create watcher: %v", err) -// return -// } -// go runWatcher() -//} -// -//func runWatcher() { -// for { -// select { -// case event, ok := <-watcher.Events: -// if !ok { -// log.DefaultLogger.Errorf("[proxywasm] [watcher] runWatcher exit") -// return -// } -// log.DefaultLogger.Debugf("[proxywasm] [watcher] runWatcher got event, %s", event) -// -// if pathIsWasmFile(event.Name) { -// if event.Op&fsnotify.Chmod == fsnotify.Chmod || -// event.Op&fsnotify.Rename == fsnotify.Rename { -// continue -// } else if event.Op&fsnotify.Remove == fsnotify.Remove { -// // rewatch the file if it exists -// // remove this file then nename other file to this name will cause this case -// if fileExist(event.Name) { -// _ = watcher.Add(event.Name) -// } -// continue -// } else if event.Op&fsnotify.Create == fsnotify.Create { -// if fileExist(event.Name) { -// _ = watcher.Add(event.Name) -// } -// } -// reloadWasm(event.Name) -// } -// case err, ok := <-watcher.Errors: -// if !ok { -// log.DefaultLogger.Errorf("[proxywasm] [watcher] runWatcher exit") -// return -// } -// log.DefaultLogger.Errorf("[proxywasm] [watcher] runWatcher got errors, err: %v", err) -// } -// } -//} -// -//func addWatchFile(cfg *filterConfigItem, pluginName string) { -// path := cfg.VmConfig.Path -// if err := watcher.Add(path); err != nil { -// log.DefaultLogger.Errorf("[proxywasm] [watcher] addWatchFile fail to watch wasm file, err: %v", err) -// return -// } -// -// dir := filepath.Dir(path) -// if err := watcher.Add(dir); err != nil { -// log.DefaultLogger.Errorf("[proxywasm] [watcher] addWatchFile fail to watch wasm dir, err: %v", err) -// return -// } -// -// configs[path] = cfg -// pluginNames[path] = pluginName -// log.DefaultLogger.Infof("[proxywasm] [watcher] addWatchFile start to watch wasm file and its dir: %s", path) -//} -// -//func reloadWasm(fullPath string) { -// found := false -// -// for path, config := range configs { -// if strings.HasSuffix(fullPath, path) { -// found = true -// pluginName := pluginNames[path] -// -// err := wasm.GetWasmManager().UninstallWasmPluginByName(pluginName) -// if err != nil { -// log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm fail to uninstall plugin, err: %v", err) -// } -// -// v2Config := v2.WasmPluginConfig{ -// PluginName: pluginName, -// VmConfig: config.VmConfig, -// InstanceNum: config.InstanceNum, -// } -// err = wasm.GetWasmManager().AddOrUpdateWasm(v2Config) -// if err != nil { -// log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm fail to add plugin, err: %v", err) -// return -// } -// -// pw := wasm.GetWasmManager().GetWasmPluginWrapperByName(pluginName) -// if pw == nil { -// log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm plugin not found") -// return -// } -// -// factory := &FilterConfigFactory{ -// pluginName: pluginName, -// config: config, -// } -// pw.RegisterPluginHandler(factory) -// -// log.DefaultLogger.Infof("[proxywasm] [watcher] reloadWasm reload wasm success: %s", path) -// } -// } -// -// if !found { -// log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm WasmPluginConfig not found: %s", fullPath) -// } -//} -// -//func fileExist(file string) bool { -// _, err := os.Stat(file) -// if err != nil && !os.IsExist(err) { -// return false -// } -// return true -//} -// -//func pathIsWasmFile(fullPath string) bool { -// for path, _ := range configs { -// if strings.HasSuffix(fullPath, path) { -// return true -// } -// } -// return false -//} +import ( + "os" + "path/filepath" + "strings" + + v2 "mosn.io/mosn/pkg/config/v2" + "mosn.io/mosn/pkg/log" + "mosn.io/mosn/pkg/wasm" + + "github.com/fsnotify/fsnotify" +) + +var ( + watcher *fsnotify.Watcher + // map[wasm-file-path]config + configs = make(map[string]*filterConfigItem) + // map[wasm-file-path]Factory + factories = make(map[string]*FilterConfigFactory) +) + +func init() { + var err error + watcher, err = fsnotify.NewWatcher() + if err != nil { + log.DefaultLogger.Errorf("[proxywasm] [watcher] init fail to create watcher: %v", err) + return + } + go runWatcher() +} + +func runWatcher() { + for { + select { + case event, ok := <-watcher.Events: + if !ok { + log.DefaultLogger.Errorf("[proxywasm] [watcher] runWatcher exit") + return + } + log.DefaultLogger.Debugf("[proxywasm] [watcher] runWatcher got event, %s", event) + + if pathIsWasmFile(event.Name) { + if event.Op&fsnotify.Chmod == fsnotify.Chmod || + event.Op&fsnotify.Rename == fsnotify.Rename { + continue + } else if event.Op&fsnotify.Remove == fsnotify.Remove { + // rewatch the file if it exists + // remove this file then nename other file to this name will cause this case + if fileExist(event.Name) { + _ = watcher.Add(event.Name) + } + continue + } else if event.Op&fsnotify.Create == fsnotify.Create { + if fileExist(event.Name) { + _ = watcher.Add(event.Name) + } + } + reloadWasm(event.Name) + } + case err, ok := <-watcher.Errors: + if !ok { + log.DefaultLogger.Errorf("[proxywasm] [watcher] runWatcher exit") + return + } + log.DefaultLogger.Errorf("[proxywasm] [watcher] runWatcher got errors, err: %v", err) + } + } +} + +func addWatchFile(cfg *filterConfigItem, factory *FilterConfigFactory) { + path := cfg.VmConfig.Path + if err := watcher.Add(path); err != nil { + log.DefaultLogger.Errorf("[proxywasm] [watcher] addWatchFile fail to watch wasm file, err: %v", err) + return + } + + dir := filepath.Dir(path) + if err := watcher.Add(dir); err != nil { + log.DefaultLogger.Errorf("[proxywasm] [watcher] addWatchFile fail to watch wasm dir, err: %v", err) + return + } + + configs[path] = cfg + factories[path] = factory + log.DefaultLogger.Infof("[proxywasm] [watcher] addWatchFile start to watch wasm file and its dir: %s", path) +} + +func reloadWasm(fullPath string) { + found := false + + for path, config := range configs { + if strings.HasSuffix(fullPath, path) { + found = true + + v2Config := v2.WasmPluginConfig{ + PluginName: config.PluginName, + VmConfig: config.VmConfig, + InstanceNum: config.InstanceNum, + } + err := wasm.GetWasmManager().AddOrUpdateWasm(v2Config) + if err != nil { + log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm fail to add plugin, err: %v", err) + return + } + + pw := wasm.GetWasmManager().GetWasmPluginWrapperByName(config.PluginName) + if pw == nil { + log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm plugin not found") + return + } + + factory := factories[path] + pw.RegisterPluginHandler(factory) + log.DefaultLogger.Infof("[proxywasm] [watcher] reloadWasm reload wasm success: %s", path) + } + } + + if !found { + log.DefaultLogger.Errorf("[proxywasm] [watcher] reloadWasm WasmPluginConfig not found: %s", fullPath) + } +} + +func fileExist(file string) bool { + _, err := os.Stat(file) + if err != nil && !os.IsExist(err) { + return false + } + return true +} + +func pathIsWasmFile(fullPath string) bool { + for path, _ := range configs { + if strings.HasSuffix(fullPath, path) { + return true + } + } + return false +} From 805a0ca545e534739c5fef3f527778824885494b Mon Sep 17 00:00:00 2001 From: zu1k Date: Thu, 19 Aug 2021 18:49:55 +0800 Subject: [PATCH 18/25] fix wasm --- demo/wasm/code/golang/wasm_2.wasm | Bin 256361 -> 256257 bytes test/integrate/wasm_test.go | 12 +++++++++--- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/demo/wasm/code/golang/wasm_2.wasm b/demo/wasm/code/golang/wasm_2.wasm index e6934f792548442797ea878270edd59a6c1e3e7d..7a32f115f5ab31eef3a2a9c06dd691bf86c77890 100644 GIT binary patch delta 2563 zcmY*a4Nz6b72a?6-pd8vd;BPmKYu`8A}XR5^Web~!H5BhHOZoa%)}LvZOsY6d$7XDY)TZ?8^(XC{xo^Mk zobR07J$vrnfh#c^uEZSv8sc4az0MD$7$%+vUS|qnWyB(Gv<9NTEiTI9t(^u)1FlA@qCMDvwAfb?*J`wasYXFS=I+=gKx-z07j!r zM&@I5dN+kw2jDGW%-1g%Q<@*dOh$Z&_-R>2GF+7P`AEed<>q{h<)2o|?tGjb)1}3g zTnA@tG#T4oMEtkhA4S1?iQlZ2tp%9raderEF7cn$@+R59WLA(8$I6Nz0(e8c6vUTs zU!;s;7j%ZiWVyMJ6pzWSLUdx1ESrvu?^V)f&dAgdMp8KgAze;2 zH-sF{Kdq75p2cB4P$Pp?Xy9Mf$e&eVEQI`|3RmHl-Or&Q&byFO9(Gb@v{O^0s((F) zJdOz}X8}wgM+K^p#IaaCvk*lhwu$tjK%b;%XEI|e)xJeYF)>1(T7nITGnS@lvrg=pM>IpzRhq^)o-K}N^Fz-zhaS;X zzSx29VU)Vmfd+xcWnm{iN0#*M$J5A@EBE7W@*GNL{tbGr_?iEM^Hob1-V{kr>HXi7 z-mgpleb%lfA4F9YD&_X~aTp8av>s%jPS*6`Su9r{_FxULM){9pIy$qsDNFvWpeRsCi3aI~vY zzsC!}QMuy}_%TjOPahrhQMsW{Gd0wQa)ClweiiTWJIB@Ct0)Dg%4yee8bLX9o$j}w z4BS8=iqz^GI40=D&hE!-xYgQzJZ*)V7EzZbx2>aBHCuP@XhNCtL_26O=+9G|o@JjeJ9ytj;bna}`n9|2FR=R5%WBQ>( z%#u$rrXS=;awGLl$wTbTF4a&Up*P?_eIhX>8cx*}bC)^rcN7;BPoE|{abyG=#@wIj z)c*fyb7O#DP|h5{)}+ilS`Sk9&Y^z?d+YUFney`i%<`A$w)Y0~C((g1-Lxmna;j88 z_ZXuvW_-a|M`<-R9|_3tLL#OxNsGSe+FlIMb4WT`DThg-tWAA@G) z&1NJKKM_%$t#L>ryVs1iL~gSs%IxL`8PX`WopRJ$BA9J9T0Aq}tZy-8l@KH1hw-U8 z|4Pwd_Zrc(x?ysw5HBYO(@bvtoKnu@Suk@gQ5Z5@TH<7w`(U~) zagLSKjLoJyWbzg=%p(>OC&IQSdm&NhIn?Rwz2-|hyGOIH)txY6u;U4*X zyr{r>bt+yoRI7>=!fWCqRl8cOn(uvwj+?W%V~ptoT}V$uO?{)B(kK$8)hAX^ztIip hi2CH4eIh-2o6l&hX;_37-y!wuK0$Z#pKggA{{^`dMnV7p delta 2710 zcmZ`*3s6+o89v`Rdv`A^yUQZ%@=yUmA&97e>%uC6vc6xWNsAf;6ns=cG1Q5ZMoctQ zwWDK=@gyqZgV1QAHPLvcS{j}DN+)TfHH4^`I8LKx#)=&~wW*2y&n3ooCf%94_xt|; z`ycl|=bqgcFL-WU@ErOE;!U(|=50xRYzCGBFa#L4n`lDGs#P|pW3`cV_yk|Xd-qzp zY{_#gD(BZWRxYfmTwGf}zi|OOfXENl+uBwSG1L$P@rFAKXi8f}A662*sGpo234i3n z18Y_>r;U}^l#GOU0_}2p9zMrQ^7(w^;br-od?ZA#tzrzP{&8*-2x=ztn?NlIrU=-vA4k&Vl4fd zVC*x^_o0-Mr#~cqU6zpy-Ljz&N%&fBC`1P5)$(W|PE(Gbhmg!8s%3KsrS7vjHk0dI z{`hKnhis|+s>yZ-fk?{dw=?!>fOt1_kLhEG=gOx>pa4hJ#u4~CT-}sHY`5h8klav2 zrN_wwMc9inSvCr<#8*&0aUQo_jCtCrNfE14`CH|KQ5c9VDzg~T92K%)H2#7L>jcDv|Qv>&w`Q@2R^z zg{CC;ypFj^mcID0zSz^5yY{R>QFYB=TxK17VulC^AIb*Ib2|Jt??AGvxhW>9P zwqxK>D+v6`_d(!aX}39-l=ZN1jK;J0cVQLVagQg@l|R~ny1vQe5-!wH>*??JXRKu? zakup@x>D!Lt2J9Icx>l*QO+O&fJ__Y9(8O_yuxu{>)n&&!WI>n-|@rgC))ol6-h9F(7(K_>50qr_PZhIfG0CURXQyXJC%BH3FCo08NPy( z2uVj5oxCAg(uE?7QmeY~o}lv~a1B#1SgpB+>Gr^uTAE(Mww3e(=ICvHoq7m3d_?JE zMiZDs3VpWb(!GdgMkioMM&3j!gv`E)jr!qo*N`j?%4PVTKD|$nJll z3wPC@?ql|1`r#W?%hS9OrIbJ?nV`y+^SuW4see4rZ!}?m>iRc7YnZtywg|&6K2UE% z#G&u*rVfK2AXBQi%I4WjgNr>)$21awjOaO)L?PVL4VYxyB&|_|B}HN6qyX$I#QsQLIin!~|PJ<|ZT6Zk`k6 zs#la)Z8+YiiP_i~S^aD7lcT=ok+R(@a-&Z%bA(;|u8F6^aM{Ia`OqukCLe1uU$Q7m zv5VtP)czTk!c7LykB440ufZe5d1g*Di#U4Bda#zclZ~)!rB=lvT`@)Gc!fuP`+(cs zOP4HJoHKt3qg}(;9@P>f>Z($I=pS8O^}_m`akY&TN+;LWE9bMqZ{WO2drmB`aK1~i zoO$14> Date: Thu, 19 Aug 2021 19:06:24 +0800 Subject: [PATCH 19/25] Fix wasm hot reload watcher --- pkg/wasm/watcher.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/pkg/wasm/watcher.go b/pkg/wasm/watcher.go index 0b9615fbe5..7deaeec613 100644 --- a/pkg/wasm/watcher.go +++ b/pkg/wasm/watcher.go @@ -93,9 +93,11 @@ func reloadWasm(fullPath string) { if strings.HasSuffix(fullPath, path) { found = true + vmConfig := *config.VmConfig + vmConfig.Md5 = "" v2Config := v2.WasmPluginConfig{ PluginName: config.PluginName, - VmConfig: config.VmConfig, + VmConfig: &vmConfig, InstanceNum: config.InstanceNum, } err := wasm.GetWasmManager().AddOrUpdateWasm(v2Config) @@ -112,6 +114,12 @@ func reloadWasm(fullPath string) { factory := factories[path] pw.RegisterPluginHandler(factory) + + for _, plugin := range factory.plugins { + if plugin.pluginName == config.PluginName { + plugin.plugin = pw.GetPlugin() + } + } log.DefaultLogger.Infof("[proxywasm] [watcher] reloadWasm reload wasm success: %s", path) } } From b3e3038f4a133207050ba2eb603840297e2c2d65 Mon Sep 17 00:00:00 2001 From: zu1k Date: Fri, 20 Aug 2021 12:05:02 +0800 Subject: [PATCH 20/25] Fix details --- pkg/wasm/dispatch.go | 4 ++- pkg/wasm/factory.go | 72 ++++++++++++++++++-------------------------- pkg/wasm/filter.go | 60 ++++++++++++++++++++++++++++++++---- 3 files changed, 86 insertions(+), 50 deletions(-) diff --git a/pkg/wasm/dispatch.go b/pkg/wasm/dispatch.go index f1f385621e..730a3118a6 100644 --- a/pkg/wasm/dispatch.go +++ b/pkg/wasm/dispatch.go @@ -3,6 +3,8 @@ package wasm import ( "errors" "math/rand" + + "mosn.io/mosn/pkg/log" ) type Group struct { @@ -20,7 +22,6 @@ func (route *Router) RegisterRoute(id string, plugin *WasmPlugin) { if group, found := route.routes[id]; found { group.count += 1 group.plugins = append(group.plugins, plugin) - route.routes[id] = group } else { route.routes[id] = Group{ count: 1, @@ -32,6 +33,7 @@ func (route *Router) RegisterRoute(id string, plugin *WasmPlugin) { func (route *Router) GetRandomPluginByID(id string) (*WasmPlugin, error) { group, ok := route.routes[id] if !ok { + log.DefaultLogger.Errorf("[proxywasm][filter] GetRandomPluginByID id not registered, id: %s", id) return nil, errors.New("id is not registered") } diff --git a/pkg/wasm/factory.go b/pkg/wasm/factory.go index 3ebf336ba4..c6269189bc 100644 --- a/pkg/wasm/factory.go +++ b/pkg/wasm/factory.go @@ -36,14 +36,15 @@ func init() { } // FilterConfigFactory contains multi wasm-plugin configs -// its pointer implemente api.StreamFilterChainFactory +// its pointer implement api.StreamFilterChainFactory type FilterConfigFactory struct { LayottoHandler config []*filterConfigItem // contains multi wasm config RootContextID int32 - plugins []*WasmPlugin + // map[pluginName]*WasmPlugin + plugins map[string]*WasmPlugin router *Router } @@ -53,7 +54,7 @@ func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilte factory := &FilterConfigFactory{ config: make([]*filterConfigItem, 0, len(confs)), RootContextID: 1, - plugins: make([]*WasmPlugin, 0, len(confs)), + plugins: make(map[string]*WasmPlugin), router: &Router{routes: make(map[string]Group)}, } @@ -100,47 +101,15 @@ func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilte config.VmConfig = pw.GetConfig().VmConfig factory.config = append(factory.config, config) - plugin := pw.GetPlugin() - // an instance used for sub tasks, not for user request - instance := plugin.GetInstance() - defer plugin.ReleaseInstance(instance) - - // handler set instance - factory.LayottoHandler.Instance = instance - // plugin register handler - pw.RegisterPluginHandler(factory) - - // get the ABI of instance - pluginABI := abi.GetABI(instance, AbiV2) - if pluginABI == nil { - log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to get instance abi, pluginName: %s", pluginName) - plugin.ReleaseInstance(instance) - return nil, errors.New("abi not found in instance") - } - // set the imports of abi - pluginABI.SetABIImports(factory) - - // get wasm exports - exports := pluginABI.GetABIExports().(Exports) - - instance.Lock(pluginABI) - defer instance.Unlock() - - id, err := exports.ProxyGetID() - if err != nil { - log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to get wasm id, PluginName: %v, err: %v", - config.PluginName, err) - return nil, err - } - wasmPlugin := &WasmPlugin{ pluginName: config.PluginName, - plugin: plugin, + plugin: pw.GetPlugin(), rootContextID: config.RootContextID, + config: config, } - - factory.router.RegisterRoute(id, wasmPlugin) - factory.plugins = append(factory.plugins, wasmPlugin) + factory.plugins[config.PluginName] = wasmPlugin + // pw.RegisterPluginHandler will call factory.OnPluginStart + pw.RegisterPluginHandler(factory) } return factory, nil @@ -175,21 +144,38 @@ func (f *FilterConfigFactory) OnConfigUpdate(config v2.WasmPluginConfig) { func (f *FilterConfigFactory) OnPluginStart(plugin types.WasmPlugin) { plugin.Exec(func(instance types.WasmInstance) bool { + wasmPlugin, ok := f.plugins[plugin.PluginName()] + if !ok { + log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to get wasm plugin, PluginName: %s", + plugin.PluginName()) + return true + } + a := abi.GetABI(instance, AbiV2) a.SetABIImports(f) exports := a.GetABIExports().(Exports) + f.LayottoHandler.Instance = instance instance.Lock(a) defer instance.Unlock() - err := exports.ProxyOnContextCreate(f.RootContextID, 0) + // get the ID of wasm, register route + id, err := exports.ProxyGetID() + if err != nil { + log.DefaultLogger.Errorf("[proxywasm][factory] createProxyWasmFilterFactory fail to get wasm id, PluginName: %s, err: %v", + plugin.PluginName, err) + return true + } + f.router.RegisterRoute(id, wasmPlugin) + + err = exports.ProxyOnContextCreate(f.RootContextID, 0) if err != nil { log.DefaultLogger.Errorf("[proxywasm][factory] OnPluginStart fail to create root context id, err: %v", err) return true } vmConfigSize := 0 - if vmConfigBytes := f.GetVmConfig(); vmConfigBytes != nil { + if vmConfigBytes := wasmPlugin.GetVmConfig(); vmConfigBytes != nil { vmConfigSize = vmConfigBytes.Len() } @@ -200,7 +186,7 @@ func (f *FilterConfigFactory) OnPluginStart(plugin types.WasmPlugin) { } pluginConfigSize := 0 - if pluginConfigBytes := f.GetPluginConfig(); pluginConfigBytes != nil { + if pluginConfigBytes := wasmPlugin.GetPluginConfig(); pluginConfigBytes != nil { pluginConfigSize = pluginConfigBytes.Len() } diff --git a/pkg/wasm/filter.go b/pkg/wasm/filter.go index bf0941180a..025a3d5255 100644 --- a/pkg/wasm/filter.go +++ b/pkg/wasm/filter.go @@ -18,6 +18,8 @@ package wasm import ( "context" + "fmt" + "reflect" "sync" "sync/atomic" @@ -38,7 +40,7 @@ type Filter struct { factory *FilterConfigFactory router *Router - plugins []*WasmPlugin + plugins map[string]*WasmPlugin contextID int32 pluginUsed *WasmPlugin @@ -59,7 +61,51 @@ type WasmPlugin struct { plugin types.WasmPlugin // useless for now - rootContextID int32 + rootContextID int32 + config *filterConfigItem + vmConfigBytes buffer.IoBuffer + pluginConfigBytes buffer.IoBuffer +} + +func (p *WasmPlugin) GetVmConfig() common.IoBuffer { + if p.vmConfigBytes != nil { + return p.vmConfigBytes + } + + vmConfig := p.plugin.GetVmConfig() + + typeOf := reflect.TypeOf(vmConfig) + valueOf := reflect.ValueOf(&vmConfig).Elem() + if typeOf.Kind() != reflect.Struct || typeOf.NumField() == 0 { + return nil + } + + m := make(map[string]string) + for i := 0; i < typeOf.NumField(); i++ { + m[typeOf.Field(i).Name] = fmt.Sprintf("%v", valueOf.Field(i).Interface()) + } + + b := proxywasm.EncodeMap(m) + if b == nil { + return nil + } + + p.vmConfigBytes = buffer.NewIoBufferBytes(b) + return p.vmConfigBytes +} + +func (p *WasmPlugin) GetPluginConfig() common.IoBuffer { + if p.pluginConfigBytes != nil { + return p.pluginConfigBytes + } + + b := proxywasm.EncodeMap(p.config.UserData) + if b == nil { + return nil + } + + p.pluginConfigBytes = buffer.NewIoBufferBytes(b) + return p.pluginConfigBytes } var contextIDGenerator int32 @@ -90,6 +136,10 @@ func NewFilter(ctx context.Context, factory *FilterConfigFactory) *Filter { func (f *Filter) OnDestroy() { f.destroyOnce.Do(func() { + if f.pluginUsed == nil || f.instance == nil { + return + } + plugin := f.pluginUsed f.instance.Lock(f.abi) @@ -212,14 +262,12 @@ func (f *Filter) GetRootContextID() int32 { return f.factory.RootContextID } -// TODO: get the plugin vm config corresponding to the caller wasm plugin func (f *Filter) GetVmConfig() common.IoBuffer { - return f.factory.GetVmConfig() + return f.pluginUsed.GetVmConfig() } -// TODO: get the plugin config corresponding to the caller wasm plugin func (f *Filter) GetPluginConfig() common.IoBuffer { - return f.factory.GetPluginConfig() + return f.pluginUsed.GetPluginConfig() } func (f *Filter) GetHttpRequestHeader() common.HeaderMap { From 71d375950593456e85b1f17e0c692c979c0c7153 Mon Sep 17 00:00:00 2001 From: zu1k Date: Fri, 20 Aug 2021 12:27:54 +0800 Subject: [PATCH 21/25] GetPluginByID weighted by number of instances --- pkg/wasm/dispatch.go | 30 ++++++++++++++++++++---------- pkg/wasm/filter.go | 2 +- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/pkg/wasm/dispatch.go b/pkg/wasm/dispatch.go index 730a3118a6..0e1ecc3ced 100644 --- a/pkg/wasm/dispatch.go +++ b/pkg/wasm/dispatch.go @@ -2,14 +2,14 @@ package wasm import ( "errors" - "math/rand" "mosn.io/mosn/pkg/log" ) type Group struct { - count int - plugins []*WasmPlugin + plugins []*WasmPlugin + instanceCount int + tPool chan int } type Router struct { @@ -20,23 +20,33 @@ type Router struct { // unsafe for concurrent func (route *Router) RegisterRoute(id string, plugin *WasmPlugin) { if group, found := route.routes[id]; found { - group.count += 1 + group.instanceCount += plugin.config.InstanceNum group.plugins = append(group.plugins, plugin) + group.tPool = make(chan int, group.instanceCount) } else { route.routes[id] = Group{ - count: 1, - plugins: []*WasmPlugin{plugin}, + plugins: []*WasmPlugin{plugin}, + instanceCount: plugin.config.InstanceNum, + tPool: make(chan int, plugin.config.InstanceNum), } } } -func (route *Router) GetRandomPluginByID(id string) (*WasmPlugin, error) { +func (route *Router) GetPluginByID(id string) (*WasmPlugin, error) { group, ok := route.routes[id] if !ok { - log.DefaultLogger.Errorf("[proxywasm][filter] GetRandomPluginByID id not registered, id: %s", id) + log.DefaultLogger.Errorf("[proxywasm][filter] GetPluginByID id not registered, id: %s", id) return nil, errors.New("id is not registered") } - idx := rand.Intn(group.count) - return group.plugins[idx], nil + if len(group.tPool) == 0 { + for idx, plugin := range group.plugins { + instanceNum := plugin.plugin.InstanceNum() + for i := 0; i < instanceNum; i++ { + group.tPool <- idx + } + } + } + + return group.plugins[<-group.tPool], nil } diff --git a/pkg/wasm/filter.go b/pkg/wasm/filter.go index 025a3d5255..e2b28f07eb 100644 --- a/pkg/wasm/filter.go +++ b/pkg/wasm/filter.go @@ -186,7 +186,7 @@ func (f *Filter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffe return api.StreamFilterStop } - wasmPlugin, err := f.router.GetRandomPluginByID(id) + wasmPlugin, err := f.router.GetPluginByID(id) if err != nil { log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestHeaders id, err: %v", err) return api.StreamFilterStop From e066f44a7b6c2bd716967174dc64cdc7d29ffa35 Mon Sep 17 00:00:00 2001 From: zu1k Date: Fri, 20 Aug 2021 13:15:41 +0800 Subject: [PATCH 22/25] Use smooth weighted round-robin balancing --- pkg/wasm/dispatch.go | 64 ++++++++++++++++++++++++++++++-------------- pkg/wasm/factory.go | 2 +- 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/pkg/wasm/dispatch.go b/pkg/wasm/dispatch.go index 0e1ecc3ced..033d592872 100644 --- a/pkg/wasm/dispatch.go +++ b/pkg/wasm/dispatch.go @@ -6,28 +6,34 @@ import ( "mosn.io/mosn/pkg/log" ) +type Router struct { + routes map[string]*Group +} + type Group struct { - plugins []*WasmPlugin - instanceCount int - tPool chan int + weightNodes []*WeightNode } -type Router struct { - routes map[string]Group +type WeightNode struct { + plugin *WasmPlugin + weight int + currentWeight int + effectiveWeight int } // RegisterRoute register a group with id // unsafe for concurrent func (route *Router) RegisterRoute(id string, plugin *WasmPlugin) { + node := &WeightNode{ + plugin: plugin, + weight: plugin.plugin.InstanceNum(), + effectiveWeight: plugin.plugin.InstanceNum(), + } if group, found := route.routes[id]; found { - group.instanceCount += plugin.config.InstanceNum - group.plugins = append(group.plugins, plugin) - group.tPool = make(chan int, group.instanceCount) + group.weightNodes = append(group.weightNodes, node) } else { - route.routes[id] = Group{ - plugins: []*WasmPlugin{plugin}, - instanceCount: plugin.config.InstanceNum, - tPool: make(chan int, plugin.config.InstanceNum), + route.routes[id] = &Group{ + weightNodes: []*WeightNode{node}, } } } @@ -35,18 +41,36 @@ func (route *Router) RegisterRoute(id string, plugin *WasmPlugin) { func (route *Router) GetPluginByID(id string) (*WasmPlugin, error) { group, ok := route.routes[id] if !ok { - log.DefaultLogger.Errorf("[proxywasm][filter] GetPluginByID id not registered, id: %s", id) + log.DefaultLogger.Errorf("[proxywasm][dispatch] GetPluginByID id not registered, id: %s", id) return nil, errors.New("id is not registered") } - if len(group.tPool) == 0 { - for idx, plugin := range group.plugins { - instanceNum := plugin.plugin.InstanceNum() - for i := 0; i < instanceNum; i++ { - group.tPool <- idx - } + if plugin := group.Next(); plugin != nil { + log.DefaultLogger.Infof("[proxywasm][dispatch] GetPluginByID return plugin: %s", plugin.pluginName) + return plugin, nil + } + return nil, errors.New("Next return nil") +} + +func (g *Group) Next() *WasmPlugin { + var best *WeightNode + total := 0 + for i := 0; i < len(g.weightNodes); i++ { + w := g.weightNodes[i] + total += w.effectiveWeight + w.currentWeight += w.effectiveWeight + if w.effectiveWeight < w.weight { + w.effectiveWeight++ + } + + if best == nil || w.currentWeight > best.currentWeight { + best = w } } - return group.plugins[<-group.tPool], nil + if best == nil { + return nil + } + best.currentWeight -= total + return best.plugin } diff --git a/pkg/wasm/factory.go b/pkg/wasm/factory.go index c6269189bc..ef40773522 100644 --- a/pkg/wasm/factory.go +++ b/pkg/wasm/factory.go @@ -55,7 +55,7 @@ func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilte config: make([]*filterConfigItem, 0, len(confs)), RootContextID: 1, plugins: make(map[string]*WasmPlugin), - router: &Router{routes: make(map[string]Group)}, + router: &Router{routes: make(map[string]*Group)}, } for configID, confIf := range confs { From 076af3606fa4bb64977a908f645d6a82a9b3ed1c Mon Sep 17 00:00:00 2001 From: zu1k Date: Fri, 20 Aug 2021 13:19:05 +0800 Subject: [PATCH 23/25] Revert "Use smooth weighted round-robin balancing" This reverts commit e066f44a7b6c2bd716967174dc64cdc7d29ffa35. --- pkg/wasm/dispatch.go | 64 ++++++++++++++------------------------------ pkg/wasm/factory.go | 2 +- 2 files changed, 21 insertions(+), 45 deletions(-) diff --git a/pkg/wasm/dispatch.go b/pkg/wasm/dispatch.go index 033d592872..0e1ecc3ced 100644 --- a/pkg/wasm/dispatch.go +++ b/pkg/wasm/dispatch.go @@ -6,34 +6,28 @@ import ( "mosn.io/mosn/pkg/log" ) -type Router struct { - routes map[string]*Group -} - type Group struct { - weightNodes []*WeightNode + plugins []*WasmPlugin + instanceCount int + tPool chan int } -type WeightNode struct { - plugin *WasmPlugin - weight int - currentWeight int - effectiveWeight int +type Router struct { + routes map[string]Group } // RegisterRoute register a group with id // unsafe for concurrent func (route *Router) RegisterRoute(id string, plugin *WasmPlugin) { - node := &WeightNode{ - plugin: plugin, - weight: plugin.plugin.InstanceNum(), - effectiveWeight: plugin.plugin.InstanceNum(), - } if group, found := route.routes[id]; found { - group.weightNodes = append(group.weightNodes, node) + group.instanceCount += plugin.config.InstanceNum + group.plugins = append(group.plugins, plugin) + group.tPool = make(chan int, group.instanceCount) } else { - route.routes[id] = &Group{ - weightNodes: []*WeightNode{node}, + route.routes[id] = Group{ + plugins: []*WasmPlugin{plugin}, + instanceCount: plugin.config.InstanceNum, + tPool: make(chan int, plugin.config.InstanceNum), } } } @@ -41,36 +35,18 @@ func (route *Router) RegisterRoute(id string, plugin *WasmPlugin) { func (route *Router) GetPluginByID(id string) (*WasmPlugin, error) { group, ok := route.routes[id] if !ok { - log.DefaultLogger.Errorf("[proxywasm][dispatch] GetPluginByID id not registered, id: %s", id) + log.DefaultLogger.Errorf("[proxywasm][filter] GetPluginByID id not registered, id: %s", id) return nil, errors.New("id is not registered") } - if plugin := group.Next(); plugin != nil { - log.DefaultLogger.Infof("[proxywasm][dispatch] GetPluginByID return plugin: %s", plugin.pluginName) - return plugin, nil - } - return nil, errors.New("Next return nil") -} - -func (g *Group) Next() *WasmPlugin { - var best *WeightNode - total := 0 - for i := 0; i < len(g.weightNodes); i++ { - w := g.weightNodes[i] - total += w.effectiveWeight - w.currentWeight += w.effectiveWeight - if w.effectiveWeight < w.weight { - w.effectiveWeight++ - } - - if best == nil || w.currentWeight > best.currentWeight { - best = w + if len(group.tPool) == 0 { + for idx, plugin := range group.plugins { + instanceNum := plugin.plugin.InstanceNum() + for i := 0; i < instanceNum; i++ { + group.tPool <- idx + } } } - if best == nil { - return nil - } - best.currentWeight -= total - return best.plugin + return group.plugins[<-group.tPool], nil } diff --git a/pkg/wasm/factory.go b/pkg/wasm/factory.go index ef40773522..c6269189bc 100644 --- a/pkg/wasm/factory.go +++ b/pkg/wasm/factory.go @@ -55,7 +55,7 @@ func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilte config: make([]*filterConfigItem, 0, len(confs)), RootContextID: 1, plugins: make(map[string]*WasmPlugin), - router: &Router{routes: make(map[string]*Group)}, + router: &Router{routes: make(map[string]Group)}, } for configID, confIf := range confs { From 80725d369287d58117cdefa5f8140af936a34bb8 Mon Sep 17 00:00:00 2001 From: zu1k Date: Fri, 20 Aug 2021 13:19:20 +0800 Subject: [PATCH 24/25] Revert "GetPluginByID weighted by number of instances" This reverts commit 71d375950593456e85b1f17e0c692c979c0c7153. --- pkg/wasm/dispatch.go | 30 ++++++++++-------------------- pkg/wasm/filter.go | 2 +- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/pkg/wasm/dispatch.go b/pkg/wasm/dispatch.go index 0e1ecc3ced..730a3118a6 100644 --- a/pkg/wasm/dispatch.go +++ b/pkg/wasm/dispatch.go @@ -2,14 +2,14 @@ package wasm import ( "errors" + "math/rand" "mosn.io/mosn/pkg/log" ) type Group struct { - plugins []*WasmPlugin - instanceCount int - tPool chan int + count int + plugins []*WasmPlugin } type Router struct { @@ -20,33 +20,23 @@ type Router struct { // unsafe for concurrent func (route *Router) RegisterRoute(id string, plugin *WasmPlugin) { if group, found := route.routes[id]; found { - group.instanceCount += plugin.config.InstanceNum + group.count += 1 group.plugins = append(group.plugins, plugin) - group.tPool = make(chan int, group.instanceCount) } else { route.routes[id] = Group{ - plugins: []*WasmPlugin{plugin}, - instanceCount: plugin.config.InstanceNum, - tPool: make(chan int, plugin.config.InstanceNum), + count: 1, + plugins: []*WasmPlugin{plugin}, } } } -func (route *Router) GetPluginByID(id string) (*WasmPlugin, error) { +func (route *Router) GetRandomPluginByID(id string) (*WasmPlugin, error) { group, ok := route.routes[id] if !ok { - log.DefaultLogger.Errorf("[proxywasm][filter] GetPluginByID id not registered, id: %s", id) + log.DefaultLogger.Errorf("[proxywasm][filter] GetRandomPluginByID id not registered, id: %s", id) return nil, errors.New("id is not registered") } - if len(group.tPool) == 0 { - for idx, plugin := range group.plugins { - instanceNum := plugin.plugin.InstanceNum() - for i := 0; i < instanceNum; i++ { - group.tPool <- idx - } - } - } - - return group.plugins[<-group.tPool], nil + idx := rand.Intn(group.count) + return group.plugins[idx], nil } diff --git a/pkg/wasm/filter.go b/pkg/wasm/filter.go index e2b28f07eb..025a3d5255 100644 --- a/pkg/wasm/filter.go +++ b/pkg/wasm/filter.go @@ -186,7 +186,7 @@ func (f *Filter) OnReceive(ctx context.Context, headers api.HeaderMap, buf buffe return api.StreamFilterStop } - wasmPlugin, err := f.router.GetPluginByID(id) + wasmPlugin, err := f.router.GetRandomPluginByID(id) if err != nil { log.DefaultLogger.Errorf("[proxywasm][filter] OnReceive call ProxyOnRequestHeaders id, err: %v", err) return api.StreamFilterStop From a18e4e16c72832060e913c206450b6843b19fa1b Mon Sep 17 00:00:00 2001 From: zu1k Date: Fri, 20 Aug 2021 13:25:06 +0800 Subject: [PATCH 25/25] Fix group not modified --- pkg/wasm/dispatch.go | 9 ++++++--- pkg/wasm/factory.go | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pkg/wasm/dispatch.go b/pkg/wasm/dispatch.go index 730a3118a6..676bd5c637 100644 --- a/pkg/wasm/dispatch.go +++ b/pkg/wasm/dispatch.go @@ -13,7 +13,7 @@ type Group struct { } type Router struct { - routes map[string]Group + routes map[string]*Group } // RegisterRoute register a group with id @@ -23,7 +23,7 @@ func (route *Router) RegisterRoute(id string, plugin *WasmPlugin) { group.count += 1 group.plugins = append(group.plugins, plugin) } else { - route.routes[id] = Group{ + route.routes[id] = &Group{ count: 1, plugins: []*WasmPlugin{plugin}, } @@ -38,5 +38,8 @@ func (route *Router) GetRandomPluginByID(id string) (*WasmPlugin, error) { } idx := rand.Intn(group.count) - return group.plugins[idx], nil + plugin := group.plugins[idx] + log.DefaultLogger.Infof("[proxywasm][dispatch] GetRandomPluginByID return index: %d, plugin: %s", idx, plugin.pluginName) + return plugin, nil + } diff --git a/pkg/wasm/factory.go b/pkg/wasm/factory.go index c6269189bc..ef40773522 100644 --- a/pkg/wasm/factory.go +++ b/pkg/wasm/factory.go @@ -55,7 +55,7 @@ func createProxyWasmFilterFactory(confs map[string]interface{}) (api.StreamFilte config: make([]*filterConfigItem, 0, len(confs)), RootContextID: 1, plugins: make(map[string]*WasmPlugin), - router: &Router{routes: make(map[string]Group)}, + router: &Router{routes: make(map[string]*Group)}, } for configID, confIf := range confs {