lifetime.go 1.9 KB

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