You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

mount.go 3.7 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package cmd
  2. import (
  3. "fmt"
  4. "os"
  5. "time"
  6. "github.com/spf13/cobra"
  7. "gitlink.org.cn/cloudream/common/pkgs/logger"
  8. "gitlink.org.cn/cloudream/storage2/client2/internal/config"
  9. "gitlink.org.cn/cloudream/storage2/client2/internal/mount"
  10. mntcfg "gitlink.org.cn/cloudream/storage2/client2/internal/mount/config"
  11. stgglb "gitlink.org.cn/cloudream/storage2/common/globals"
  12. "gitlink.org.cn/cloudream/storage2/common/pkgs/connectivity"
  13. "gitlink.org.cn/cloudream/storage2/common/pkgs/db2"
  14. "gitlink.org.cn/cloudream/storage2/common/pkgs/distlock"
  15. "gitlink.org.cn/cloudream/storage2/common/pkgs/downloader"
  16. "gitlink.org.cn/cloudream/storage2/common/pkgs/downloader/strategy"
  17. agtrpc "gitlink.org.cn/cloudream/storage2/common/pkgs/grpc/agent"
  18. "gitlink.org.cn/cloudream/storage2/common/pkgs/metacache"
  19. "gitlink.org.cn/cloudream/storage2/common/pkgs/storage/agtpool"
  20. "gitlink.org.cn/cloudream/storage2/common/pkgs/uploader"
  21. )
  22. func init() {
  23. var configPath string
  24. cmd := &cobra.Command{
  25. Use: "mount",
  26. Args: cobra.ExactArgs(1),
  27. Run: func(cmd *cobra.Command, args []string) {
  28. mountCmd(args[0], configPath)
  29. },
  30. }
  31. cmd.Flags().StringVarP(&configPath, "config", "c", "", "path to config file")
  32. RootCmd.AddCommand(cmd)
  33. }
  34. func mountCmd(mountPoint string, configPath string) {
  35. err := config.Init(configPath)
  36. if err != nil {
  37. fmt.Printf("init config failed, err: %s", err.Error())
  38. os.Exit(1)
  39. }
  40. err = logger.Init(&config.Cfg().Logger)
  41. if err != nil {
  42. fmt.Printf("init logger failed, err: %s", err.Error())
  43. os.Exit(1)
  44. }
  45. stgglb.InitLocal(&config.Cfg().Local)
  46. stgglb.InitMQPool(config.Cfg().RabbitMQ)
  47. stgglb.InitAgentRPCPool(&agtrpc.PoolConfig{})
  48. stgglb.Stats.SetupHubStorageTransfer(*config.Cfg().Local.HubID)
  49. stgglb.Stats.SetupHubTransfer(*config.Cfg().Local.HubID)
  50. // 初始化存储服务管理器
  51. stgAgts := agtpool.NewPool()
  52. // 启动网络连通性检测,并就地检测一次
  53. conCol := connectivity.NewCollector(&config.Cfg().Connectivity, nil)
  54. // conCol.CollectInPlace()
  55. // 初始化元数据缓存服务
  56. metacacheHost := metacache.NewHost()
  57. go metacacheHost.Serve()
  58. stgMeta := metacacheHost.AddStorageMeta()
  59. hubMeta := metacacheHost.AddHubMeta()
  60. conMeta := metacacheHost.AddConnectivity()
  61. // 分布式锁
  62. distlockSvc, err := distlock.NewService(&config.Cfg().DistLock)
  63. if err != nil {
  64. logger.Warnf("new distlock service failed, err: %s", err.Error())
  65. os.Exit(1)
  66. }
  67. go serveDistLock(distlockSvc)
  68. // 初始化下载策略选择器
  69. strgSel := strategy.NewSelector(config.Cfg().DownloadStrategy, stgMeta, hubMeta, conMeta)
  70. // 初始化下载器
  71. dlder := downloader.NewDownloader(config.Cfg().Downloader, &conCol, stgAgts, strgSel)
  72. // 上传器
  73. uploader := uploader.NewUploader(distlockSvc, &conCol, stgAgts, stgMeta)
  74. db, err := db2.NewDB(&config.Cfg().DB)
  75. if err != nil {
  76. logger.Fatalf("new db2 failed, err: %s", err.Error())
  77. }
  78. mnt := mount.NewMount(&mntcfg.Config{
  79. CacheDir: "./cache",
  80. MountPoint: mountPoint,
  81. AttrTimeout: time.Second * 5,
  82. UploadPendingTime: time.Second * 10,
  83. CacheActiveTime: time.Second * 10,
  84. CacheExpireTime: time.Second * 60,
  85. }, db, uploader, &dlder)
  86. ch := mnt.Start()
  87. for {
  88. evt, err := ch.Receive()
  89. if err != nil {
  90. break
  91. }
  92. switch e := evt.(type) {
  93. case mount.MountingFailedEvent:
  94. fmt.Println("mounting failed:", e.Err)
  95. return
  96. case mount.MountExitEvent:
  97. fmt.Printf("mount exit\n")
  98. return
  99. }
  100. }
  101. }
  102. func serveDistLock(svc *distlock.Service) {
  103. logger.Info("start serving distlock")
  104. err := svc.Serve()
  105. if err != nil {
  106. logger.Errorf("distlock stopped with error: %s", err.Error())
  107. }
  108. logger.Info("distlock stopped")
  109. // TODO 仅简单结束了程序
  110. os.Exit(1)
  111. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。