From b7bb00d7ee92ad648e033adc31c0c36e2aa45c6e Mon Sep 17 00:00:00 2001 From: Marc Bernard <59966492+mbtools@users.noreply.github.com> Date: Wed, 18 Dec 2024 09:26:08 -0500 Subject: [PATCH] Limit number of GUI sessions (#7080) Co-authored-by: Lars Hvam --- package.json | 4 +- ...t_abap_language_vers.clas.testclasses.abap | 2 + src/env/zcl_abapgit_environment.clas.abap | 162 ++++++++++-------- src/env/zif_abapgit_environment.intf.abap | 3 + .../core/zcl_abapgit_serialize.clas.abap | 12 ++ ...cl_abapgit_serialize.clas.testclasses.abap | 41 ++++- 6 files changed, 150 insertions(+), 74 deletions(-) diff --git a/package.json b/package.json index 7d642e93b..2296909d3 100644 --- a/package.json +++ b/package.json @@ -25,9 +25,9 @@ "devDependencies": { "@abaplint/cli": "^2.113.82", "@abaplint/database-sqlite": "^2.10.20", - "@abaplint/runtime": "^2.10.22", + "@abaplint/runtime": "^2.10.23", "express": "^4.21.2", - "@abaplint/transpiler-cli": "^2.10.22", + "@abaplint/transpiler-cli": "^2.10.23", "globals": "^15.13.0", "abapmerge": "^0.16.6", "c8": "^10.1.3", diff --git a/src/env/zcl_abapgit_abap_language_vers.clas.testclasses.abap b/src/env/zcl_abapgit_abap_language_vers.clas.testclasses.abap index c7edd9ac9..7a23bdc35 100644 --- a/src/env/zcl_abapgit_abap_language_vers.clas.testclasses.abap +++ b/src/env/zcl_abapgit_abap_language_vers.clas.testclasses.abap @@ -26,6 +26,8 @@ CLASS lcl_environment IMPLEMENTATION. ENDMETHOD. METHOD zif_abapgit_environment~get_basis_release. ENDMETHOD. + METHOD zif_abapgit_environment~get_available_user_sessions. + ENDMETHOD. METHOD zif_abapgit_environment~get_system_language_filter. ENDMETHOD. METHOD zif_abapgit_environment~is_merged. diff --git a/src/env/zcl_abapgit_environment.clas.abap b/src/env/zcl_abapgit_environment.clas.abap index 5e6922a38..a57f91dab 100644 --- a/src/env/zcl_abapgit_environment.clas.abap +++ b/src/env/zcl_abapgit_environment.clas.abap @@ -81,6 +81,26 @@ CLASS zcl_abapgit_environment IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_environment~get_available_user_sessions. + + DATA: + lv_act_sessions TYPE i, + lv_max_sessions TYPE i, + lv_subrc TYPE sy-subrc. + + CALL FUNCTION 'TH_USER_INFO' + IMPORTING + act_sessions = lv_act_sessions + max_sessions = lv_max_sessions + rc = lv_subrc. + + IF lv_subrc = 0. + rv_sessions = lv_max_sessions - lv_act_sessions. + ENDIF. + + ENDMETHOD. + + METHOD zif_abapgit_environment~get_basis_release. SELECT SINGLE release extrelease FROM cvers INTO (rs_result-release, rs_result-sp) @@ -89,6 +109,78 @@ CLASS zcl_abapgit_environment IMPLEMENTATION. ENDMETHOD. + METHOD zif_abapgit_environment~get_system_language_filter. + DATA lv_translation_detective_lang TYPE spras. + DATA lv_pseudo_translation_language TYPE spras. + FIELD-SYMBOLS LIKE LINE OF rt_system_language_filter. + + " Translation Object Detective + " https://help.sap.com/docs/ABAP_PLATFORM_NEW/ceb25152cb0d4adba664cebea2bf4670/88a3d3cbccf64601975acabaccdfde45.html + CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT' + EXPORTING + input = '1Q' + IMPORTING + output = lv_translation_detective_lang + EXCEPTIONS + unknown_language = 1 + OTHERS = 2. + IF sy-subrc = 1. + " The language for Translation Object Detective was not setup + ENDIF. + IF NOT lv_translation_detective_lang IS INITIAL. + APPEND INITIAL LINE TO rt_system_language_filter ASSIGNING . + -sign = 'E'. + -option = 'EQ'. + -low = lv_translation_detective_lang. + ENDIF. + " 1943470 - Using technical language key 2Q to create pseudo-translations of ABAP developments + " https://launchpad.support.sap.com/#/notes/1943470 + CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT' + EXPORTING + input = '2Q' + IMPORTING + output = lv_pseudo_translation_language + EXCEPTIONS + unknown_language = 1 + OTHERS = 2. + IF sy-subrc = 1. + " The language for Pseudo Translation was not setup + ENDIF. + IF NOT lv_pseudo_translation_language IS INITIAL. + APPEND INITIAL LINE TO rt_system_language_filter ASSIGNING . + -sign = 'E'. + -option = 'EQ'. + -low = lv_pseudo_translation_language. + ENDIF. + ENDMETHOD. + + + METHOD zif_abapgit_environment~init_parallel_processing. + + DATA: lv_group TYPE rzlli_apcl. + + lv_group = iv_group. + + " SPBT_INITIALIZE gives error PBT_ENV_ALREADY_INITIALIZED if called + " multiple times in same session + CALL FUNCTION 'SPBT_INITIALIZE' + EXPORTING + group_name = lv_group + IMPORTING + free_pbt_wps = rv_free_work_processes + EXCEPTIONS + invalid_group_name = 1 + internal_error = 2 + pbt_env_already_initialized = 3 + currently_no_resources_avail = 4 + no_pbt_resources_found = 5 + cant_init_different_pbt_groups = 6 + OTHERS = 7 ##FM_SUBRC_OK. + " If SPBT_INITIALIZE fails, check transactions RZ12, SM50, SM21, SARFC + + ENDMETHOD. + + METHOD zif_abapgit_environment~is_merged. DATA lr_marker TYPE REF TO data ##NEEDED. @@ -155,50 +247,6 @@ CLASS zcl_abapgit_environment IMPLEMENTATION. ENDMETHOD. - METHOD zif_abapgit_environment~get_system_language_filter. - DATA lv_translation_detective_lang TYPE spras. - DATA lv_pseudo_translation_language TYPE spras. - FIELD-SYMBOLS LIKE LINE OF rt_system_language_filter. - - " Translation Object Detective - " https://help.sap.com/docs/ABAP_PLATFORM_NEW/ceb25152cb0d4adba664cebea2bf4670/88a3d3cbccf64601975acabaccdfde45.html - CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT' - EXPORTING - input = '1Q' - IMPORTING - output = lv_translation_detective_lang - EXCEPTIONS - unknown_language = 1 - OTHERS = 2. - IF sy-subrc = 1. - " The language for Translation Object Detective was not setup - ENDIF. - IF NOT lv_translation_detective_lang IS INITIAL. - APPEND INITIAL LINE TO rt_system_language_filter ASSIGNING . - -sign = 'E'. - -option = 'EQ'. - -low = lv_translation_detective_lang. - ENDIF. - " 1943470 - Using technical language key 2Q to create pseudo-translations of ABAP developments - " https://launchpad.support.sap.com/#/notes/1943470 - CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT' - EXPORTING - input = '2Q' - IMPORTING - output = lv_pseudo_translation_language - EXCEPTIONS - unknown_language = 1 - OTHERS = 2. - IF sy-subrc = 1. - " The language for Pseudo Translation was not setup - ENDIF. - IF NOT lv_pseudo_translation_language IS INITIAL. - APPEND INITIAL LINE TO rt_system_language_filter ASSIGNING . - -sign = 'E'. - -option = 'EQ'. - -low = lv_pseudo_translation_language. - ENDIF. - ENDMETHOD. METHOD zif_abapgit_environment~is_variant_maintenance. @@ -212,30 +260,4 @@ CLASS zcl_abapgit_environment IMPLEMENTATION. rv_is_variant_maintenance = boolc( lines( lt_variscreens ) > 0 ). ENDMETHOD. - - METHOD zif_abapgit_environment~init_parallel_processing. - - DATA: lv_group TYPE rzlli_apcl. - - lv_group = iv_group. - - " SPBT_INITIALIZE gives error PBT_ENV_ALREADY_INITIALIZED if called - " multiple times in same session - CALL FUNCTION 'SPBT_INITIALIZE' - EXPORTING - group_name = lv_group - IMPORTING - free_pbt_wps = rv_free_work_processes - EXCEPTIONS - invalid_group_name = 1 - internal_error = 2 - pbt_env_already_initialized = 3 - currently_no_resources_avail = 4 - no_pbt_resources_found = 5 - cant_init_different_pbt_groups = 6 - OTHERS = 7 ##FM_SUBRC_OK. - " If SPBT_INITIALIZE fails, check transactions RZ12, SM50, SM21, SARFC - - ENDMETHOD. - ENDCLASS. diff --git a/src/env/zif_abapgit_environment.intf.abap b/src/env/zif_abapgit_environment.intf.abap index 6fcaa06fb..5aee0824c 100644 --- a/src/env/zif_abapgit_environment.intf.abap +++ b/src/env/zif_abapgit_environment.intf.abap @@ -39,5 +39,8 @@ INTERFACE zif_abapgit_environment iv_group TYPE clike RETURNING VALUE(rv_free_work_processes) TYPE i. + METHODS get_available_user_sessions + RETURNING + VALUE(rv_sessions) TYPE i. ENDINTERFACE. diff --git a/src/objects/core/zcl_abapgit_serialize.clas.abap b/src/objects/core/zcl_abapgit_serialize.clas.abap index fc4ad0c95..b9254c39e 100644 --- a/src/objects/core/zcl_abapgit_serialize.clas.abap +++ b/src/objects/core/zcl_abapgit_serialize.clas.abap @@ -280,6 +280,7 @@ CLASS zcl_abapgit_serialize IMPLEMENTATION. METHOD determine_max_processes. DATA: li_exit TYPE REF TO zif_abapgit_exit. + DATA lv_available_sessions TYPE i. IF iv_force_sequential = abap_true. rv_processes = 1. @@ -319,6 +320,17 @@ CLASS zcl_abapgit_serialize IMPLEMENTATION. ASSERT rv_processes >= 1. " check exit above + " Avoid going over the maximum available user sessions + IF sy-batch IS INITIAL. + lv_available_sessions = zcl_abapgit_factory=>get_environment( )->get_available_user_sessions( ). + + IF rv_processes > lv_available_sessions AND lv_available_sessions <> 0. + rv_processes = lv_available_sessions. + ENDIF. + ENDIF. + + ASSERT rv_processes >= 1. + ENDMETHOD. diff --git a/src/objects/core/zcl_abapgit_serialize.clas.testclasses.abap b/src/objects/core/zcl_abapgit_serialize.clas.testclasses.abap index a224ff5da..3eda1b89b 100644 --- a/src/objects/core/zcl_abapgit_serialize.clas.testclasses.abap +++ b/src/objects/core/zcl_abapgit_serialize.clas.testclasses.abap @@ -70,12 +70,16 @@ CLASS ltd_environment DEFINITION FINAL FOR TESTING set_is_merged IMPORTING iv_is_merged TYPE abap_bool, + set_available_sessions + IMPORTING iv_available_sessions TYPE i, + set_free_work_processes IMPORTING iv_free_work_processes TYPE i. PRIVATE SECTION. DATA: mv_is_merged TYPE abap_bool, + mv_available_sessions TYPE i, mv_free_work_processes TYPE i. ENDCLASS. @@ -89,6 +93,10 @@ CLASS ltd_environment IMPLEMENTATION. METHOD zif_abapgit_environment~get_basis_release. ENDMETHOD. + METHOD zif_abapgit_environment~get_available_user_sessions. + rv_sessions = mv_available_sessions. + ENDMETHOD. + METHOD zif_abapgit_environment~get_system_language_filter. ENDMETHOD. @@ -116,11 +124,16 @@ CLASS ltd_environment IMPLEMENTATION. ENDMETHOD. METHOD set_is_merged. - me->mv_is_merged = iv_is_merged. + mv_is_merged = iv_is_merged. ENDMETHOD. + METHOD set_available_sessions. + mv_available_sessions = iv_available_sessions. + ENDMETHOD. + + METHOD set_free_work_processes. - me->mv_free_work_processes = iv_free_work_processes. + mv_free_work_processes = iv_free_work_processes. ENDMETHOD. ENDCLASS. @@ -255,6 +268,7 @@ CLASS ltcl_determine_max_processes DEFINITION FOR TESTING DURATION SHORT RISK LE determine_max_processes_no_pp FOR TESTING RAISING zcx_abapgit_exception, determine_max_processes_merged FOR TESTING RAISING zcx_abapgit_exception, determine_max_processes_exit FOR TESTING RAISING zcx_abapgit_exception, + determine_max_processes_capped FOR TESTING RAISING zcx_abapgit_exception, force FOR TESTING RAISING zcx_abapgit_exception, teardown, @@ -267,6 +281,10 @@ CLASS ltcl_determine_max_processes DEFINITION FOR TESTING DURATION SHORT RISK LE IMPORTING iv_is_merged TYPE abap_bool, + given_available_sessions + IMPORTING + iv_available_sessions TYPE i, + given_free_work_processes IMPORTING iv_free_work_processes TYPE i, @@ -390,6 +408,19 @@ CLASS ltcl_determine_max_processes IMPLEMENTATION. ENDMETHOD. + METHOD determine_max_processes_capped. + + given_parallel_proc_disabled( abap_false ). + given_is_merged( abap_false ). + given_free_work_processes( 50 ). " big system + given_available_sessions( 10 ). " but user session is capped + + when_determine_max_processes( ). + + then_we_shd_have_n_processes( 10 ). + + ENDMETHOD. + METHOD force. @@ -413,6 +444,12 @@ CLASS ltcl_determine_max_processes IMPLEMENTATION. ENDMETHOD. + METHOD given_available_sessions. + + mo_environment_double->set_available_sessions( iv_available_sessions ). + + ENDMETHOD. + METHOD given_free_work_processes.