Uploaded image for project: 'tools.nrepl'
  1. NREPL-21

Sometimes *err*/*out*/value messages are surprisingly ordered

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Minor
    • Resolution: Completed
    • Affects versions: None
    • Fix versions: None
    • Labels:
      None
    • Patch:
      Code

      Description

      As described here: https://github.com/technomancy/leiningen/issues/631, the *out*, *err*, and value printing are ordered differently than expected sometimes.

      There are 2 things left here:
      (1) The return value can sometimes print before synchronous prints to err/out. Synchronizing all the printing on the REPLy side doesn't seem to help. An example case:

       
      => (do (.print *err* "one") (print "two") (print "three"))
      niltwothreeone
      

      (2) Calling .println() on the *out*/*err* streams doesn't necessarily flush the stream. Changing this may have performance/network ramifications, but generally it seems like surprising behavior. An example case:

       
      user=> (do (.println *out* "one") (.print *err* "two") (.print *err* "three") 1)
      twothreeone
      1
      

      I'd expect two .print() calls to different streams to have undefined ordering, but the other orderings were all surprising.

      The attached patch forces flushes to avoid both of these, for (1) immediately before sending the value message, and for (2) on the "normal" PrintStream [autoFlush] cases of println, printf, or format.

      Side note: I couldn't get any tests to fail in this scenario, even after doing some reworking of the streams used in tests, but I kept one new test in this patch anyway. Turns out it's hard to write tests that really make sure .flush() gets called.

        Attachments

          Activity

            People

            • Assignee:
              cemerick Chas Emerick
              Reporter:
              trptcolin Colin Jones
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: