Skip to content

Commit cf06912

Browse files
feat: add retries to delete_node
1 parent 9b6a512 commit cf06912

File tree

4 files changed

+36
-18
lines changed

4 files changed

+36
-18
lines changed

integration-tests/robot/tests/shared/lib/ZookeeperLibrary.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@
1313
# limitations under the License.
1414

1515
import os
16+
import time
1617

1718
from kazoo.client import KazooClient
1819
from kazoo.security import make_digest_acl, make_acl
20+
from kazoo.exceptions import ConnectionLoss, ConnectionClosedError
1921
from robot.api import logger
2022
from robot.libraries.BuiltIn import BuiltIn
2123

@@ -264,17 +266,37 @@ def update_node_value(self, zk, node_path, new_value):
264266
stat = zk.set(node_path, new_value.encode())
265267
logger.debug('Node "{}" is updated: {}'.format(node_path, stat))
266268

267-
def delete_node(self, zk, node_path):
269+
def delete_node(self, zk, node_path, retries=3, delay=5, backoff=2):
268270
"""
269271
Delete the node.
270272
*Args:*\n
271273
_zk_ (KazooClient) - ZooKeeper client;\n
272274
_node_path_ (str) - path of the node;\n
275+
_retries_ (int, optional) - number of retry attempts (default: 5);\n
276+
_delay_ (int, optional) - initial delay between retries in seconds (default: 2);\n
277+
_backoff_ (int, optional) - backoff multiplier (default: 2);\n
278+
273279
*Example:*\n
274-
| Delete Node | zk | /zookeeper_crud/tests |
280+
| Delete Node | zk | /zookeeper_crud/tests | retries=3 | delay=1 |
275281
"""
276-
zk.delete(node_path, recursive=True)
277-
logger.debug('Node "{}" is deleted.'.format(node_path))
282+
for attempt in range(1, retries + 1):
283+
try:
284+
if zk.exists(node_path):
285+
zk.delete(node_path, recursive=True)
286+
logger.debug(f'Node "{node_path}" is deleted.')
287+
return
288+
else:
289+
logger.debug(f'Node "{node_path}" does not exist.')
290+
return
291+
292+
except ConnectionLoss as e:
293+
msg = (f'Attempt {attempt}/{retries}: cannot delete node "{node_path}" '
294+
f'due to ConnectionLoss: {e}')
295+
logger.warn(msg)
296+
BuiltIn().log_to_console(msg)
297+
if attempt == retries:
298+
self.builtin.fail(f'Failed to delete node "{node_path}" after {retries} attempts: {e}')
299+
time.sleep(delay)
278300

279301
def find_minimum(self, first, second):
280302
"""

integration-tests/robot/tests/zookeeper/acl_tests/acl_tests.robot

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,14 @@ ${ADMIN_PASSWORD} admin
66
${USERNAME} user123
77
${PASSWORD} pwd123
88
${ACL_VALUE} ACL
9-
${SUITE_RETRY_TIME} 2min
10-
${SUITE_RETRY_INTERVAL} 10s
119

1210
*** Settings ***
1311
Library String
1412
Library Collections
1513
Library RetryFailed
1614
Resource ../../shared/keywords.robot
17-
Suite Setup Wait Until Keyword Succeeds ${SUITE_RETRY_TIME} ${SUITE_RETRY_INTERVAL} Setup
18-
Suite Teardown Wait Until Keyword Succeeds ${SUITE_RETRY_TIME} ${SUITE_RETRY_INTERVAL} Cleanup
15+
Suite Setup Setup
16+
Suite Teardown Cleanup
1917
Test Teardown Run Keyword If Test Failed Sleep 5s
2018

2119
*** Keywords ***

integration-tests/robot/tests/zookeeper/sasl/sasl_tests.robot

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,14 @@ ${ZOOKEEPER_ADMIN_PASSWORD} %{ZOOKEEPER_ADMIN_PASSWORD}
66
${ZOOKEEPER_CLIENT_USERNAME} %{ZOOKEEPER_CLIENT_USERNAME}
77
${ZOOKEEPER_CLIENT_PASSWORD} %{ZOOKEEPER_CLIENT_PASSWORD}
88
${ACL_VALUE} ACL
9-
${SUITE_RETRY_TIME} 2min
10-
${SUITE_RETRY_INTERVAL} 10s
119

1210
*** Settings ***
1311
Library String
1412
Library Collections
1513
Library RetryFailed
1614
Resource ../../shared/keywords.robot
17-
Suite Setup Wait Until Keyword Succeeds ${SUITE_RETRY_TIME} ${SUITE_RETRY_INTERVAL} Setup
18-
Suite Teardown Wait Until Keyword Succeeds ${SUITE_RETRY_TIME} ${SUITE_RETRY_INTERVAL} Cleanup
15+
Suite Setup Setup
16+
Suite Teardown Cleanup
1917
Test Teardown Run Keyword If Test Failed Sleep 5s
2018

2119
*** Keywords ***

monitoring/exec-scripts/health_metric.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,15 @@ def get_server_state(server_address):
112112
logger.info(f"Server {zookeeper_server} state: {state}")
113113
return state
114114
else:
115-
logger.warning(f"Unexpected output format from {zookeeper_server}: {stdout}")
115+
logger.warn(f"Unexpected output format from {zookeeper_server}: {stdout}")
116116
else:
117-
logger.warning(f"Failed to retrieve state information from {zookeeper_server} (return code: {process.returncode})")
117+
logger.warn(f"Failed to retrieve state information from {zookeeper_server} (return code: {process.returncode})")
118118
except subprocess.TimeoutExpired:
119-
logger.warning(f"Timeout while connecting to {zookeeper_server}")
119+
logger.warn(f"Timeout while connecting to {zookeeper_server}")
120120
except Exception as e:
121121
logger.exception(f"Error retrieving state information from {zookeeper_server}: {e}")
122122

123-
logger.warning(f"Returning 'NA' for server {zookeeper_server}")
123+
logger.warn(f"Returning 'NA' for server {zookeeper_server}")
124124
return "NA"
125125

126126
def get_leader_node(zookeeper_hosts):
@@ -143,9 +143,9 @@ def get_leader_node(zookeeper_hosts):
143143
logger.info(f"Unique leader found: {leaders[0]}")
144144
return leaders[0] # Return just the hostname without port
145145
elif len(leaders) > 1:
146-
logger.warning(f"Multiple leaders found: {leaders}. This is unexpected.")
146+
logger.warn(f"Multiple leaders found: {leaders}. This is unexpected.")
147147
else:
148-
logger.warning("No leader found among all hosts")
148+
logger.warn("No leader found among all hosts")
149149

150150
return "NA"
151151

0 commit comments

Comments
 (0)