Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
CIRCLE
/
cloud
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
94
Merge Requests
10
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
2bd2679c
authored
Feb 20, 2014
by
Guba Sándor
1
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
storage: reworked create_from_url to be abortable
parent
95663de7
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
33 additions
and
12 deletions
+33
-12
circle/storage/models.py
+33
-12
No files found.
circle/storage/models.py
View file @
2bd2679c
...
...
@@ -13,6 +13,7 @@ from sizefield.models import FileSizeField
from
acl.models
import
AclBase
from
.tasks
import
local_tasks
,
remote_tasks
from
celery.exceptions
import
TimeoutError
from
common.models
import
ActivityModel
,
activitycontextimpl
,
WorkerNotFound
logger
=
logging
.
getLogger
(
__name__
)
...
...
@@ -236,32 +237,52 @@ class Disk(AclBase, TimeStampedModel):
return
disk
@classmethod
def
create_from_url_async
(
cls
,
url
,
params
,
user
=
None
):
return
local_tasks
.
create_from_url
.
apply_async
(
args
=
[
cls
,
url
,
params
,
user
]
,
def
create_from_url_async
(
cls
,
url
,
params
=
None
,
user
=
None
):
return
local_tasks
.
create_from_url
.
apply_async
(
kwargs
=
{
'cls'
:
cls
,
'url'
:
url
,
'params'
:
params
,
'user'
:
user
}
,
queue
=
'localhost.man'
)
@classmethod
def
create_from_url
(
cls
,
url
,
params
=
{},
user
=
None
,
task_uuid
=
None
):
def
create_from_url
(
cls
,
url
,
params
=
{},
user
=
None
,
task_uuid
=
None
,
abortable_task
=
None
):
disk
=
cls
()
disk
.
filename
=
str
(
uuid
.
uuid4
())
disk
.
type
=
"iso"
disk
.
size
=
1
disk
.
datastore
=
DataStore
.
objects
.
all
()[
0
]
if
params
:
disk
.
__dict__
.
update
(
params
)
disk
.
save
()
queue_name
=
disk
.
get_remote_queue_name
(
'storage'
)
def
__onabort
(
activity
,
error
):
activity
.
disk
.
delete
()
raise
error
def
__on_abort
(
activity
,
error
):
activity
.
disk
.
destroyed
=
timezone
.
now
()
activity
.
disk
.
save
()
if
abortable_task
:
from
celery.contrib.abortable
import
AbortableAsyncResult
class
AbortException
(
Exception
):
pass
with
disk_activity
(
code_suffix
=
'download'
,
disk
=
disk
,
task_uuid
=
task_uuid
,
user
=
user
):
size
=
remote_tasks
.
download
.
apply_async
(
kwargs
=
{
'url'
:
url
,
'disk'
:
disk
.
get_disk_desc
()},
queue
=
queue_name
)
.
get
()
task_uuid
=
task_uuid
,
user
=
user
,
on_abort
=
__on_abort
):
result
=
remote_tasks
.
download
.
apply_async
(
kwargs
=
{
'url'
:
url
,
'parent_id'
:
task_uuid
,
'disk'
:
disk
.
get_disk_desc
()},
queue
=
queue_name
)
while
True
:
try
:
size
=
result
.
get
(
timeout
=
5
)
break
except
TimeoutError
:
logger
.
info
(
abortable_task
)
logger
.
info
(
abortable_task
.
is_aborted
())
if
abortable_task
and
abortable_task
.
is_aborted
():
AbortableAsyncResult
(
result
.
id
)
.
abort
()
raise
AbortException
(
"Download aborted by user."
)
disk
.
size
=
size
disk
.
ready
=
True
disk
.
save
()
def
destroy
(
self
,
user
=
None
,
task_uuid
=
None
):
...
...
Guba Sándor
@gubasandor
mentioned in issue
#24 (closed)
Feb 20, 2014
mentioned in issue
#24 (closed)
mentioned in issue #24
Toggle commit list
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