📄 defaultrankcalculator.java
字号:
* @return New Seeding Rank Value
*/
public int recalcSeedingRank() {
try {
downloadData_this_mon.enter();
sExplainSR = "";
int oldSR = dl.getSeedingRank();
DownloadStats stats = dl.getStats();
int newSR = 0;
// make undownloaded sort to top so they can start first.
if (!dl.isComplete()) {
newSR = SR_COMPLETE_STARTS_AT + (10000 - dl.getPosition());
dl.setSeedingRank(newSR);
if ( rules.bDebugLog ){
sExplainSR += " not complete. SetSR " + newSR + "\n";
}
return newSR;
}
// here we are seeding
int shareRatio = stats.getShareRatio();
int numPeers = rules.calcPeersNoUs(dl);
int numSeeds = rules.calcSeedsNoUs(dl);
boolean bScrapeResultsOk = (numPeers > 0 || numSeeds > 0
|| scrapeResultOk(dl)) && (numPeers >= 0 && numSeeds >= 0);
if (!isFirstPriority()) {
// Check Ignore Rules
// never apply ignore rules to First Priority Matches
// (we don't want leechers circumventing the 0.5 rule)
//0 means unlimited
if (iIgnoreShareRatio != 0 && shareRatio >= iIgnoreShareRatio
&& (numSeeds >= iIgnoreShareRatio_SeedStart || !scrapeResultOk(dl))
&& shareRatio != -1) {
if (rules.bDebugLog)
sExplainSR += " shareratio met: shareRatio(" + shareRatio
+ ") >= " + iIgnoreShareRatio + "\n";
dl.setSeedingRank(SR_SHARERATIOMET);
return SR_SHARERATIOMET;
} else if (rules.bDebugLog && iIgnoreShareRatio != 0
&& shareRatio >= iIgnoreShareRatio) {
sExplainSR += " shareratio NOT met: ";
if (numSeeds >= iIgnoreShareRatio_SeedStart)
sExplainSR += numSeeds + " below seed threshold of "
+ iIgnoreShareRatio_SeedStart;
sExplainSR += "\n";
}
if (numPeers == 0 && bScrapeResultsOk) {
// If both bIgnore0Peers and bFirstPriorityIgnore0Peer are on,
// we won't know which one it is at this point.
// We have to use the normal SR_0PEERS in case it isn't FP
if (bIgnore0Peers) {
if (rules.bDebugLog)
sExplainSR += " Ignore 0 Peers criteria met\n";
dl.setSeedingRank(SR_0PEERS);
return SR_0PEERS;
}
// if (bFirstPriorityIgnore0Peer) {
// if (rules.bDebugLog)
// sExplainSR += " Ignore 0 Peers criteria for FP met\n";
//
// dl.setSeedingRank(SR_FP0PEERS);
// return SR_FP0PEERS;
// }
} else if (rules.bDebugLog && numPeers == 0) {
sExplainSR += " 0 Peer Ignore rule NOT applied: Scrape invalid\n";
}
// if (numPeers != 0 && iFirstPriorityIgnoreSPRatio != 0
// && numSeeds / numPeers >= iFirstPriorityIgnoreSPRatio) {
// if (rules.bDebugLog)
// sExplainSR += " Ignore rule for S:P Ratio for FP met. Current: ("
// + (numSeeds / numPeers)
// + ") >= Threshold("
// + iFirstPriorityIgnoreSPRatio + ")\n";
//
// dl.setSeedingRank(SR_FP_SPRATIOMET);
// return SR_FP_SPRATIOMET;
// }
//0 means disabled
if ((iIgnoreSeedCount != 0) && (numSeeds >= iIgnoreSeedCount)) {
if (rules.bDebugLog)
sExplainSR += " SeedCount Ignore rule met. numSeeds("
+ numSeeds + " >= iIgnoreSeedCount(" + iIgnoreSeedCount + ")\n";
dl.setSeedingRank(SR_NUMSEEDSMET);
return SR_NUMSEEDSMET;
}
// Ignore when P:S ratio met
// (More Peers for each Seed than specified in Config)
//0 means never stop
if (iIgnoreRatioPeers != 0 && numSeeds != 0) {
float ratio = (float) numPeers / numSeeds;
if (ratio <= iIgnoreRatioPeers
&& numSeeds >= iIgnoreRatioPeers_SeedStart) {
if (rules.bDebugLog)
sExplainSR += " P:S Ignore rule met. ratio(" + ratio
+ " <= threshold(" + iIgnoreRatioPeers_SeedStart + ")\n";
dl.setSeedingRank(SR_RATIOMET);
return SR_RATIOMET;
}
}
}
// Never do anything with rank type of none
if (iRankType == StartStopRulesDefaultPlugin.RANK_NONE) {
if (rules.bDebugLog)
sExplainSR += " Ranking Type set to none.. blanking seeding rank\n";
// everythink ok!
dl.setSeedingRank(newSR);
return newSR;
}
if (iRankType == StartStopRulesDefaultPlugin.RANK_TIMED) {
if (bIsFirstPriority) {
newSR += SR_TIMED_QUEUED_ENDS_AT + 1;
dl.setSeedingRank(newSR);
return newSR;
}
int state = dl.getState();
if (state == Download.ST_STOPPING || state == Download.ST_STOPPED
|| state == Download.ST_ERROR) {
if (rules.bDebugLog)
sExplainSR += " Download stopping, stopped or in error\n";
dl.setSeedingRank(SR_NOTQUEUED);
return SR_NOTQUEUED;
} else if (state == Download.ST_SEEDING || state == Download.ST_READY
|| state == Download.ST_WAITING || state == Download.ST_PREPARING) {
// force sort to top
long lMsElapsed = 0;
if (state == Download.ST_SEEDING && !dl.isForceStart())
lMsElapsed = (SystemTime.getCurrentTime() - stats
.getTimeStartedSeeding());
if (lMsElapsed >= minTimeAlive) {
dl.setSeedingRank(1);
if (oldSR > SR_TIMED_QUEUED_ENDS_AT) {
rules.requestProcessCycle(null);
if (rules.bDebugLog)
rules.log.log(dl.getTorrent(), LoggerChannel.LT_INFORMATION,
"somethingChanged: TimeUp");
}
} else {
newSR = SR_TIMED_QUEUED_ENDS_AT + 1 + (int) (lMsElapsed / 1000);
dl.setSeedingRank(newSR);
if (oldSR <= SR_TIMED_QUEUED_ENDS_AT) {
rules.requestProcessCycle(null);
if (rules.bDebugLog)
rules.log.log(dl.getTorrent(), LoggerChannel.LT_INFORMATION,
"somethingChanged: strange timer change");
}
}
return newSR;
} else {
if (oldSR <= 0) {
newSR = SR_TIMED_QUEUED_ENDS_AT - dl.getPosition();
dl.setSeedingRank(newSR);
rules.requestProcessCycle(null);
if (rules.bDebugLog)
rules.log.log(dl.getTorrent(), LoggerChannel.LT_INFORMATION,
"somethingChanged: NotIgnored");
}
return newSR;
}
}
/**
* Add to SeedingRank based on Rank Type
*/
// SeedCount and SPRatio require Scrape Results..
if (bScrapeResultsOk) {
if ((iRankType == StartStopRulesDefaultPlugin.RANK_SEEDCOUNT)
&& (iRankTypeSeedFallback == 0 || iRankTypeSeedFallback > numSeeds)) {
if (numSeeds < 10000)
newSR = 10000 - numSeeds;
else
newSR = 1;
// shift over to make way for fallback
newSR *= SEEDONLY_SHIFT;
} else { // iRankType == RANK_SPRATIO or we are falling back
if (numPeers != 0) {
if (numSeeds == 0) {
if (numPeers >= minPeersToBoostNoSeeds)
newSR += SPRATIO_BASE_LIMIT;
} else { // numSeeds != 0 && numPeers != 0
float x = (float) numSeeds / numPeers;
newSR += SPRATIO_BASE_LIMIT / ((x + 1) * (x + 1));
}
}
}
} else {
if (rules.bDebugLog)
sExplainSR += " Can't calculate SR, no scrape results\n";
}
if (newSR < 0)
newSR = 1;
if (newSR != oldSR)
dl.setSeedingRank(newSR);
return newSR;
} finally {
downloadData_this_mon.exit();
}
} // recalcSeedingRank
/** Does the torrent match First Priority criteria?
* @return FP State
*/
public boolean isFirstPriority() {
boolean bFP = pisFirstPriority();
if (bIsFirstPriority != bFP) {
bIsFirstPriority = bFP;
rules.requestProcessCycle(null);
if (rules.bDebugLog)
rules.log.log(dl.getTorrent(), LoggerChannel.LT_INFORMATION,
"somethingChanged: FP changed");
}
return bIsFirstPriority;
}
private boolean pisFirstPriority() {
if (rules.bDebugLog)
sExplainFP = "FP if "
+ (iFirstPriorityType == FIRSTPRIORITY_ALL ? "all" : "any")
+ " criteria match:\n";
if (!dl.isPersistent()) {
if (rules.bDebugLog)
sExplainFP += "Not FP: Download not persistent\n";
return false;
}
if (dl.getState() == Download.ST_ERROR
|| dl.getState() == Download.ST_STOPPED) {
if (rules.bDebugLog)
sExplainFP += "Not FP: Download is ERROR or STOPPED\n";
return false;
}
// FP only applies to completed
if (!dl.isComplete()) {
if (rules.bDebugLog)
sExplainFP += "Not FP: Download not complete\n";
return false;
}
int numPeers = rules.calcPeersNoUs(dl);
int numSeeds = rules.calcSeedsNoUs(dl);
// FP while our content doesn't have another seed
if (dl.getState() == Download.ST_SEEDING) {
Map contentMap = dl.getMapAttribute(rules.torrentAttributeContent);
if (contentMap != null && contentMap.containsKey("ourContent")) {
if (((Long) contentMap.get("ourContent")).longValue() == 1) {
if (dl.getStats().getAvailability() < 2 && numSeeds == 0) {
return true;
}
}
}
}
// FP doesn't apply when S:P >= set SPratio (SPratio = 0 means ignore)
if (numPeers > 0 && numSeeds > 0
&& (numSeeds / numPeers) >= iFirstPriorityIgnoreSPRatio
&& iFirstPriorityIgnoreSPRatio != 0) {
if (rules.bDebugLog)
sExplainFP += "Not FP: S:P >= " + iFirstPriorityIgnoreSPRatio + ":1\n";
return false;
}
//not FP if no peers //Nolar, 2105 - Gouss, 2203
if (numPeers == 0 && scrapeResultOk(dl) && bFirstPriorityIgnore0Peer) {
if (rules.bDebugLog)
sExplainFP += "Not FP: 0 peers\n";
return false;
}
int shareRatio = dl.getStats().getShareRatio();
boolean bLastMatched = (shareRatio != -1)
&& (shareRatio < minQueueingShareRatio);
if (rules.bDebugLog)
sExplainFP += " shareRatio(" + shareRatio + ") < "
+ minQueueingShareRatio + "=" + bLastMatched + "\n";
if (!bLastMatched && iFirstPriorityType == FIRSTPRIORITY_ALL) {
if (rules.bDebugLog)
sExplainFP += "..Not FP. Exit Early\n";
return false;
}
if (bLastMatched && iFirstPriorityType == FIRSTPRIORITY_ANY) {
if (rules.bDebugLog)
sExplainFP += "..Is FP. Exit Early\n";
return true;
}
bLastMatched = (iFirstPrioritySeedingMinutes == 0);
if (!bLastMatched) {
long timeSeeding = dl.getStats().getSecondsOnlySeeding();
if (timeSeeding >= 0) {
bLastMatched = (timeSeeding < (iFirstPrioritySeedingMinutes * 60));
if (rules.bDebugLog)
sExplainFP += " SeedingTime(" + timeSeeding + ") < "
+ (iFirstPrioritySeedingMinutes * 60) + "=" + bLastMatched + "\n";
if (!bLastMatched && iFirstPriorityType == FIRSTPRIORITY_ALL) {
if (rules.bDebugLog)
sExplainFP += "..Not FP. Exit Early\n";
return false;
}
if (bLastMatched && iFirstPriorityType == FIRSTPRIORITY_ANY) {
if (rules.bDebugLog)
sExplainFP += "..Is FP. Exit Early\n";
return true;
}
}
} else if (rules.bDebugLog) {
sExplainFP += " Skipping Seeding Time check (user disabled)\n";
}
bLastMatched = (iFirstPriorityActiveMinutes == 0);
if (!bLastMatched) {
long timeActive = dl.getStats().getSecondsDownloading()
+ dl.getStats().getSecondsOnlySeeding();
if (timeActive >= 0) {
bLastMatched = (timeActive < (iFirstPriorityActiveMinutes * 60));
if (rules.bDebugLog)
sExplainFP += " ActiveTime(" + timeActive + ") < "
+ (iFirstPriorityActiveMinutes * 60) + "=" + bLastMatched + "\n";
if (!bLastMatched && iFirstPriorityType == FIRSTPRIORITY_ALL) {
if (rules.bDebugLog)
sExplainFP += "..Not FP. Exit Early\n";
return false;
}
if (bLastMatched && iFirstPriorityType == FIRSTPRIORITY_ANY) {
if (rules.bDebugLog)
sExplainFP += "..Is FP. Exit Early\n";
return true;
}
}
} else if (rules.bDebugLog) {
sExplainFP += " Skipping DL Time check (user disabled)\n";
}
if (iFirstPriorityType == FIRSTPRIORITY_ALL) {
if (rules.bDebugLog)
sExplainFP += "..Is FP\n";
return true;
}
if (rules.bDebugLog)
sExplainFP += "..Not FP\n";
return false;
}
/**
*
* @return last calculated FP state
*/
public boolean getCachedIsFP() {
return bIsFirstPriority;
}
public String toString() {
return String.valueOf(dl.getSeedingRank());
}
/**
* Check Seeders for various changes not triggered by listeners
*
* @return True: something changed
*/
public boolean changeChecker() {
if (getActivelySeeding()) {
int shareRatio = dl.getStats().getShareRatio();
int numSeeds = rules.calcSeedsNoUs(dl);
if (iIgnoreShareRatio != 0 && shareRatio >= iIgnoreShareRatio
&& (numSeeds >= iIgnoreShareRatio_SeedStart || !scrapeResultOk(dl))
&& shareRatio != -1) {
return true;
}
}
/* READY downloads are usually waiting for a seeding torrent to
stop (the seeding torrent probably is within the "Minimum Seeding
Time" setting)
The rules may go through several cycles before a READY torrent is
processed
*/
if (dl.getState() == Download.ST_READY) {
if (rules.bDebugLog)
rules.log.log(dl.getTorrent(), LoggerChannel.LT_INFORMATION,
"somethingChanged: Download is ready");
return true;
}
return false;
}
private boolean scrapeResultOk(Download download) {
DownloadScrapeResult sr = download.getLastScrapeResult();
return (sr.getResponseType() == DownloadScrapeResult.RT_SUCCESS);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -