Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 8 additions & 9 deletions vector_search/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
import logging

import celery
import grpc
import sentry_sdk
from celery.exceptions import Ignore
from django.conf import settings
Expand Down Expand Up @@ -120,10 +119,10 @@ def generate_embeddings(ids, resource_type, overwrite):
raise
except SystemExit as err:
raise RetryError(SystemExit.__name__) from err
except grpc.RpcError as err:
if err.code() == grpc.StatusCode.DEADLINE_EXCEEDED:
raise RetryError(str(err)) from err
raise
except: # noqa: E722
error = "generate_embeddings threw an error"
log.exception(error)
return error
Comment on lines +122 to +125


@app.task(
Expand All @@ -149,10 +148,10 @@ def remove_embeddings(ids, resource_type):
raise
except SystemExit as err:
raise RetryError(SystemExit.__name__) from err
except grpc.RpcError as err:
if err.code() == grpc.StatusCode.DEADLINE_EXCEEDED:
raise RetryError(str(err)) from err
raise
except: # noqa: E722
error = "generate_embeddings threw an error"
log.exception(error)
return error
Comment on lines +151 to +154


@app.task(bind=True)
Expand Down
71 changes: 0 additions & 71 deletions vector_search/tasks_test.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import datetime
import random

import grpc
import pytest
from django.conf import settings

Expand All @@ -25,16 +24,13 @@
LEARNING_RESOURCE_TYPES,
PROGRAM_TYPE,
)
from learning_resources_search.exceptions import RetryError
from main.utils import now_in_utc
from vector_search.tasks import (
embed_learning_resources_by_id,
embed_new_content_files,
embed_new_learning_resources,
embed_run_content_files,
embeddings_healthcheck,
generate_embeddings,
remove_embeddings,
remove_run_content_files,
remove_unpublished_run_content_files,
start_embed_resources,
Expand All @@ -44,13 +40,6 @@
pytestmark = pytest.mark.django_db


def _rpc_error(code):
"""Build a grpc.RpcError carrying a status code, like qdrant's gRPC failures."""
err = grpc.RpcError()
err.code = lambda: code
return err


@pytest.mark.parametrize("index", list(LEARNING_RESOURCE_TYPES))
def test_start_embed_resources(mocker, mocked_celery, index):
"""
Expand Down Expand Up @@ -791,63 +780,3 @@ def test_embeddings_healthcheck_missing_summaries(mocker):
mock_sentry.mock_calls[0].args[0]
== "Warning: 1 missing content file summaries detected"
)


def test_generate_embeddings_raises_retryerror_on_grpc_deadline(mocker):
"""A DEADLINE_EXCEEDED gRPC error becomes a RetryError (autoretry_for picks it up)."""
mocker.patch(
"vector_search.tasks.embed_learning_resources",
side_effect=_rpc_error(grpc.StatusCode.DEADLINE_EXCEEDED),
)
with pytest.raises(RetryError):
generate_embeddings([1], COURSE_TYPE, overwrite=False)


def test_generate_embeddings_reraises_other_grpc_errors(mocker):
"""Non-transient gRPC errors propagate (task fails) rather than retrying."""
mocker.patch(
"vector_search.tasks.embed_learning_resources",
side_effect=_rpc_error(grpc.StatusCode.INVALID_ARGUMENT),
)
with pytest.raises(grpc.RpcError):
generate_embeddings([1], COURSE_TYPE, overwrite=False)


def test_generate_embeddings_does_not_swallow_errors(mocker):
"""Unhandled errors propagate so the task fails instead of reporting success."""
mocker.patch(
"vector_search.tasks.embed_learning_resources",
side_effect=ValueError("boom"),
)
with pytest.raises(ValueError, match="boom"):
generate_embeddings([1], COURSE_TYPE, overwrite=False)


def test_remove_embeddings_raises_retryerror_on_grpc_deadline(mocker):
"""remove_embeddings retries on DEADLINE_EXCEEDED rather than swallowing it."""
mocker.patch(
"vector_search.tasks.remove_qdrant_records",
side_effect=_rpc_error(grpc.StatusCode.DEADLINE_EXCEEDED),
)
with pytest.raises(RetryError):
remove_embeddings([1], COURSE_TYPE)


def test_remove_embeddings_reraises_other_grpc_errors(mocker):
"""Non-transient gRPC errors propagate (task fails) rather than retrying."""
mocker.patch(
"vector_search.tasks.remove_qdrant_records",
side_effect=_rpc_error(grpc.StatusCode.INVALID_ARGUMENT),
)
with pytest.raises(grpc.RpcError):
remove_embeddings([1], COURSE_TYPE)


def test_remove_embeddings_does_not_swallow_errors(mocker):
"""Unhandled errors propagate so the task fails instead of reporting success."""
mocker.patch(
"vector_search.tasks.remove_qdrant_records",
side_effect=ValueError("boom"),
)
with pytest.raises(ValueError, match="boom"):
remove_embeddings([1], COURSE_TYPE)
Loading