Uploaded image for project: 'JGroups'
  1. JGroups
  2. JGRP-1961

TCP_NIO2: message bundling can lead to corruption of msgs sent asynchronously

    Details

    • Type: Bug
    • Status: Resolved (View Workflow)
    • Priority: Critical
    • Resolution: Done
    • Affects Version/s: 3.6.5
    • Fix Version/s: 3.6.6
    • Labels:
      None

      Description

      When a message is sent with a message bundler (in TP), the output buffer in TP.BaseBundler is reused for all messages of a given bundle (say m1 and m2).
      This works for TCP and UDP because a write blocks and - when it returns - we're guaranteed that the buffer has been copied into an OS buffer (TCP's send window).
      However, this is different with TCP_NIO2: an async write always returns immediately, irrespective of whether the data was written completely, partially, or not at all !
      If a write only writes a part of its data, on returning from the write, the message bundler reuses the output buffer and can thus overwrite and corrupt buffers that are in transit, waiting to be written.
      A quick check where buffers were copied fixed the problem.
      TODO: see where we need to copy data when using a bundler. Possibly only copy if a write didn't write all of the data.

        Gliffy Diagrams

          Attachments

            Activity

              People

              • Assignee:
                belaban Bela Ban
                Reporter:
                belaban Bela Ban
              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: