lifetime.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package plugin_manager
  2. import (
  3. "time"
  4. "github.com/langgenius/dify-plugin-daemon/internal/types/app"
  5. "github.com/langgenius/dify-plugin-daemon/internal/types/entities"
  6. "github.com/langgenius/dify-plugin-daemon/internal/utils/log"
  7. )
  8. func (p *PluginManager) lifetime(config *app.Config, r entities.PluginRuntimeInterface) {
  9. configuration := r.Configuration()
  10. log.Info("new plugin logged in: %s", configuration.Identity())
  11. defer log.Info("plugin %s has exited", configuration.Identity())
  12. // stop plugin when the plugin reaches the end of its lifetime
  13. defer r.Stop()
  14. // add plugin to cluster
  15. err := p.cluster.RegisterPlugin(r)
  16. if err != nil {
  17. log.Error("add plugin to cluster failed: %s", err.Error())
  18. return
  19. }
  20. start_failed_times := 0
  21. // remove lifetime state after plugin if it has been stopped
  22. defer r.TriggerStop()
  23. for !r.Stopped() {
  24. if err := r.InitEnvironment(); err != nil {
  25. log.Error("init environment failed: %s, retry in 30s", err.Error())
  26. time.Sleep(30 * time.Second)
  27. if start_failed_times == 3 {
  28. log.Error(
  29. "init environment failed 3 times, plugin %s has been stopped",
  30. configuration.Identity(),
  31. )
  32. break
  33. }
  34. start_failed_times++
  35. continue
  36. }
  37. start_failed_times = 0
  38. // start plugin
  39. if err := r.StartPlugin(); err != nil {
  40. if r.Stopped() {
  41. break
  42. }
  43. log.Error("start plugin failed: %s, retry in 30s", err.Error())
  44. time.Sleep(30 * time.Second)
  45. if start_failed_times == 3 {
  46. log.Error(
  47. "start plugin failed 3 times, plugin %s has been stopped",
  48. configuration.Identity(),
  49. )
  50. break
  51. }
  52. start_failed_times++
  53. continue
  54. }
  55. // wait for plugin to stop
  56. c, err := r.Wait()
  57. if err == nil {
  58. <-c
  59. }
  60. // restart plugin in 5s
  61. time.Sleep(5 * time.Second)
  62. // add restart times
  63. r.AddRestarts()
  64. }
  65. }