void calculate(PeerNode[] peers) { double[] allPeers = new double[peers.length]; int x = 0; for(PeerNode peer : peers) { PeerLoadStats stats = peer.outputLoadTracker(isRealtime).getLastIncomingLoadStats(); if(stats == null) continue; allPeers[x++] = stats.peerLimit(isInput); } if(x != peers.length) { allPeers = Arrays.copyOf(allPeers, x); } Arrays.sort(allPeers); if(x == 0) return; synchronized(this) { min = allPeers[0]; median = allPeers[x / 2]; firstQuartile = allPeers[x / 4]; lastQuartile = allPeers[(x * 3) / 4]; max = allPeers[x - 1]; if(logMINOR) Logger.minor(this, "Quartiles for peer capacities: "+(isInput?"input ":"output ")+(isRealtime?"realtime: ":"bulk: ")+Arrays.toString(getQuartiles())); } }
private RequestLikelyAcceptedState getRequestLikelyAcceptedStateBandwidth( boolean input, RunningRequestsSnapshot runningRequests, RunningRequestsSnapshot otherRunningRequests, boolean ignoreLocalVsRemote, PeerLoadStats stats) { double ourUsage = runningRequests.calculate(ignoreLocalVsRemote, input); if(logMINOR) Logger.minor(this, "Our usage is "+ourUsage+" peer limit is "+stats.peerLimit(input)+" lower limit is "+stats.lowerLimit(input)+" realtime "+realTime+" input "+input); if(ourUsage < stats.peerLimit(input)) return RequestLikelyAcceptedState.GUARANTEED; otherRunningRequests.log(PeerNode.this); double theirUsage = otherRunningRequests.calculate(ignoreLocalVsRemote, input); if(logMINOR) Logger.minor(this, "Their usage is "+theirUsage); if(ourUsage + theirUsage < stats.lowerLimit(input)) return RequestLikelyAcceptedState.LIKELY; else return RequestLikelyAcceptedState.UNLIKELY; }
public boolean isLowCapacity(boolean isRealtime) { PeerLoadStats stats = outputLoadTracker(isRealtime).getLastIncomingLoadStats(); if(stats == null) return false; NodePinger pinger = node.nodeStats.nodePinger; if(pinger == null) return false; // FIXME possible? if(pinger.capacityThreshold(isRealtime, true) > stats.peerLimit(true)) return true; if(pinger.capacityThreshold(isRealtime, false) > stats.peerLimit(false)) return true; return false; }