MAX_RESULT_BUNDLE_BYTES = 64 * 1024 * 1024 REMOTE_ASSIGNMENT_BASELINE_BYTES = 2 * 1024 * 1024 REMOTE_ASSIGNMENT_MAX_ACTIVE = 50 def validate_remote_assignment_capacity(config): values = {} fields = ( 'result_bundle_max_event_bytes', 'remote_assignment_reserve_bytes', 'remote_assignment_max_active', 'result_bundle_max_total_bytes', 'projection_backlog_max_bytes', 'projection_backlog_headroom_bytes', 'keycheck_queue_max_items', 'keycheck_queue_max_bytes', 'keycheck_candidates_per_event', 'keycheck_candidate_bytes_per_event', ) for name in fields: value = config.get(name) if type(value) is not int or value < 0: raise ValueError(name) values[name] = value hard_limit = values['result_bundle_max_event_bytes'] reserve = values['remote_assignment_reserve_bytes'] active = values['remote_assignment_max_active'] if not REMOTE_ASSIGNMENT_BASELINE_BYTES <= reserve <= hard_limit: raise ValueError('remote_assignment_reserve_bytes') if not REMOTE_ASSIGNMENT_BASELINE_BYTES <= hard_limit <= MAX_RESULT_BUNDLE_BYTES: raise ValueError('result_bundle_max_event_bytes') if not 1 <= active <= REMOTE_ASSIGNMENT_MAX_ACTIVE: raise ValueError('remote_assignment_max_active') required_bytes = active * reserve if values['result_bundle_max_total_bytes'] < required_bytes: raise ValueError('result_bundle_max_total_bytes') projection_admission_bytes = ( values['projection_backlog_max_bytes'] - values['projection_backlog_headroom_bytes'] ) if projection_admission_bytes < required_bytes: raise ValueError('projection_backlog_max_bytes') if ( values['keycheck_queue_max_items'] < active * values['keycheck_candidates_per_event'] ): raise ValueError('keycheck_queue_max_items') if ( values['keycheck_queue_max_bytes'] < active * values['keycheck_candidate_bytes_per_event'] ): raise ValueError('keycheck_queue_max_bytes') return values