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