Beispiel #1
0
def process_reporting_metadata_staging():
    from corehq.apps.users.models import (
        CouchUser, UserReportingMetadataStaging
    )

    start = datetime.utcnow()

    with transaction.atomic():
        records = (
            UserReportingMetadataStaging.objects.select_for_update(skip_locked=True).order_by('pk')
        )[:100]
        for record in records:
            user = CouchUser.get_by_user_id(record.user_id, record.domain)
            try:
                record.process_record(user)
            except ResourceConflict:
                # https://sentry.io/organizations/dimagi/issues/1479516073/
                user = CouchUser.get_by_user_id(record.user_id, record.domain)
                record.process_record(user)
            record.delete()

    duration = datetime.utcnow() - start
    run_again = run_periodic_task_again(process_reporting_metadata_staging_schedule, start, duration)
    if run_again and UserReportingMetadataStaging.objects.exists():
        process_reporting_metadata_staging.delay()
Beispiel #2
0
def process_reporting_metadata_staging():
    from corehq.apps.users.models import (CouchUser,
                                          UserReportingMetadataStaging)
    lock_key = "PROCESS_REPORTING_METADATA_STAGING_TASK"
    process_reporting_metadata_lock = get_redis_lock(
        lock_key,
        timeout=60 * 60,  # one hour
        name=lock_key,
    )
    if not process_reporting_metadata_lock.acquire(blocking=False):
        metrics_counter("commcare.process_reporting_metadata.locked_out")
        return

    try:
        start = datetime.utcnow()

        for i in range(20):
            with transaction.atomic():
                records = (
                    UserReportingMetadataStaging.objects.select_for_update(
                        skip_locked=True).order_by('pk'))[:5]
                for record in records:
                    user = CouchUser.get_by_user_id(record.user_id,
                                                    record.domain)
                    try:
                        record.process_record(user)
                    except ResourceConflict:
                        # https://sentry.io/organizations/dimagi/issues/1479516073/
                        user = CouchUser.get_by_user_id(
                            record.user_id, record.domain)
                        record.process_record(user)
                    record.delete()
    finally:
        process_reporting_metadata_lock.release()

    duration = datetime.utcnow() - start
    run_again = run_periodic_task_again(
        process_reporting_metadata_staging_schedule, start, duration)
    if run_again and UserReportingMetadataStaging.objects.exists():
        process_reporting_metadata_staging.delay()
Beispiel #3
0
 def _test(run_every, last_run, duration, expected, now):
     with freeze_time(now):
         run_again = run_periodic_task_again(run_every, last_run, duration)
     eq(run_again, expected)