config.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. package balance
  2. import (
  3. "fmt"
  4. "github.com/seaweedfs/seaweedfs/weed/admin/config"
  5. "github.com/seaweedfs/seaweedfs/weed/glog"
  6. "github.com/seaweedfs/seaweedfs/weed/pb/worker_pb"
  7. "github.com/seaweedfs/seaweedfs/weed/worker/tasks/base"
  8. )
  9. // Config extends BaseConfig with balance-specific settings
  10. type Config struct {
  11. base.BaseConfig
  12. ImbalanceThreshold float64 `json:"imbalance_threshold"`
  13. MinServerCount int `json:"min_server_count"`
  14. }
  15. // NewDefaultConfig creates a new default balance configuration
  16. func NewDefaultConfig() *Config {
  17. return &Config{
  18. BaseConfig: base.BaseConfig{
  19. Enabled: true,
  20. ScanIntervalSeconds: 30 * 60, // 30 minutes
  21. MaxConcurrent: 1,
  22. },
  23. ImbalanceThreshold: 0.2, // 20%
  24. MinServerCount: 2,
  25. }
  26. }
  27. // GetConfigSpec returns the configuration schema for balance tasks
  28. func GetConfigSpec() base.ConfigSpec {
  29. return base.ConfigSpec{
  30. Fields: []*config.Field{
  31. {
  32. Name: "enabled",
  33. JSONName: "enabled",
  34. Type: config.FieldTypeBool,
  35. DefaultValue: true,
  36. Required: false,
  37. DisplayName: "Enable Balance Tasks",
  38. Description: "Whether balance tasks should be automatically created",
  39. HelpText: "Toggle this to enable or disable automatic balance task generation",
  40. InputType: "checkbox",
  41. CSSClasses: "form-check-input",
  42. },
  43. {
  44. Name: "scan_interval_seconds",
  45. JSONName: "scan_interval_seconds",
  46. Type: config.FieldTypeInterval,
  47. DefaultValue: 30 * 60,
  48. MinValue: 5 * 60,
  49. MaxValue: 2 * 60 * 60,
  50. Required: true,
  51. DisplayName: "Scan Interval",
  52. Description: "How often to scan for volume distribution imbalances",
  53. HelpText: "The system will check for volume distribution imbalances at this interval",
  54. Placeholder: "30",
  55. Unit: config.UnitMinutes,
  56. InputType: "interval",
  57. CSSClasses: "form-control",
  58. },
  59. {
  60. Name: "max_concurrent",
  61. JSONName: "max_concurrent",
  62. Type: config.FieldTypeInt,
  63. DefaultValue: 1,
  64. MinValue: 1,
  65. MaxValue: 3,
  66. Required: true,
  67. DisplayName: "Max Concurrent Tasks",
  68. Description: "Maximum number of balance tasks that can run simultaneously",
  69. HelpText: "Limits the number of balance operations running at the same time",
  70. Placeholder: "1 (default)",
  71. Unit: config.UnitCount,
  72. InputType: "number",
  73. CSSClasses: "form-control",
  74. },
  75. {
  76. Name: "imbalance_threshold",
  77. JSONName: "imbalance_threshold",
  78. Type: config.FieldTypeFloat,
  79. DefaultValue: 0.2,
  80. MinValue: 0.05,
  81. MaxValue: 0.5,
  82. Required: true,
  83. DisplayName: "Imbalance Threshold",
  84. Description: "Minimum imbalance ratio to trigger balancing",
  85. HelpText: "Volume distribution imbalances above this threshold will trigger balancing",
  86. Placeholder: "0.20 (20%)",
  87. Unit: config.UnitNone,
  88. InputType: "number",
  89. CSSClasses: "form-control",
  90. },
  91. {
  92. Name: "min_server_count",
  93. JSONName: "min_server_count",
  94. Type: config.FieldTypeInt,
  95. DefaultValue: 2,
  96. MinValue: 2,
  97. MaxValue: 10,
  98. Required: true,
  99. DisplayName: "Minimum Server Count",
  100. Description: "Minimum number of servers required for balancing",
  101. HelpText: "Balancing will only occur if there are at least this many servers",
  102. Placeholder: "2 (default)",
  103. Unit: config.UnitCount,
  104. InputType: "number",
  105. CSSClasses: "form-control",
  106. },
  107. },
  108. }
  109. }
  110. // ToTaskPolicy converts configuration to a TaskPolicy protobuf message
  111. func (c *Config) ToTaskPolicy() *worker_pb.TaskPolicy {
  112. return &worker_pb.TaskPolicy{
  113. Enabled: c.Enabled,
  114. MaxConcurrent: int32(c.MaxConcurrent),
  115. RepeatIntervalSeconds: int32(c.ScanIntervalSeconds),
  116. CheckIntervalSeconds: int32(c.ScanIntervalSeconds),
  117. TaskConfig: &worker_pb.TaskPolicy_BalanceConfig{
  118. BalanceConfig: &worker_pb.BalanceTaskConfig{
  119. ImbalanceThreshold: float64(c.ImbalanceThreshold),
  120. MinServerCount: int32(c.MinServerCount),
  121. },
  122. },
  123. }
  124. }
  125. // FromTaskPolicy loads configuration from a TaskPolicy protobuf message
  126. func (c *Config) FromTaskPolicy(policy *worker_pb.TaskPolicy) error {
  127. if policy == nil {
  128. return fmt.Errorf("policy is nil")
  129. }
  130. // Set general TaskPolicy fields
  131. c.Enabled = policy.Enabled
  132. c.MaxConcurrent = int(policy.MaxConcurrent)
  133. c.ScanIntervalSeconds = int(policy.RepeatIntervalSeconds) // Direct seconds-to-seconds mapping
  134. // Set balance-specific fields from the task config
  135. if balanceConfig := policy.GetBalanceConfig(); balanceConfig != nil {
  136. c.ImbalanceThreshold = float64(balanceConfig.ImbalanceThreshold)
  137. c.MinServerCount = int(balanceConfig.MinServerCount)
  138. }
  139. return nil
  140. }
  141. // LoadConfigFromPersistence loads configuration from the persistence layer if available
  142. func LoadConfigFromPersistence(configPersistence interface{}) *Config {
  143. config := NewDefaultConfig()
  144. // Try to load from persistence if available
  145. if persistence, ok := configPersistence.(interface {
  146. LoadBalanceTaskPolicy() (*worker_pb.TaskPolicy, error)
  147. }); ok {
  148. if policy, err := persistence.LoadBalanceTaskPolicy(); err == nil && policy != nil {
  149. if err := config.FromTaskPolicy(policy); err == nil {
  150. glog.V(1).Infof("Loaded balance configuration from persistence")
  151. return config
  152. }
  153. }
  154. }
  155. glog.V(1).Infof("Using default balance configuration")
  156. return config
  157. }