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

Reply via email to