📄 startstoprulesdefaultplugin.java
字号:
vars.bStopAndQueued = false;
dlData.sTrace = "";
// Initialize STATE_WAITING torrents
if ((download.getState() == Download.ST_WAITING)) {
try {
download.initialize();
} catch (Exception ignore) {
/*ignore*/
}
if (bDebugLog && download.getState() == Download.ST_WAITING) {
dlData.sTrace += "still in waiting state after initialize!\n";
}
}
if (bAutoReposition && (iRankType != RANK_NONE)
&& download.isComplete()
&& (totals.bOkToStartSeeding || totals.firstPriority > 0))
download.setPosition(++vars.posComplete);
int state = download.getState();
// Never do anything to stopped entries
if (state == Download.ST_STOPPING || state == Download.ST_STOPPED
|| state == Download.ST_ERROR) {
continue;
}
// Handle incomplete DLs
if (!download.isComplete()) {
handleInCompleteDownload(dlData, vars, totals);
} else {
handleCompletedDownload(dlDataArray, dlData, vars, totals);
}
} // Loop 2/2 (Start/Stopping)
if (bDebugLog) {
String[] mainDebugEntries2 = new String[] {
"ok2Start=" + boolDebug(totals.bOkToStartSeeding),
"tFrcdCding=" + totals.forcedSeeding,
"actvCDs=" + totals.activelyCDing,
"tW8tingToCd=" + totals.waitingToSeed,
"tDLing=" + totals.downloading,
"actvDLs=" + totals.activelyDLing,
"tW8tingToDL=" + totals.waitingToDL,
"tCom=" + totals.complete,
"tIncQd=" + totals.incompleteQueued,
"mxCdrs=" + totals.maxSeeders,
"tFP=" + totals.firstPriority,
"maxT=" + totals.maxTorrents
};
printDebugChanges("<<process() ", mainDebugEntries, mainDebugEntries2,
"", "", true, null);
}
} finally {
if (now > 0) {
processCount++;
long timeTaken = (SystemTime.getCurrentTime() - now);
processTotalMS += timeTaken;
if (timeTaken > processMaxMS) {
processMaxMS = timeTaken;
}
if (processLastComplete > 0) {
processTotalGap += (now - processLastComplete);
}
processLastComplete = now;
}
this_mon.exit();
}
} // process()
/**
* @param dlData
* @param vars
* @param totals
*/
private void handleInCompleteDownload(DefaultRankCalculator dlData,
ProcessVars vars, TotalsStats totals) {
Download download = dlData.dl;
int state = download.getState();
if (download.isForceStart()) {
if (bDebugLog) {
String s = "isForceStart.. rules skipped";
log.log(download.getTorrent(), LoggerChannel.LT_INFORMATION, s);
dlData.sTrace += s + "\n";
}
return;
}
// Don't mess with preparing torrents. they could be in the
// middle of resume-data building, or file allocating.
if (state == Download.ST_PREPARING) {
vars.numWaitingOrDLing++;
if (bDebugLog) {
String s = "ST_PREPARING.. rules skipped. numW8tngorDLing="
+ vars.numWaitingOrDLing;
log.log(download.getTorrent(), LoggerChannel.LT_INFORMATION, s);
dlData.sTrace += s + "\n";
}
return;
}
int maxDLs = 0;
if (totals.maxActive == 0) {
maxDLs = maxDownloads;
} else {
int DLmax = 0;
DLmax = totals.stalledFPSeeders + totals.forcedActive + totals.maxActive
- totals.firstPriority - totals.forcedSeedingNonFP;
maxDLs = (DLmax <= 0) ? 0 : maxDownloads - DLmax <= 0 ? maxDownloads
: DLmax;
}
if (maxDLs < minDownloads) {
maxDLs = minDownloads;
}
if (bDebugLog) {
String s = ">> DL state=" + sStates.charAt(download.getState())
+ ";shareRatio=" + download.getStats().getShareRatio()
+ ";numW8tngorDLing=" + vars.numWaitingOrDLing + ";maxCDrs="
+ totals.maxSeeders + ";forced=" + boolDebug(download.isForceStart())
+ ";actvDLs=" + totals.activelyDLing + ";maxDLs=" + maxDLs
+ ";ActDLing=" + boolDebug(dlData.getActivelyDownloading())
+ ";hgherQd=" + boolDebug(vars.higherDLtoStart) + ";isCmplt="
+ boolDebug(download.isComplete());
log.log(download.getTorrent(), LoggerChannel.LT_INFORMATION, s);
dlData.sTrace += s + "\n";
}
// must use fresh getActivelyDownloading() in case state changed to
// downloading
if ((state == Download.ST_DOWNLOADING && dlData.getActivelyDownloading())
|| state == Download.ST_READY || state == Download.ST_WAITING
|| state == Download.ST_PREPARING) {
vars.numWaitingOrDLing++;
}
if (state == Download.ST_READY || state == Download.ST_DOWNLOADING
|| state == Download.ST_WAITING) {
boolean bActivelyDownloading = dlData.getActivelyDownloading();
// Stop torrent if over limit
boolean bOverLimit = vars.numWaitingOrDLing > maxDLs
|| (vars.numWaitingOrDLing >= maxDLs && vars.higherDLtoStart);
boolean bDownloading = state == Download.ST_DOWNLOADING;
if ((maxDownloads != 0)
&& bOverLimit
&& (bActivelyDownloading || !bDownloading || (bDownloading
&& totals.maxActive != 0 && !bActivelyDownloading && totals.activelyCDing
+ totals.activelyDLing >= totals.maxActive))) {
try {
if (bDebugLog) {
String s = " stopAndQueue: " + vars.numWaitingOrDLing
+ " waiting or downloading, when limit is " + maxDLs + "("
+ maxDownloads + ")";
if (vars.higherDLtoStart) {
s += " and higher DL is starting";
}
log.log(download.getTorrent(), LoggerChannel.LT_INFORMATION, s);
dlData.sTrace += s + "\n";
}
download.stopAndQueue();
// reduce counts
vars.numWaitingOrDLing--;
if (state == Download.ST_DOWNLOADING) {
totals.downloading--;
if (bActivelyDownloading)
totals.activelyDLing--;
} else {
totals.waitingToDL--;
}
totals.maxSeeders = calcMaxSeeders(totals.activelyDLing
+ totals.waitingToDL);
} catch (Exception ignore) {
/*ignore*/
}
state = download.getState();
} else if (bDebugLog) {
String s = "NOT queuing: ";
if (maxDownloads == 0) {
s += "maxDownloads = " + maxDownloads;
} else if (!bOverLimit) {
s += "not over limit. numWaitingOrDLing(" + vars.numWaitingOrDLing
+ ") <= maxDLs(" + maxDLs + ")";
} else if (!bActivelyDownloading || bDownloading) {
s += "not actively downloading";
} else if (totals.maxActive == 0) {
s += "unlimited active allowed (set)";
} else {
s += "# active(" + (totals.activelyCDing + totals.activelyDLing)
+ ") < maxActive(" + totals.maxActive + ")";
}
log.log(download.getTorrent(), LoggerChannel.LT_INFORMATION, s);
dlData.sTrace += s + "\n";
}
}
if (state == Download.ST_READY) {
if ((maxDownloads == 0) || (totals.activelyDLing < maxDLs)) {
try {
if (bDebugLog) {
String s = " start: READY && activelyDLing ("
+ totals.activelyDLing + ") < maxDLs (" + maxDownloads + ")";
log.log(download.getTorrent(), LoggerChannel.LT_INFORMATION, s);
dlData.sTrace += s + "\n";
}
download.start();
// adjust counts
totals.waitingToDL--;
totals.activelyDLing++;
totals.maxSeeders = calcMaxSeeders(totals.activelyDLing
+ totals.waitingToDL);
} catch (Exception ignore) {
/*ignore*/
}
state = download.getState();
}
}
if (state == Download.ST_QUEUED) {
if ((maxDownloads == 0) || (vars.numWaitingOrDLing < maxDLs)) {
try {
if (bDebugLog) {
String s = " restart: QUEUED && numWaitingOrDLing ("
+ vars.numWaitingOrDLing + ") < maxDLS (" + maxDLs + ")";
log.log(LoggerChannel.LT_INFORMATION, s);
dlData.sTrace += s + "\n";
}
download.restart();
// increase counts
vars.numWaitingOrDLing++;
totals.waitingToDL++;
totals.maxSeeders = calcMaxSeeders(totals.activelyDLing
+ totals.waitingToDL);
} catch (Exception ignore) {/*ignore*/
}
state = download.getState();
}
}
state = download.getState();
if (download.getSeedingRank() >= 0
&& (state == Download.ST_QUEUED || state == Download.ST_READY
|| state == Download.ST_WAITING || state == Download.ST_PREPARING)) {
vars.higherDLtoStart = true;
}
if (bDebugLog) {
String s = "<< DL state=" + sStates.charAt(download.getState())
+ ";shareRatio=" + download.getStats().getShareRatio()
+ ";numW8tngorDLing=" + vars.numWaitingOrDLing + ";maxCDrs="
+ totals.maxSeeders + ";forced=" + boolDebug(download.isForceStart())
+ ";actvDLs=" + totals.activelyDLing + ";hgherQd="
+ boolDebug(vars.higherDLtoStart) + ";ActDLing="
+ boolDebug(dlData.getActivelyDownloading());
log.log(download.getTorrent(), LoggerChannel.LT_INFORMATION, s);
dlData.sTrace += s + "\n";
}
}
/**
* Process Completed (Seeding) downloads, starting and stopping as needed
*
* @param dlDataArray All download data (rank objects) we handle
* @param dlData Current download data (rank object) we are processing
* @param vars Running calculations
* @param totals Summary values used in logic
*/
private void handleCompletedDownload(DefaultRankCalculator[] dlDataArray,
DefaultRankCalculator dlData, ProcessVars vars, TotalsStats totals) {
if (!totals.bOkToStartSeeding)
return;
Download download = dlData.dl;
int state = download.getState();
String[] debugEntries = null;
String sDebugLine = "";
// Queuing process:
// 1) Torrent is Queued (Stopped)
// 2) Slot becomes available
// 3) Queued Torrent changes to Waiting
// 4) Waiting Torrent changes to Ready
// 5) Ready torrent changes to Seeding (with startDownload)
// 6) Trigger stops Seeding torrent
// a) Queue Ranking drops
// b) User pressed stop
// c) other
// 7) Seeding Torrent changes to Queued. Go to step 1.
int numPeers = calcPeersNoUs(download);
boolean isFP = false;
if (bDebugLog) {
isFP = dlData.isFirstPriority();
debugEntries = new String[] {
"CD state=" + sStates.charAt(state),
"shareR=" + download.getStats().getShareRatio(),
"nWorCDing=" + vars.numWaitingOrSeeding,
"nWorDLing=" + vars.numWaitingOrDLing,
"sr=" + download.getSeedingRank(),
"hgherQd=" + boolDebug(vars.higherCDtoStart),
"maxCDrs=" + totals.maxSeeders,
"FP=" + boolDebug(isFP),
"nActCDing=" + totals.activelyCDing,
"ActCDing=" + boolDebug(dlData.getActivelySeeding())
};
}
try {
boolean bScrapeOk = scrapeResultOk(download);
// Ignore rules and other auto-starting rules do not apply when
// bAutoStart0Peers and peers == 0. So, handle starting 0 peers
// right at the beginning, and loop early
if (bAutoStart0Peers && numPeers == 0 && bScrapeOk) {
if (state == Download.ST_QUEUED) {
try {
if (bDebugLog)
sDebugLine += "\nrestart() 0Peers";
download.restart(); // set to Waiting
totals.waitingToSeed++;
vars.numWaitingOrSeeding++;
state = download.getState();
if (state == Download.ST_READY) {
if (bDebugLog)
sDebugLine += "\nstart(); 0Peers";
download.start();
totals.activelyCDing++;
}
} catch (Exception ignore) {/*ignore*/
}
}
if (state == Download.ST_READY) {
try {
if (bDebugLog)
sDebugLine += "\nstart(); 0Peers";
download.start();
totals.activelyCDing++;
vars.numWaitingOrSeeding++;
} catch (Exception ignore) {/*ignore*/
}
}
return;
}
if (bDebugLog && bAutoStart0Peers && numPeers == 0 && !bScrapeOk
&& (state == Download.ST_QUEUED || state == Download.ST_READY)) {
sDebugLine += "\n NOT starting 0 Peer torrent because scrape isn't ok";
}
if (!bDebugLog) {
// In debug mode, we already calculated FP
isFP = dlData.isFirstPriority();
}
boolean bActivelySeeding = dlData.getActivelySeeding();
boolean okToQueue = (state == Download.ST_READY || state == Download.ST_SEEDING)
&& (!isFP || (isFP && ((totals.maxActive != 0 && vars.numWaitingOrSeeding >= totals.maxActive
- minDownloads))))
//&& (!isFP || (isFP && ((vars.numWaitingOrSeeding >= totals.maxSeeders) || (!bActivelySeeding && (vars.numWaitingOrSeeding + totals.totalStalledSeeders) >= totals.maxSeeders))) )
&& (!download.isForceStart());
int rank = download.getSeedingRank();
// in RANK_TIMED mode, we use minTimeAlive for rotation time, so
// skip check
// XXX do we want changes to take effect immediately ?
if (okToQueue && (state == Download.ST_SEEDING)
&& iRankType != RANK_TIMED) {
long timeAlive = (SystemTime.getCurrentTime() - download.getStats().getTimeStarted());
okToQueue = (timeAlive >= minTimeAlive);
if (!okToQueue && bDebugLog)
sDebugLine += "\n Torrent can't be stopped yet, timeAlive("
+ timeAlive + ") < minTimeAlive(" + minTimeAlive + ")";
}
if (state != Download.ST_QUEUED && // Short circuit.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -