Our team is currently using Proton 0.7 and ran into an issue on Windows while 
testing where we could not successfully reconnect to a broker once it was taken 
down and brought back up (we are using a pn_driver_t in C).  It appears that 
having the ability to clear the pn_error_t stored in the driver struct would 
have solved the issue for us.  I'll include some of the details below but 
before proceeding further, we wanted to know if there were any other 
workarounds we were missing or should we open a JIRA to allow access to the 
pn_error_t in the driver so we can clear it (or have it cleared automatically 
when it is accessed).  Also, we saw there were some changes going in for 0.8 
related to the posix and windows driver code but haven't looked at that in 
depth yet.  Would any of those changes help us with needing to clear the error 
in the driver?

Details
The Proton library's Driver Module (both Posix and Windows) does not supply a 
mechanism to clear an error that was detected. In contrast, other modules such 
as Connection supply a method to obtain the pn_error_t structure (see 
pn_connection_error()). This method can be used in combination with 
pn_error_clear() to clear an error.

It was observed that when establishing a connection from Windows to a potential 
broker on Linux that a WSAECONNREFUSED can be returned from the connect() call 
if the broker is not running. This results in a call to select() with a -1 file 
descriptor. The select() returns a socket error which is recorded in the Error 
Module. The error number can be obtained using the pn_driver_errno() call. 
Deleting the Connection and therefore removing the erroneous -1 file 
description results in subsequent successful select() calls. However, querying 
the Driver module for an error will perpetually return the last error. There is 
no mechanism to clear that error.


A small patch to the driver.c below is working for us currently but we wanted 
input on what the best or more general solution to the problem should be:
<   return d ? pn_error_code(d->error) : PN_ARG_ERR;
---
>             int rtn = PN_ARG_ERR;
>             if (d) {
>                             rtn = pn_error_code(d->error);
>                             pn_error_clear(d->error);
>             }
>             return rtn;


Should we open a JIRA on this?

Thanks,
Jesse

Reply via email to