Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
ecommerce-worker
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
ecommerce-worker
Commits
bc45f24b
Commit
bc45f24b
authored
Oct 26, 2016
by
Simon Chen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Retry fulfillment even if the attempt was failed by HttpClientError
ECOM-5901
parent
063607a7
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
37 additions
and
14 deletions
+37
-14
ecommerce_worker/fulfillment/v1/tasks.py
+26
-14
ecommerce_worker/fulfillment/v1/tests/test_tasks.py
+11
-0
No files found.
ecommerce_worker/fulfillment/v1/tasks.py
View file @
bc45f24b
...
@@ -10,6 +10,22 @@ from ecommerce_worker.utils import get_configuration
...
@@ -10,6 +10,22 @@ from ecommerce_worker.utils import get_configuration
logger
=
get_task_logger
(
__name__
)
# pylint: disable=invalid-name
logger
=
get_task_logger
(
__name__
)
# pylint: disable=invalid-name
def
_retry_order
(
self
,
exception
,
max_fulfillment_retries
,
order_number
):
"""
Retry with exponential backoff until fulfillment
succeeds or the retry limit is reached. If the retry limit is exceeded,
the exception is re-raised.
"""
retries
=
self
.
request
.
retries
if
retries
==
max_fulfillment_retries
:
logger
.
exception
(
'Fulfillment of order [
%
s] failed. Giving up.'
,
order_number
)
else
:
logger
.
warning
(
'Fulfillment of order [
%
s] failed. Retrying.'
,
order_number
)
countdown
=
2
**
retries
raise
self
.
retry
(
exc
=
exception
,
countdown
=
countdown
,
max_retries
=
max_fulfillment_retries
)
@shared_task
(
bind
=
True
,
ignore_result
=
True
)
@shared_task
(
bind
=
True
,
ignore_result
=
True
)
def
fulfill_order
(
self
,
order_number
,
site_code
=
None
):
def
fulfill_order
(
self
,
order_number
,
site_code
=
None
):
"""Fulfills an order.
"""Fulfills an order.
...
@@ -37,18 +53,14 @@ def fulfill_order(self, order_number, site_code=None):
...
@@ -37,18 +53,14 @@ def fulfill_order(self, order_number, site_code=None):
logger
.
info
(
'Order [
%
s] has already been fulfilled. Ignoring.'
,
order_number
)
logger
.
info
(
'Order [
%
s] has already been fulfilled. Ignoring.'
,
order_number
)
raise
Ignore
()
raise
Ignore
()
else
:
else
:
# Unknown client error. Re-raise the exception.
# Unknown client error. Let's retry to resolve it.
logger
.
exception
(
'Fulfillment of order [
%
s] failed.'
,
order_number
)
logger
.
warning
(
raise
exc
'Fulfillment of order [
%
s] failed because of HttpClientError. Retrying'
,
except
(
exceptions
.
HttpServerError
,
exceptions
.
Timeout
)
as
exc
:
order_number
,
# Fulfillment failed. Retry with exponential backoff until fulfillment
exc_info
=
True
# succeeds or the retry limit is reached. If the retry limit is exceeded,
)
# the exception is re-raised.
_retry_order
(
self
,
exc
,
max_fulfillment_retries
,
order_number
)
retries
=
self
.
request
.
retries
if
retries
==
max_fulfillment_retries
:
logger
.
exception
(
'Fulfillment of order [
%
s] failed. Giving up.'
,
order_number
)
else
:
logger
.
warning
(
'Fulfillment of order [
%
s] failed. Retrying.'
,
order_number
)
countdown
=
2
**
retries
except
(
exceptions
.
HttpServerError
,
exceptions
.
Timeout
)
as
exc
:
raise
self
.
retry
(
exc
=
exc
,
countdown
=
countdown
,
max_retries
=
max_fulfillment_retries
)
# Fulfillment failed, retry
_retry_order
(
self
,
exc
,
max_fulfillment_retries
,
order_number
)
ecommerce_worker/fulfillment/v1/tests/test_tasks.py
View file @
bc45f24b
...
@@ -71,6 +71,17 @@ class OrderFulfillmentTaskTests(TestCase):
...
@@ -71,6 +71,17 @@ class OrderFulfillmentTaskTests(TestCase):
fulfill_order
(
self
.
ORDER_NUMBER
)
fulfill_order
(
self
.
ORDER_NUMBER
)
@httpretty.activate
@httpretty.activate
def
test_fulfillment_unknown_client_error_retry_success
(
self
):
"""Verify that the task is capable of successfully retrying after client error."""
httpretty
.
register_uri
(
httpretty
.
PUT
,
self
.
API_URL
,
responses
=
[
httpretty
.
Response
(
status
=
404
,
body
=
{}),
httpretty
.
Response
(
status
=
200
,
body
=
{}),
])
result
=
fulfill_order
.
delay
(
self
.
ORDER_NUMBER
)
.
get
()
self
.
assertIsNone
(
result
)
@httpretty.activate
def
test_fulfillment_failure
(
self
):
def
test_fulfillment_failure
(
self
):
"""Verify that the task raises an exception when fulfillment fails."""
"""Verify that the task raises an exception when fulfillment fails."""
httpretty
.
register_uri
(
httpretty
.
PUT
,
self
.
API_URL
,
status
=
500
,
body
=
{})
httpretty
.
register_uri
(
httpretty
.
PUT
,
self
.
API_URL
,
status
=
500
,
body
=
{})
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment