balancing_override.go 928 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package router
  2. import (
  3. sync "sync"
  4. "github.com/xtls/xray-core/common/errors"
  5. )
  6. func (r *Router) OverrideBalancer(balancer string, target string) error {
  7. var b *Balancer
  8. for tag, bl := range r.balancers {
  9. if tag == balancer {
  10. b = bl
  11. break
  12. }
  13. }
  14. if b == nil {
  15. return errors.New("balancer '", balancer, "' not found")
  16. }
  17. b.override.Put(target)
  18. return nil
  19. }
  20. type overrideSettings struct {
  21. target string
  22. }
  23. type override struct {
  24. access sync.RWMutex
  25. settings overrideSettings
  26. }
  27. // Get gets the override settings
  28. func (o *override) Get() string {
  29. o.access.RLock()
  30. defer o.access.RUnlock()
  31. return o.settings.target
  32. }
  33. // Put updates the override settings
  34. func (o *override) Put(target string) {
  35. o.access.Lock()
  36. defer o.access.Unlock()
  37. o.settings.target = target
  38. }
  39. // Clear clears the override settings
  40. func (o *override) Clear() {
  41. o.access.Lock()
  42. defer o.access.Unlock()
  43. o.settings.target = ""
  44. }