Source code for selinon.strategies
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# ######################################################################
# Copyright (C) 2016-2018 Fridolin Pokorny, fridolin.pokorny@gmail.com
# This file is part of Selinon project.
# ######################################################################
"""Prepared functions for scheduling dispatcher.
Dispatcher strategy configuration functions. All of them are receiving a dict
as a first argument containing:
* previous_retry - value of previous retry, None if scheduling for the first time
* active_nodes - active nodes within the system
* failed_nodes - failed nodes within the system
* new_started_nodes - newly started nodes in the system, these nodes are already in active_nodes
* new_fallback_nodes - newly started fallback nodes, these nodes are already in active_nodes
* finished nodes - already finished nodes
Other parameters are specific for strategy function and are configurable from YAML configuration file.
"""
from random import randint as gen_random
# There are done checks on user-defined strategies, so keep args
# pylint: disable=unused-argument
[docs]def linear_increase(status, start_retry, max_retry, step):
"""Increase linearly if no node started, decrease drastically to start_retry if no node scheduled.
:param status: flow status dict
:param start_retry: starting retry to use
:param max_retry: upper limit of scheduling
:param step: step to use in linear increase
"""
if not status['active_nodes']:
return None
if status['previous_retry'] is None:
return start_retry
if status['new_started_nodes'] or status['new_fallback_nodes']:
retry = status['previous_retry'] + step
return retry if retry < max_retry else max_retry
return start_retry
[docs]def linear_adapt(status, start_retry, max_retry, step):
"""Increase linearly if no node started, decrease linearly if a node scheduled.
:param status: flow status dict
:param start_retry: starting retry to use
:param max_retry: upper limit of scheduling
:param step: step to use in linear increase
"""
if not status['active_nodes']:
return None
if status['previous_retry'] is None:
return start_retry
if status['new_started_nodes'] or status['new_fallback_nodes']:
retry = status['previous_retry'] + step
return retry if retry < max_retry else max_retry
retry = status['previous_retry'] - step
return retry if retry > start_retry else start_retry
[docs]def biexponential_increase(status, start_retry, max_retry):
"""Increase exponentially if no node started, decrease drastically to start_retry if a node scheduled.
:param status: flow status dict
:param start_retry: starting retry to use
:param max_retry: upper limit of scheduling
"""
if not status['active_nodes']:
return None
if status['previous_retry'] is None:
return start_retry
if status['new_started_nodes'] or status['new_fallback_nodes']:
retry = status['previous_retry'] * 2
return retry if retry < max_retry else max_retry
return start_retry
[docs]def biexponential_decrease(status, start_retry, stop_retry):
"""Decrease by div 2 each time if no node started, decrease to stop_retry if a node scheduled.
:param status: flow status dict
:param start_retry: starting retry to use
:param stop_retry: upper limit of scheduling
"""
if not status['active_nodes']:
return None
if status['previous_retry'] is None:
return start_retry
retry = status['previous_retry'] / 2
return retry if retry > stop_retry else stop_retry
[docs]def biexponential_adapt(status, start_retry, max_retry):
"""Increase exponentially if no node started, decrease exponentially if a node scheduled.
:param status: flow status dict
:param start_retry: starting retry to use
:param max_retry: upper limit of scheduling
"""
if status['previous_retry'] is None:
return start_retry
if not status['active_nodes']:
return None
if status['new_started_nodes'] or status['new_fallback_nodes']:
retry = status['previous_retry'] * 2
return retry if retry < max_retry else max_retry
retry = status['previous_retry'] / 2
return retry if retry > start_retry else start_retry
[docs]def random(status, start_retry, max_retry):
"""Schedule randomly.
:param status: flow status dict
:param start_retry: lower limit of scheduling
:param max_retry: upper limit of scheduling
"""
if not status['active_nodes']:
return None
return gen_random(start_retry, max_retry) # nosec
[docs]def constant(status, retry):
"""Schedule constantly.
:param status: flow status dict
:param retry: constant retry timeout
"""
if not status['active_nodes']:
return None
return retry