Add delay for EOR in BGP
[netvirt.git] / bgpmanager / impl / src / main / java / org / opendaylight / netvirt / bgpmanager / RetryOnException.java
1 /*
2  * Copyright (c) 2017 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 package org.opendaylight.netvirt.bgpmanager;
10
11 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
12 import org.slf4j.Logger;
13 import org.slf4j.LoggerFactory;
14
15 @SuppressFBWarnings("NM_CLASS_NOT_EXCEPTION")
16 public class RetryOnException {
17     public static final int DEFAULT_RETRIES = Integer.MAX_VALUE;
18     public static final long TIME_IN_MILLI = 1000;
19     public static final int MAX_DELAY_FACTOR = 15;
20     private static final Logger LOG = LoggerFactory.getLogger(RetryOnException.class);
21
22     private int numberOfTriesLeft;
23     private int delayFactor;
24
25     public RetryOnException(int numberOfRetries) {
26         numberOfTriesLeft = numberOfRetries;
27     }
28
29     public int getNumberOfTriesLeft() {
30         return numberOfTriesLeft;
31     }
32
33     public boolean shouldRetry() {
34         return numberOfTriesLeft > 0;
35     }
36
37     public boolean decrementAndRetry() {
38         numberOfTriesLeft--;
39         return numberOfTriesLeft > 0;
40     }
41
42     public void errorOccured() {
43         numberOfTriesLeft--;
44         delayFactor++;
45         LOG.info("number of retries left {} delay factor {}", numberOfTriesLeft, delayFactor);
46         if (!shouldRetry()) {
47             return;
48         }
49         waitUntilNextTry();
50     }
51
52     public void errorOccured(int decrementTries) {
53         numberOfTriesLeft = numberOfTriesLeft - decrementTries;
54         delayFactor++;
55         LOG.info("number of retries left {} delay factor {}", numberOfTriesLeft, delayFactor);
56         if (!shouldRetry()) {
57             return;
58         }
59         waitUntilNextTry();
60     }
61
62
63     public long getTimeToWait() {
64     /*
65      Disabling exponential backoff
66        if (delayFactor > MAX_DELAY_FACTOR) { // max wait time is 225 seconds
67             delayFactor = 1;
68         }
69         return delayFactor * delayFactor * TIME_IN_MILLI;
70      */
71         return TIME_IN_MILLI;
72     }
73
74     private void waitUntilNextTry() {
75         try {
76             Thread.sleep(getTimeToWait());
77         } catch (InterruptedException ignored) {
78             LOG.error("Exception while waiting for next try", ignored);
79         }
80     }
81 }