Uploaded image for project: 'JGroups'
  1. JGroups
  2. JGRP-809 Copyless stack
  3. JGRP-815

Scatter/Gather to avoid copying

XMLWordPrintable

    • Icon: Sub-task Sub-task
    • Resolution: Duplicate
    • Icon: Major Major
    • 5.0.0.Alpha5
    • None
    • None

      When we invoke Channel.send(), we pass a bufffer to JGroups. At the transport level, JGroups marshals the sender and destination address, plus all headers and the buffer into a new byte[] buffer, which is then passed to the socket (DatagramSocket, MulticastSocket, Socket).

      We cannot do gathering writes on a DatagramSocket because DatagramSocket doesn't expose this functionality, contrary to a DatagramChannel.

      We could avoid having to copy the user's buffer by using gathering writes: effectively passing to the socket NIO ByteBuffers containing:
      1: Src and dest address plus flags, plus possibly size
      2: The marshalled headers
      3: The buffer passed to JGroups by the user

      We can obtain a gathering-write channel as follows:

      ByteBuffer[] buffers; // contains the 3 byte buffers above
      DatagramSocket sock;
      DatagramChannel ch=sock.getChannel();
      ch.write(buffers, 0, length); // length is the number of bytes of the total marshalled message

      This is supported by a GatheringByteChannel.

      I don't think there's currently a need to do scattered reads, but this needs to get investigated more. Also investigate whether MulticastSockets support gathering writes (whether they expose the correct DatagramChannel).

        1. bla9.java
          2 kB
        2. bla10.java
          1 kB

              rhn-engineering-bban Bela Ban
              rhn-engineering-bban Bela Ban
              Votes:
              3 Vote for this issue
              Watchers:
              4 Start watching this issue

                Created:
                Updated:
                Resolved: