From dd242c9926832a7847bc9f80059ca647f0a3a2f8 Mon Sep 17 00:00:00 2001 From: Chris Weaver <25087905+Weves@users.noreply.github.com> Date: Tue, 29 Apr 2025 16:35:40 -0700 Subject: [PATCH] Fix race condition with archived channels (#4635) --- ...70b7664e37_add_model_configuration_table.py | 8 +++++--- backend/onyx/connectors/slack/connector.py | 18 +++++++++++++----- backend/onyx/connectors/slack/utils.py | 3 ++- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/backend/alembic/versions/7a70b7664e37_add_model_configuration_table.py b/backend/alembic/versions/7a70b7664e37_add_model_configuration_table.py index ab7aa2223d..8734a41098 100644 --- a/backend/alembic/versions/7a70b7664e37_add_model_configuration_table.py +++ b/backend/alembic/versions/7a70b7664e37_add_model_configuration_table.py @@ -27,7 +27,7 @@ def _resolve( model_names: list[str] | None, display_model_names: list[str] | None, default_model_name: str, - fast_default_model_name: str, + fast_default_model_name: str | None, ) -> set[tuple[str, bool]]: models = set(model_names) if model_names else None display_models = set(display_model_names) if display_model_names else None @@ -94,9 +94,11 @@ def _resolve( # It is possible that `default_model_name` is not in `models` and is not in `display_models`. # It is also possible that `fast_default_model_name` is not in `models` and is not in `display_models`. models.add(default_model_name) - models.add(fast_default_model_name) + if fast_default_model_name: + models.add(fast_default_model_name) display_models.add(default_model_name) - display_models.add(fast_default_model_name) + if fast_default_model_name: + display_models.add(fast_default_model_name) return set([(model, model in display_models) for model in models]) diff --git a/backend/onyx/connectors/slack/connector.py b/backend/onyx/connectors/slack/connector.py index bc63965796..884c37d235 100644 --- a/backend/onyx/connectors/slack/connector.py +++ b/backend/onyx/connectors/slack/connector.py @@ -330,11 +330,19 @@ def _get_messages( # have to be in the channel in order to read messages if not channel["is_member"]: - make_slack_api_call_w_retries( - client.conversations_join, - channel=channel["id"], - is_private=channel["is_private"], - ) + try: + make_slack_api_call_w_retries( + client.conversations_join, + channel=channel["id"], + is_private=channel["is_private"], + ) + except SlackApiError as e: + if e.response["error"] == "is_archived": + logger.warning(f"Channel {channel['name']} is archived. Skipping.") + return [], False + + logger.exception(f"Error joining channel {channel['name']}") + raise logger.info(f"Successfully joined '{channel['name']}'") response = make_slack_api_call_w_retries( diff --git a/backend/onyx/connectors/slack/utils.py b/backend/onyx/connectors/slack/utils.py index 13c60eb620..2a9145da84 100644 --- a/backend/onyx/connectors/slack/utils.py +++ b/backend/onyx/connectors/slack/utils.py @@ -16,7 +16,8 @@ from onyx.utils.retry_wrapper import retry_builder logger = setup_logger() -basic_retry_wrapper = retry_builder() +# retry after 0.1, 1.2, 3.4, 7.8, 16.6, 34.2 seconds +basic_retry_wrapper = retry_builder(tries=7) # number of messages we request per page when fetching paginated slack messages _SLACK_LIMIT = 900