[ https://issues.apache.org/jira/browse/PROTON-708?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Rafael H. Schloming resolved PROTON-708. ---------------------------------------- Resolution: Fixed Fix Version/s: 0.8 > C proton driver needs a getter function to access the pn_error so it can be > cleared > ----------------------------------------------------------------------------------- > > Key: PROTON-708 > URL: https://issues.apache.org/jira/browse/PROTON-708 > Project: Qpid Proton > Issue Type: Bug > Components: proton-c > Affects Versions: 0.7 > Reporter: Jesse Fugitt > Assignee: Rafael H. Schloming > Fix For: 0.8 > > > 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 > that were also sent to the mailing list but the solution is probably a pretty > easy fix that just involves adding a function to the driver that simply > returns its pn_error_t field. > 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; > On the mailing list, Rafael said his preference would be to expose the > driver's pn_error_t as the other modules do so it can be cleared rather than > auto-clearing it as we do in the sample patch above. However, the > pn_driver_error function already exists so either we need to break convention > with the other modules in terms of the function name or break compatibility. -- This message was sent by Atlassian JIRA (v6.3.4#6332)