Skip to content

Commit

Permalink
Implemented SIGTERM handler. Without it docker used to wait and then
Browse files Browse the repository at this point in the history
kill application with SIGKILL. Another advantage of handling SIGTERM -
it's possible to remove themself from cluster through api call:
DELETE /v2/members/<my_id>. This way cluster wont have any problems with
member which is not accessible.
  • Loading branch information
Alexander Kukushkin committed Apr 29, 2015
1 parent 3f20bc3 commit 2510134
Showing 1 changed file with 27 additions and 4 deletions.
31 changes: 27 additions & 4 deletions etcd-cluster-appliance/etcd.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
import os
import requests
import shutil
import signal
import subprocess
import sys
import time

from boto.ec2.instance import Instance
Expand Down Expand Up @@ -389,7 +391,7 @@ def remove_unhealthy_members(self, autoscaling_members):
members[m.addr] = m

for m in autoscaling_members:
members.pop(m.private_ip_address)
members.pop(m.private_ip_address, None)

for m in members.values():
self.me.delete_member(m)
Expand Down Expand Up @@ -445,15 +447,36 @@ def run(self):
time.sleep(self.NAPTIME)


def sigterm_handler(signo, stack_frame):
sys.exit()


def main():
hosted_zone = os.environ.get('HOSTED_ZONE', None)
manager = EtcdManager()
house_keeper = HouseKeeper(manager, hosted_zone)
house_keeper.start()
manager.run()
try:
house_keeper = HouseKeeper(manager, hosted_zone)
house_keeper.start()
manager.run()
finally:
logging.info('Trying to remove myself from cluster...')
try:
cluster = EtcdCluster(manager)
cluster.load_members()
if cluster.accessible_member:
if cluster.me:
if not cluster.accessible_member.delete_member(cluster.me):
logging.error('Can not remove myself from cluster')
else:
logging.error('Can not find me in existing cluster')
else:
logging.error('Cluster does not have accessible member')
except:
logging.exception()


if __name__ == '__main__':
signal.signal(signal.SIGTERM, sigterm_handler)
logging.basicConfig(format='%(levelname)-6s %(asctime)s - %(message)s', level=logging.DEBUG)
os.chdir(os.path.dirname(os.path.realpath(__file__)))
main()

0 comments on commit 2510134

Please sign in to comment.