Am 05.11.21 um 14:03 schrieb Fabian Grünbichler:
for proxied requests, we usually tear down the proxy connection
immediately when closing the source connection. this is not the correct
course of action for bulk one-way data streams that are proxied, where
the source connection might be closed, but the proxy connection might
still have data in the write buffer that needs to be written out.

push_shutdown already handles this case (closing the socket/FH after it
has been fully drained).

one example for such a proxied data stream is the 'migrate' data for a
remote migration, which gets proxied over a websocket connection.
terminating the proxied connection early makes the target VM crash for
obvious reasons.

Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com>
---
  src/PVE/APIServer/AnyEvent.pm | 10 ++++++----
  1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/src/PVE/APIServer/AnyEvent.pm b/src/PVE/APIServer/AnyEvent.pm
index 86d0e2e..ecf771f 100644
--- a/src/PVE/APIServer/AnyEvent.pm
+++ b/src/PVE/APIServer/AnyEvent.pm
@@ -144,7 +144,8 @@ sub client_do_disconnect {
      };
if (my $proxyhdl = delete $reqstate->{proxyhdl}) {
-       &$shutdown_hdl($proxyhdl);
+       &$shutdown_hdl($proxyhdl)
+               if !$proxyhdl->{block_disconnect};

Style nit: fits in one line ;)

I'm not familiar with the code, so I'll just ask: can this be reached without going through the code below first, i.e. can it happen that block_disconnect is not set, but length $proxyhdl->{wbuf} > 0? Or is it not important in other cases (if there are any)?

      }
my $hdl = delete $reqstate->{hdl};
@@ -627,9 +628,10 @@ sub websocket_proxy {
                    } elsif ($opcode == 8) {
                        my $statuscode = unpack ("n", $payload);
                        $self->dprint("websocket received close. status code: 
'$statuscode'");
-                       if ($reqstate->{proxyhdl}) {
-                           $reqstate->{proxyhdl}->push_shutdown();
-                       }
+                       if (my $proxyhdl = $reqstate->{proxyhdl}) {
+                           $proxyhdl->{block_disconnect} = 1 if length 
$proxyhdl->{wbuf} > 0;
+                           $proxyhdl->push_shutdown();
+                       }
                        $hdl->push_shutdown();
                    } elsif ($opcode == 9) {
                        # ping received, schedule pong



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to