diff --git a/pkg/pluginmanager/lifecycle.go b/pkg/pluginmanager/lifecycle.go index 46fcac0565..1d6ec4c294 100644 --- a/pkg/pluginmanager/lifecycle.go +++ b/pkg/pluginmanager/lifecycle.go @@ -6,6 +6,7 @@ import ( "log" "os/exec" "syscall" + "time" "github.com/hashicorp/go-hclog" "github.com/hashicorp/go-plugin" @@ -64,6 +65,7 @@ func start(steampipeExecutablePath string) (*State, error) { Cmd: pluginManagerCmd, AllowedProtocols: []plugin.Protocol{plugin.ProtocolGRPC}, Logger: logger, + StartTimeout: 3 * time.Minute, //TODO: macke this configurable }) if _, err := client.Start(); err != nil { diff --git a/pkg/pluginmanager_service/plugin_manager.go b/pkg/pluginmanager_service/plugin_manager.go index c6a6721ef4..9afffc75e5 100644 --- a/pkg/pluginmanager_service/plugin_manager.go +++ b/pkg/pluginmanager_service/plugin_manager.go @@ -501,11 +501,25 @@ func (m *PluginManager) startPluginProcess(pluginInstance string, connectionConf cmd := exec.Command(pluginPath) m.setPluginMaxMemory(pluginConfig, cmd) + pluginStartTimeoutSecs := pluginConfig.GetStartTimeout() + if pluginStartTimeoutSecs == 0 { + if viper.IsSet(pconstants.ArgPluginStartTimeout) { + pluginStartTimeoutSecs = viper.GetInt64(pconstants.ArgPluginStartTimeout) + } + } + if pluginStartTimeoutSecs == 0 { + // if we don't have any timeout set use 30 seconds + pluginStartTimeoutSecs = int64(30) + } + pluginStartTimeoutDuration := time.Duration(pluginStartTimeoutSecs) * time.Second + log.Printf("[TRACE] %s pluginStartTimeoutDuration: %s", pluginPath, pluginStartTimeoutDuration) + client := goplugin.NewClient(&goplugin.ClientConfig{ HandshakeConfig: sdkshared.Handshake, Plugins: pluginMap, Cmd: cmd, AllowedProtocols: []goplugin.Protocol{goplugin.ProtocolGRPC}, + StartTimeout: pluginStartTimeoutDuration, // pass our logger to the plugin client to ensure plugin logs end up in logfile Logger: m.logger, @@ -678,7 +692,7 @@ func (m *PluginManager) waitForPluginLoad(p *runningPlugin, req *pb.GetRequest) } pluginStartTimeoutSecs := pluginConfig.GetStartTimeout() if pluginStartTimeoutSecs == 0 { - if viper.IsSet(pconstants.ArgMemoryMaxMbPlugin) { + if viper.IsSet(pconstants.ArgPluginStartTimeout) { pluginStartTimeoutSecs = viper.GetInt64(pconstants.ArgPluginStartTimeout) } }