Hi Phil,

Starting a new mailing thread is a good idea at this point. I'll just
mention: I really do not want to roll back code changes in master. If you
want to pick a commit in the past and create a branch 2.x from that, it's
fine with me, or tell me, and I'll be happy to create the branch. Then I
can switch master to 3.0.

Gary


On Mon, Jul 3, 2023, 11:31 Phil Steitz <phil.ste...@gmail.com> wrote:

> On Mon, Jul 3, 2023 at 6:41 AM Gary Gregory <garydgreg...@gmail.com>
> wrote:
>
> > On Thu, Jun 29, 2023 at 5:08 PM Phil Steitz <phil.ste...@gmail.com>
> wrote:
> > >
> > > On Thu, Jun 29, 2023 at 11:39 AM Gary Gregory <garydgreg...@gmail.com>
> > > wrote:
> > >
> > > > Great presentation in the video Elliotte. Thanks for sharing the
> link.
> > > >
> > >
> > > +1 many thanks.
> > >
> > > Now back to our hero.  Let me pretend to be one of the people in the
> > > audience of the video.
> > >
> > > We have this library that is used by all kinds of "programs" [1] and we
> > are
> > > not sure how best to a) type our own exceptions (the ones we generate)
> > and
> > > b) propagate the ones generated by user-supplied object factories.
> > Broadly
> > > speaking, we have four kinds of exceptions to deal with:
> > >
> > > 0) User-supplied object factories that the pool uses to perform pooled
> > > object lifecycle operations may throw checked or unchecked exceptions.
> > > Many of these will be the classic variety you mention in the video -
> > > database is dead, etc when the factory is trying to open a physical
> > > connection.  The smelly "throws Exception" in place now lets us just
> pass
> > > these all up the stack, but essentially untyped.
> > > 1) Pool clients want to do something, but the pool can't do it without
> > > violating one of its invariants (most common is a client wants to
> borrow
> > an
> > > object and, after waiting the configured interval, there is no capacity
> > to
> > > serve).  We are inconsistent here.  In the out of capacity case, we
> throw
> > > NoSuchElementException (probably bogus according to your taxonomy), but
> > in
> > > some cases - e.g. addObject - we silently no-op.
> > > 2) An API is abused (e.g. return an object that did not come from the
> > pool
> > > or try to start borrowing objects before providing a factory)
> > > 3) Something happens that should not be possible (indicating some kind
> of
> > > concurrency bug in [pool] itself or unanticipated craziness from a
> > factory
> > > or client code)
> > >
> > > There is a lot of complexity in the 0)-1) cases because some failures
> are
> > > more important to both the pool and clients than others (for example,
> > > factory exceptions thrown in object validation or destruction are
> > different
> > > from those thrown in object creation).
> > >
> > > If I understand your advice, it would be:
> > > 0) checked if that is what comes from the factory; just propagate
> > otherwise
> > > 1) checked?  Maybe actually no exception - handle via return values or
> > > somesuch?  By far the most common here is NoSuchElementException.  I
> > guess
> > > it's OK to see pool exhaustion as "environmental" [2], so probably
> > checked
> > > is actually right
> > > 2) unchecked
> > > 3) unchecked
> > >
> > > Assuming I got 0) right at least, the follow-up is how do we get the
> > right
> > > exceptions passed up the stack?  What Gary is proposing is adding a
> type
> > > parameter at the pool level.  Could be that is the best solution, but
> > that
> > > adds to complexity of the API and I keep wanting it to be defined at
> the
> > > factory level somehow and ideally have it default to something so users
> > who
> > > don't want to think about it (maybe because their factories only throw
> > > unchecked exceptions) don't have to think about it.
> > >
> > > I would be remiss not to add a closing (at this point probably
> annoying)
> > > comment to the effect that this should be a 3.0 discussion :)
> >
> > I am OK with all of this being for 3.0, which can be as soon as we want.
> >
>
> Thanks, Gary.  We should probably end this thread then and start a new one
> on 3.0 planning.  As a side note, I discovered that the failures reported
> to the console but not causing test failure that I saw were real, due to
> problems in GKOP reuseCapacity.  The OP test case for POOL-391 is
> demanding, but we should be able to handle it. It was not causing the test
> to fail because the runner does not see failures in spawned threads.  My
> bad not knowing that.  Once I set it up so the failures would fail the
> test, they did consistently.  I have been working on and off on this over
> the last week and I think I am close to a fix.  Once I have this, I think
> it would be good to roll a 2.12 without the compat break because there are
> quite a few bug fixes in the RC.  Would you be OK either rolling back the
> added type parameter change or moving it to a new 3.0 branch?  Or I guess
> alternatively, creating a 2.x branch without that change?   I can help with
> either of these.
>
> Phil
>
> >
> > Gary
> >
> > >
> > > Phil
> > >
> > > [1] It is hard for us to understand what is and is not in "our program"
> > as
> > > library developers.  Our code is always running inside someone else's
> > > program, often using yet another third party's code.  So for example,
> in
> > a
> > > common use case, [pool] is used by [dbcp] which is used by tomcat, with
> > > factories specified in a user webapp running in tomcat, wrapped into
> > [dbcp]
> > > and managed by [pool].
> > > [2] Though many/most actual cases of this in production code end up
> being
> > > the result of self-DOS due to programming errors.
> > >
> > > >
> > > > Gary
> > > >
> > > > On Thu, Jun 29, 2023, 10:33 Elliotte Rusty Harold <
> elh...@ibiblio.org>
> > > > wrote:
> > > >
> > > > > On Thu, Jun 29, 2023 at 10:10 AM Gilles Sadowski <
> > gillese...@gmail.com>
> > > > > wrote:
> > > > > >
> > > > > > Le jeu. 29 juin 2023 à 15:22, Elliotte Rusty Harold
> > > > > > <elh...@ibiblio.org> a écrit :
> > > > > > >
> > > > > > > On Thu, Jun 29, 2023 at 9:07 AM Gilles Sadowski <
> > > > gillese...@gmail.com>
> > > > > wrote:
> > > > > > > >
> > > > > > > > Hello.
> > > > > > > >
> > > > > > > > Le jeu. 29 juin 2023 à 14:44, Gary Gregory <
> > garydgreg...@gmail.com
> > > > >
> > > > > a écrit :
> > > > > > >
> > > > > > > > I agree with the second part assuming the *current* Java
> > > > > > > > best practices, not because of old APIs that are here to stay
> > > > > > > > only because of infinite backwards compatibility, and not
> > > > > > > > because they are deemed perfect.
> > > > > > >
> > > > > > >
> > > > > > > Best practices on this haven't changed since Java 1.0 (Possibly
> > Java
> > > > > > > 1.0 alpha 3 if I recall versions correctly).
> > > > > > >
> > > > > > > Checked exceptions: all errors arising from external input to
> the
> > > > > program.
> > > > > > > Runtime exceptions: program bugs
> > > > > >
> > > > > > A pile of arguments (tally is largely against *any* use of
> checked
> > > > > exceptions):
> > > > > >
> > > > >
> > > >
> >
> https://ohadshai.medium.com/its-almost-2020-and-yet-checked-exceptions-are-still-a-thing-bfaa24c8997e
> > > > >
> > > > > tldr; he's wrong. More details:
> > > > > https://www.youtube.com/watch?v=rJ-Ihh7RNao&t=419s
> > > > >
> > > > > > >
> > > > > > > I don't know which applies here, but 99% of the time this is
> all
> > you
> > > > > > > need to consider to figure out whether a checked or runtime
> > exception
> > > > > > > is called for. There are indeed a lot of old broken APIs that
> > don't
> > > > > > > follow these simple rules,
> > > > > >
> > > > > > The rules which you stated are far from simple because "external"
> > > > > > depends on the POV (more below).
> > > > > >
> > > > > > Commons components like [RNG], [Geometry], [Numbers], [Math]
> > > > > > only throw unchecked exceptions.
> > > > >
> > > > > Libraries you link to are not external to the program. Runtime
> > > > > exceptions might be appropriate here.
> > > > >
> > > > > > The only rule that ever made sense to me is from J. Bloch's
> > "Effective
> > > > > > Java":
> > > > > > ---CUT---
> > > > > > Use checked exceptions for recoverable conditions and runtime
> > > > > > exceptions for programming errors
> > > > > > ---CUT---
> > > > >
> > > > > This is about the only thing in that book where I disagree with
> > Bloch.
> > > > > At the very least this is not said as well as it needs to be.
> > > > > Recoverable vs unrecoverable distinguishes Errors from Exceptions,
> > not
> > > > > runtime exceptions from checked exceptions. You can interpret that
> > > > > sentence to mean "bugs are not recoverable short of fixing the
> code"
> > > > > in which case sure, runtime exceptions are not recoverable.
> > > > >
> > > > > > For example, *all* precondition failures are, from the POV of the
> > > > > > called function, a programming error (akin to NPE or IAE).
> > > > >
> > > > > This is correct. NPEs and IAEs are programming errors.
> > > > >
> > > > > > Whether the root cause is an "internal" or "external" error is
> > > > irrelevant
> > > > > > at the point where the issue is detected (where the runtime
> > exception
> > > > > > just conveys that "the call was inappropriate").
> > > > >
> > > > > It's not about the root cause. It's about the immediate cause.
> > Passing
> > > > > null or another illegal argument to a method that isn't ready to
> > > > > receive it is a programming error, i.e. a bug, and therefore these
> > are
> > > > > properly runtime exceptions.
> > > > >
> > > > > > > and it's never fun when a system goes down
> > > > > > > in production because some random JSON yahoo thought checked
> > > > > > > exceptions were "icky".
> > > > > >
> > > > > > A bug of the application, by the "absent-minded" developer
> > mentioned
> > > > > > in the previous mail.
> > > > > > In Java, nothing prevents the throwing of a runtime
> > > > > > exception; the developer *always* must enclose "foreign" code in
> a
> > > > > > "try/catch" block, to protect the system.  There is no need for
> > checked
> > > > > > exceptions just to remember this (really) simple rule.
> > > > >
> > > > > Had the JSON library properly used checked exceptions, the
> programmer
> > > > > would not have been able to compile code that contained this
> mistake.
> > > > > The reason we have strong static typing, unit tests, and checked
> > > > > exceptions is that programmers are imperfect humans. Let the
> machines
> > > > > do the work that machines are good at, including checking whether
> > > > > errors are properly handled.
> > > > >
> > > > > > > Lately I've been working in Python, and error handling practice
> > in
> > > > > > > this community is abominable. The lack of checked exceptions
> is a
> > > > > > > large reason why Python code is expected to be unreliable and
> > Python
> > > > > > > programs routinely dump stack.
> > > > > >
> > > > > > I've heard that it's rather the result of "script"-oriented
> > design, or
> > > > > lack
> > > > > > thereof... :-)
> > > > >
> > > > > There's more than one reason. :-)
> > > > >
> > > > >
> > > > > --
> > > > > Elliotte Rusty Harold
> > > > > elh...@ibiblio.org
> > > > >
> > > > >
> ---------------------------------------------------------------------
> > > > > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> > > > > For additional commands, e-mail: dev-h...@commons.apache.org
> > > > >
> > > > >
> > > >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
> > For additional commands, e-mail: dev-h...@commons.apache.org
> >
> >
>

Reply via email to