def hard_rebuild_case(domain, case_id, detail, lock=True, save=True): assert save or not lock, f"refusing to lock when not saving" if lock: # only record metric if locking since otherwise it has been # (most likley) recorded elsewhere case_load_counter("rebuild_case", domain)() case, lock_obj = FormProcessorSQL.get_case_with_lock(case_id, lock=lock) found = bool(case) if not found: case = CommCareCaseSQL(case_id=case_id, domain=domain) if lock: lock_obj = CommCareCaseSQL.get_obj_lock_by_id(case_id) acquire_lock(lock_obj, degrade_gracefully=False)
def hard_rebuild_case(domain, case_id, detail, save=True, lock=True): if lock: # only record metric if locking since otherwise it has been # (most likley) recorded elsewhere case_load_counter("rebuild_case", domain)() case, lock_obj = FormProcessorCouch.get_case_with_lock(case_id, lock=lock, wrap=True) found = bool(case) if not found: case = CommCareCase() case.case_id = case_id case.domain = domain if lock: lock_obj = CommCareCase.get_obj_lock_by_id(case_id) acquire_lock(lock_obj, degrade_gracefully=False)
def __init__(self, domain=None, deleted_ok=False, lock=False, wrap=True, initial=None, xforms=None, load_src="unknown"): self._track_load = case_load_counter(load_src, domain) self._populate_from_initial(initial) self.domain = domain self.cached_xforms = xforms if xforms is not None else [] self.deleted_ok = deleted_ok self.lock = lock self.wrap = wrap if self.lock and not self.wrap: raise ValueError( 'Currently locking only supports explicitly wrapping cases!') self.locks = [] self._changed = set() # this is used to allow casedb to be re-entrant. Each new context pushes the parent context locks # onto this stack and restores them when the context exits self.lock_stack = [] self.processor_interface = FormProcessorInterface(self.domain)
def batch_cases(accessor, case_ids): def take(n, iterable): # https://docs.python.org/2/library/itertools.html#recipes return list(islice(iterable, n)) track_load = case_load_counter("livequery_restore", accessor.domain) ids = iter(case_ids) while True: next_ids = take(1000, ids) if not next_ids: break track_load(len(next_ids)) yield accessor.get_cases(next_ids)
def __init__(self, timing_context, case_ids_to_sync, restore_state): self.restore_state = restore_state self.case_accessor = CaseAccessors(self.restore_state.domain) self.case_ids_to_sync = case_ids_to_sync self.all_maybe_syncing = copy(case_ids_to_sync) self.checked_cases = set() self.child_indices = defaultdict(set) self.extension_indices = defaultdict(set) self.all_dependencies_syncing = set() self.closed_cases = set() self.potential_elements_to_sync = {} self.timing_context = timing_context self._track_load = case_load_counter("cleanowner_restore", restore_state.domain)
def batch_cases(accessor, case_ids): def take(n, iterable): # https://docs.python.org/2/library/itertools.html#recipes return list(islice(iterable, n)) track_load = case_load_counter("livequery_restore", accessor.domain) metrics_histogram('commcare.restore.case_load', len(case_ids), 'cases', [10, 20, 50, 100, 200, 500, 1000, 2000, 5000, 10000], tags={'domain': accessor.domain}) ids = iter(case_ids) while True: next_ids = take(1000, ids) if not next_ids: break track_load(len(next_ids)) yield accessor.get_cases(next_ids)
def _sync_case_for_messaging_rule(domain, case_id, rule_id): case_load_counter("messaging_rule_sync", domain)() try: case = CaseAccessors(domain).get_case(case_id)
bind=True) def sync_case_for_messaging_rule(self, domain, case_id, rule_id): try: with CriticalSection([get_sync_key(case_id)], timeout=5 * 60): _sync_case_for_messaging_rule(domain, case_id, rule_id) except Exception as e: self.retry(exc=e) def _sync_case_for_messaging(domain, case_id): try: case = CaseAccessors(domain).get_case(case_id) sms_tasks.clear_case_caches(case) except CaseNotFound: case = None case_load_counter("messaging_sync", domain)() update_messaging_for_case(domain, case_id, case) if case is not None: run_auto_update_rules_for_case(case) def update_messaging_for_case(domain, case_id, case): if case is None or case.is_deleted: clear_messaging_for_case(domain, case_id) elif use_phone_entries(): sms_tasks._sync_case_phone_number(case) def clear_messaging_for_case(domain, case_id): sms_tasks.delete_phone_numbers_for_owners([case_id]) delete_schedule_instances_for_cases(domain, [case_id])
def _log_case_lookup(domain): case_load_counter("case_importer", domain)
def _sync_case_for_messaging_rule(domain, case_id, rule_id): case_load_counter("messaging_rule_sync", domain)() try: case = CommCareCase.objects.get_case(case_id, domain)