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.

pin.go 1.5 kB

5 months ago
5 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package opt
  2. import (
  3. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch/dag"
  4. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/ioswitch2/parser/state"
  5. )
  6. // 通过流的输入输出位置来确定指令的执行位置。
  7. // To系列的指令都会有固定的执行位置,这些位置会随着pin操作逐步扩散到整个DAG,
  8. // 所以理论上不会出现有指令的位置始终无法确定的情况。
  9. func Pin(ctx *state.GenerateState) bool {
  10. changed := false
  11. ctx.DAG.Walk(func(node dag.Node) bool {
  12. if node.Env().Pinned {
  13. return true
  14. }
  15. var toEnv *dag.NodeEnv
  16. for _, out := range node.OutputStreams().Slots.RawArray() {
  17. for _, to := range out.Dst.RawArray() {
  18. if to.Env().Type == dag.EnvAny {
  19. continue
  20. }
  21. if toEnv == nil {
  22. toEnv = to.Env()
  23. } else if !toEnv.Equals(to.Env()) {
  24. toEnv = nil
  25. break
  26. }
  27. }
  28. }
  29. if toEnv != nil {
  30. if !node.Env().Equals(toEnv) {
  31. changed = true
  32. }
  33. *node.Env() = *toEnv
  34. return true
  35. }
  36. // 否则根据输入流的始发地来固定
  37. var fromEnv *dag.NodeEnv
  38. for _, in := range node.InputStreams().Slots.RawArray() {
  39. if in.Src.Env().Type == dag.EnvAny {
  40. continue
  41. }
  42. if fromEnv == nil {
  43. fromEnv = in.Src.Env()
  44. } else if !fromEnv.Equals(in.Src.Env()) {
  45. fromEnv = nil
  46. break
  47. }
  48. }
  49. if fromEnv != nil {
  50. if !node.Env().Equals(fromEnv) {
  51. changed = true
  52. }
  53. *node.Env() = *fromEnv
  54. }
  55. return true
  56. })
  57. return changed
  58. }

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