|
@@ -55,7 +55,7 @@ type Manager struct {
|
|
// A map from function name to its plugin file name. It is constructed during initialization by reading kv info. All functions must have at least an entry, even the function resizes in a one function plugin.
|
|
// A map from function name to its plugin file name. It is constructed during initialization by reading kv info. All functions must have at least an entry, even the function resizes in a one function plugin.
|
|
symbols map[string]string
|
|
symbols map[string]string
|
|
// loaded symbols in current runtime
|
|
// loaded symbols in current runtime
|
|
- runtime map[string]plugin.Symbol
|
|
|
|
|
|
+ runtime map[string]*plugin.Plugin
|
|
// dirs
|
|
// dirs
|
|
pluginDir string
|
|
pluginDir string
|
|
etcDir string
|
|
etcDir string
|
|
@@ -77,7 +77,7 @@ func InitManager() (*Manager, error) {
|
|
if err != nil {
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error when opening db: %v", err)
|
|
return nil, fmt.Errorf("error when opening db: %v", err)
|
|
}
|
|
}
|
|
- registry := &Manager{symbols: make(map[string]string), db: db, pluginDir: pluginDir, etcDir: etcDir, runtime: make(map[string]plugin.Symbol)}
|
|
|
|
|
|
+ registry := &Manager{symbols: make(map[string]string), db: db, pluginDir: pluginDir, etcDir: etcDir, runtime: make(map[string]*plugin.Plugin)}
|
|
manager = registry
|
|
manager = registry
|
|
plugins := make([]map[string]string, 3)
|
|
plugins := make([]map[string]string, 3)
|
|
for i := range plugin2.PluginTypes {
|
|
for i := range plugin2.PluginTypes {
|
|
@@ -116,7 +116,7 @@ func findAll(t plugin2.PluginType, pluginDir string) (result map[string]string,
|
|
n, v := parseName(baseName)
|
|
n, v := parseName(baseName)
|
|
//load the plugins when ekuiper set up
|
|
//load the plugins when ekuiper set up
|
|
if !conf.IsTesting {
|
|
if !conf.IsTesting {
|
|
- if _, err := manager.loadRuntime(t, n, path.Join(dir, baseName)); err != nil {
|
|
|
|
|
|
+ if _, err := manager.loadRuntime(t, n, path.Join(dir, baseName), ""); err != nil {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -513,7 +513,7 @@ func (rr *Manager) install(t plugin2.PluginType, name, src string, shellParas []
|
|
|
|
|
|
if !conf.IsTesting {
|
|
if !conf.IsTesting {
|
|
// load the runtime first
|
|
// load the runtime first
|
|
- _, err = manager.loadRuntime(t, soName, soPath)
|
|
|
|
|
|
+ _, err = manager.loadRuntime(t, soName, soPath, "")
|
|
if err != nil {
|
|
if err != nil {
|
|
return version, err
|
|
return version, err
|
|
}
|
|
}
|
|
@@ -526,7 +526,7 @@ func (rr *Manager) install(t plugin2.PluginType, name, src string, shellParas []
|
|
// binder factory implementations
|
|
// binder factory implementations
|
|
|
|
|
|
func (rr *Manager) Source(name string) (api.Source, error) {
|
|
func (rr *Manager) Source(name string) (api.Source, error) {
|
|
- nf, err := rr.loadRuntime(plugin2.SOURCE, name, "")
|
|
|
|
|
|
+ nf, err := rr.loadRuntime(plugin2.SOURCE, name, "", "")
|
|
if err != nil {
|
|
if err != nil {
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
@@ -544,7 +544,7 @@ func (rr *Manager) Source(name string) (api.Source, error) {
|
|
}
|
|
}
|
|
|
|
|
|
func (rr *Manager) LookupSource(name string) (api.LookupSource, error) {
|
|
func (rr *Manager) LookupSource(name string) (api.LookupSource, error) {
|
|
- nf, err := rr.loadRuntime(plugin2.SOURCE, name+"Lookup", "")
|
|
|
|
|
|
+ nf, err := rr.loadRuntime(plugin2.SOURCE, name, "", ucFirst(name)+"Lookup")
|
|
if err != nil {
|
|
if err != nil {
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
@@ -562,7 +562,7 @@ func (rr *Manager) LookupSource(name string) (api.LookupSource, error) {
|
|
}
|
|
}
|
|
|
|
|
|
func (rr *Manager) Sink(name string) (api.Sink, error) {
|
|
func (rr *Manager) Sink(name string) (api.Sink, error) {
|
|
- nf, err := rr.loadRuntime(plugin2.SINK, name, "")
|
|
|
|
|
|
+ nf, err := rr.loadRuntime(plugin2.SINK, name, "", "")
|
|
if err != nil {
|
|
if err != nil {
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
@@ -582,7 +582,7 @@ func (rr *Manager) Sink(name string) (api.Sink, error) {
|
|
}
|
|
}
|
|
|
|
|
|
func (rr *Manager) Function(name string) (api.Function, error) {
|
|
func (rr *Manager) Function(name string) (api.Function, error) {
|
|
- nf, err := rr.loadRuntime(plugin2.FUNCTION, name, "")
|
|
|
|
|
|
+ nf, err := rr.loadRuntime(plugin2.FUNCTION, name, "", "")
|
|
if err != nil {
|
|
if err != nil {
|
|
return nil, err
|
|
return nil, err
|
|
}
|
|
}
|
|
@@ -615,43 +615,50 @@ func (rr *Manager) ConvName(name string) (string, bool) {
|
|
}
|
|
}
|
|
|
|
|
|
// If not found, return nil,nil; Other errors return nil, err
|
|
// If not found, return nil,nil; Other errors return nil, err
|
|
-func (rr *Manager) loadRuntime(t plugin2.PluginType, name, soFilepath string) (plugin.Symbol, error) {
|
|
|
|
- ut := ucFirst(name)
|
|
|
|
|
|
+func (rr *Manager) loadRuntime(t plugin2.PluginType, soName, soFilepath, symbolName string) (plugin.Symbol, error) {
|
|
ptype := plugin2.PluginTypes[t]
|
|
ptype := plugin2.PluginTypes[t]
|
|
- key := ptype + "/" + name
|
|
|
|
- var nf plugin.Symbol
|
|
|
|
|
|
+ key := ptype + "/" + soName
|
|
|
|
+ var (
|
|
|
|
+ plug *plugin.Plugin
|
|
|
|
+ ok bool
|
|
|
|
+ err error
|
|
|
|
+ )
|
|
rr.RLock()
|
|
rr.RLock()
|
|
- nf, ok := rr.runtime[key]
|
|
|
|
|
|
+ plug, ok = rr.runtime[key]
|
|
rr.RUnlock()
|
|
rr.RUnlock()
|
|
if !ok {
|
|
if !ok {
|
|
var soPath string
|
|
var soPath string
|
|
if soFilepath != "" {
|
|
if soFilepath != "" {
|
|
soPath = soFilepath
|
|
soPath = soFilepath
|
|
} else {
|
|
} else {
|
|
- mod, err := rr.getSoFilePath(t, name, false)
|
|
|
|
|
|
+ mod, err := rr.getSoFilePath(t, soName, false)
|
|
if err != nil {
|
|
if err != nil {
|
|
- conf.Log.Warnf(fmt.Sprintf("cannot find the native plugin %s in path: %v", name, err))
|
|
|
|
|
|
+ conf.Log.Warnf(fmt.Sprintf("cannot find the native plugin %s in path: %v", soName, err))
|
|
return nil, nil
|
|
return nil, nil
|
|
}
|
|
}
|
|
soPath = mod
|
|
soPath = mod
|
|
}
|
|
}
|
|
conf.Log.Debugf("Opening plugin %s", soPath)
|
|
conf.Log.Debugf("Opening plugin %s", soPath)
|
|
- plug, err := plugin.Open(soPath)
|
|
|
|
|
|
+ plug, err = plugin.Open(soPath)
|
|
if err != nil {
|
|
if err != nil {
|
|
- conf.Log.Errorf(fmt.Sprintf("plugin %s open error: %v", name, err))
|
|
|
|
|
|
+ conf.Log.Errorf(fmt.Sprintf("plugin %s open error: %v", soName, err))
|
|
return nil, fmt.Errorf("cannot open %s: %v", soPath, err)
|
|
return nil, fmt.Errorf("cannot open %s: %v", soPath, err)
|
|
}
|
|
}
|
|
- conf.Log.Debugf("Successfully open plugin %s", soPath)
|
|
|
|
- nf, err = plug.Lookup(ut)
|
|
|
|
- if err != nil {
|
|
|
|
- conf.Log.Warnf(fmt.Sprintf("cannot find symbol %s, please check if it is exported: %v", ut, err))
|
|
|
|
- return nil, nil
|
|
|
|
- }
|
|
|
|
- conf.Log.Debugf("Successfully look-up plugin %s", soPath)
|
|
|
|
rr.Lock()
|
|
rr.Lock()
|
|
- rr.runtime[key] = nf
|
|
|
|
|
|
+ rr.runtime[key] = plug
|
|
rr.Unlock()
|
|
rr.Unlock()
|
|
|
|
+ conf.Log.Debugf("Successfully open plugin %s", soPath)
|
|
|
|
+ }
|
|
|
|
+ if symbolName == "" {
|
|
|
|
+ symbolName = ucFirst(soName)
|
|
|
|
+ }
|
|
|
|
+ conf.Log.Debugf("Loading symbol %s", symbolName)
|
|
|
|
+ nf, err := plug.Lookup(symbolName)
|
|
|
|
+ if err != nil {
|
|
|
|
+ conf.Log.Warnf(fmt.Sprintf("cannot find symbol %s, please check if it is exported: %v", symbolName, err))
|
|
|
|
+ return nil, nil
|
|
}
|
|
}
|
|
|
|
+ conf.Log.Debugf("Successfully look-up plugin %s", symbolName)
|
|
return nf, nil
|
|
return nf, nil
|
|
}
|
|
}
|
|
|
|
|