Skip to content

Commit 1a86aa8

Browse files
Add retry to manage group members in oss fuzz cc groups (google#5205)
The fix from google#5195 was not enough to fix the permission denied errors the cronjob is hitting, as seen by logs: https://cloudlogging.app.goo.gl/A5TjUfxFoJRbtuLx7 As these errors do not really seem an access/credentials issue, since the SA is the owner of all groups it tries to manage, it could potentially be an issue with the cloud identity API rate limit. So, this PR is another tentative to mitigate these errors by wrapping the API calls to add/remove members with a retry logic, which delays the calls and adds exponential backoff. Context: b/477964128
1 parent ed2c78e commit 1a86aa8

1 file changed

Lines changed: 26 additions & 4 deletions

File tree

src/clusterfuzz/_internal/cron/oss_fuzz_cc_groups.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
# limitations under the License.
1414
"""Cron to sync OSS-Fuzz projects groups used as CC in the issue tracker."""
1515

16+
from clusterfuzz._internal.base import retry
1617
from clusterfuzz._internal.base import utils
1718
from clusterfuzz._internal.datastore import data_types
1819
from clusterfuzz._internal.datastore import ndb_utils
@@ -21,6 +22,7 @@
2122

2223
_CC_GROUP_SUFFIX = '-ccs@oss-fuzz.com'
2324
_CC_GROUP_DESC = 'External CCs in OSS-Fuzz issue tracker for project'
25+
_API_DELAY = 3 # 3s delay to avoid cloud identity api rate limits.
2426

2527

2628
def normalize_email_for_group(email):
@@ -47,6 +49,27 @@ def normalize_email_for_group(email):
4749
return f'{local}@{domain}'
4850

4951

52+
@retry.wrap(
53+
retries=3,
54+
delay=_API_DELAY,
55+
function='cron.oss_fuzz_cc_groups._add_member_with_retry',
56+
retry_on_false=True)
57+
def _add_member_with_retry(group_id, member):
58+
"""Add a member to a group with retry."""
59+
return google_groups.add_member_to_group(group_id, member)
60+
61+
62+
@retry.wrap(
63+
retries=3,
64+
delay=_API_DELAY,
65+
function='cron.oss_fuzz_cc_groups._delete_member_with_retry',
66+
retry_on_false=True)
67+
def _delete_member_with_retry(group_id, member, membership_name):
68+
"""Delete a member from a group with retry."""
69+
return google_groups.delete_google_group_membership(group_id, member,
70+
membership_name)
71+
72+
5073
def sync_project_cc_group(project_name: str, ccs: list[str]):
5174
"""Sync the project's google group used for CCing in the issue tracker."""
5275
group_name = f'{project_name}{_CC_GROUP_SUFFIX}'
@@ -89,15 +112,14 @@ def sync_project_cc_group(project_name: str, ccs: list[str]):
89112
for member in to_add:
90113
if not member:
91114
continue
92-
google_groups.add_member_to_group(group_id, member)
115+
_add_member_with_retry(group_id, member)
93116

94117
for member in to_delete:
95118
# Ignore the SA that created the group from members to delete.
96119
if not member or utils.is_service_account(member):
97120
continue
98-
memebership_name = group_memberships_norm[member]
99-
google_groups.delete_google_group_membership(group_id, member,
100-
memebership_name)
121+
membership_name = group_memberships_norm[member]
122+
_delete_member_with_retry(group_id, member, membership_name)
101123

102124

103125
def main():

0 commit comments

Comments
 (0)