Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#997: Added documentation for Rollback of Script-Languages-Container #999

Merged
merged 51 commits into from
Nov 5, 2024
Merged
Show file tree
Hide file tree
Changes from 50 commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
55cfa3d
#997: Added documentation for Rollback of Script-Languages-Container
tomuben Oct 30, 2024
fcd61b7
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
3b9973e
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
65e7f05
Fixed install_slc_v6.0.0_on_db.sh
tomuben Oct 30, 2024
638a359
Use https://docs.exasol.com/db/7.1/database_concepts/udf_scripts/pyth…
tomuben Oct 30, 2024
a3a5e72
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
90bd5e0
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
bf74c99
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
42efc8f
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
7573fde
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
4edff98
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
10b675e
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
4314cb4
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
936476e
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
635b8d8
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
8b70867
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
9c7e395
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
c362266
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
b72dc57
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
4162d6d
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
2fb413b
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
96b2b92
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
5471f17
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
556453a
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 30, 2024
25f657c
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 31, 2024
c2c2523
Fixed check_rollback_7.1.30_script.yml
tomuben Oct 31, 2024
6ac07e3
Fixed link in use_R3.6_on_7.1.30_and_above.md
tomuben Oct 31, 2024
83fe008
Added a link to the new document in the user_guide.md
tomuben Oct 31, 2024
b8e0e97
1. Use "-x" for invocations of exaplus.
tomuben Nov 1, 2024
ba6bb30
Debug
tomuben Nov 1, 2024
8b9a8cb
Debug
tomuben Nov 1, 2024
76d2772
Debug
tomuben Nov 1, 2024
8e8aaa8
Removed `fresh install section`
tomuben Nov 1, 2024
173442b
fixed check_rollback_7.1.30_script.yml
tomuben Nov 1, 2024
98656cf
fixed check_rollback_7.1.30_script.yml
tomuben Nov 1, 2024
44e887f
fixed check_rollback_7.1.30_script.yml
tomuben Nov 1, 2024
cc710f6
fixed check_rollback_7.1.30_script.yml
tomuben Nov 1, 2024
0fa0822
Revert "fixed check_rollback_7.1.30_script.yml"
tomuben Nov 1, 2024
df6e25a
Activated matrix builds
tomuben Nov 1, 2024
ca1b28b
fixed check_rollback_7.1.30_script.yml
tomuben Nov 1, 2024
8352901
Revert "Revert "fixed check_rollback_7.1.30_script.yml""
tomuben Nov 1, 2024
d86c89b
fixed check_rollback_7.1.30_script.yml
tomuben Nov 1, 2024
13cd737
fixed check_rollback_7.1.30_script.yml
tomuben Nov 1, 2024
d96f550
fixed check_rollback_7.1.30_script.yml
tomuben Nov 1, 2024
6b8d61d
fixed check_rollback_7.1.30_script.yml
tomuben Nov 1, 2024
7f728f2
fixed check_rollback_7.1.30_script.yml
tomuben Nov 1, 2024
a44ec60
fixed install_python2_udf.sql
tomuben Nov 1, 2024
292b932
fixed install_python2_udf.sql
tomuben Nov 1, 2024
6021f04
fixed user_guide.md
tomuben Nov 4, 2024
89d6348
Added more details about performance drop of new versions of R
tomuben Nov 5, 2024
13847c2
Added more details about performance drop of new versions of R
tomuben Nov 5, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions .github/workflows/check_rollback_7.1.30_script.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
name: Check Rollback Script 7.1.30

on:
push:
branches:
- develop
pull_request:

