lifetime.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. // add plugin to manager
  21. err = p.Add(r)
  22. if err != nil {
  23. log.Error("add plugin to manager failed: %s", err.Error())
  24. return
  25. }
  26. start_failed_times := 0
  27. // remove lifetime state after plugin if it has been stopped
  28. defer r.TriggerStop()
  29. for !r.Stopped() {
  30. if err := r.InitEnvironment(); err != nil {
  31. log.Error("init environment failed: %s, retry in 30s", err.Error())
  32. time.Sleep(30 * time.Second)
  33. if start_failed_times == 3 {
  34. log.Error(
  35. "init environment failed 3 times, plugin %s has been stopped",
  36. configuration.Identity(),
  37. )
  38. break
  39. }
  40. start_failed_times++
  41. continue
  42. }
  43. start_failed_times = 0
  44. // start plugin
  45. if err := r.StartPlugin(); err != nil {
  46. if r.Stopped() {
  47. break
  48. }
  49. log.Error("start plugin failed: %s, retry in 30s", err.Error())
  50. time.Sleep(30 * time.Second)
  51. if start_failed_times == 3 {
  52. log.Error(
  53. "start plugin failed 3 times, plugin %s has been stopped",
  54. configuration.Identity(),
  55. )
  56. break
  57. }
  58. start_failed_times++
  59. continue
  60. }
  61. // wait for plugin to stop
  62. c, err := r.Wait()
  63. if err == nil {
  64. <-c
  65. }
  66. // restart plugin in 5s
  67. time.Sleep(5 * time.Second)
  68. // add restart times
  69. r.AddRestarts()
  70. }
  71. }