ZCL_ABAPGIT_SERIALIZE / DETERMINE_MAX_PROCESSES refactoring (#6646)

This commit is contained in:
Christian Günter 2023-11-15 14:48:10 +01:00 committed by GitHub
parent 0cbbc5bbfd
commit f9b25f279d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 355 additions and 118 deletions

View File

@ -1,6 +1,7 @@
CLASS zcl_abapgit_exit DEFINITION
PUBLIC
CREATE PUBLIC.
CREATE PUBLIC
GLOBAL FRIENDS zcl_abapgit_injector.
PUBLIC SECTION.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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.