jobs:
Check:
runs-on: ubuntu-20.04
strategy:
fail-fast: false
matrix:
include:
- db-version: "7.1.29"
expected-original-alter-system-parameter: "ALTER SYSTEM SET SCRIPT_LANGUAGES='R=builtin_r JAVA=builtin_java PYTHON3=builtin_python3'"
expected-new-alter-system-command: "ALTER SYSTEM SET SCRIPT_LANGUAGES='JAVA=builtin_java PYTHON3=builtin_python3 R=localzmq+protobuf:///bfsdefault/default/EXAClusterOS/ScriptLanguages-standard-EXASOL-7.1.0-slc-v6.0.0-VYP23K36/?lang=r#/buckets/bfsdefault/default/EXAClusterOS/ScriptLanguages-standard-EXASOL-7.1.0-slc-v6.0.0-VYP23K36/exaudf/exaudfclient_py3';"
support-python2: "no"
- db-version: "7.1.19"
expected-original-alter-system-parameter: "ALTER SYSTEM SET SCRIPT_LANGUAGES='PYTHON=builtin_python R=builtin_r JAVA=builtin_java PYTHON3=builtin_python3';"
expected-new-alter-system-command: "ALTER SYSTEM SET SCRIPT_LANGUAGES='JAVA=builtin_java PYTHON3=builtin_python3 PYTHON=localzmq+protobuf:///bfsdefault/default/EXAClusterOS/ScriptLanguages-standard-EXASOL-7.1.0-slc-v4.0.0-CM4RWW6R/?lang=python#/buckets/bfsdefault/default/EXAClusterOS/ScriptLanguages-standard-EXASOL-7.1.0-slc-v4.0.0-CM4RWW6R/exaudf/exaudfclient R=localzmq+protobuf:///bfsdefault/default/EXAClusterOS/ScriptLanguages-standard-EXASOL-7.1.0-slc-v4.0.0-CM4RWW6R/?lang=r#/buckets/bfsdefault/default/EXAClusterOS/ScriptLanguages-standard-EXASOL-7.1.0-slc-v4.0.0-CM4RWW6R/exaudf/exaudfclient_py3';"
support-python2: "yes"
- db-version: "7.1.6"
expected-original-alter-system-parameter: "ALTER SYSTEM SET SCRIPT_LANGUAGES='PYTHON=builtin_python R=builtin_r JAVA=builtin_java PYTHON3=builtin_python3';"
expected-new-alter-system-command: "ALTER SYSTEM SET SCRIPT_LANGUAGES='JAVA=builtin_java PYTHON3=builtin_python3 PYTHON=localzmq+protobuf:///bfsdefault/default/EXAClusterOS/ScriptLanguages-release-standard-exasol-7.1.0-1.1.0/?lang=python#/buckets/bfsdefault/default/EXAClusterOS/ScriptLanguages-release-standard-exasol-7.1.0-1.1.0/exaudf/exaudfclient R=localzmq+protobuf:///bfsdefault/default/EXAClusterOS/ScriptLanguages-release-standard-exasol-7.1.0-1.1.0/?lang=r#/buckets/bfsdefault/default/EXAClusterOS/ScriptLanguages-release-standard-exasol-7.1.0-1.1.0/exaudf/exaudfclient_py3';"
support-python2: "yes"
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: 'recursive'

- name: Setup Python & Poetry Environment
uses: exasol/python-toolbox/.github/actions/[email protected]
with:
python-version: "3.10"
poetry-version: '1.8.2'
- name: Start ITDE
run: poetry run itde spawn-test-environment --environment-name exasol_test --database-port-forward 8888 --bucketfs-port-forward 6583 --docker-db-image-version "${{ matrix.db-version }}"
- name: Install dependencies
run: sudo apt update && sudo apt install -y perl default-jre
- name: Install EXAPlus
run: |
curl -o exaplus.tar.gz https://exasol-script-languages-dependencies.s3.eu-central-1.amazonaws.com/EXAplus-7.0.11.tar.gz && tar xf exaplus.tar.gz
echo "/tmp/EXAplus-7.0.11" >> $GITHUB_PATH
working-directory: /tmp
- name: Check if get_original_script_languages_parameters.sql works
run: |
RESULT=`exaplus -x -q -c localhost:8888 -u sys -p exasol -f ./get_original_script_languages_parameter.sql`
echo "$RESULT" | grep "$EXPECTED_ORIGINAL_ALTER_SYSTEM_PARAMETER" || (echo SCRIPT_LANGUAGES parameter not as expected && exit 1)
env:
EXPECTED_ORIGINAL_ALTER_SYSTEM_PARAMETER: "${{ matrix.expected-original-alter-system-parameter }}"

