Skip to content
Snippets Groups Projects
Commit 3cb60864 authored by Erik Reid's avatar Erik Reid
Browse files

fix race condition

iterating over keys & then non-atomically fetching value ...
parent a4429f1b
No related branches found
No related tags found
No related merge requests found
...@@ -238,38 +238,40 @@ def clear_cached_classifier_responses(hostname): ...@@ -238,38 +238,40 @@ def clear_cached_classifier_responses(hostname):
r.delete(k) r.delete(k)
def refresh_ix_public_peers(hostname, netconf): def _refresh_peers(hostname, key_base, peers):
task_logger = logging.getLogger(constants.TASK_LOGGER_NAME) task_logger = logging.getLogger(constants.TASK_LOGGER_NAME)
task_logger.debug( task_logger.debug(
'removing cached ix public peers for %r' % hostname) 'removing cached %s for %r' % (key_base, hostname))
r = get_redis(InventoryTask.config) r = get_redis(InventoryTask.config)
for k in r.keys('ix_public_peer:*'): for k in r.keys(key_base + ':*'):
value = json.loads(r.get(k.decode('utf-8')).decode('utf-8')) # potential race condition: another proc could have
if value['router'] == hostname: # delete this element between the time we read the
r.delete(k) # keys and the next statement ... check for None below
value = r.get(k.decode('utf-8'))
for peer in juniper.ix_public_peers(netconf): if value:
value = json.loads(value.decode('utf-8'))
if value['router'] == hostname:
r.delete(k)
for peer in peers:
peer['router'] = hostname peer['router'] = hostname
r.set( r.set(
'ix_public_peer:' + peer['name'], '%s:%s' % (key_base, peer['name']),
json.dumps(peer)) json.dumps(peer))
def refresh_vpn_rr_peers(hostname, netconf): def refresh_ix_public_peers(hostname, netconf):
task_logger = logging.getLogger(constants.TASK_LOGGER_NAME) _refresh_peers(
task_logger.debug( hostname,
'removing cached vpn rr for %r' % hostname) 'ix_public_peer',
r = get_redis(InventoryTask.config) juniper.ix_public_peers(netconf))
for k in r.keys('vpn_rr_peer:*'):
value = json.loads(r.get(k.decode('utf-8')).decode('utf-8'))
if value['router'] == hostname:
r.delete(k)
for peer in juniper.vpn_rr_peers(netconf):
peer['router'] = hostname def refresh_vpn_rr_peers(hostname, netconf):
r.set( _refresh_peers(
'vpn_rr_peer:' + peer['name'], hostname,
json.dumps(peer)) 'vpn_rr_peer',
juniper.vpn_rr_peers(netconf))
@app.task @app.task
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment