Say which build orders the scheduler does not enforce, and which jobs nobody orders
io.moderne.mainframe.controlm.AnalyzeScheduleGapsio.moderne.recipe:recipes-mainframeUsage
Run this recipe
This recipe has no required configuration options. Users of Moderne can run it via the Moderne CLI.
You will need to have configured the Moderne CLI on your machine before you can run the following command.
mod run . --recipe AnalyzeScheduleGaps
If the recipe is not available locally, then you can install it using:
RELEASE resolves to the newest release and LATEST to the newest build of any kind, including snapshots. Either one lets mod config recipes upgrade pull in later versions without editing this command; a pinned version stays where you put it.
- RELEASE
- LATEST
- Pinned version
mod config recipes jar install io.moderne.recipe:recipes-mainframe:RELEASE
mod config recipes jar install io.moderne.recipe:recipes-mainframe:LATEST
mod config recipes jar install io.moderne.recipe:recipes-mainframe:0.1.0
Data tables
Build order
io.moderne.mainframe.analysis.table.BuildOrderEvery order the build requires between two jobs, with what the scheduler does about it. A link-edit deck that includes an object binds whatever the object library held when the binder ran, so the job that compiles the object has to have run first — and no one file says so: the deck names a member, the JCL names the library it is written to and read from, and only the scheduler can make one job wait for another.
mod study . --last-recipe-run \
--data-table io.moderne.mainframe.analysis.table.BuildOrder
| Column | Description |
|---|---|
| Module | The load module whose deck requires the order. |
| Deck | The link-edit deck that includes the object. A deck written in a job stream is that job. |
| Deck line | The one-based line of the deck the INCLUDE card is on. |
| Object | The member the card includes, which is the compiled subroutine, map set or assembler object bound into the module. |
| Object data set | The library member the include resolves to, from the DD the card names as the linking step allocates it. This is what joins the deck to the job that writes the object. |
| Producer job | The job that writes the object, which is the one that has to run first. |
| Producer step | The step of that job, on whose SYSLIN or SYSLMOD the object is written. |
| Producer schedules | The scheduler's jobs that submit the producing member, comma separated. Empty where nothing schedules it. |
| Consumer job | The job that link-edits the module, which is the one that has to run second. |
| Consumer step | The step of that job that reads the deck. |
| Consumer schedules | The scheduler's jobs that submit the consuming member, comma separated. Empty where nothing schedules it. |
| Enforcement | ENFORCED where the consumer waits on a condition the producer adds, ENFORCED_THROUGH where the conditions in between impose the order anyway, MISSING where both are scheduled and neither waits for the other, UNSCHEDULED where one of them has no schedule at all, and SAME_JOB where one job does both and its own step order decides it. |
| Enforced through | The jobs the order runs through where no condition joins the two directly, producer first: CLMASMB > CLMCMPC > CLMCMPI. Empty for every other verdict. |
Schedule coverage
io.moderne.mainframe.analysis.table.ScheduleCoverageEvery job of the JCL library with the schedules that order it. A JCL member says what a job does and never says when it runs, so a member with no schedule is one somebody submits by hand, or one nothing runs at all — and either way it is outside everything the operations side of the estate is documented and monitored by.
mod study . --last-recipe-run \
--data-table io.moderne.mainframe.analysis.table.ScheduleCoverage
| Column | Description |
|---|---|
| Job | The JCL member, which is the name a schedule's MEMNAME writes. |
| Source path | The file the job was read from. |
| Schedules | The scheduler's jobs that submit this member, comma separated. A member two applications order is submitted by a job of each. |
| Tables | The tables those jobs are ordered in, comma separated, which is where an operator looks for them. |
| Definitions | The files the schedules were read from, comma separated. A shop that supplies both the panel and the export supplies each job twice. |
| Verdict | ORDERED, or UNSCHEDULED for a job no schedule submits. |
Findings
io.moderne.mainframe.analysis.table.FindingsEverything the mainframe analyses found wrong, ranked, with the evidence for each and the line it is on. Sort on priority.
mod study . --last-recipe-run \
--data-table io.moderne.mainframe.analysis.table.Findings
| Column | Description |
|---|---|
| Priority | 1 for CRITICAL down to 4 for LOW, so the table sorts. |
| Severity | CRITICAL for code that cannot do what it was written to do, HIGH for what will break a migration if not decided deliberately, MEDIUM for what is worth knowing first, LOW for cleanup. |
| Category | What kind of problem it is, which is what groups the report into sections: DEAD_RULE, UNREACHABLE_CODE, COPYBOOK_DRIFT, MIGRATION_BLOCKER, RANGE_PATHOLOGY, DEAD_DATA, COMPLEXITY, LAYOUT_DRIFT, IMS_PCB_MISMATCH, IMS_SEGMENT_NOT_SENSITIVE, IMS_IO_AREA_MISMATCH, MFS_MESSAGE_LENGTH, SCREEN_ITEM_UNREACHED, SCREEN_FIELD_UNREACHED, PARSE_FAILURE, UNDOCUMENTED, STALE_DOCUMENTATION, STALE_REFERENCE, UNENFORCED_BUILD_ORDER, UNSCHEDULED_JOB, AUTOCALL_RESOLVED_REFERENCE, UNRESOLVED_EXECUTION_PATH, INHERITED_SETTING, UNLOAD_NEEDS_REDESIGN, UNLOAD_ACCESS_MODE, UNLOAD_CONSISTENCY, UNLOAD_OUTPUT_WIRING, MIXED_SUBSTITUTION. |
| Program | The COBOL program, or the copybook where the finding is about one. |
| Summary | The finding in one sentence, written to be read on its own. |
| Evidence | Why this is claimed — the conditions that conflict, the two declarations that differ, the caller that made the paragraph unreachable. A finding nobody can check is a finding nobody will act on. |
| Where | The paragraph, section or data item the finding is in. |
| Source path | The file, so the finding can be opened. |
Source files that had results
org.openrewrite.table.SourcesFileResultsSource files that were modified by the recipe run.
mod study . --last-recipe-run \
--data-table org.openrewrite.table.SourcesFileResults
| Column | Description |
|---|---|
| Source path before the run | The source path of the file before the run. null when a source file was created during the run. |
| Source path after the run | A recipe may modify the source path. This is the path after the run. null when a source file was deleted during the run. |
| Parent of the recipe that made changes | In a hierarchical recipe, the parent of the recipe that made a change. Empty if this is the root of a hierarchy or if the recipe is not hierarchical at all. |
| Recipe that made changes | The specific recipe that made a change. |
| Estimated time saving | An estimated effort that a developer to fix manually instead of using this recipe, in unit of seconds. |
| Cycle | The recipe cycle in which the change was made. |
Source files that had search results
org.openrewrite.table.SearchResultsSearch results that were found during the recipe run.
mod study . --last-recipe-run \
--data-table org.openrewrite.table.SearchResults
| Column | Description |
|---|---|
| Source path of search result before the run | The source path of the file with the search result markers present. |
| Source path of search result after run the run | A recipe may modify the source path. This is the path after the run. null when a source file was deleted during the run. |
| Result | The trimmed printed tree of the LST element that the marker is attached to. |
| Description | The content of the description of the marker. |
| Recipe that added the search marker | The specific recipe that added the Search marker. |
Source files that errored on a recipe
org.openrewrite.table.SourcesFileErrorsThe details of all errors produced by a recipe run.
mod study . --last-recipe-run \
--data-table org.openrewrite.table.SourcesFileErrors
| Column | Description |
|---|---|
| Source path | The file that failed to parse. |
| Recipe that made changes | The specific recipe that made a change. |
| Stack trace | The stack trace of the failure. |
Recipe performance
org.openrewrite.table.RecipeRunStatsStatistics used in analyzing the performance of recipes.
mod study . --last-recipe-run \
--data-table org.openrewrite.table.RecipeRunStats
| Column | Description |
|---|---|
| The recipe | The recipe whose stats are being measured both individually and cumulatively. |
| Source file count | The number of source files the recipe ran over. |
| Source file changed count | The number of source files which were changed in the recipe run. Includes files created, deleted, and edited. |
| Cumulative scanning time (ns) | The total time spent across the scanning phase of this recipe. |
| Max scanning time (ns) | The max time scanning any one source file. |
| Cumulative edit time (ns) | The total time spent across the editing phase of this recipe. |
| Max edit time (ns) | The max time editing any one source file. |