routing_table.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package router
  2. import (
  3. "sync"
  4. "time"
  5. )
  6. type RoutingEntry struct {
  7. tag string
  8. err error
  9. expire time.Time
  10. }
  11. func (v *RoutingEntry) Extend() {
  12. v.expire = time.Now().Add(time.Hour)
  13. }
  14. func (v *RoutingEntry) Expired() bool {
  15. return v.expire.Before(time.Now())
  16. }
  17. type RoutingTable struct {
  18. sync.RWMutex
  19. table map[string]*RoutingEntry
  20. }
  21. func NewRoutingTable() *RoutingTable {
  22. return &RoutingTable{
  23. table: make(map[string]*RoutingEntry),
  24. }
  25. }
  26. func (v *RoutingTable) Cleanup() {
  27. v.Lock()
  28. defer v.Unlock()
  29. for key, value := range v.table {
  30. if value.Expired() {
  31. delete(v.table, key)
  32. }
  33. }
  34. }
  35. func (v *RoutingTable) Set(destination string, tag string, err error) {
  36. v.Lock()
  37. defer v.Unlock()
  38. entry := &RoutingEntry{
  39. tag: tag,
  40. err: err,
  41. }
  42. entry.Extend()
  43. v.table[destination] = entry
  44. if len(v.table) > 1000 {
  45. go v.Cleanup()
  46. }
  47. }
  48. func (v *RoutingTable) Get(destination string) (bool, string, error) {
  49. v.RLock()
  50. defer v.RUnlock()
  51. entry, found := v.table[destination]
  52. if !found {
  53. return false, "", nil
  54. }
  55. entry.Extend()
  56. return true, entry.tag, entry.err
  57. }