loleaflet/js/global.js | 69 +++++++++++++++++++------------------------------ 1 file changed, 27 insertions(+), 42 deletions(-)
New commits: commit 6ba706662739cc9ef029c13aef86d894ff371a37 Author: Michael Meeks <michael.me...@collabora.com> AuthorDate: Wed May 13 17:21:07 2020 +0100 Commit: Michael Meeks <michael.me...@collabora.com> CommitDate: Wed May 13 19:48:31 2020 +0200 Proxy: significantly simplify proxy socket. This avoids needing long-term wait sockets which consume server-side resources & can block other requests. Change-Id: I0909f49e16c5ce2315b9980cdf34fa4e370e3abc Reviewed-on: https://gerrit.libreoffice.org/c/online/+/94150 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoff...@gmail.com> Reviewed-by: Michael Meeks <michael.me...@collabora.com> diff --git a/loleaflet/js/global.js b/loleaflet/js/global.js index f0556a5fb..279f2b7c9 100644 --- a/loleaflet/js/global.js +++ b/loleaflet/js/global.js @@ -220,7 +220,7 @@ this.sessionId = 'open'; this.id = window.proxySocketCounter++; this.sendCounter = 0; - this.readWaiting = 0; + this.msgInflight = 0; this.inSerial = 0; this.outSerial = 0; this.onclose = function() { @@ -295,26 +295,34 @@ } }; this.sendQueue = ''; - this.sendTimeout = undefined; this.doSend = function () { - console.debug('send msg "' + that.sendQueue + '"'); - var req = new XMLHttpRequest(); - req.open('POST', that.getEndPoint('write')); if (that.sessionId === 'open') + { console.debug('new session not completed'); - else + return; + } + if (that.msgInflight >= 4) // something went badly wrong. { - req.responseType = 'arraybuffer'; - req.addEventListener('load', function() { - if (this.status == 200) - that.parseIncomingArray(new Uint8Array(this.response)); - else - console.debug('proxy: error on incoming response'); - }); + console.debug('High latency connection - too much in-flight, pausing'); + return; } + console.debug('send msg - ' + that.msgInflight + ' on session ' + + that.sessionId + ' queue: "' + that.sendQueue + '"'); + var req = new XMLHttpRequest(); + req.open('POST', that.getEndPoint('write')); + req.responseType = 'arraybuffer'; + req.addEventListener('load', function() { + if (this.status == 200) + that.parseIncomingArray(new Uint8Array(this.response)); + else + console.debug('proxy: error on incoming response'); + }); + req.addEventListener('loadend', function() { + that.msgInflight--; + }); req.send(that.sendQueue); that.sendQueue = ''; - that.sendTimeout = undefined; + that.msgInflight++; }; this.getSessionId = function() { var req = new XMLHttpRequest(); @@ -343,8 +351,6 @@ 'B0x' + this.outSerial.toString(16) + '\n' + '0x' + msg.length.toString(16) + '\n' + msg + '\n'); this.outSerial++; - if (this.sessionId !== 'open' && this.sendTimeout === undefined) - this.sendTimeout = setTimeout(this.doSend, 2 /* ms */); }; this.sendCloseMsg = function(beacon) { var url = that.getEndPoint('close'); @@ -378,32 +384,11 @@ // queue fetch of session id. this.getSessionId(); - // horrors ... - this.waitConnect = function() { - console.debug('proxy: waiting - ' + that.readWaiting + ' on session ' + that.sessionId); - if (that.readWaiting >= 4) // max 4 waiting connections concurrently. - return; - if (that.sessionId == 'open') - return; // waiting for our session id. - var req = new XMLHttpRequest(); - // fetch session id: - req.addEventListener('load', function() { - if (this.status == 200) - that.parseIncomingArray(new Uint8Array(this.response)); - else - console.debug('Handle error ' + this.status); - }); - req.addEventListener('loadend', function() { - that.readWaiting--; - console.debug('proxy: wait ended, re-issue'); - that.waitConnect(); - }); - req.open('GET', that.getEndPoint('wait')); - req.responseType = 'arraybuffer'; - req.send(''); - that.readWaiting++; - }; - this.waitInterval = setInterval(this.waitConnect, 250); + // For those who think that long-running sockets are a + // better way to wait: you're so right. However, each + // consumes a scarce server worker thread while it waits, + // so ... back in the real world: + this.pollInterval = setInterval(this.doSend, 25); }; if (global.socketProxy) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits