From c1678b269be3155c071a4ac2a37b601b1b709fd8 Mon Sep 17 00:00:00 2001 From: dineshb-jnpr Date: Wed, 26 Oct 2016 10:42:56 -0700 Subject: [PATCH] Gracefully handle duplicate delete requests. This code change is to handle any gracefully handle duplicate delete requests sent by external entities, in this case service monitor. This code change will log and handle the key not found excpetion and proceed. The service monitor, sending duplicate deletes is tracked by bug: 1636932 Change-Id: I606561ca0e3c570713b41c196325180a16f96987 closes-bug: #1635901 --- src/config/api-server/vnc_cfg_ifmap.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/src/config/api-server/vnc_cfg_ifmap.py b/src/config/api-server/vnc_cfg_ifmap.py index e0cf2e490ba..f3bc4305691 100644 --- a/src/config/api-server/vnc_cfg_ifmap.py +++ b/src/config/api-server/vnc_cfg_ifmap.py @@ -575,17 +575,28 @@ def _build_request(self, id1_name, id2_name, meta_list, delete=False): def _delete_id_self_meta(self, self_imid, meta_name): mapclient = self._mapclient contrail_metaname = 'contrail:' + meta_name if meta_name else None - del_str = self._build_request(self_imid, 'self', [contrail_metaname], + del_str = self._build_request(self_imid, 'self', [contrail_metaname], True) self._publish_to_ifmap_enqueue('delete', del_str) - # del meta from cache and del id if this was last meta - if meta_name: - del self._id_to_metas[self_imid][meta_name] - if not self._id_to_metas[self_imid]: + try: + + # del meta from cache and del id if this was last meta + if meta_name: + del self._id_to_metas[self_imid][meta_name] + if not self._id_to_metas[self_imid]: + del self._id_to_metas[self_imid] + else: del self._id_to_metas[self_imid] - else: - del self._id_to_metas[self_imid] + + except KeyError: + # Case of delete received for an id which we do not know about. + # Could be a case of duplicate delete. + # There is nothing for us to do here. Just log and proceed. + msg = "Delete received for unknown imid(%s) meta_name(%s)." % \ + (self_imid, meta_name) + self.config_log(msg, level=SandeshLevel.SYS_DEBUG) + # end _delete_id_self_meta def _delete_id_pair_meta_list(self, id1, meta_list):