From 9f9646bc356f269f14b2112f96f2112e8b647f23 Mon Sep 17 00:00:00 2001 From: David Ames Date: Fri, 22 Sep 2017 14:25:03 -0700 Subject: [PATCH] Update all clients once and only once This change solves two problmes. First, one off problems waiting for the cluster to complete. Second, running update_clients too often. Update clients will get executed only once as soon as leader_node_is_ready() or client_node_is_ready() returns True. Subsequent client requests will be handled by normal amqp-relation-changed hooks. Co-Authored-By: Liam Young Partial-Bug: #1717579 Change-Id: I02c648cccc72d816beeec5546b6c7914d57c607a --- .gitignore | 2 +- hooks/rabbitmq_server_relations.py | 26 ++++++++++++++++---------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 540e4e1c..2c25ce06 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,4 @@ revision *.pyc .project .pydevproject - +.stestr diff --git a/hooks/rabbitmq_server_relations.py b/hooks/rabbitmq_server_relations.py index 691d4830..9503f933 100755 --- a/hooks/rabbitmq_server_relations.py +++ b/hooks/rabbitmq_server_relations.py @@ -109,6 +109,7 @@ STATS_CRONFILE = '/etc/cron.d/rabbitmq-stats' STATS_DATAFILE = os.path.join(RABBIT_DIR, 'data', '{}_queue_stats.dat' ''.format(rabbit.get_unit_hostname())) +INITIAL_CLIENT_UPDATE_KEY = 'initial_client_update_done' @hooks.hook('install.real') @@ -211,6 +212,11 @@ def update_clients(): for rid in relation_ids('amqp'): for unit in related_units(rid): amqp_changed(relation_id=rid, remote_unit=unit) + kvstore = kv() + update_done = kvstore.get(INITIAL_CLIENT_UPDATE_KEY, False) + if not update_done: + kvstore.set(key=INITIAL_CLIENT_UPDATE_KEY, value=True) + kvstore.flush() @validate_amqp_config_tracker @@ -655,6 +661,9 @@ def upgrade_charm(): # 'clustered' for existing deployments (LP: #1691510). rabbit.cluster_with() + # Ensure all client connections are up to date on upgrade + update_clients() + MAN_PLUGIN = 'rabbitmq_management' @@ -782,16 +791,13 @@ if __name__ == '__main__': hooks.execute(sys.argv) except UnregisteredHookError as e: log('Unknown hook {} - skipping.'.format(e)) - - # NOTE(niedbalski): we skip running update_clients on - # update-status as this might workload overhead on the - # cloud at every tick of the update-status hook. (LP:#1717579). - (hook, skip) = (os.path.basename(sys.argv[0]), ('update-status', )) - if hook in skip: - log("Skipping to run update_clients on hook: {} - skip: {}".format( - hook, ",".join(skip)), DEBUG) - else: - # Gated client updates + # This solves one off problems waiting for the cluster to complete + # It will get executed only once as soon as leader_node_is_ready() + # or client_node_is_ready() returns True + # Subsequent client requests will be handled by normal + # amqp-relation-changed hooks + kvstore = kv() + if not kvstore.get(INITIAL_CLIENT_UPDATE_KEY, False): update_clients() rabbit.assess_status(rabbit.ConfigRenderer(rabbit.CONFIG_FILES))