public class

SmaLatencyScoreStrategyInstanceImpl

extends Object
implements LatencyScoreStrategy.Instance
package com.netflix.astyanax.connectionpool.impl;

import java.util.NoSuchElementException;
import java.util.concurrent.LinkedBlockingQueue;

import com.netflix.astyanax.connectionpool.LatencyScoreStrategy;

public class SmaLatencyScoreStrategyInstanceImpl implements LatencyScoreStrategy.Instance {
    private final LinkedBlockingQueue<Long> latencies;
    private volatile Double cachedScore = 0.0d;

    public SmaLatencyScoreStrategyInstanceImpl(SmaLatencyScoreStrategyImpl strategy) {
        this.latencies = new LinkedBlockingQueue<Long>(strategy.getWindowSize());
    }

    @Override
    public void addSample(long sample) {
        if (!latencies.offer(sample)) {
            try {
                latencies.remove();
            }
            catch (NoSuchElementException e) {
            }
            latencies.offer(sample);
        }
    }

    @Override
    public double getScore() {
        return cachedScore;
    }

    @Override
    public void reset() {
        latencies.clear();
    }

    @Override
    public void update() {
        cachedScore = getMean();
    }

    @Override
    public double getMean() {
        long sum = 0;
        int count = 0;
        for (long d : latencies) {
            sum += d;
            count++;
        }
        return (count > 0) ? sum / count : 0.0;
    }
}