Send browse results to UI in batches. Github issue #49

pull/53/head
Zlatin Balevsky 2020-10-10 16:18:50 +01:00
parent 9acb49c22a
commit 9e3a9e2737
No known key found for this signature in database
GPG Key ID: A72832072D525E41
4 changed files with 33 additions and 9 deletions

View File

@ -19,6 +19,8 @@ import java.util.zip.GZIPInputStream
@Log @Log
class BrowseManager { class BrowseManager {
private static final int BATCH_SIZE = 32
private final I2PConnector connector private final I2PConnector connector
private final EventBus eventBus private final EventBus eventBus
private final Persona me private final Persona me
@ -58,19 +60,34 @@ class BrowseManager {
boolean chat = headers.containsKey("Chat") && Boolean.parseBoolean(headers['Chat']) boolean chat = headers.containsKey("Chat") && Boolean.parseBoolean(headers['Chat'])
// at this stage, start pulling the results // at this stage, start pulling the results
eventBus.publish(new BrowseStatusEvent(host: e.host, status : BrowseStatus.FETCHING, totalResults : results)) UUID uuid = UUID.randomUUID()
eventBus.publish(new BrowseStatusEvent(host: e.host, status : BrowseStatus.FETCHING,
totalResults : results, uuid : uuid))
log.info("Starting to fetch $results results with uuid $uuid")
JsonSlurper slurper = new JsonSlurper() JsonSlurper slurper = new JsonSlurper()
DataInputStream dis = new DataInputStream(new GZIPInputStream(is)) DataInputStream dis = new DataInputStream(new GZIPInputStream(is))
UUID uuid = UUID.randomUUID() UIResultEvent[] batch = new UIResultEvent[Math.min(BATCH_SIZE, results)]
int j = 0
for (int i = 0; i < results; i++) { for (int i = 0; i < results; i++) {
log.fine("parsing result $i at batch position $j")
int size = dis.readUnsignedShort() int size = dis.readUnsignedShort()
byte [] tmp = new byte[size] byte [] tmp = new byte[size]
dis.readFully(tmp) dis.readFully(tmp)
def json = slurper.parse(tmp) def json = slurper.parse(tmp)
UIResultEvent result = ResultsParser.parse(e.host, uuid, json) UIResultEvent result = ResultsParser.parse(e.host, uuid, json)
result.chat = chat result.chat = chat
eventBus.publish(result) batch[j++] = result
// publish piecemally
if (j == batch.length) {
eventBus.publish(new UIResultBatchEvent(results : batch, uuid : uuid))
j = 0
batch = new UIResultEvent[Math.min(results - i - 1, BATCH_SIZE)]
log.fine("publishing batch, next batch size ${batch.length}")
}
} }
eventBus.publish(new BrowseStatusEvent(host: e.host, status : BrowseStatus.FINISHED)) eventBus.publish(new BrowseStatusEvent(host: e.host, status : BrowseStatus.FINISHED))

View File

@ -7,4 +7,5 @@ class BrowseStatusEvent extends Event {
Persona host Persona host
BrowseStatus status BrowseStatus status
int totalResults int totalResults
UUID uuid
} }

View File

@ -14,6 +14,7 @@ import com.muwire.core.download.UIDownloadEvent
import com.muwire.core.search.BrowseStatus import com.muwire.core.search.BrowseStatus
import com.muwire.core.search.BrowseStatusEvent import com.muwire.core.search.BrowseStatusEvent
import com.muwire.core.search.UIBrowseEvent import com.muwire.core.search.UIBrowseEvent
import com.muwire.core.search.UIResultBatchEvent
import com.muwire.core.search.UIResultEvent import com.muwire.core.search.UIResultEvent
@ArtifactProviderFor(GriffonController) @ArtifactProviderFor(GriffonController)
@ -28,27 +29,31 @@ class BrowseController {
void register() { void register() {
core.eventBus.register(BrowseStatusEvent.class, this) core.eventBus.register(BrowseStatusEvent.class, this)
core.eventBus.register(UIResultEvent.class, this) core.eventBus.register(UIResultBatchEvent.class, this)
core.eventBus.publish(new UIBrowseEvent(host : model.host)) core.eventBus.publish(new UIBrowseEvent(host : model.host))
} }
void mvcGroupDestroy() { void mvcGroupDestroy() {
core.eventBus.unregister(BrowseStatusEvent.class, this) core.eventBus.unregister(BrowseStatusEvent.class, this)
core.eventBus.unregister(UIResultEvent.class, this) core.eventBus.unregister(UIResultBatchEvent.class, this)
} }
void onBrowseStatusEvent(BrowseStatusEvent e) { void onBrowseStatusEvent(BrowseStatusEvent e) {
runInsideUIAsync { runInsideUIAsync {
model.status = e.status model.status = e.status
if (e.status == BrowseStatus.FETCHING) if (e.status == BrowseStatus.FETCHING) {
model.totalResults = e.totalResults model.totalResults = e.totalResults
model.uuid = e.uuid
}
} }
} }
void onUIResultEvent(UIResultEvent e) { void onUIResultBatchEvent(UIResultBatchEvent e) {
runInsideUIAsync { runInsideUIAsync {
model.chatActionEnabled = e.chat if (e.uuid != model.uuid)
model.results << e return
model.chatActionEnabled = e.results[0].chat
model.results.addAll(e.results.toList())
model.resultCount = model.results.size() model.resultCount = model.results.size()
view.resultsTable.model.fireTableDataChanged() view.resultsTable.model.fireTableDataChanged()
} }

View File

@ -18,6 +18,7 @@ class BrowseModel {
@Observable boolean chatActionEnabled @Observable boolean chatActionEnabled
@Observable int totalResults @Observable int totalResults
@Observable int resultCount @Observable int resultCount
UUID uuid
def results = [] def results = []
} }