Re: Getting DB error = 20017 - Unexpected EOF from the server

"James K. Lowden" <[email protected]>
Newsgroups gmane.comp.db.tds.freetds
Message-ID <[email protected]>
Frediano Ziglio wrote:
> http://h71000.www7.hp.com/doc/82final/6529/6529pro_030.html

(nice resource!) 

http://www.opengroup.org/onlinepubs/000095399/functions/send.html
http://www.opengroup.org/onlinepubs/000095399/functions/write.html

"[For] a socket, write() shall be equivalent to send() with no flags set."

> The problem is that in some situations
> tds_select can return even if data are not pending (or not possible to
> write) and catching these errors keep looping.

What situations?  

I can't see a *standard* way for the code to fail in the way it did. 

http://h71000.www7.hp.com/doc/82final/6529/6529pro_020.html#r_send

But then there are always nonstandard, undocumented ways.  Sigh.   

I agree with your analysis, but not DEC's implementation!  EINPROGRESS is
not just a nonstandard return from write(2), it's nonsensical.  We already
already know select(2) gave us the green light.  EAGAIN or EWOULDBLOCK
will nevertheless tell us if *nothing* can be written.  *Partial* success
is not an error, whether or not O_NONBLOCK is set.  Who needs yet another
alias for "can't write to nonblocking socket"?  

That said, the list of error conditions is quite long and the code a bit
simplistic.  I wonder why we haven't bumped into this before.  Here's the
union of possible error conditions and how I think they should be treated:
 

Error: 
 erc          vendors      description                             
 ------------ ------------ ----------------------------------------
 EACCES       posix        The calling process does not have the ap
 EBADF        posix vms    The socket argument is not a valid file 
 ECONNRESET   posix vms    A connection was forcibly closed by a pe
 EDESTADDRREQ posix vms    The socket is not connection-mode and no
 EFAULT             vms     The message argument is not in a readab
 EIO          posix        An I/O error occurred while reading from
 EMSGSIZE     posix vms    The message is too large to be sent all 
 ENOBUFS      posix vms    Insufficient resources were available in
 ENOTCONN     posix vms    The socket is not connected or otherwise
 ENOTSOCK     posix vms    The socket argument does not refer to a 
 EOPNOTSUPP   posix vms    The socket argument is associated with a
 EPIPE        posix        The socket is shut down for writing, or 
Retry: 
 EAGAIN       posix        The socket's file descriptor is marked O
 EINPROGRESS        vms    (undocumented)
 EINTR        posix vms    A signal interrupted send() before any d
 ENETDOWN     posix vms    The local network interface used to reac
 ENETUNREACH  posix vms    No route to the network is present.     
 EWOULDBLOCK  posix vms    The socket's file descriptor is marked O

Yes, generic network failures should be subject to timeouts, not
automatically fail.  No reason not to wait for a router to reboot.  

--jkl
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.