Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.04 KB | None | 0 0
  1. import argparse
  2. import time
  3. import numpy as np
  4. from datetime import datetime
  5. from redis.sentinel import (Sentinel, MasterNotFoundError)
  6. from redis import exceptions
  7.  
  8. # this client is based on Yossi failover_client
  9. class TestClientSentinel(object):
  10. def __init__(self, args):
  11. self.connect_timeout = args.connect_timeout
  12. self.connect_retry_interval = args.connect_retry_interval
  13. self.heartbeat_socket_timeout = args.heartbeat_socket_timeout
  14. self.heartbeat_interval = args.heartbeat_interval
  15. self.sock = None
  16. self.last_pong_time = None
  17. self.dbname = args.dbname
  18. self.hosts = [str(item) for item in args.hosts.split(',')]
  19. self.ports = [int(item) for item in args.ports.split(',')]
  20. sentinel_list = np.column_stack((self.hosts, self.ports))
  21. self.sentinel = Sentinel(sentinel_list, socket_timeout=0.1)
  22. self.master = self.sentinel.master_for(self.dbname, socket_timeout=0.1)
  23. # self.sentinel_list = [[0 for x in range(args.hosts)] for i in range(args.hosts)]
  24. # print(self.sentinel_list)
  25.  
  26. @staticmethod
  27. def log_event(text):
  28. print '[{}] {}'.format(datetime.now().strftime('%d-%b-%g %H:%M:%S.%f', ), text)
  29.  
  30. def connect(self):
  31. while True:
  32. try:
  33. self.log_event('[I] Trying to connect %s (%s), port %s' % (self.sentinel.master_for(self.dbname), "3", 222))
  34. self.master = self.sentinel.master_for(self.dbname, socket_timeout=0.1)
  35. print(self.master)
  36. except (exceptions.ConnectionError, exceptions.TimeoutError) as err:
  37. self.log_event('[E] %s' % str(err))
  38. if self.master is not None:
  39. self.log_event('[I] Connection established.')
  40.  
  41. return
  42. time.sleep(self.connect_retry_interval)
  43.  
  44. def heartbeat(self):
  45. responses = 0
  46. while True:
  47. try:
  48.  
  49. response = self.master.ping()
  50.  
  51. if not response:
  52. self.log_event('[E] Server connection dropped')
  53. break
  54. if not response:
  55. self.log_event('[E] Unexpected protocol response: %s' % response)
  56. break
  57. except (exceptions.ConnectionError, exceptions.TimeoutError) as err:
  58. self.log_event('[E] %s' % str(err))
  59. break
  60.  
  61. now = time.time()
  62. if responses == 0 and self.last_pong_time:
  63. self.log_event('[I] First successful response, %.2f after previous one' % (
  64. now - self.last_pong_time))
  65. responses += 1
  66. self.last_pong_time = now
  67. time.sleep(self.heartbeat_interval)
  68.  
  69. def run(self):
  70. while True:
  71. self.connect()
  72. self.heartbeat()
  73. time.sleep(1)
  74. # try:
  75. # self.sock.shutdown(socket.SHUT_RDWR)
  76. # except socket.error:
  77. # pass
  78. # self.sock = None
  79.  
  80.  
  81. def main():
  82. parser = argparse.ArgumentParser(
  83. formatter_class=argparse.ArgumentDefaultsHelpFormatter,
  84. description='Redis failover test client')
  85. parser.add_argument(
  86. '--hosts', type=str, help='Servers address',
  87. default='localhost')
  88. parser.add_argument(
  89. '--ports', type=str, help='Server port',
  90. default=6379)
  91. parser.add_argument(
  92. '--dbname', type=str, help='db name',
  93. default='mymaster')
  94. parser.add_argument(
  95. '--connect-timeout', type=int, help='Timeout (secs) for individual connect attempts',
  96. default=5)
  97. parser.add_argument(
  98. '--connect-retry-interval', type=float, help='Connect (secs) retry interval time',
  99. default=0.5)
  100. parser.add_argument(
  101. '--heartbeat-socket-timeout', type=float, help='PING heartbeat socket timeout (secs)',
  102. default=3)
  103. parser.add_argument(
  104. '--heartbeat-interval', type=float, help='PING heartbeat interval time (secs)',
  105. default=1)
  106. args = parser.parse_args()
  107.  
  108. TestClientSentinel(args).run()
  109.  
  110.  
  111. if __name__ == '__main__':
  112. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement