package com.cloudera.util;
import com.cloudera.flume.core.Attributes;
import com.cloudera.flume.reporter.ReportEvent;
import static java.lang.Math.max;
final long initialSleep;
final long maxTries;
final static public String A_INITIAL = "backoffInitialMs";
final static public String A_COUNT = "backoffCurCount";
final static public String A_COUNTCAP = "backoffCountCap";
final static public String A_CURRENTBACKOFF = "backoffCurrentMs";
final static public String A_RETRYTIME = "backoffRetryTime";
long backoffCount = 0;
long sleepIncrement;
long retryTime;
this.initialSleep = initialSleep;
this.maxTries = max;
reset();
}
retryTime = Clock.unixTime() + sleepIncrement;
sleepIncrement *= 2;
backoffCount++;
}
return retryTime <= Clock.unixTime() && !isFailed();
}
return backoffCount >= maxTries;
}
sleepIncrement = initialSleep;
long cur = Clock.unixTime();
retryTime = cur;
backoffCount = 0;
}
@Override
return sleepIncrement;
}
@Override
return "ExpBackoff";
}
@Override
ReportEvent rpt = new ReportEvent(getName());
Attributes.setLong(rpt, A_INITIAL, initialSleep);
Attributes.setLong(rpt, A_COUNT, backoffCount);
Attributes.setLong(rpt, A_COUNTCAP, maxTries);
Attributes.setLong(rpt, A_CURRENTBACKOFF, sleepIncrement);
Attributes.setLong(rpt, A_RETRYTIME, retryTime);
return rpt;
}
@Override
Thread.sleep(max(0L,retryTime - Clock.unixTime()));
}
}