Peter,

Thanks for the corrections.

It's been awhile since I looked at the logic.
Sometimes I forget things.

Best,
Dave






At 11/23/2023 08:56 AM, Peter Relson wrote:
<snip>

Jon Perryman <jperr...@pacbell.net) wrote:

> 3. Abend recovery can be more difficult. It's been a long time but if I

> remember correctly, ESTAE creates a linkage stack entry and an abend causes

> linkage stack entries to be flushed up to the ESTAE entry thus limiting

> recovery to the CSECT which requires setting up recovery environment for

> each point that requires recovery.



That's not quite correct. What happens is this:

    * ESTAE-create does not create LSEs (Linkage Stack Entries). What

it does do is mark the LSE that is current at the time of ESTAE-create.

    * Then ESTAE cancel will purge all LSEs that are newer that what

existed at ESTAE-create time.

That can be quite a rude surprise if you're using BAKR/PRs without

regard to ESTAE-create points.
<snip>

That's not quite correct either.
ESTAE(X) cancel does not do that. The sequence of
ESTAE(X) create, BAKR, ESTAE(X) cancel
is rejected with return code x'24' because you are not canceling from the right linkage stack entry. It is retry from any recovery routine (ESTAE-type or FRR-type) that by default resets the linkage stack to the time-of-set entry. You can consider that a "purge" if you want. It doesn't typically have to do anything to "purge", just reset the "current pointer". This default can be overridden by setting SDWALSLV within your recovery routine. For example, set to 2 if you want the retry to be two entries past the time-of-set linkage stack level. There are authorization restrictions with respect to how far you can go.

Perhaps you were thinking about PR canceling an ESTAE-type recovery routine that is associated with the former linkage stack level. That does happen. That is analogous to what happens if you end an RB with which an ESTAE-type recovery routine. ESTAE-x recovery is removed by the system automatically when the RB with which it is associated terminates
or when the linkage stack entry with which it is associated is removed.

BAKR is simply not a great approach for saving registers from module to module. Recovery complications are one of the downsides. Performance is another. Limitation on the size of the linkage stack (unless you expand it) is another. Most find that BAKR is nice for initial entry, but intra-component linkage is better handled with save areas. You're not going to want to set up new recovery for every module that gets control (both for complexity and performance).

Many z/OS components have the concept of a "recovery mainline" with individual modules each providing a "module recovery exit". The recovery mainline calls each appropriate module recovery exit, so that the module recovery exit can take care of logic specific to that module, with the recovery mainline doing the routing and taking care of logic that is general to the flow. We find that that makes it more natural to keep recovery in synch with module changes.

Peter Relson
z/OS Core Technology Design

Reply via email to