working-directory: doc/user_guide/resources
- name: Install a simple R UDF
run: |
sleep 120
exaplus -x -q -c localhost:8888 -u sys -p exasol -f install_r_udf.sql
exaplus -x -q -c localhost:8888 -u sys -p exasol -sql "SELECT TEST.R_DEMO();"
working-directory: .github/workflows/scripts
- name: Install a simple Python2 UDF
if: ${{ matrix.support-python2=='yes' }}
run: |
exaplus -x -q -c localhost:8888 -u sys -p exasol -f install_python2_udf.sql
exaplus -x -q -c localhost:8888 -u sys -p exasol -sql "SELECT TEST.TEST_PYTHON_VERSION();"
working-directory: .github/workflows/scripts
- name: Check if pre_update_check.sql works for R only
if: ${{ matrix.support-python2=='no' }}
run: |
RESULT=`exaplus -x -q -c localhost:8888 -u sys -p exasol -f ./pre_update_check.sql`
echo "$RESULT" | grep "You have 1 UDFs using the pre-shipped R/Python2"
working-directory: doc/user_guide/resources
- name: Check if pre_update_check.sql works for R and Python2
if: ${{ matrix.support-python2=='yes' }}
run: |
RESULT=`exaplus -x -q -c localhost:8888 -u sys -p exasol -f ./pre_update_check.sql`
echo "$RESULT" | grep "You have 2 UDFs using the pre-shipped R/Python2"
working-directory: doc/user_guide/resources
- name: Run construct_alter_system_command_before_update.sql
run: |
RESULT=`exaplus -c localhost:8888 -u sys -p exasol -f ./construct_alter_system_command_before_update.sql`
echo "$RESULT" | tr -d '\n' | grep "$EXPECTED_NEW_ALTER_SYSTEM_PARAMETER" || (echo ALTER SYSTEM command not as expected && exit 1)
exaplus -x -q -c localhost:8888 -u sys -p exasol -sql "$EXPECTED_NEW_ALTER_SYSTEM_PARAMETER"
working-directory: doc/user_guide/resources
env:
EXPECTED_NEW_ALTER_SYSTEM_PARAMETER: "${{ matrix.expected-new-alter-system-command }}"
- name: Test if R UDF still works
run: exaplus -x -q -c localhost:8888 -u sys -p exasol -sql "SELECT TEST.R_DEMO();"
- name: Test if Python2 UDF still works
if: ${{ matrix.support-python2=='yes' }}
run: exaplus -x -q -c localhost:8888 -u sys -p exasol -sql "SELECT TEST.TEST_PYTHON_VERSION();"
10 changes: 10 additions & 0 deletions .github/workflows/scripts/install_python2_udf.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CREATE SCHEMA IF NOT EXISTS TEST;
OPEN SCHEMA TEST;
--/

CREATE OR REPLACE PYTHON SCALAR SCRIPT "TEST_PYTHON_VERSION" () RETURNS VARCHAR(2000) AS
import sys
def run(ctx):
return sys.version
/

10 changes: 10 additions & 0 deletions .github/workflows/scripts/install_r_udf.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
CREATE SCHEMA IF NOT EXISTS TEST;
OPEN SCHEMA TEST;

--/
CREATE OR REPLACE R SCALAR SCRIPT TEST.R_DEMO() RETURNS VARCHAR(2000) AS

