balancing_override.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package router
  2. import (
  3. sync "sync"
  4. "time"
  5. "github.com/v2fly/v2ray-core/v4/features/outbound"
  6. )
  7. func (b *Balancer) overrideSelecting(selects []string, validity time.Duration) error {
  8. if validity <= 0 {
  9. b.override.Clear()
  10. return nil
  11. }
  12. hs, ok := b.ohm.(outbound.HandlerSelector)
  13. if !ok {
  14. return newError("outbound.Manager is not a HandlerSelector")
  15. }
  16. tags := hs.Select(selects)
  17. if len(tags) == 0 {
  18. return newError("no outbound selected")
  19. }
  20. b.override.Put(tags, time.Now().Add(validity))
  21. return nil
  22. }
  23. // OverrideSelecting implements routing.BalancingOverrider
  24. func (r *Router) OverrideSelecting(balancer string, selects []string, validity time.Duration) error {
  25. var b *Balancer
  26. for tag, bl := range r.balancers {
  27. if tag == balancer {
  28. b = bl
  29. break
  30. }
  31. }
  32. if b == nil {
  33. return newError("balancer '", balancer, "' not found")
  34. }
  35. err := b.overrideSelecting(selects, validity)
  36. if err != nil {
  37. return err
  38. }
  39. return nil
  40. }
  41. type overrideSettings struct {
  42. selects []string
  43. until time.Time
  44. }
  45. type override struct {
  46. access sync.RWMutex
  47. settings overrideSettings
  48. }
  49. // Get gets the override settings
  50. func (o *override) Get() *overrideSettings {
  51. o.access.RLock()
  52. defer o.access.RUnlock()
  53. if len(o.settings.selects) == 0 || time.Now().After(o.settings.until) {
  54. return nil
  55. }
  56. return &overrideSettings{
  57. selects: o.settings.selects,
  58. until: o.settings.until,
  59. }
  60. }
  61. // Put updates the override settings
  62. func (o *override) Put(selects []string, until time.Time) {
  63. o.access.Lock()
  64. defer o.access.Unlock()
  65. o.settings.selects = selects
  66. o.settings.until = until
  67. }
  68. // Clear clears the override settings
  69. func (o *override) Clear() {
  70. o.access.Lock()
  71. defer o.access.Unlock()
  72. o.settings.selects = nil
  73. o.settings.until = time.Time{}
  74. }