I2PSnark: improve sort algorithms
Opened 12 months ago
Last modified 10 months ago
#2733newenhancement
I2PSnark: improve sort algorithms
Reported by:ReportageOwned by:zzz Priority: minor Milestone: undecided Component: apps/i2psnark Version: 0.9.45 Keywords: I2PSnark, sorting Cc:
Parent Tickets:
Sensitive: no
(last modified by Reportage)
DescriptionPatch to provide more intuitive sort for Status and ETA columns. Also requires reversal of sort order for status column in I2PSnarkServlet.java:
// String sort = ("-2".equals(currentSort)) ? "2" : "-2";
// show incomplete torrents at top on first click
String sort = ("2".equals(currentSort)) ? "-2" : "2";
diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java b/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java
index 56c3115e7..818a4df35 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/Sorters.java
@@ -200,37 +200,61 @@ class Sorters {
int rv = getStatus(l) - getStatus(r);
if (rv != 0)
return rv;
- // use reverse remaining as first tie break
- return compLong(r.getNeededLength(), l.getNeededLength());
+ else if ((getStatus(l) == 100 && getStatus(r) == 100)||
+ (getStatus(l) == 98 && getStatus(r) == 98) ||
+ (getStatus(l) == 40 && getStatus(r) == 40) ||
+ (getStatus(l) == 10 && getStatus(r) == 10))
+
+ // first tie break by swarm size
+ return compLong(r.getTrackerSeenPeers(), l.getTrackerSeenPeers());
+ else
+ // tie break by active peer count
+ return compLong(r.getPeerCount(), l.getPeerCount());
}
private static int getStatus(Snark snark) {
- long remaining = snark.getRemainingLength();
+ long remaining = snark.getRemainingLength();
+ int activePeers = snark.getPeerCount();
+ int peers = snark.getTrackerSeenPeers();
+ long downBps = snark.getDownloadRate();
if (snark.isStopped()) {
+ if (remaining < 0) // magnet
+ return 50;
+ if (remaining > 0)
+ return 46;
+ else
+ return 60;
+ } else {
+ if (downBps > 0)
+ return 3;
+ if (snark.isStarting())
+ return 15;
+ if (snark.isAllocating())
+ return 20;
if (remaining < 0)
+ return 45; // magnet
+ if (remaining == 0) { //seeding
+ if (activePeers > 0)
+ return 65; // active
+ else if (peers > 0) // inactive with swarm members
+ return 98;
+ else
+ return 100;
+ }
+ if (snark.isChecking())
+ return 95;
+ if (snark.getNeededLength() <= 0)https://news.google.com/topstories?hl=en-US&gl=US&ceid=US:en
+ return 90;
+ if (peers <= 0) // no peers in swarm
+ return 35;
+ if (activePeers <= 0) // no active peers
return 10;
- if (remaining > 0)
+ if (downBps <= 0) // stalled
+ return 7;
+ else
return 5;
- return 0;
- }
- if (snark.isStarting())
- return 15;
- if (snark.isAllocating())
- return 20;
- if (remaining < 0)
- return 15; // magnet
- if (remaining == 0)
- return 100;
- if (snark.isChecking())
- return 95;
- if (snark.getNeededLength() <= 0)
- return 90;
- if (snark.getPeerCount() <= 0)
- return 40;
- if (snark.getDownloadRate() <= 0)
- return 50;
- return 60;
- }
+ }
+ }
}
private static class PeersComparator extends Sort {
@@ -256,20 +280,49 @@ class Sorters {
public ETAComparator(boolean rev, String lang) { super(rev, lang); }
public int compareIt(Snark l, Snark r) {
+ // TODO For completed torrents, sort by date of completion
return compLong(eta(l), eta(r));
}
private static long eta(Snark snark) {
- long needed = snark.getNeededLength();
- if (needed <= 0)
- return 0;
- long total = snark.getTotalLength();
- if (needed > total)
- needed = total;
- long downBps = snark.getDownloadRate();
- if (downBps > 0)
- return needed / downBps;
- return Long.MAX_VALUE;
+ long needed = snark.getNeededLength();
+ long remaining = snark.getRemainingLength();
+ long upBps = snark.getUploadRate();
+ int activePeers = snark.getPeerCount();
+ int peers = snark.getTrackerSeenPeers();
+ if (snark.isStopped()) {
+ if (remaining == 0)
+ return Long.MAX_VALUE - 9;
+ if (remaining < 0) // magnet
+ return Long.MAX_VALUE - 10;
+ else
+ return Long.MAX_VALUE - 11;
+ } else {
+ if (remaining < 0) // magnet
+ return Long.MAX_VALUE - 12;
+ else if (remaining == 0) {
+ if (upBps > 0)
+ return Long.MAX_VALUE - 8;
+ if (activePeers > 0)
+ return Long.MAX_VALUE - 7;
+ if (peers > 0)
+ return Long.MAX_VALUE - 6;
+ }
+ if (needed > 0 && snark.getDownloadRate() <= 0) {
+ if (activePeers <= 0)
+ return Long.MAX_VALUE - 16;
+ else
+ return Long.MAX_VALUE - 17;
+ }
+ long total = snark.getTotalLength();
+ if (needed > total)
+ needed = total;
+ long downBps = snark.getDownloadRate();
+ if (downBps > 0)
+ return needed / downBps;
+ else
+ return Long.MAX_VALUE - 19;
+ }
}
}
Updated: 27 May 2020