run <- function(ctx) {
"Minimal R language UDF"
}
/
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
with minor_version as (
select CAST(SUBSTR(PARAM_VALUE,INSTR(PARAM_VALUE,'.',-1,1)+1) as INT) as minor_version
from EXA_METADATA
where PARAM_NAME='databaseProductVersion' and PARAM_VALUE like '7.1%'
),
container_name as (
select 'ScriptLanguages-standard-EXASOL-7.1.0-slc-v6.0.0-VYP23K36' as container_name
from minor_version
where minor_version>=20
union all
select 'ScriptLanguages-standard-EXASOL-7.1.0-slc-v4.0.0-CM4RWW6R' as container_name
from minor_version
where minor_version>=7 AND minor_version<20
union all
select 'ScriptLanguages-release-standard-exasol-7.1.0-1.1.0' as container_name
from minor_version
where minor_version<7

),
num_of_pairs as(
SELECT
p.system_value,
length(p.system_value)-length(replace(p.system_value, '=')) as num_of_pairs
FROM exa_parameters p
WHERE p.parameter_name in ('SCRIPT_LANGUAGES')
),
lang_pairs as(
SELECT
regexp_substr(nop.system_value, '[^ =]+=[^ ]+', 1, level) as pair_val,
nop.system_value
FROM num_of_pairs nop
connect by level <= nop.num_of_pairs
),
parsed_lang_pairs as(
SELECT
instr(lp.pair_val, '=') as eq_pos,
substr(lp.pair_val, 1, local.eq_pos-1) as alias_name,
substr(lp.pair_val, local.eq_pos + 1, length(lp.pair_val) - local.eq_pos) as alias_content
FROM lang_pairs lp
),
new_alias_content as (
select
alias_name,
'localzmq+protobuf:///bfsdefault/default/EXAClusterOS/' || container_name || '/?lang=r#/buckets/bfsdefault/default/EXAClusterOS/' || container_name || '/exaudf/exaudfclient_py3' as alias_content
from container_name
join parsed_lang_pairs on true
where alias_content='builtin_r'
tomuben marked this conversation as resolved.
Show resolved Hide resolved
union all
select
alias_name,
'localzmq+protobuf:///bfsdefault/default/EXAClusterOS/' || container_name || '/?lang=python#/buckets/bfsdefault/default/EXAClusterOS/' || container_name || '/exaudf/exaudfclient' as alias_content
from container_name
join parsed_lang_pairs on true
where alias_content='builtin_python'
union all
select
alias_name,
alias_content
from parsed_lang_pairs
where alias_content<>'builtin_r' and alias_content<>'builtin_python'
),
new_system_value as (
select GROUP_CONCAT(alias_name || '=' || alias_content SEPARATOR ' ') as new_system_value
from new_alias_content
)
select 'ALTER SYSTEM SET SCRIPT_LANGUAGES=''' || new_system_value || ''';' as command_text from new_system_value;
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SELECT 'ALTER SYSTEM SET SCRIPT_LANGUAGES=''' || system_value || ''';'
FROM EXA_PARAMETERS
WHERE PARAMETER_NAME='SCRIPT_LANGUAGES';
45 changes: 45 additions & 0 deletions doc/user_guide/resources/pre_update_check.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
with
num_of_pairs as(
SELECT
p.system_value
, length(p.system_value)-length(replace(p.system_value, '=')) as num_of_pairs
FROM
exa_parameters p
WHERE
1=1
and p.parameter_name in ('SCRIPT_LANGUAGES')
)
, lang_pairs as(
SELECT
regexp_substr(nop.system_value, '[^ =]+=[^ ]+', 1, level) as pair_val
, nop.system_value
FROM
num_of_pairs nop
connect by
level <= nop.num_of_pairs
)
, parsed as(
SELECT
lp.*
, instr(lp.pair_val, '=') as eq_pos
, substr(lp.pair_val, 1, local.eq_pos-1) as alias_name
, substr(lp.pair_val, local.eq_pos + 1, length(lp.pair_val) - local.eq_pos) as alias_content
FROM
lang_pairs lp
)
select
case
when count(*) = 0 then 'You are not using the pre-shipped R/Python2 in UDFs.'
else 'You have '||to_char(count(*))||' UDFs using the pre-shipped R/Python2:

' || GROUP_CONCAT('"'||s.script_schema||'"."'||s.script_name||'"' separator '
')
end as check_results
FROM
parsed p
join exa_dba_scripts s
on upper(p.alias_name)=s.script_language
WHERE
1=1
and (p.alias_content = 'builtin_r' or p.alias_content = 'builtin_python')
;
72 changes: 72 additions & 0 deletions doc/user_guide/use_R3_and_Python2_on_7.1.30_and_above.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Use R3.6 UDF's with Exasol 7.1.30 and later

## Background

The Script-Languages-Container was updated to version [8.1.0](https://github.com/exasol/script-languages-release/releases/tag/8.1.0) in Database v7.1.30. Release 8.1.0 included a major update for the Python and R languages compared to 6.0.0. For R we detected some performance drops in special circumstances: Newer versions of R have a higher memory consumption which has direct impact on the execution of UDF's in parallel.
tomuben marked this conversation as resolved.
Show resolved Hide resolved
Also, some R packages were removed.
In case, customers want to use the previous Script-Languages-Container [6.0.0](https://github.com/exasol/script-languages-release/releases/tag/6.0.0), they can follow the steps described in this document.
tomuben marked this conversation as resolved.
Show resolved Hide resolved

⚠️These script language containers are provided as is and are not maintained anymore.

## Pre-update Check

ⓘ This script will detect most occurrences of R and Python2 usage in UDFs. We cannot guarantee that all occurrences are detected.

See [pre_update_check.sql](./resources/pre_update_check.sql)


## Update From 7.1.x To 7.1.30 or newer

To use Python 2.7 or R3.4 with UDFs after updating from Exasol 7.1.x to Exasol 7.1.30 or later you need to change the SCRIPT_LANGUAGES parameter to activate a script language container that supports Python 2.7/R3.4. The new parameter value can be generated automatically or manually.

### Automatic generation of the new SCRIPT_LANGUAGES parameter value

1. Get the current value of the SCRIPT_LANGUAGES parameter and save the output in case you need to restore it.

See [get_original_script_languages_parameter.sql](./resources/get_original_script_languages_parameter.sql)

Expected result for an Exasol 7.1.20 database or later (the example shows the default values - actual values may be different if the parameter has been changed):
```sql
ALTER SYSTEM SET SCRIPT_LANGUAGES='R=builtin_r JAVA=builtin_java PYTHON3=builtin_python3';
```
Expected result for an Exasol 7.1.19 database or lower (the example shows the default values - actual values may be different if the parameter has been changed):
```sql
ALTER SYSTEM SET SCRIPT_LANGUAGES='PYTHON=builtin_python R=builtin_r JAVA=builtin_java PYTHON3=builtin_python3';
```

2. Run the following query before updating to 7.1.30:

See [construct_alter_system_command_before_update.sql](./resources/construct_alter_system_command_before_update.sql)

3. Run the ALTER SYSTEM statement returned by the query. For example:

```sql
ALTER SYSTEM SET SCRIPT_LANGUAGES='JAVA=builtin_java PYTHON3=builtin_python3 R=localzmq+protobuf:///bfsdefault/default/EXAClusterOS/ScriptLanguages-standard-EXASOL-7.1.0-slc-v6.0.0-VYP23K36/?lang=r#/buckets/bfsdefault/default/EXAClusterOS/ScriptLanguages-standard-EXASOL-7.1.0-slc-v6.0.0-VYP23K36/exaudf/exaudfclient_py3';
```
ⓘ We recommend that you test parameter changes using ALTER SESSION before making system-wide changes using ALTER SYSTEM.

### Manual generation of the new SCRIPT_LANGUAGES parameter value

1. Get the current value of the SCRIPT_LANGUAGES parameter and save the output in case you need to restore it.

See [get_original_script_languages_parameter.sql](./resources/get_original_script_languages_parameter.sql)

2. Using the output from the query in the previous step, replace:
- `builtin_r` with `localzmq+protobuf:///bfsdefault/default/EXAClusterOS/<container_name>/?lang=r#/buckets/bfsdefault/default/EXAClusterOS/<container_name>/exaudf/exaudfclient_py3`
- `builtin_python` with `localzmq+protobuf:///bfsdefault/default/EXAClusterOS/<container_name>/?lang=r#/buckets/bfsdefault/default/EXAClusterOS/<container_name>/exaudf/exaudfclient` (in case you need Python2 in UDF's)

Replace <container_name> in this string with the following value depending on which version you are upgrading from:

| Exasol DB Min Version | Exasol DB Max Version | Container Name |
|:-----------------------------|:---------------------------------|:---------------------------------------------------------|
| 7.1.20 | 7.1.29 |ScriptLanguages-standard-EXASOL-7.1.0-slc-v6.0.0-VYP23K36 |
| 7.1.7 | 7.1.19 |ScriptLanguages-standard-EXASOL-7.1.0-slc-v4.0.0-CM4RWW6R |
| 7.1.0 | 7.1.6 |ScriptLanguages-release-standard-exasol-7.1.0-1.1.0 |

ⓘ If you already had updated the `SCRIPT_LANGUAGES` parameter during a previous update, following steps in https://docs.exasol.com/db/7.1/database_concepts/udf_scripts/python2_extended_use.htm, leave the value for Python2 unchanged.

3. Run the updated ALTER SYSTEM statement after changing the values as described in the previous step. For example:
```sql
ALTER SYSTEM SET SCRIPT_LANGUAGES='JAVA=builtin_java PYTHON3=builtin_python3 R=localzmq+protobuf:///bfsdefault/default/EXAClusterOS/ScriptLanguages-standard-EXASOL-7.1.0-slc-v6.0.0-VYP23K36/?lang=r#/buckets/bfsdefault/default/EXAClusterOS/ScriptLanguages-standard-EXASOL-7.1.0-slc-v6.0.0-VYP23K36/exaudf/exaudfclient_py3 PYTHON=localzmq+protobuf:///bfsdefault/default/EXAClusterOS/ScriptLanguages-standard-EXASOL-7.1.0-slc-v4.0.0-CM4RWW6R/?lang=python#/buckets/bfsdefault/default/EXAClusterOS/ScriptLanguages-standard-EXASOL-7.1.0-slc-v4.0.0-CM4RWW6R/exaudf/exaudfclient';
```
ⓘ We recommend that you test parameter changes using ALTER SESSION before making system-wide changes using ALTER SYSTEM.
1 change: 1 addition & 0 deletions doc/user_guide/user_guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@
- [Python Dataframe Support](py_dataframe.md)
- [Using Vagrant as development environment](vagrant.md)
- [FAQ](FAQ.md)
- [Use R3.x and Python2 on an Exasol 7.1.3.0 database and above](use_R3_and_Python2_on_7.1.30_and_above.md)