schamel23_at_spinor.com wrote on Sat, Dec 24, 2011 at 09:46:41 +0100:
> On 2011-12-23 23:52, Branko Čibej wrote:
> >On 23.12.2011 18:49, Stefan Küng wrote:
> >>On 23.12.2011 15:18, Stefan Sperling wrote:
> >>>On Fri, Dec 23, 2011 at 04:10:07PM +0200, Daniel Shahaf wrote:
> >>>>On Fri, Dec 23, 2011, at 14:50, Stefan Sperling wrote:
> >>>>>On Fri, Dec 23, 2011 at 02:26:40PM +0200, Daniel Shahaf wrote:
> >>>>>>On Fri, Dec 23, 2011, at 13:01, Stefan Sperling wrote:
> >>>>>>>On Fri, Dec 23, 2011 at 01:48:18PM +0200, Daniel Shahaf wrote:
> >>>>>>>>stsp_at_apache.org wrote on Fri, Dec 23, 2011 at 00:35:16 -0000:
> >>>>>>>>>+ An informative error message helps people more than an
> >>>>>>>>>assert (which
> >>>>>>>>>+ in case of TSVN can mean crashing the Windows Explorer).
> >>>>>>>>
> >>>>>>>>I thought the svn_error_malfunction_handler_t stuff addressed
> >>>>>>>>that issue?
> >>>>>>>
> >>>>>>>No, because TSVN didn't end up using it as intended.
> >>>>>>>See bottom of http://svn.haxx.se/users/archive-2011-10/0378.shtml
> >>>>>>
> >>>>>>I don't see how that's relevant? That link discusses the error
> >>>>>>dialogs.
> >>>>>>What I'm asking is whether TSVN has implemented an
> >>>>>>svn_error_malfunction_handler_t that replaces the default handler,
> >>>>>>svn_error_abort_on_malfunction().
> >>>>>
> >>>>>Yes it does (called svn_error_handle_malfunction()) but it calls
> >>>>>abort()
> >>>>>which means the explorer crashes:
> >>>>>http://tortoisesvn.googlecode.com/svn/trunk/src/SVN/SVN.cpp
> >>>>
> >>>>And they can't remove the abort() call because...?
> >>>
> >>>As Stefan explained, he cannot rely on the internal state of the
> >>>application if he gets an assertion thrown out of the svn libraries.
> >>>
> >>>And he has a point. He assumes that asserts are fatal and
> >>>non-recoverable
> >>>errors. What if Subversion asserts because it just trashed the entire
> >>>stack and heap space of the windows explorer and happens to operate on
> >>>garbaga data that triggers an assertion? It doesn't make any sense to
> >>>try
> >>>to continue.
> >>>
> >>>Now, we know that most of our assertions are due to bugs in our code
> >>>where, for instance, invalid data entered wc.db. But an application
> >>>using the svn libraries cannot safely rely on this knowledge.
> >>>Changing all these bogus asserts that trigger just because of invalid
> >>>working copy meta-data into proper errors is the right way to fix this.
> >>
> >>I think I have to explain something here:
> >>First, the shell extension of TSVN does not even call
> >>svn_error_set_malfunction_handler() to set its own handler. Since that
> >>function clearly states that "This function must be called in a
> >>single-threaded context", I can not initialize that in the shell
> >>extension since the extension can get loaded in multi threaded
> >>situations.
> >>And the default handler asserts and calls abort(). So the whole shell
> >>goes down in such situations.
> >>
> >>Then: the reason I call abort() in my own handler for TortoiseProc
> >>(the UI part of TSVN) is that the SVN also clearly state that "If
> >>can_return is false the method should never return. (The caller will
> >>call abort())".
> >>So what else than call abort() can I do? I can not return from that
> >>function if can_return is false. No way to exit but to call abort().
> >>So how is that "not implemented as intended"???
> >>At least now in the UI part I can show a nasty dialog box telling the
> >>users where to report the problem to. That way it's not me that gets
> >>bothered with these since I can't do anything about them anyway.
> >>
> >>I have _repeatedly_ mentioned on this list that this kind of "error
> >>handling" (quotes intended) is bad. Sure, it won't affect the CL
> >>client that much, but for a library that's just not acceptable.
> >>But others have similar error handling implemented:
> >>http://thedailywtf.com/Articles/Serious-Failure.aspx
> >
> >Ranting is all very well, but I've yet to hear a suggestion from you
> >about how the libraries should handle unrecoverable errors. Like, for
> >example, the case where wc.db contains inconsistent and/or invalid data.
>
> Simple answer:
> Return an normal error, giving the caller (e.g. TSVN shell extension)
> the chance for example to continue its work on other working copies.
> But definitely never just abort or assert (crash the Windows explorer).
>
How is calling svn_error_malfunction_handler_t(can_return=TRUE) not such
a mechanism?
When can_return=FALSE then the library itself abort()s if the callback
does return... but when can_return=TRUE, the library is supposed to
propagate the error all the way up[1]
[1] though, in practice, we may have places that do
if (err && err->apr_err == FOO)
/* .. */
else
svn_error_clear(err);
which would mask assertions. Perhaps we should make it a fatal error to
call svn_error_clear() on an error if SVN_ERROR_IN_CATEGORY(SVN_ERR_MALFUNC_CATEGORY_START) ?
> So there must be never "unrecoverable errors".
> There may be some unrecoverable data (e.g. a broken db/WC),
> but the caller must be able to continue work on other data
> (e.g. another WC).
>
+1
> Cheers,
> Folkr
Received on 2011-12-24 11:14:05 CET