lifetime.go 2.0 KB

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