I am canceling this vote thread, discussing results now on the sev mailing
list.

Gary

On Mon, Jul 3, 2023, 12:31 Gary Gregory <garydgreg...@gmail.com> wrote:

> 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