¡@

Home 

OpenStack Study: comm_utils.py

OpenStack Index

**** CubicPower OpenStack Study ****

# vim: tabstop=4 shiftwidth=4 softtabstop=4

#

# Copyright 2013 Mellanox Technologies, Ltd

#

# Licensed under the Apache License, Version 2.0 (the "License");

# you may not use this file except in compliance with the License.

# You may obtain a copy of the License at

#

# http://www.apache.org/licenses/LICENSE-2.0

#

# Unless required by applicable law or agreed to in writing, software

# distributed under the License is distributed on an "AS IS" BASIS,

# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or

# implied.

# See the License for the specific language governing permissions and

# limitations under the License.

import time

from oslo.config import cfg

from neutron.openstack.common import log as logging

from neutron.plugins.mlnx.common import config # noqa

LOG = logging.getLogger(__name__)

**** CubicPower OpenStack Study ****

class RetryDecorator(object):

"""Retry decorator reruns a method 'retries' times if an exception occurs.

Decorator for retrying a method if exceptionToCheck exception occurs

If method raises exception, retries 'retries' times with increasing

back off period between calls with 'interval' multiplier

:param exceptionToCheck: the exception to check

:param interval: initial delay between retries in seconds

:param retries: number of times to try before giving up

:raises: exceptionToCheck

"""

sleep_fn = time.sleep

**** CubicPower OpenStack Study ****

    def __init__(self, exceptionToCheck,

                 interval=cfg.CONF.ESWITCH.request_timeout / 1000,

                 retries=cfg.CONF.ESWITCH.retries,

                 backoff_rate=cfg.CONF.ESWITCH.backoff_rate):

        self.exc = exceptionToCheck

        self.interval = interval

        self.retries = retries

        self.backoff_rate = backoff_rate

**** CubicPower OpenStack Study ****

    def __call__(self, original_func):

        def decorated(*args, **kwargs):

            sleep_interval = self.interval

            num_of_iter = self.retries

            while num_of_iter > 0:

                try:

                    return original_func(*args, **kwargs)

                except self.exc:

                    LOG.debug(_("Request timeout - call again after "

                              "%s seconds"), sleep_interval)

                    RetryDecorator.sleep_fn(sleep_interval)

                    num_of_iter -= 1

                    sleep_interval *= self.backoff_rate

            return original_func(*args, **kwargs)

        return decorated

**** CubicPower OpenStack Study ****

        def decorated(*args, **kwargs):

            sleep_interval = self.interval

            num_of_iter = self.retries

            while num_of_iter > 0:

                try:

                    return original_func(*args, **kwargs)

                except self.exc:

                    LOG.debug(_("Request timeout - call again after "

                              "%s seconds"), sleep_interval)

                    RetryDecorator.sleep_fn(sleep_interval)

                    num_of_iter -= 1

                    sleep_interval *= self.backoff_rate

            return original_func(*args, **kwargs)

        return decorated