I am sponsoring this fast-track request for Vasumathi Sundaram.  The
timer is set to 01/02/2009 in light of the coming holidays.  Please
speak up if you need more time than that.

In an offline discussion, the project team went to lengths to find any
sendfilev users, and determine whether the proposed change in
semantics would affect any application.  There are just a few known
users of sendfilev, and none of them do file-to-file transfers, so no
problems are known or expected.

It's an incompatible change to a Committed interface and we wish to
assert Patch/Micro release binding, but the project team contends (and
I agree) that (a) the original interface as specified has unresolvable
defects that could lead to serious system stability problems, (b) we
can't just remove the sendfilev interface because there are consumers,
and (c) it appears unlikely that anyone ever used the functionality
affected by this change as described.


1. Problem

  sendfilev(3EXT) and sendfile(2) support transferring data from a
  regular file to another regular file, in addition to being able to
  transfer to a socket.  The current man page states that the
  semantics of this function is analogous to writev(2), except that
  sendfilev can read from data buffers or file descriptors.

  Supporting this semantic, however, leads to unavoidable deadlock and
  performance issues.

2. Solution

  sendfilev is modified so that the output behavior is not the same as
  writev() and when multiple threads attempt to write to the same
  output file at the same time.  Instead, the result of the combined
  operations is undefined.  The applications that use sendfilev() will
  have to use their own synchronization mechanism to ensure a
  consistent output.

3. Man page update

  The following change will be made to the man page of sendfilev(3EXT).

--- sendfilev.old       Thu Dec 18 15:41:16 2008
+++ sendfilev.new       Thu Dec 18 15:45:40 2008
@@ -44,12 +44,6 @@
     open for writing.


-     This function is analogous to the writev() system call.  See
-     writev(2).  Instead  of sending out chunks of data, however,
-     the sendfilev() function  can  read  input  data  from  data
-     buffers or file descriptors.
+     This function is analogous to the writev(2) system call, but can
+     read from both buffers and file descriptors.  Unlike writev(),
+     it does not provide protection against multiple writers on a
+     single stream or file.  Applications must use their own
+     synchronization mechanisms if such a situation is possible.

      The following is the sendfilevec structure:

       typedef struct sendfilevec {

-- 
James Carlson, Solaris Networking              <james.d.carlson at sun.com>
Sun Microsystems / 35 Network Drive        71.232W   Vox +1 781 442 2084
MS UBUR02-212 / Burlington MA 01803-2757   42.496N   Fax +1 781 442 1677

Reply via email to