rework the upload speed smoothing to persist across requests

pull/53/head
Zlatin Balevsky 2020-10-06 20:28:00 +01:00
parent 56e02c4981
commit fdf3a46ad4
No known key found for this signature in database
GPG Key ID: A72832072D525E41
5 changed files with 41 additions and 41 deletions

View File

@ -69,9 +69,9 @@ class ContentUploader extends Uploader {
int start = mapped.position()
mapped.get(tmp, 0, Math.min(tmp.length, mapped.remaining()))
read = mapped.position() - start
dataSinceLastRead += read
}
endpoint.getOutputStream().write(tmp, 0, read)
dataSinceLastRead.addAndGet(read)
}
done = true
} finally {

View File

@ -32,9 +32,9 @@ class HashListUploader extends Uploader {
int start = mapped.position()
mapped.get(tmp, 0, Math.min(tmp.length, mapped.remaining()))
read = mapped.position() - start
dataSinceLastRead += read
}
endpoint.getOutputStream().write(tmp, 0, read)
dataSinceLastRead.addAndGet(read)
}
endpoint.getOutputStream().flush()
}

View File

@ -5,6 +5,7 @@ import java.nio.channels.FileChannel
import java.nio.charset.StandardCharsets
import java.nio.file.Files
import java.nio.file.StandardOpenOption
import java.util.concurrent.atomic.AtomicInteger
import com.muwire.core.Persona
import com.muwire.core.connection.Endpoint
@ -13,12 +14,8 @@ abstract class Uploader {
protected final Endpoint endpoint
protected ByteBuffer mapped
private long lastSpeedRead
protected int dataSinceLastRead
protected final AtomicInteger dataSinceLastRead = new AtomicInteger()
private final ArrayList<Integer> speedArr = [0,0,0,0,0]
private int speedPos, speedAvg
Uploader(Endpoint endpoint) {
this.endpoint = endpoint
}
@ -52,33 +49,7 @@ abstract class Uploader {
abstract boolean isFeedEnabled();
abstract boolean isChatEnabled();
synchronized int speed() {
final long now = System.currentTimeMillis()
long interval = Math.max(1000, now - lastSpeedRead)
lastSpeedRead = now;
int currSpeed = (int) (dataSinceLastRead * 1000.0d / interval)
dataSinceLastRead = 0
// normalize to speedArr.size
currSpeed /= speedArr.size()
// compute new speedAvg and update speedArr
if ( speedArr[speedPos] > speedAvg ) {
speedAvg = 0
} else {
speedAvg -= speedArr[speedPos]
}
speedAvg += currSpeed
speedArr[speedPos] = currSpeed
// this might be necessary due to rounding errors
if (speedAvg < 0)
speedAvg = 0
// rolling index over the speedArr
speedPos++
if (speedPos >= speedArr.size())
speedPos=0
speedAvg
int dataSinceLastRead() {
dataSinceLastRead.getAndSet(0)
}
}

View File

@ -441,11 +441,9 @@ class MainFrameModel {
return
}
}
if (wrapper != null) {
wrapper.uploader = e.uploader
wrapper.requests++
wrapper.finished = false
} else
if (wrapper != null)
wrapper.updateUploader(e.uploader)
else
uploads << new UploaderWrapper(uploader : e.uploader)
updateTablePreservingSelection("uploads-table")
view.refreshSharedFiles()
@ -678,6 +676,37 @@ class MainFrameModel {
Uploader uploader
int requests
boolean finished
private int[] speedArray = []
private long lastSpeedRead = System.currentTimeMillis()
private int speedPos
public int speed() {
if (speedArray.length != core.muOptions.speedSmoothSeconds) {
speedArray = new int[core.muOptions.speedSmoothSeconds]
speedPos = 0
}
final long now = System.currentTimeMillis()
if (now < lastSpeedRead + 50)
return speedArray.average()
int read = uploader.dataSinceLastRead()
int speed = (int) (1000.0d * read / (now - lastSpeedRead))
lastSpeedRead = now
speedArray[speedPos++] = speed
if (speedPos == speedArray.length)
speedPos = 0
speedArray.average()
}
void updateUploader(Uploader uploader) {
this.uploader = uploader
requests++
finished = false
}
}
void onFeedLoadedEvent(FeedLoadedEvent e) {

View File

@ -385,7 +385,7 @@ class MainFrameView {
"${totalSize} ($done/$pieces".toString() + trans("PIECES_SHORT")+ ")"
})
closureColumn(header : trans("SPEED"), type : String, read : { row ->
int speed = row.uploader.speed()
int speed = row.speed()
DataHelper.formatSize2Decimal(speed, false) + trans("B_SEC")
})
}