From 3e5a486378702cab1366d377240a6f405d71a078 Mon Sep 17 00:00:00 2001 From: Maciej Tronowski Date: Tue, 24 Mar 2015 11:50:22 +0100 Subject: [PATCH] rename sync -> service & add logging --- qcg/service.py | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ qcg/sync.py | 50 ------------------------------------ qcg/views.py | 3 +-- 3 files changed, 78 insertions(+), 52 deletions(-) create mode 100644 qcg/service.py delete mode 100644 qcg/sync.py diff --git a/qcg/service.py b/qcg/service.py new file mode 100644 index 0000000..fb312c7 --- /dev/null +++ b/qcg/service.py @@ -0,0 +1,77 @@ +import logging +import time + +from django.db import transaction +from django.utils.timezone import now + +from pyqcg.service import Registry +from pyqcg.utils import Credential, TimePeriod + + +logger = logging.getLogger(__name__) + + +@transaction.atomic +def update_user_data(user, proxy): + ts = time.time() + from qcg.models import User, Job, Task, Allocation, NodeInfo + + credential = Credential(proxy) + registry = Registry(credential) + + # put lock on user record (hopefully..?) + user = User.objects.select_for_update().get(pk=user.pk) + + changed_filter = {'changed': TimePeriod(after=user.last_update)} + + ################################### + # Jobs + ################################### + jts = time.time() + jobs = registry.jobs(**changed_filter) + jte = time.time() + + jobs_count = 0 + for qcg_job in jobs: + params = Job.qcg_map(qcg_job, user) + job_id = params.pop('job_id') + + Job.objects.update_or_create(job_id=job_id, defaults=params) + jobs_count += 1 + + ################################### + # Tasks + ################################### + tts = time.time() + tasks = registry.tasks(**changed_filter) + tte = time.time() + + jobs_cache = {j.job_id: j for j in Job.objects.filter(owner=user)} + task_count = 0 + for qcg_task in tasks: + params = Task.qcg_map(qcg_task, jobs_cache) + task_id = params.pop('task_id') + + task, created = Task.objects.update_or_create(job__job_id=qcg_task.job_id, task_id=task_id, defaults=params) + + if not created: + task.allocations.all().delete() + + for qcg_alloc in qcg_task.allocations: + alloc = task.allocations.create(**Allocation.qcg_map(qcg_alloc)) + + for qcg_node in qcg_alloc.nodes: + alloc.nodes.create(**NodeInfo.qcg_map(qcg_node)) + + task_count += 1 + + # release user lock + user.last_update = now() + user.save() + + elapsed = time.time() - ts + elapsed_jobs = jte - jts + elapsed_tasks = tte - tts + elapsed_py = elapsed - elapsed_jobs - elapsed_tasks + logger.info('(%.3f) USER = %s, JOBS = %s (%.3f), TASKS = %s (%.3f), TIME = %.3f', + elapsed, user, jobs_count, elapsed_jobs, task_count, elapsed_tasks, elapsed_py) diff --git a/qcg/sync.py b/qcg/sync.py deleted file mode 100644 index 9b3cc25..0000000 --- a/qcg/sync.py +++ /dev/null @@ -1,50 +0,0 @@ -from django.db import transaction -from django.utils.timezone import now - -from pyqcg.service import Registry -from pyqcg.utils import Credential, TimePeriod - - -@transaction.atomic -def update_user_data(user, proxy): - from qcg.models import User, Job, Task, Allocation, NodeInfo - - credential = Credential(proxy) - registry = Registry(credential) - - # put lock on user record (hopefully..?) - user = User.objects.select_for_update().get(pk=user.pk) - - changed_filter = {'changed': TimePeriod(after=user.last_update)} - - ################################### - # Jobs - ################################### - for qcg_job in registry.jobs(**changed_filter): - params = Job.qcg_map(qcg_job, user) - job_id = params.pop('job_id') - - Job.objects.update_or_create(job_id=job_id, defaults=params) - - ################################### - # Tasks - ################################### - jobs_cache = {j.job_id: j for j in Job.objects.filter(owner=user)} - for qcg_task in registry.tasks(**changed_filter): - params = Task.qcg_map(qcg_task, jobs_cache) - task_id = params.pop('task_id') - - task, created = Task.objects.update_or_create(job__job_id=qcg_task.job_id, task_id=task_id, defaults=params) - - if not created: - task.allocations.all().delete() - - for qcg_alloc in qcg_task.allocations: - alloc = task.allocations.create(**Allocation.qcg_map(qcg_alloc)) - - for qcg_node in qcg_alloc.nodes: - alloc.nodes.create(**NodeInfo.qcg_map(qcg_node)) - - # release user lock - user.last_update = now() - user.save() diff --git a/qcg/views.py b/qcg/views.py index 2a26f83..a760425 100644 --- a/qcg/views.py +++ b/qcg/views.py @@ -17,7 +17,7 @@ from pyqcg.utils import Credential from qcg.forms import FiltersForm, ColumnsForm, JobDescriptionForm, EnvFormSet from qcg.utils import paginator_context -from qcg.sync import update_user_data +from qcg.service import update_user_data def index(request): @@ -59,7 +59,6 @@ def parse_date(string): def jobs_list(request): QCG.start() update_user_data(request.user, request.session['proxy']) - QCG.stop() tasks = request.user.tasks.order_by('-job__submission_time', '-submission_time') \ .select_related('job').prefetch_related('allocations__nodes') -- 1.7.9.5