diff --git a/src/exits/zcl_abapgit_exit.clas.abap b/src/exits/zcl_abapgit_exit.clas.abap index f20eeb008..f2a03cfb0 100644 --- a/src/exits/zcl_abapgit_exit.clas.abap +++ b/src/exits/zcl_abapgit_exit.clas.abap @@ -1,6 +1,7 @@ CLASS zcl_abapgit_exit DEFINITION PUBLIC - CREATE PUBLIC. + CREATE PUBLIC + GLOBAL FRIENDS zcl_abapgit_injector. PUBLIC SECTION. diff --git a/src/objects/core/zcl_abapgit_serialize.clas.abap b/src/objects/core/zcl_abapgit_serialize.clas.abap index 1983ad1e3..03db16d7f 100644 --- a/src/objects/core/zcl_abapgit_serialize.clas.abap +++ b/src/objects/core/zcl_abapgit_serialize.clas.abap @@ -126,6 +126,9 @@ CLASS zcl_abapgit_serialize DEFINITION VALUE(rs_i18n_params) TYPE zif_abapgit_definitions=>ty_i18n_params RAISING zcx_abapgit_exception. + METHODS is_parallelization_possible + RETURNING + VALUE(rv_result) TYPE abap_bool. ENDCLASS. @@ -300,75 +303,46 @@ CLASS zcl_abapgit_serialize IMPLEMENTATION. METHOD determine_max_processes. - DATA: lo_settings TYPE REF TO zcl_abapgit_settings, - li_exit TYPE REF TO zif_abapgit_exit. + DATA: li_exit TYPE REF TO zif_abapgit_exit. IF iv_force_sequential = abap_true. rv_processes = 1. RETURN. ENDIF. - IF gv_max_processes IS INITIAL. - lo_settings = zcl_abapgit_persist_factory=>get_settings( )->read( ). + IF gv_max_processes IS INITIAL AND is_parallelization_possible( ) = abap_true. - IF zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_true - OR lo_settings->get_parallel_proc_disabled( ) = abap_true. - gv_max_processes = 1. - ENDIF. - ENDIF. - - IF gv_max_processes >= 1. - " SPBT_INITIALIZE gives error PBT_ENV_ALREADY_INITIALIZED if called - " multiple times in same session - rv_processes = gv_max_processes. - ELSEIF mv_group IS NOT INITIAL. - " The function module below should always exist here as is_merged evaluated to false above. It does however - " not exist in the transpiled version which then causes unit tests to fail. Therefore the check needs to stay. - IF zcl_abapgit_factory=>get_function_module( )->function_exists( 'Z_ABAPGIT_SERIALIZE_PARALLEL' ) = abap_false. - gv_max_processes = 1. - ELSE. - CALL FUNCTION 'SPBT_INITIALIZE' - EXPORTING - group_name = mv_group - IMPORTING - free_pbt_wps = gv_max_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. - IF sy-subrc <> 0. - " fallback to running sequentially. If SPBT_INITIALIZE fails, check transactions - " RZ12, SM50, SM21, SARFC - gv_max_processes = 1. - ENDIF. - ENDIF. + gv_max_processes = zcl_abapgit_factory=>get_environment( )->init_parallel_processing( mv_group ). IF gv_max_processes > 1. gv_max_processes = gv_max_processes - 1. ENDIF. - ELSE. + + IF gv_max_processes > 32. + " https://en.wikipedia.org/wiki/Amdahl%27s_law + gv_max_processes = 32. + ENDIF. + + ENDIF. + + IF gv_max_processes IS INITIAL. + " fallback to running sequentially. gv_max_processes = 1. ENDIF. - ASSERT gv_max_processes >= 1. - - IF gv_max_processes > 32. - " https://en.wikipedia.org/wiki/Amdahl%27s_law - gv_max_processes = 32. - ENDIF. - rv_processes = gv_max_processes. + ASSERT rv_processes >= 1. + li_exit = zcl_abapgit_exit=>get_instance( ). li_exit->change_max_parallel_processes( EXPORTING iv_package = iv_package CHANGING cv_max_processes = rv_processes ). + + ASSERT rv_processes >= 1. " check exit above + ENDMETHOD. @@ -718,4 +692,19 @@ CLASS zcl_abapgit_serialize IMPLEMENTATION. lo_timer->end( abap_true ). ENDMETHOD. + + + METHOD is_parallelization_possible. + + rv_result = boolc( zcl_abapgit_factory=>get_environment( )->is_merged( ) = abap_false + AND zcl_abapgit_persist_factory=>get_settings( )->read( )->get_parallel_proc_disabled( ) = abap_false + AND mv_group IS NOT INITIAL + " The function module below should always exist here as is_merged evaluated to false above. + " It does however not exist in the transpiled version which then causes unit tests to fail. + " Therefore the check needs to stay. + AND zcl_abapgit_factory=>get_function_module( + )->function_exists( 'Z_ABAPGIT_SERIALIZE_PARALLEL' ) = abap_true ). + + ENDMETHOD. + ENDCLASS. diff --git a/src/objects/core/zcl_abapgit_serialize.clas.testclasses.abap b/src/objects/core/zcl_abapgit_serialize.clas.testclasses.abap index 4baa1c017..a224ff5da 100644 --- a/src/objects/core/zcl_abapgit_serialize.clas.testclasses.abap +++ b/src/objects/core/zcl_abapgit_serialize.clas.testclasses.abap @@ -10,31 +10,49 @@ CLASS ltd_settings DEFINITION FINAL FOR TESTING zif_abapgit_persist_settings. METHODS: - constructor + set_parallel_proc_disabled IMPORTING iv_parallel_proc_disabled TYPE abap_bool. PRIVATE SECTION. DATA: - ms_settings TYPE zif_abapgit_definitions=>ty_s_user_settings. + mv_parallel_proc_disabled TYPE zif_abapgit_definitions=>ty_s_user_settings-parallel_proc_disabled. ENDCLASS. + CLASS ltd_settings IMPLEMENTATION. - METHOD constructor. - ms_settings-parallel_proc_disabled = iv_parallel_proc_disabled. - ENDMETHOD. - METHOD zif_abapgit_persist_settings~modify. - ENDMETHOD. METHOD zif_abapgit_persist_settings~read. - CREATE OBJECT ro_settings. - ro_settings->set_parallel_proc_disabled( ms_settings-parallel_proc_disabled ). + ro_settings->set_parallel_proc_disabled( mv_parallel_proc_disabled ). + ENDMETHOD. + METHOD set_parallel_proc_disabled. + mv_parallel_proc_disabled = iv_parallel_proc_disabled. + ENDMETHOD. + +ENDCLASS. + + +CLASS ltd_function_module DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + + PUBLIC SECTION. + INTERFACES: + zif_abapgit_function_module. + +ENDCLASS. + + +CLASS ltd_function_module IMPLEMENTATION. + + METHOD zif_abapgit_function_module~function_exists. + rv_exists = abap_true. ENDMETHOD. ENDCLASS. @@ -49,33 +67,29 @@ CLASS ltd_environment DEFINITION FINAL FOR TESTING zif_abapgit_environment. METHODS: - constructor - IMPORTING - iv_is_merged TYPE abap_bool. + set_is_merged + IMPORTING iv_is_merged TYPE abap_bool, + + set_free_work_processes + IMPORTING iv_free_work_processes TYPE i. PRIVATE SECTION. DATA: - mv_is_merged TYPE abap_bool. + mv_is_merged TYPE abap_bool, + mv_free_work_processes TYPE i. ENDCLASS. CLASS ltd_environment IMPLEMENTATION. - METHOD constructor. - mv_is_merged = iv_is_merged. - ENDMETHOD. - METHOD zif_abapgit_environment~compare_with_inactive. - ENDMETHOD. METHOD zif_abapgit_environment~get_basis_release. - ENDMETHOD. METHOD zif_abapgit_environment~get_system_language_filter. - ENDMETHOD. METHOD zif_abapgit_environment~is_merged. @@ -83,23 +97,139 @@ CLASS ltd_environment IMPLEMENTATION. ENDMETHOD. METHOD zif_abapgit_environment~is_repo_object_changes_allowed. - ENDMETHOD. METHOD zif_abapgit_environment~is_restart_required. - ENDMETHOD. METHOD zif_abapgit_environment~is_sap_cloud_platform. - ENDMETHOD. METHOD zif_abapgit_environment~is_sap_object_allowed. - ENDMETHOD. METHOD zif_abapgit_environment~is_variant_maintenance. + ENDMETHOD. + METHOD zif_abapgit_environment~init_parallel_processing. + rv_free_work_processes = mv_free_work_processes. + ENDMETHOD. + + METHOD set_is_merged. + me->mv_is_merged = iv_is_merged. + ENDMETHOD. + + METHOD set_free_work_processes. + me->mv_free_work_processes = iv_free_work_processes. + ENDMETHOD. + +ENDCLASS. + + +CLASS ltd_exit DEFINITION FINAL FOR TESTING + DURATION SHORT + RISK LEVEL HARMLESS. + PUBLIC SECTION. + INTERFACES: + zif_abapgit_exit. + + METHODS: + set_max_parallel_processes + IMPORTING + iv_max_parallel_processes TYPE i. + + PRIVATE SECTION. + DATA: + mv_max_parallel_processes TYPE i. + +ENDCLASS. + + +CLASS ltd_exit IMPLEMENTATION. + + METHOD zif_abapgit_exit~adjust_display_commit_url. + ENDMETHOD. + + METHOD zif_abapgit_exit~adjust_display_filename. + ENDMETHOD. + + METHOD zif_abapgit_exit~allow_sap_objects. + ENDMETHOD. + + METHOD zif_abapgit_exit~change_local_host. + ENDMETHOD. + + METHOD zif_abapgit_exit~change_max_parallel_processes. + IF mv_max_parallel_processes IS NOT INITIAL. + cv_max_processes = mv_max_parallel_processes. + ENDIF. + ENDMETHOD. + + METHOD zif_abapgit_exit~change_proxy_authentication. + ENDMETHOD. + + METHOD zif_abapgit_exit~change_proxy_port. + ENDMETHOD. + + METHOD zif_abapgit_exit~change_proxy_url. + ENDMETHOD. + + METHOD zif_abapgit_exit~change_rfc_server_group. + ENDMETHOD. + + METHOD zif_abapgit_exit~change_supported_data_objects. + ENDMETHOD. + + METHOD zif_abapgit_exit~change_supported_object_types. + ENDMETHOD. + + METHOD zif_abapgit_exit~change_tadir. + ENDMETHOD. + + METHOD zif_abapgit_exit~create_http_client. + ENDMETHOD. + + METHOD zif_abapgit_exit~custom_serialize_abap_clif. + ENDMETHOD. + + METHOD zif_abapgit_exit~deserialize_postprocess. + ENDMETHOD. + + METHOD zif_abapgit_exit~determine_transport_request. + ENDMETHOD. + + METHOD zif_abapgit_exit~enhance_repo_toolbar. + ENDMETHOD. + + METHOD zif_abapgit_exit~get_ci_tests. + ENDMETHOD. + + METHOD zif_abapgit_exit~get_ssl_id. + ENDMETHOD. + + METHOD zif_abapgit_exit~http_client. + ENDMETHOD. + + METHOD zif_abapgit_exit~on_event. + ENDMETHOD. + + METHOD zif_abapgit_exit~pre_calculate_repo_status. + ENDMETHOD. + + METHOD zif_abapgit_exit~serialize_postprocess. + ENDMETHOD. + + METHOD zif_abapgit_exit~validate_before_push. + ENDMETHOD. + + METHOD zif_abapgit_exit~wall_message_list. + ENDMETHOD. + + METHOD zif_abapgit_exit~wall_message_repo. + ENDMETHOD. + + METHOD set_max_parallel_processes. + mv_max_parallel_processes = iv_max_parallel_processes. ENDMETHOD. ENDCLASS. @@ -109,11 +239,24 @@ CLASS ltcl_determine_max_processes DEFINITION FOR TESTING DURATION SHORT RISK LE PRIVATE SECTION. DATA: - mo_cut TYPE REF TO zcl_abapgit_serialize. + mo_cut TYPE REF TO zcl_abapgit_serialize, + mv_act_processes TYPE i, + mo_settings_double TYPE REF TO ltd_settings, + mo_environment_double TYPE REF TO ltd_environment, + mo_function_module_double TYPE REF TO ltd_function_module, + mo_exit TYPE REF TO ltd_exit. METHODS: setup, + determine_max_processes_free FOR TESTING RAISING zcx_abapgit_exception, + det_max_processes_not_free FOR TESTING RAISING zcx_abapgit_exception, + det_max_proc_amdahls_law FOR TESTING RAISING zcx_abapgit_exception, + 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, + force FOR TESTING RAISING zcx_abapgit_exception, + teardown, given_parallel_proc_disabled @@ -124,23 +267,51 @@ CLASS ltcl_determine_max_processes DEFINITION FOR TESTING DURATION SHORT RISK LE IMPORTING iv_is_merged TYPE abap_bool, - determine_max_processes FOR TESTING RAISING zcx_abapgit_exception, - determine_max_processes_no_pp FOR TESTING RAISING zcx_abapgit_exception, - determine_max_processes_merged FOR TESTING RAISING zcx_abapgit_exception, - force FOR TESTING RAISING zcx_abapgit_exception. + given_free_work_processes + IMPORTING + iv_free_work_processes TYPE i, + + when_determine_max_processes + IMPORTING + iv_force_sequential TYPE abap_bool OPTIONAL + RAISING + zcx_abapgit_exception, + + then_we_shd_have_n_processes + IMPORTING + iv_exp_processes TYPE i, + + given_exit_chg_max_processes + IMPORTING + iv_max_processes TYPE i. ENDCLASS. CLASS ltcl_determine_max_processes IMPLEMENTATION. METHOD setup. + + CREATE OBJECT mo_settings_double. + zcl_abapgit_persist_injector=>set_settings( mo_settings_double ). + + CREATE OBJECT mo_environment_double. + zcl_abapgit_injector=>set_environment( mo_environment_double ). + + CREATE OBJECT mo_function_module_double. + zcl_abapgit_injector=>set_function_module( mo_function_module_double ). + + CREATE OBJECT mo_exit. + zcl_abapgit_injector=>set_exit( mo_exit ). + TRY. CREATE OBJECT mo_cut. CATCH zcx_abapgit_exception. cl_abap_unit_assert=>fail( 'Error creating serializer' ). ENDTRY. + ENDMETHOD. + METHOD teardown. CLEAR: mo_cut->gv_max_processes. @@ -148,92 +319,129 @@ CLASS ltcl_determine_max_processes IMPLEMENTATION. ENDMETHOD. - METHOD determine_max_processes. - - DATA: lv_processes TYPE i. + METHOD determine_max_processes_free. given_parallel_proc_disabled( abap_false ). given_is_merged( abap_false ). + given_free_work_processes( 10 ). - lv_processes = mo_cut->determine_max_processes( 'ZDUMMY' ). + when_determine_max_processes( ). - cl_abap_unit_assert=>assert_differs( - act = lv_processes - exp = 0 ). + then_we_shd_have_n_processes( 9 ). + + ENDMETHOD. + + + METHOD det_max_processes_not_free. + + given_parallel_proc_disabled( abap_false ). + given_is_merged( abap_false ). + given_free_work_processes( 0 ). + + when_determine_max_processes( ). + + then_we_shd_have_n_processes( 1 ). + + ENDMETHOD. + + + METHOD det_max_proc_amdahls_law. + + given_parallel_proc_disabled( abap_false ). + given_is_merged( abap_false ). + given_free_work_processes( 50 ). + + when_determine_max_processes( ). + + then_we_shd_have_n_processes( 32 ). ENDMETHOD. METHOD determine_max_processes_no_pp. - DATA: lv_processes TYPE i. - given_parallel_proc_disabled( abap_true ). given_is_merged( abap_false ). - lv_processes = mo_cut->determine_max_processes( 'ZDUMMY' ). + when_determine_max_processes( ). - cl_abap_unit_assert=>assert_differs( - act = lv_processes - exp = 0 ). + then_we_shd_have_n_processes( 1 ). ENDMETHOD. METHOD determine_max_processes_merged. - DATA: lv_processes TYPE i. - given_parallel_proc_disabled( abap_false ). given_is_merged( abap_true ). - lv_processes = mo_cut->determine_max_processes( 'ZDUMMY' ). + when_determine_max_processes( ). - cl_abap_unit_assert=>assert_differs( - act = lv_processes - exp = 0 ). + then_we_shd_have_n_processes( 1 ). + + ENDMETHOD. + + + METHOD determine_max_processes_exit. + + given_exit_chg_max_processes( 7 ). + when_determine_max_processes( ). + then_we_shd_have_n_processes( 7 ). ENDMETHOD. METHOD force. - DATA: lv_processes TYPE i. + when_determine_max_processes( abap_true ). - lv_processes = mo_cut->determine_max_processes( iv_force_sequential = abap_true - iv_package = 'ZDUMMY' ). - - cl_abap_unit_assert=>assert_equals( - act = lv_processes - exp = 1 ). + then_we_shd_have_n_processes( 1 ). ENDMETHOD. METHOD given_parallel_proc_disabled. - DATA: - lo_settings_double TYPE REF TO ltd_settings. - - CREATE OBJECT lo_settings_double - EXPORTING - iv_parallel_proc_disabled = iv_parallel_proc_disabled. - - zcl_abapgit_persist_injector=>set_settings( lo_settings_double ). + mo_settings_double->set_parallel_proc_disabled( iv_parallel_proc_disabled ). ENDMETHOD. METHOD given_is_merged. - DATA: - lo_environment_double TYPE REF TO ltd_environment. + mo_environment_double->set_is_merged( iv_is_merged ). - CREATE OBJECT lo_environment_double - EXPORTING - iv_is_merged = iv_is_merged. + ENDMETHOD. - zcl_abapgit_injector=>set_environment( lo_environment_double ). + + METHOD given_free_work_processes. + + mo_environment_double->set_free_work_processes( iv_free_work_processes ). + + ENDMETHOD. + + + METHOD when_determine_max_processes. + + mv_act_processes = mo_cut->determine_max_processes( + iv_force_sequential = iv_force_sequential + iv_package = 'ZDUMMY' ). + + ENDMETHOD. + + + METHOD then_we_shd_have_n_processes. + + cl_abap_unit_assert=>assert_equals( + act = mv_act_processes + exp = iv_exp_processes ). + + ENDMETHOD. + + + METHOD given_exit_chg_max_processes. + + mo_exit->set_max_parallel_processes( iv_max_processes ). ENDMETHOD. diff --git a/src/utils/zcl_abapgit_abap_language_vers.clas.testclasses.abap b/src/utils/zcl_abapgit_abap_language_vers.clas.testclasses.abap index 1533a2e2f..f01064661 100644 --- a/src/utils/zcl_abapgit_abap_language_vers.clas.testclasses.abap +++ b/src/utils/zcl_abapgit_abap_language_vers.clas.testclasses.abap @@ -38,6 +38,8 @@ CLASS lcl_environment IMPLEMENTATION. ENDMETHOD. METHOD zif_abapgit_environment~is_variant_maintenance. ENDMETHOD. + METHOD zif_abapgit_environment~init_parallel_processing. + ENDMETHOD. ENDCLASS. diff --git a/src/utils/zcl_abapgit_environment.clas.abap b/src/utils/zcl_abapgit_environment.clas.abap index 2ebc6b662..e9277f22f 100644 --- a/src/utils/zcl_abapgit_environment.clas.abap +++ b/src/utils/zcl_abapgit_environment.clas.abap @@ -213,4 +213,29 @@ CLASS zcl_abapgit_environment IMPLEMENTATION. 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. + " If SPBT_INITIALIZE fails, check transactions RZ12, SM50, SM21, SARFC + + ENDMETHOD. + ENDCLASS. diff --git a/src/zcl_abapgit_injector.clas.abap b/src/zcl_abapgit_injector.clas.abap index bf20227f4..c1848cb17 100644 --- a/src/zcl_abapgit_injector.clas.abap +++ b/src/zcl_abapgit_injector.clas.abap @@ -42,6 +42,9 @@ CLASS zcl_abapgit_injector DEFINITION CLASS-METHODS set_function_module IMPORTING ii_function_module TYPE REF TO zif_abapgit_function_module. + CLASS-METHODS set_exit + IMPORTING + ii_exit TYPE REF TO zif_abapgit_exit. PROTECTED SECTION. PRIVATE SECTION. @@ -146,9 +149,12 @@ CLASS zcl_abapgit_injector IMPLEMENTATION. METHOD set_function_module. - zcl_abapgit_factory=>gi_function_module = ii_function_module. + ENDMETHOD. + + METHOD set_exit. + zcl_abapgit_exit=>gi_global_exit = ii_exit. ENDMETHOD. ENDCLASS. diff --git a/src/zif_abapgit_environment.intf.abap b/src/zif_abapgit_environment.intf.abap index 840a63055..6fcaa06fb 100644 --- a/src/zif_abapgit_environment.intf.abap +++ b/src/zif_abapgit_environment.intf.abap @@ -34,4 +34,10 @@ INTERFACE zif_abapgit_environment METHODS is_variant_maintenance RETURNING VALUE(rv_is_variant_maintenance) TYPE abap_bool. + METHODS init_parallel_processing + IMPORTING + iv_group TYPE clike + RETURNING + VALUE(rv_free_work_processes) TYPE i. + ENDINTERFACE.