Skip to content

Commit 46ad1d3

Browse files
authored
Use lock when create_workflow (#2361)
1 parent e6f0875 commit 46ad1d3

File tree

3 files changed

+84
-82
lines changed

3 files changed

+84
-82
lines changed

ESSArch_Core/WorkflowEngine/util.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
import logging
33

44
from celery import states as celery_states
5-
# from django.core.cache import cache
6-
from django.db import transaction
5+
from django.core.cache import cache
6+
# from django.db import transaction
77
from tenacity import (
88
RetryError,
99
Retrying,
@@ -145,14 +145,14 @@ def create_workflow(workflow_spec=None, ip=None, workflow_steps=None, name='', l
145145

146146
logger = logging.getLogger('essarch.workflow')
147147

148-
# with cache.lock('create_workflow_lock', timeout=300):
149-
try:
150-
for attempt in Retrying(stop=stop_after_delay(30),
151-
wait=wait_random_exponential(multiplier=1, max=60),
152-
before_sleep=before_sleep_log(logging.getLogger('essarch'), logging.WARNING)):
153-
with attempt:
154-
try:
155-
with transaction.atomic():
148+
with cache.lock('create_workflow_lock', timeout=300):
149+
try:
150+
for attempt in Retrying(stop=stop_after_delay(30),
151+
wait=wait_random_exponential(multiplier=1, max=60),
152+
before_sleep=before_sleep_log(logging.getLogger('essarch'), logging.WARNING)):
153+
with attempt:
154+
try:
155+
# with transaction.atomic():
156156
# with ProcessStep.objects.delay_mptt_updates():
157157
if top_root_step:
158158
root_step = ProcessStep(
@@ -190,10 +190,10 @@ def create_workflow(workflow_spec=None, ip=None, workflow_steps=None, name='', l
190190
empty_steps = root_step.get_descendants(
191191
include_self=True
192192
).filter(tasks=None, child_steps__isnull=True).exists()
193-
except RuntimeError as e:
194-
logger.warning('Exception in create_workflow for ip: {}, error: {} - retry'.format(ip, e))
195-
raise
196-
except RetryError:
197-
logger.warning('RetryError in create_workflow for ip: {}'.format(ip))
198-
raise
193+
except RuntimeError as e:
194+
logger.warning('Exception in create_workflow for ip: {}, error: {} - retry'.format(ip, e))
195+
raise
196+
except RetryError:
197+
logger.warning('RetryError in create_workflow for ip: {}'.format(ip))
198+
raise
199199
return root_step

ESSArch_Core/frontend/static/frontend/scripts/controllers/StorageMigrationCtrl.js

Lines changed: 60 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -53,69 +53,71 @@ export default class StorageMigrationCtrl {
5353
};
5454

5555
vm.callServer = function (tableState) {
56-
$scope.ipLoading = true;
57-
if (vm.displayedIps.length == 0) {
58-
$scope.initLoad = true;
59-
}
60-
if (!angular.isUndefined(tableState)) {
61-
$scope.tableState = tableState;
62-
var search = '';
63-
if (tableState.search.predicateObject) {
64-
var search = tableState.search.predicateObject['$'];
65-
}
66-
let ordering = tableState.sort.predicate;
67-
if (tableState.sort.reverse) {
68-
ordering = '-' + ordering;
56+
if (vm.selectedMediums.length && vm.ipsVisible) {
57+
$scope.ipLoading = true;
58+
if (vm.displayedIps.length == 0) {
59+
$scope.initLoad = true;
6960
}
61+
if (!angular.isUndefined(tableState)) {
62+
$scope.tableState = tableState;
63+
var search = '';
64+
if (tableState.search.predicateObject) {
65+
var search = tableState.search.predicateObject['$'];
66+
}
67+
let ordering = tableState.sort.predicate;
68+
if (tableState.sort.reverse) {
69+
ordering = '-' + ordering;
70+
}
7071

71-
const paginationParams = listViewService.getPaginationParams(tableState.pagination, vm.itemsPerPage);
72-
$http({
73-
method: 'GET',
74-
url: appConfig.djangoUrl + 'information-packages/',
75-
params: angular.extend(
76-
{
77-
search,
78-
ordering,
79-
view_type: 'flat',
80-
page: paginationParams.pageNumber,
81-
page_size: paginationParams.number,
82-
pager: paginationParams.pager,
83-
medium: vm.selectedMediums.length ? vm.selectedMediums.map((x) => x.id) : null,
84-
policy: vm.mediumFilterModel.policy,
85-
migratable: true,
86-
},
87-
vm.columnFilters
88-
),
89-
})
90-
.then(function (response) {
91-
vm.displayedIps = response.data;
92-
tableState.pagination.numberOfPages = Math.ceil(response.headers('Count') / paginationParams.number); //set the number of pages so the pagination can update
93-
$scope.ipLoading = false;
94-
$scope.initLoad = false;
95-
ipExists();
96-
SelectedIPUpdater.update(vm.displayedIps, $scope.ips, $scope.ip);
72+
const paginationParams = listViewService.getPaginationParams(tableState.pagination, vm.itemsPerPage);
73+
$http({
74+
method: 'GET',
75+
url: appConfig.djangoUrl + 'information-packages/',
76+
params: angular.extend(
77+
{
78+
search,
79+
ordering,
80+
view_type: 'flat',
81+
page: paginationParams.pageNumber,
82+
page_size: paginationParams.number,
83+
pager: paginationParams.pager,
84+
medium: vm.selectedMediums.length ? vm.selectedMediums.map((x) => x.id) : null,
85+
policy: vm.mediumFilterModel.policy,
86+
migratable: true,
87+
},
88+
vm.columnFilters
89+
),
9790
})
98-
.catch(function (response) {
99-
if (response.status == 404) {
100-
const filters = angular.extend(
101-
{
102-
state: ipSortString,
103-
},
104-
vm.columnFilters
105-
);
91+
.then(function (response) {
92+
vm.displayedIps = response.data;
93+
tableState.pagination.numberOfPages = Math.ceil(response.headers('Count') / paginationParams.number); //set the number of pages so the pagination can update
94+
$scope.ipLoading = false;
95+
$scope.initLoad = false;
96+
ipExists();
97+
SelectedIPUpdater.update(vm.displayedIps, $scope.ips, $scope.ip);
98+
})
99+
.catch(function (response) {
100+
if (response.status == 404) {
101+
const filters = angular.extend(
102+
{
103+
state: ipSortString,
104+
},
105+
vm.columnFilters
106+
);
106107

107-
if (vm.workarea) {
108-
filters.workarea = vm.workarea;
109-
}
108+
if (vm.workarea) {
109+
filters.workarea = vm.workarea;
110+
}
110111

111-
listViewService.checkPages('ip', paginationParams.number, filters).then(function (response) {
112-
tableState.pagination.numberOfPages = response.numberOfPages; //set the number of pages so the pagination can update
113-
tableState.pagination.start =
114-
response.numberOfPages * paginationParams.number - paginationParams.number;
115-
vm.callServer(tableState);
116-
});
117-
}
118-
});
112+
listViewService.checkPages('ip', paginationParams.number, filters).then(function (response) {
113+
tableState.pagination.numberOfPages = response.numberOfPages; //set the number of pages so the pagination can update
114+
tableState.pagination.start =
115+
response.numberOfPages * paginationParams.number - paginationParams.number;
116+
vm.callServer(tableState);
117+
});
118+
}
119+
});
120+
}
119121
}
120122
};
121123

ESSArch_Core/storage/backends/tape.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ def prepare_for_io(self, storage_medium, io_lock_key=None, wait_timeout=10 * 60)
125125
while RobotQueue.objects.filter(id=rq.id).exists():
126126
logger.debug('Wait for the mount request to complete for storage medium {} ({})'.format(
127127
storage_medium.medium_id, str(storage_medium.pk)))
128-
if storage_medium.tape_drive.status == 100:
128+
if storage_medium.tape_drive is not None and storage_medium.tape_drive.status == 100:
129129
raise TapeError(
130130
'Storage medium {} "{}" in drive {} "{}" is failed'.format(
131131
storage_medium.medium_id, str(storage_medium.pk), storage_medium.tape_drive.device,
@@ -137,13 +137,13 @@ def prepare_for_io(self, storage_medium, io_lock_key=None, wait_timeout=10 * 60)
137137
self.wait_for_media_transit(storage_medium)
138138

139139
storage_medium.refresh_from_db()
140-
if storage_medium.tape_drive.status == 100:
141-
raise TapeError(
142-
'Storage medium {} "{}" in drive {} "{}" is failed'.format(
143-
storage_medium.medium_id, str(storage_medium.pk), storage_medium.tape_drive.device,
144-
storage_medium.tape_drive.drive_id))
145-
elif storage_medium.tape_drive is not None:
146-
if io_lock_key is not None:
140+
if storage_medium.tape_drive is not None:
141+
if storage_medium.tape_drive.status == 100:
142+
raise TapeError(
143+
'Storage medium {} "{}" in drive {} "{}" is failed'.format(
144+
storage_medium.medium_id, str(storage_medium.pk), storage_medium.tape_drive.device,
145+
storage_medium.tape_drive.drive_id))
146+
elif io_lock_key is not None:
147147
logger.debug('Storage medium {} ({}) is now mounted'.format(
148148
storage_medium.medium_id, str(storage_medium.pk)))
149149
self.lock_or_wait_for_drive(storage_medium, io_lock_key)

0 commit comments

Comments
 (0)