From 872ef2d93b20e3a46fd7474c30e325728b765a3f Mon Sep 17 00:00:00 2001 From: James Kafader Date: Tue, 26 Sep 2017 16:43:37 -0700 Subject: [PATCH] changed after reviewing merge request --- doublethink/cli.py | 45 +++++++++++++++++++++++++++++++++ doublethink/services.py | 4 +-- scripts/purge_stale_services.py | 35 ------------------------- setup.py | 6 ++++- 4 files changed, 52 insertions(+), 38 deletions(-) create mode 100644 doublethink/cli.py delete mode 100644 scripts/purge_stale_services.py diff --git a/doublethink/cli.py b/doublethink/cli.py new file mode 100644 index 0000000..de6543b --- /dev/null +++ b/doublethink/cli.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python +''' +doublethink/orm.py - rethinkdb ORM Command Line Interface + +Copyright (C) 2017 Internet Archive + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +''' + +import os, sys +import argparse +import doublethink + +def purge_stale_services(argv=None): + """Command-line utility to periodically purge stale entries from the "services" table. + + It is designed to be used in conjunction with cron. + """ + argv = argv or sys.argv + arg_parser = argparse.ArgumentParser( + prog=os.path.basename(argv[0]), + description='purge-stale-services: utility to periodically purge stale entries from the "services" table.') + + arg_parser.add_argument("db", help="A RethinkDB database containing a 'services' table") + + arg_parser.add_argument("-s", "--rethinkdb-servers", + metavar="SERVERS", dest="servers", required=True, + help="a comma-separated list of hostnames of rethinkdb servers. Required.") + args = arg_parser.parse_args(argv[1:]) + + args.servers = [srv.strip() for srv in args.servers.split(",")] + + rethinker = doublethink.Rethinker(servers=args.servers, db=args) + registry = doublethink.services.ServiceRegistry(rethinker) + registry.purge_stale_services() \ No newline at end of file diff --git a/doublethink/services.py b/doublethink/services.py index 616b306..aeeed29 100644 --- a/doublethink/services.py +++ b/doublethink/services.py @@ -312,8 +312,8 @@ class ServiceRegistry(object): available_service = healthy_service available_services = healthy_services - def purge_stale_services(self, grace_period=0): + def purge_stale_services(self, ttls_until_deletion=2): result = self.rr.table('services').filter( - lambda svc: r.now().sub(svc["last_heartbeat"]).gt(svc["ttl"] + grace_period) + lambda svc: r.now().sub(svc["last_heartbeat"]).gt(svc["ttl"] * ttls_until_deletion) ).delete().run() return result diff --git a/scripts/purge_stale_services.py b/scripts/purge_stale_services.py deleted file mode 100644 index 31794c5..0000000 --- a/scripts/purge_stale_services.py +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env python -import sys -from optparse import OptionParser -from doublethink import Rethinker -from doublethink.services import ServiceRegistry - -usage = """usage: %prog [options] db -where 'db' is the the name of a RethinkDB database that contains a "services" table. - -This script can be used to periodically purge stale entries from the "services" table. - -It is designed to be used in conjunction with cron. - -Example: -%prog -s rethink-host0,rethink-host1,rethink-host2 doublethink_database""" -parser = OptionParser(usage=usage) -parser.add_option("-s", "--rethinkdb-servers", - metavar="SERVERS", dest="servers", - help="a comma-separated list of hostnames of rethinkdb servers. Required. [default: none]") -parser.add_option("-g", "--grace-period", - metavar="SECONDS", dest="grace_period", type="int", - help="leave records that have been stale for up to SECONDS seconds. [default: 0]") -(options, args) = parser.parse_args() - -if len(args) < 1: - sys.exit('"db" is a required argument and should be the name of a RethinkDB database that contains a "services" table. See "--help" for a list of options') - -if not options.servers: - sys.exit('--rethinkdb-servers (-s) is a required argument. It should be a comma-separated list of rethinkdb servers. See --help for more information') - -options.servers = [srv.strip() for srv in options.servers.split(",")] - -rethinker = Rethinker(servers=options.servers, db=args[0]) -registry = ServiceRegistry(rethinker) -registry.purge_stale_services(grace_period=options.grace_period) \ No newline at end of file diff --git a/setup.py b/setup.py index e16e560..3e28469 100644 --- a/setup.py +++ b/setup.py @@ -18,5 +18,9 @@ setuptools.setup( description='rethinkdb python library', long_description=codecs.open( 'README.rst', mode='r', encoding='utf-8').read(), - scripts=glob.glob('scripts/*.py'), + entry_points={ + 'console_scripts': [ + 'purge-stale-services=doublethink.cli:purge_stale_services', + ] + }, )