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.6 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package cmdline
  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/client/internal/config"
  9. db2 "gitlink.org.cn/cloudream/storage2/client/internal/db"
  10. "gitlink.org.cn/cloudream/storage2/client/internal/downloader"
  11. "gitlink.org.cn/cloudream/storage2/client/internal/downloader/strategy"
  12. "gitlink.org.cn/cloudream/storage2/client/internal/metacache"
  13. "gitlink.org.cn/cloudream/storage2/client/internal/mount"
  14. mntcfg "gitlink.org.cn/cloudream/storage2/client/internal/mount/config"
  15. "gitlink.org.cn/cloudream/storage2/client/internal/uploader"
  16. stgglb "gitlink.org.cn/cloudream/storage2/common/globals"
  17. "gitlink.org.cn/cloudream/storage2/common/pkgs/connectivity"
  18. "gitlink.org.cn/cloudream/storage2/common/pkgs/distlock"
  19. hubrpc "gitlink.org.cn/cloudream/storage2/common/pkgs/grpc/hub"
  20. hubpool "gitlink.org.cn/cloudream/storage2/common/pkgs/storage/pool"
  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.InitHubRPCPool(&hubrpc.PoolConfig{})
  48. // stgglb.Stats.SetupHubStorageTransfer(*config.Cfg().Local.HubID)
  49. // stgglb.Stats.SetupHubTransfer(*config.Cfg().Local.HubID)
  50. // 初始化存储服务管理器
  51. stgPool := hubpool.NewPool()
  52. db, err := db2.NewDB(&config.Cfg().DB)
  53. if err != nil {
  54. logger.Fatalf("new db failed, err: %s", err.Error())
  55. }
  56. // 启动网络连通性检测,并就地检测一次
  57. conCol := connectivity.NewCollector(&config.Cfg().Connectivity, nil)
  58. // conCol.CollectInPlace()
  59. // 初始化元数据缓存服务
  60. metacacheHost := metacache.NewHost(db)
  61. go metacacheHost.Serve()
  62. stgMeta := metacacheHost.AddStorageMeta()
  63. hubMeta := metacacheHost.AddHubMeta()
  64. conMeta := metacacheHost.AddConnectivity()
  65. // 分布式锁
  66. distlockSvc, err := distlock.NewService(&config.Cfg().DistLock)
  67. if err != nil {
  68. logger.Warnf("new distlock service failed, err: %s", err.Error())
  69. os.Exit(1)
  70. }
  71. go serveDistLock(distlockSvc)
  72. // 初始化下载策略选择器
  73. strgSel := strategy.NewSelector(config.Cfg().DownloadStrategy, stgMeta, hubMeta, conMeta)
  74. // 初始化下载器
  75. dlder := downloader.NewDownloader(config.Cfg().Downloader, &conCol, stgPool, strgSel, db)
  76. // 上传器
  77. uploader := uploader.NewUploader(distlockSvc, &conCol, stgPool, stgMeta, db)
  78. mnt := mount.NewMount(&mntcfg.Config{
  79. DataDir: "./cache/data",
  80. MetaDir: "./cache/meta",
  81. MountPoint: mountPoint,
  82. AttrTimeout: time.Second * 5,
  83. UploadPendingTime: time.Second * 10,
  84. CacheActiveTime: time.Second * 10,
  85. CacheExpireTime: time.Second * 60,
  86. ScanDataDirInterval: 30 * time.Second,
  87. }, db, uploader, &dlder)
  88. ch := mnt.Start()
  89. for {
  90. evt, err := ch.Receive()
  91. if err != nil {
  92. break
  93. }
  94. switch e := evt.(type) {
  95. case mount.MountingFailedEvent:
  96. fmt.Println("mounting failed:", e.Err)
  97. return
  98. case mount.MountExitEvent:
  99. fmt.Printf("mount exit\n")
  100. return
  101. }
  102. }
  103. }

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