Patchwork D2463: wireprotoserver: support logging SSH server I/O to a file descriptor

login
register
mail settings
Submitter phabricator
Date Feb. 26, 2018, 9:17 p.m.
Message ID <differential-rev-PHID-DREV-mj2y6qghskugntulnwq5-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/28422/
State Superseded
Headers show

Comments

phabricator - Feb. 26, 2018, 9:17 p.m.
indygreg created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  We will soon introduce a debug command and tests for low-level I/O
  behavior of the SSH wire protocol.
  
  To facilitate this, we need to instrument the SSH server so it
  can log its I/O as events occur.
  
  We teach the SSH server to convert its stdout and stderr file objects
  into file object proxies. We configure these proxies to log to a
  file descriptor whose file number is specified via a config option.
  The idea is to have a future debug command start the SSH server
  process with access to an extra file descriptor that can be used
  by the server process to log I/O. Monitoring only the write I/O
  will be more robust than monitoring both writes and reads from the
  client process because read operations are not deterministic. This
  will matter for tests that capture raw I/O activity.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D2463

AFFECTED FILES
  mercurial/wireprotoserver.py

CHANGE DETAILS




To: indygreg, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/mercurial/wireprotoserver.py b/mercurial/wireprotoserver.py
--- a/mercurial/wireprotoserver.py
+++ b/mercurial/wireprotoserver.py
@@ -7,6 +7,7 @@ 
 from __future__ import absolute_import
 
 import contextlib
+import os
 import struct
 import sys
 import threading
@@ -588,12 +589,19 @@ 
                                          state)
 
 class sshserver(object):
-    def __init__(self, ui, repo):
+    def __init__(self, ui, repo, logfh=None):
         self._ui = ui
         self._repo = repo
         self._fin = ui.fin
         self._fout = ui.fout
 
+        # Log write I/O to stdout and stderr if configured.
+        if logfh:
+            self._fout = util.makeloggingfileobject(
+                logfh, self._fout, 'o', logdata=True)
+            ui.ferr = util.makeloggingfileobject(
+                logfh, ui.ferr, 'e', logdata=True)
+
         hook.redirect(True)
         ui.fout = repo.ui.fout = ui.ferr