)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"7f9fd5654cf3d45d9c944114fe44a13e16cebe2a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"aa09979f_8d562668","updated":"2022-10-19 14:04:54.000000000","message":"Hi, thanks for the patch, I will test it soon.","commit_id":"4bf75ba60bcedb68df6bc54432bc3d81631babd9"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"3fc10c205bdafd4ba27ff644fb334b23a87af135","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"4f3e063e_dac7713b","updated":"2023-11-08 15:31:18.000000000","message":"Hi Wu and Bo, sorry for the delay. I will update the patch.","commit_id":"d41c957410d20d2a8ff6a7e0f30c64dba8a0dae2"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"3c384789e1006bea6490611395a9839d32e84d27","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"512a4e72_be6a03a7","updated":"2023-11-07 09:38:24.000000000","message":"Hi, Bo, could you help to review this patch? As i am not familiar with this part, so we need two cores +2.  thanks in advance.","commit_id":"d41c957410d20d2a8ff6a7e0f30c64dba8a0dae2"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"4f547c7c0958f5ef50efcb316a5dc42424b35e91","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"37cd9cbc_22101668","updated":"2023-06-21 01:44:07.000000000","message":"Hi, we now have CI the test backup and restore, could you help to update this patch? add a release note as well, thanks","commit_id":"d41c957410d20d2a8ff6a7e0f30c64dba8a0dae2"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"1c5b91f78bf727526d1703d7dd4b1f49a972e1c8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"8a807d0c_cc1b4233","in_reply_to":"37cd9cbc_22101668","updated":"2023-06-21 01:44:40.000000000","message":"s/the/to/","commit_id":"d41c957410d20d2a8ff6a7e0f30c64dba8a0dae2"},{"author":{"_account_id":28691,"name":"Bo Tran","email":"ministry.96.nd@gmail.com","username":"ministry"},"change_message_id":"910e8c8bce0359f3fa3ed802a1cbd8c076622941","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d63eb502_355b5852","in_reply_to":"512a4e72_be6a03a7","updated":"2023-11-09 01:37:16.000000000","message":"ok. I will review this patch after Hirotaka push new commit.","commit_id":"d41c957410d20d2a8ff6a7e0f30c64dba8a0dae2"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"15973e1670abe0b68fbe22cf373d793c82ebf082","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"11acd582_9ee39801","in_reply_to":"d63eb502_355b5852","updated":"2023-11-09 02:54:56.000000000","message":"thanks, I am adding mariadb backup  and postgresql Backup test now.","commit_id":"d41c957410d20d2a8ff6a7e0f30c64dba8a0dae2"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"257888aea82674633ac3fb6af77f414e50188d46","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"42116369_9d545782","updated":"2023-11-29 03:24:01.000000000","message":"CI failed","commit_id":"4b234af0a1fc0c3d7f342c3fd63bd58e5b6634ff"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"3f3f754be4345d8413e39666ca215d1b22a71fe2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"ed74d3f1_d924824f","updated":"2023-12-10 11:51:47.000000000","message":"Hello Wu! Thanks for your updates, I will test and updates the patch.","commit_id":"159d70ac00b7000108363056b221c865e384c01a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"c56d847dbb396b561e0b553efa54ceede59088de","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"7ca2b865_3507f7c1","in_reply_to":"24b3a21b_cd39410a","updated":"2023-12-14 07:01:57.000000000","message":"Hi， hirotaka， your patch doesn\u0027t work well for incremental backup. It seems to be failed to prepare the backup which causes the restored database loosing the incremental data. I\u0027ve fixed it by removing the usage of the subprocess in the incremental prepare function and removing the incremental backup log file. instead, I check the output  directly from the stderr variable.","commit_id":"159d70ac00b7000108363056b221c865e384c01a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"72dd1a5575582071c0a54228967d43579be59e54","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"24b3a21b_cd39410a","in_reply_to":"ed74d3f1_d924824f","updated":"2023-12-11 01:20:02.000000000","message":"I guess you are busy recently, so i updated this commit. I\u0027ll check what\u0027s wrong with the CI.","commit_id":"159d70ac00b7000108363056b221c865e384c01a"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"18cea56df8441a2a597ec7b79a0a098564a804a5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"d5ee8b3d_714c0db0","updated":"2023-12-18 04:01:05.000000000","message":"Hello Bo: could you help to review this commit ? I\u0027ve fixed the incremental backup function. Now, both full backup and incremental backup passed the CI tests. this commit also fixed the mysql 8.0 backup function by checking the xtrabackup version.","commit_id":"7c89017401a65dcf6b035fcac80d222c4de1b186"},{"author":{"_account_id":28691,"name":"Bo Tran","email":"ministry.96.nd@gmail.com","username":"ministry"},"change_message_id":"eabad639b5425b85e1147b19d1ce1dde7619a255","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"72c7a3ae_14fb2b82","updated":"2023-12-18 10:29:17.000000000","message":"LGTM","commit_id":"7c89017401a65dcf6b035fcac80d222c4de1b186"},{"author":{"_account_id":28691,"name":"Bo Tran","email":"ministry.96.nd@gmail.com","username":"ministry"},"change_message_id":"c7a26bfb04e1c33d841496f0c4d5bf6b68650262","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"cf0fd63e_a3e0c429","in_reply_to":"d5ee8b3d_714c0db0","updated":"2023-12-18 08:19:50.000000000","message":"ok. let me put it in my queue.","commit_id":"7c89017401a65dcf6b035fcac80d222c4de1b186"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"e8019589a8e0e58894dd07d79d817ab6d9899d1a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"2e3c79fa_e1641c43","updated":"2023-12-19 08:44:09.000000000","message":"Hello Wu and Bo! Thanks for the review, Here is my manual test log of MariaDB. I will test postgres later.\n\n# 1. MariaDB\n\n## 1.1. Create a mariadb instance \n\n````\n$ DATABASE_NAME\u003dmariadb\n$ DATABASE_VERSION\u003d10.4.31\n$ openstack datastore version create ${DATABASE_VERSION} ${DATABASE_NAME} ${DATABASE_NAME} \"\" \\\n    --image-tags trove,mariadb --active --default --version-number ${DATABASE_VERSION}\n$ openstack database instance create mariadb1 --flavor d2 \\\n    --nic net-id\u003d$(openstack network list -f value -c ID --name private) \\\n    --datastore mariadb --datastore-version ${DATABASE_VERSION} --datastore-version-number ${DATABASE_VERSION} --size 1\n\n$ INSTANCE_NAME\u003dmariadb1\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${INSTANCE_NAME} -f value -c ip)\n$ docker exec -ti database /bin/bash\ncat \u003e /tmp/init_test_mariadb.sql \u003c\u003cEOF\nCREATE DATABASE IF NOT EXISTS test;\nCREATE TABLE test.contacts (\n   id INT PRIMARY KEY AUTO_INCREMENT,\n   first_name VARCHAR(25),\n   last_name VARCHAR(25),\n   email VARCHAR(100)\n) ENGINE\u003dInnoDB;\n\nCREATE TABLE test.accounts (\n   id INT PRIMARY KEY AUTO_INCREMENT,\n   first_name VARCHAR(25),\n   last_name VARCHAR(25),\n   email VARCHAR(100),\n   amount DECIMAL(15,2) CHECK (amount \u003e\u003d 0.0),\n   UNIQUE (email)\n) ENGINE\u003dInnoDB;\n\nDROP USER IF EXISTS \u0027db_user\u0027@\u0027127.0.0.1\u0027;\n\nCREATE USER \u0027db_user\u0027@\u0027127.0.0.1\u0027\n   IDENTIFIED BY \u0027db_user_password\u0027;\n\nGRANT SELECT, INSERT, UPDATE, DELETE, DROP\n   ON test.contacts\n   TO \u0027db_user\u0027@\u0027127.0.0.1\u0027;\n\nGRANT SELECT, INSERT, UPDATE, DELETE, DROP\n   ON test.accounts\n   TO \u0027db_user\u0027@\u0027127.0.0.1\u0027;\n\nINSERT INTO test.contacts(\n        first_name, last_name, email\n) VALUES (\n        \u0027fn1\u0027, \u0027ln1\u0027, \u0027fn1ln1@example.com\u0027\n);\nSELECT first_name, last_name, email FROM test.contacts;\n\nEOF\n\n$ mariadb -uroot -p${MYSQL_ROOT_PASSWORD} -h 127.0.0.1 \u003c /tmp/init_test_mariadb.sql\n$ exit\n$ exit\n````\n\n## 1.2. Create a mariadb backup\n\n````\n$ INSTANCE_NAME\u003dmariadb1\n$ BACKUP_NAME\u003dmariadb1_backup1\n$ openstack database backup create --instance ${INSTANCE_NAME} --swift-container \u0027test\u0027 ${BACKUP_NAME}\n````\n\n### 1.2.1. Debug tips\n\nYou can check if the \"main.py\" backup script have worked correctly by executing the following commands.\n\n```\n$ INSTANCE_NAME\u003dmariadb1\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${INSTANCE_NAME} -f value -c ip)\n$ docker logs db_backup\n$ docker inspect db_backup\n                ...\n            \"Cmd\": [\n                \"/usr/bin/python3\",\n                \"main.py\",\n                \"--backup\",\n                \"--backup-id\u003d41a0ead4-c25f-41b9-a0be-9b10e7c991dc\",\n                ...\n```\n\nYou can see if the \"main.py\" backup script works correctly by executing the following commands.\n```\n$ docker run --rm \\\n\t--name db_backup_temp \\\n\t--network host \\\n\t--mount \u0027type\u003dbind,src\u003d/tmp,dst\u003d/tmp\u0027 \\\n\t--mount \u0027type\u003dbind,src\u003d/var/lib/mysql,dst\u003d/var/lib/mysql\u0027 \\\n\t--mount \u0027type\u003dbind,src\u003d/var/run/mysqld,dst\u003d/var/run/mysqld\u0027 \\\n\t-ti 10.0.0.4:4000/trove-datastores/db-backup-mariadb:1.2.0 \\\n\t/bin/bash\n$ /usr/bin/python3 main.py --backup --backup-id\u003d41a0ead4-c25f-41b9-a0be-9b10e7c991dc ...\n```\n\nYou can check the backup data.\n```\nfor file in $(swift list test)\ndo\n\tswift download test $file; gunzip $file ; echo $file; tar tvf $(echo $file|sed -e \u0027s|.gz||g\u0027)\ndone\n```\n\n## 1.3. Create an instance using the backup\n\n```\n$ DATABASE_VERSION\u003d10.4.31\n$ INSTANCE_NAME\u003dmariadb1\n$ NEW_INSTANCE_NAME\u003dnew_${INSTANCE_NAME}\n$ BACKUP_NAME\u003dmariadb1_backup1\n$ INC_BACKUP_NAME\u003d${BACKUP_NAME}_inc\n$ openstack database instance create ${NEW_INSTANCE_NAME} --flavor d2 \\\n    --nic net-id\u003d$(openstack network list -f value -c ID --name private) \\\n    --datastore mariadb --datastore-version ${DATABASE_VERSION} \\\n    --datastore-version-number ${DATABASE_VERSION} --size 1 \\\n    --backup $(openstack database backup show ${BACKUP_NAME} -f value -c id)\n```\n\n### 1.3.1. Debug tips\n\nYou can check if the \"main.py\" restore script have worked correctly by executing the following commands.\n\n```\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${NEW_INSTANCE_NAME} -f value -c ip)\n$ docker logs db_restore\n$ docker inspect db_restore\n```\n\nYou can see if the \"main.py\" restore script works correctly by executing the following commands.\n\n```\n$ docker run --rm \\\n\t--name db_restore_temp \\\n\t--network host \\\n\t--mount \u0027type\u003dbind,src\u003d/tmp,dst\u003d/tmp\u0027 \\\n\t--mount \u0027type\u003dbind,src\u003d/var/lib/mysql,dst\u003d/var/lib/mysql\u0027 \\\n\t--mount \u0027type\u003dbind,src\u003d/var/run/mysqld,dst\u003d/var/run/mysqld\u0027 \\\n\t-ti 10.0.0.4:4000/trove-datastores/db-backup-mariadb:1.2.0 \\\n\t/bin/bash\n$ /usr/bin/python3 main.py --nobackup --storage-driver\u003dswift --driver\u003dmariabackup --os-token\u003d ...\n```\n\nThe restored data should be expanded to the /var/lib/mysql directory.\n\n## 1.4. Create an incremental backup data.\n\n```\n$ INSTANCE_NAME\u003dmariadb1\n$ BACKUP_NAME\u003dmariadb1_backup1\n$ INC_BACKUP_NAME\u003dmariadb1_backup1_inc1\n$ openstack database backup create --instance ${INSTANCE_NAME} \\\n    --swift-container \u0027test\u0027 ${INC_BACKUP_NAME} \\\n    --parent $(openstack database backup show ${BACKUP_NAME} -f value -c id)\n$ openstack database backup list\n```\n\nIf you want to debug, See \"1.2.1. Debug tips\".\n\n## 1.5. Create an instance using the incremental backup\n\n```\n$ DATABASE_VERSION\u003d10.4.31\n$ INSTANCE_NAME\u003dmariadb1\n$ NEW_INSTANCE_NAME\u003dnew_${INSTANCE_NAME}_inc\n$ BACKUP_NAME\u003dmariadb1_backup1\n$ INC_BACKUP_NAME\u003d${BACKUP_NAME}_inc\n$ openstack database instance create ${NEW_INSTANCE_NAME} --flavor d2 \\\n    --nic net-id\u003d$(openstack network list -f value -c ID --name private) \\\n    --datastore mariadb --datastore-version ${DATABASE_VERSION} \\\n    --datastore-version-number ${DATABASE_VERSION} --size 1 \\\n    --backup $(openstack database backup show ${INC_BACKUP_NAME} -f value -c id)\n```\n\nIf you want to debug, See \"1.3.1. Debug tips\".","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"e5c6ab9fef9be969d7147f59ec342805f1ea94f0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"e48e1357_c94a0098","updated":"2023-12-20 06:17:17.000000000","message":"Hi Wu, Thanks for your great work! OK, I will check the unmerged patches too.","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"e5c6ab9fef9be969d7147f59ec342805f1ea94f0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"7b441b94_f5f26780","updated":"2023-12-20 06:17:17.000000000","message":"Hi Wu, Thanks for your work! My comments are no k","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"0d5cede3297a3a516186abd5d500893172acc02a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"fcc1e721_098a1e67","updated":"2023-12-20 05:43:44.000000000","message":"Manual test log for PostgreSQL. I will test mysql later.\n\n# 2. PostgreSQL\n\n## 2.1. Create a postgresql instance \n\n````\n$ DATABASE_NAME\u003dpostgresql\n$ DATABASE_VERSION\u003d12.17\n$ openstack datastore version create ${DATABASE_VERSION} ${DATABASE_NAME} ${DATABASE_NAME} \"\" \\\n    --image-tags trove,postgresql --active --default --version-number ${DATABASE_VERSION}\n$ openstack database instance create postgresql1 --flavor d2 \\\n    --nic net-id\u003d$(openstack network list -f value -c ID --name private) \\\n    --datastore postgresql --datastore-version ${DATABASE_VERSION} --datastore-version-number ${DATABASE_VERSION} --size 1\n\n$ INSTANCE_NAME\u003dpostgresql1\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${INSTANCE_NAME} -f value -c ip)\n$ docker exec -ti database /bin/bash\n\ncat \u003e /tmp/init_test_postgresql.sql \u003c\u003cEOF\nDROP TABLE IF EXISTS test.contacts;\nDROP TABLE IF EXISTS test.accounts;\nDROP SCHEMA IF EXISTS test;\nDROP USER IF EXISTS db_user;\n\nCREATE SCHEMA test;\nCREATE TABLE test.contacts (\n   id SERIAL PRIMARY KEY,\n   first_name VARCHAR(25),\n   last_name VARCHAR(25),\n   email VARCHAR(100)\n);\n\nCREATE TABLE test.accounts (\n   id SERIAL PRIMARY KEY,\n   first_name VARCHAR(25),\n   last_name VARCHAR(25),\n   email VARCHAR(100),\n   amount DECIMAL(15,2) CHECK (amount \u003e\u003d 0.0),\n   UNIQUE (email)\n);\n\nCREATE USER db_user\n   PASSWORD \u0027db_user_password\u0027;\n\nGRANT SELECT, INSERT, UPDATE, DELETE, DELETE\n   ON test.contacts\n   TO db_user;\n\nGRANT SELECT, INSERT, UPDATE, DELETE, DELETE\n   ON test.accounts\n   TO db_user;\n\nINSERT INTO test.contacts(\n        first_name, last_name, email\n) VALUES (\n        \u0027fn1\u0027, \u0027ln1\u0027, \u0027fn1ln1@example.com\u0027\n);\nSELECT first_name, last_name, email FROM test.contacts;\n\nEOF\n\n$ PGPASSWORD\u003d${POSTGRES_PASSWORD} psql -U postgres -h 127.0.0.1 \u003c /tmp/init_test_postgresql.sql\n$ exit\n$ exit\n````\n\n## 2.2. Create a postgresql backup\n\n````\n$ INSTANCE_NAME\u003dpostgresql1\n$ BACKUP_NAME\u003dpostgresql1_backup1\n$ openstack database backup create --instance ${INSTANCE_NAME} --swift-container \u0027test\u0027 ${BACKUP_NAME}\n$ openstack database backup list\n````\n\n### 2.2.1. Debug tips\n\nYou can check if the \"main.py\" backup script have worked correctly by executing the following commands.\n\n```\n$ INSTANCE_NAME\u003dpostgresql1\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${INSTANCE_NAME} -f value -c ip)\n$ docker logs db_backup\n$ docker inspect db_backup\n                ...\n            \"Cmd\": [\n                \"/usr/bin/python3\",\n                \"main.py\",\n                \"--backup\",\n                \"--backup-id\u003d41a0ead4-c25f-41b9-a0be-9b10e7c991dc\",\n                ...\n```\n\nYou can see if the \"main.py\" backup script works correctly by executing the following commands.\n```\n$ docker run --rm \\\n\t--name db_backup_temp \\\n\t--network host \\\n\t--mount \u0027type\u003dbind,src\u003d/tmp,dst\u003d/tmp\u0027 \\\n\t--mount \u0027type\u003dbind,src\u003d/var/lib/postgresql,dst\u003d/var/lib/postgresql\u0027 \\\n\t-ti 10.0.0.4:4000/trove-datastores/db-backup-postgresql:1.2.0 \\\n\t/bin/bash\n$ /usr/bin/python3 main.py --backup --backup-id\u003d41a0ead4-c25f-41b9-a0be-9b10e7c991dc ...\n```\n\nYou can check the backup data.\n```\nfor file in $(swift list test)\ndo\n\tswift download test $file; gunzip $file ; echo $file; tar tvf $(echo $file|sed -e \u0027s|.gz||g\u0027)\ndone\n```\n\n## 2.3. Create an instance using the backup\n\n```\n$ DATABASE_VERSION\u003d12.17\n$ INSTANCE_NAME\u003dpostgresql1\n$ NEW_INSTANCE_NAME\u003dnew_${INSTANCE_NAME}\n$ BACKUP_NAME\u003dpostgresql1_backup1\n$ openstack database instance create ${NEW_INSTANCE_NAME} --flavor d2 \\\n    --nic net-id\u003d$(openstack network list -f value -c ID --name private) \\\n    --datastore postgresql --datastore-version ${DATABASE_VERSION} \\\n    --datastore-version-number ${DATABASE_VERSION} --size 1 \\\n    --backup $(openstack database backup show ${BACKUP_NAME} -f value -c id)\n```\n\n### 2.3.1. Debug tips\n\nYou can check if the \"main.py\" restore script have worked correctly by executing the following commands.\n\n```\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${NEW_INSTANCE_NAME} -f value -c ip)\n$ docker logs db_restore\n$ docker inspect db_restore\n```\n\nYou can see if the \"main.py\" restore script works correctly by executing the following commands.\n\n```\n$ docker run --rm \\\n\t--name db_restore_temp \\\n\t--network host \\\n\t--mount \u0027type\u003dbind,src\u003d/tmp,dst\u003d/tmp\u0027 \\\n\t--mount \u0027type\u003dbind,src\u003d/var/lib/postgresql,dst\u003d/var/lib/postgresql\u0027 \\\n\t-ti 10.0.0.4:4000/trove-datastores/db-backup-postgresql:1.2.0 \\\n\t/bin/bash\n$ /usr/bin/python3 main.py --nobackup --storage-driver\u003dswift --driver\u003dpg_basebackup --os-token\u003d ...\n```\n\nThe restored data should be expanded to the /var/lib/postgresql directory.\n\n## 2.4. Create an incremental backup data.\n\n```\n$ INSTANCE_NAME\u003dpostgresql1\n$ BACKUP_NAME\u003dpostgresql1_backup1\n$ INC_BACKUP_NAME\u003dpostgresql1_backup1_inc\n$ openstack database backup create --instance ${INSTANCE_NAME} \\\n    --swift-container \u0027test\u0027 ${INC_BACKUP_NAME} \\\n    --parent $(openstack database backup show ${BACKUP_NAME} -f value -c id)\n$ openstack database backup list\n```\n\nIf you want to debug, See \"2.2.1. Debug tips\".\n\n## 2.5. Create an instance using the incremental backup\n\n```\n$ DATABASE_VERSION\u003d12.17\n$ INSTANCE_NAME\u003dpostgresql1\n$ NEW_INSTANCE_NAME\u003dnew_${INSTANCE_NAME}_inc\n$ BACKUP_NAME\u003dpostgresql1_backup1\n$ INC_BACKUP_NAME\u003d${BACKUP_NAME}_inc\n$ openstack database instance create ${NEW_INSTANCE_NAME} --flavor d2 \\\n    --nic net-id\u003d$(openstack network list -f value -c ID --name private) \\\n    --datastore postgresql --datastore-version ${DATABASE_VERSION} \\\n    --datastore-version-number ${DATABASE_VERSION} --size 1 \\\n    --backup $(openstack database backup show ${INC_BACKUP_NAME} -f value -c id)\n\n```\n\nIf you want to debug, See \"2.3.1. Debug tips\".","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"98432f234f3a09ffd3e82fc565b914a17bdf76a9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"d0bc0df8_97e60cff","updated":"2023-12-21 11:28:25.000000000","message":"Manual test log of MySQL-5.7.44.\n\n# 4. MySQL\n\n## 4.1. Create a MySQL instance \n\n````\n$ INSTANCE_NAME\u003dmysql1\n$ DATABASE_NAME\u003dmysql\n$ DATABASE_VERSION\u003d5.7.44\n$ openstack datastore version create ${DATABASE_VERSION} ${DATABASE_NAME} ${DATABASE_NAME} \"\" \\\n    --image-tags trove,mysql --active --default --version-number ${DATABASE_VERSION}\n$ openstack database instance create ${INSTANCE_NAME} --flavor d2 \\\n    --nic net-id\u003d$(openstack network list -f value -c ID --name private) \\\n    --datastore mysql --datastore-version ${DATABASE_VERSION} --datastore-version-number ${DATABASE_VERSION} --size 1\n\n$ INSTANCE_NAME\u003dmysql1\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${INSTANCE_NAME} -f value -c ip)\n$ docker exec -ti database /bin/bash\n\ncat \u003e /tmp/init_test_mysql.sql \u003c\u003cEOF\nCREATE DATABASE IF NOT EXISTS test;\nCREATE TABLE test.contacts (\n   id INT PRIMARY KEY AUTO_INCREMENT,\n   first_name VARCHAR(25),\n   last_name VARCHAR(25),\n   email VARCHAR(100)\n) ENGINE\u003dInnoDB;\n\nCREATE TABLE test.accounts (\n   id INT PRIMARY KEY AUTO_INCREMENT,\n   first_name VARCHAR(25),\n   last_name VARCHAR(25),\n   email VARCHAR(100),\n   amount DECIMAL(15,2) CHECK (amount \u003e\u003d 0.0),\n   UNIQUE (email)\n) ENGINE\u003dInnoDB;\n\nDROP USER IF EXISTS \u0027db_user\u0027@\u0027127.0.0.1\u0027;\n\nCREATE USER \u0027db_user\u0027@\u0027127.0.0.1\u0027\n   IDENTIFIED BY \u0027db_user_password\u0027;\n\nGRANT SELECT, INSERT, UPDATE, DELETE, DROP\n   ON test.contacts\n   TO \u0027db_user\u0027@\u0027127.0.0.1\u0027;\n\nGRANT SELECT, INSERT, UPDATE, DELETE, DROP\n   ON test.accounts\n   TO \u0027db_user\u0027@\u0027127.0.0.1\u0027;\n\nINSERT INTO test.contacts(\n        first_name, last_name, email\n) VALUES (\n        \u0027fn1\u0027, \u0027ln1\u0027, \u0027fn1ln1@example.com\u0027\n);\nSELECT first_name, last_name, email FROM test.contacts;\n\nEOF\n\n$ mysql -uroot -p${MYSQL_ROOT_PASSWORD} \u003c /tmp/init_test_mysql.sql\n$ exit\n$ exit\n````\n\n## 4.2. Create a mysql backup\n\n````\n$ INSTANCE_NAME\u003dmysql1\n$ BACKUP_NAME\u003dmysql1_backup1\n$ openstack database backup create --instance ${INSTANCE_NAME} --swift-container \u0027test\u0027 ${BACKUP_NAME}\n$ openstack database backup list\n````\n\n### 4.2.1. Debug tips\n\nYou can check if the \"main.py\" backup script have worked correctly by executing the following commands.\n\n```\n$ INSTANCE_NAME\u003dmysql1\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${INSTANCE_NAME} -f value -c ip)\n$ docker logs db_backup\n$ docker inspect db_backup\n                ...\n            \"Cmd\": [\n                \"/usr/bin/python3\",\n                \"main.py\",\n                \"--backup\",\n                \"--backup-id\u003d15a46c7d-f856-4d67-afec-b50b8a4c3016\",\n                \"--storage-driver\u003dswift\",\n                \"--driver\u003dinnobackupex\",\n                ...\n```\n\nYou can see if the \"main.py\" backup script works correctly by executing the following commands.\n```\n$ docker run --rm \\\n\t--name db_backup_temp \\\n\t--network host \\\n\t--mount \u0027type\u003dbind,src\u003d/tmp,dst\u003d/tmp\u0027 \\\n\t--mount \u0027type\u003dbind,src\u003d/var/lib/mysql,dst\u003d/var/lib/mysql\u0027 \\\n\t-ti 10.0.0.4:4000/trove-datastores/db-backup-mysql5.7:1.2.0 \\\n\t/bin/bash\n$ /usr/bin/python3 main.py --backup --backup-id\u003d15a46c7d-f856-4d67-afec-b50b8a4c3016 ...\n```\n\nYou can check the backup data.\n```\nfor file in $(swift list test)\ndo\n\tswift download test $file; gunzip $file ; echo $file; tar tvf $(echo $file|sed -e \u0027s|.gz||g\u0027)\ndone\n```\n\n## 4.3. Create an instance using the backup\n\n```\n$ DATABASE_VERSION\u003d5.7.44\n$ INSTANCE_NAME\u003dmysql1\n$ NEW_INSTANCE_NAME\u003dnew_${INSTANCE_NAME}\n$ BACKUP_NAME\u003dmysql1_backup1\n$ openstack database instance create ${NEW_INSTANCE_NAME} --flavor d2 \\\n    --nic net-id\u003d$(openstack network list -f value -c ID --name private) \\\n    --datastore mysql --datastore-version ${DATABASE_VERSION} \\\n    --datastore-version-number ${DATABASE_VERSION} --size 1 \\\n    --backup $(openstack database backup show ${BACKUP_NAME} -f value -c id)\n```\n\n### 4.3.1. Debug tips\n\nYou can check if the \"main.py\" restore script have worked correctly by executing the following commands.\n\n```\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${NEW_INSTANCE_NAME} -f value -c ip)\n$ docker logs db_restore\n$ docker inspect db_restore\n```\n\nYou can see if the \"main.py\" restore script works correctly by executing the following commands.\n\n```\n$ docker run --rm \\\n\t--name db_restore_temp \\\n\t--network host \\\n\t--mount \u0027type\u003dbind,src\u003d/tmp,dst\u003d/tmp\u0027 \\\n\t--mount \u0027type\u003dbind,src\u003d/var/lib/mysql,dst\u003d/var/lib/mysql\u0027 \\\n\t-ti 10.0.0.4:4000/trove-datastores/db-backup-mysql5.7:1.2.0 \\\n\t/bin/bash\n$ /usr/bin/python3 main.py --nobackup --storage-driver\u003dswift --driver\u003dinnobackupex --os-token\u003d ...\n```\n\nThe restored data should be expanded to the /var/lib/mysql directory.\n\n## 4.4. Create an incremental backup data.\n\n```\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${INSTANCE_NAME} -f value -c ip)\n$ docker exec -ti database /bin/bash\n$ cat \u003e /tmp/incremental_test_mysql.sql \u003c\u003cEOF\nINSERT INTO test.contacts(\n        first_name, last_name, email\n) VALUES (\n        \u0027fn2\u0027, \u0027ln2\u0027, \u0027fn2ln2@example.com\u0027\n);\nSELECT first_name, last_name, email FROM test.contacts;\n\nEOF\n\n$ mysql -uroot -p${MYSQL_ROOT_PASSWORD} \u003c /tmp/incremental_test_mysql.sql\n$ exit\n$ exit\n```\n\nThen, create an incremental backup data.\n\n```\n$ INSTANCE_NAME\u003dmysql1\n$ BACKUP_NAME\u003dmysql1_backup1\n$ INC_BACKUP_NAME\u003dmysql1_backup1_inc\n$ openstack database backup create --instance ${INSTANCE_NAME} \\\n    --swift-container \u0027test\u0027 ${INC_BACKUP_NAME} \\\n    --parent $(openstack database backup show ${BACKUP_NAME} -f value -c id)\n$ openstack database backup list\n```\n\nIf you want to debug, See \"4.2.1. Debug tips\".\n\n## 4.5. Create an instance using the incremental backup\n\n```\n$ DATABASE_VERSION\u003d5.7.44\n$ INSTANCE_NAME\u003dmysql1\n$ NEW_INSTANCE_NAME\u003dnew_${INSTANCE_NAME}_inc\n$ BACKUP_NAME\u003dmysql1_backup1\n$ INC_BACKUP_NAME\u003d${BACKUP_NAME}_inc\n$ openstack database instance create ${NEW_INSTANCE_NAME} --flavor d2 \\\n    --nic net-id\u003d$(openstack network list -f value -c ID --name private) \\\n    --datastore mysql --datastore-version ${DATABASE_VERSION} \\\n    --datastore-version-number ${DATABASE_VERSION} --size 1 \\\n    --backup $(openstack database backup show ${INC_BACKUP_NAME} -f value -c id)\n\n```\n\nIf you want to debug, See \"4.3.1. Debug tips\".","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"2d8b577a8fbf2f23352aa434d6a2f304e72f6160","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"aff0a75d_d0febe57","updated":"2023-12-21 02:30:44.000000000","message":"Manual test log of MySQL-8.0.35.\n\n# 3. MySQL\n\n## 3.1. Create a MySQL instance \n\n````\n$ DATABASE_NAME\u003dmysql\n$ DATABASE_VERSION\u003d8.0.35\n$ openstack datastore version create ${DATABASE_VERSION} ${DATABASE_NAME} ${DATABASE_NAME} \"\" \\\n    --image-tags trove,mysql --active --default --version-number ${DATABASE_VERSION}\n$ openstack database instance create mysql1 --flavor d2 \\\n    --nic net-id\u003d$(openstack network list -f value -c ID --name private) \\\n    --datastore mysql --datastore-version ${DATABASE_VERSION} --datastore-version-number ${DATABASE_VERSION} --size 1\n\n$ INSTANCE_NAME\u003dmysql1\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${INSTANCE_NAME} -f value -c ip)\n$ docker exec -ti database /bin/bash\n\ndocker exec -ti database /bin/bash\ncat \u003e /tmp/init_test_mysql.sql \u003c\u003cEOF\nCREATE DATABASE IF NOT EXISTS test;\nCREATE TABLE test.contacts (\n   id INT PRIMARY KEY AUTO_INCREMENT,\n   first_name VARCHAR(25),\n   last_name VARCHAR(25),\n   email VARCHAR(100)\n) ENGINE\u003dInnoDB;\n\nCREATE TABLE test.accounts (\n   id INT PRIMARY KEY AUTO_INCREMENT,\n   first_name VARCHAR(25),\n   last_name VARCHAR(25),\n   email VARCHAR(100),\n   amount DECIMAL(15,2) CHECK (amount \u003e\u003d 0.0),\n   UNIQUE (email)\n) ENGINE\u003dInnoDB;\n\nDROP USER IF EXISTS \u0027db_user\u0027@\u0027127.0.0.1\u0027;\n\nCREATE USER \u0027db_user\u0027@\u0027127.0.0.1\u0027\n   IDENTIFIED BY \u0027db_user_password\u0027;\n\nGRANT SELECT, INSERT, UPDATE, DELETE, DROP\n   ON test.contacts\n   TO \u0027db_user\u0027@\u0027127.0.0.1\u0027;\n\nGRANT SELECT, INSERT, UPDATE, DELETE, DROP\n   ON test.accounts\n   TO \u0027db_user\u0027@\u0027127.0.0.1\u0027;\n\nINSERT INTO test.contacts(\n        first_name, last_name, email\n) VALUES (\n        \u0027fn1\u0027, \u0027ln1\u0027, \u0027fn1ln1@example.com\u0027\n);\nSELECT first_name, last_name, email FROM test.contacts;\n\nEOF\n\n$ mysql -uroot -p${MYSQL_ROOT_PASSWORD} \u003c /tmp/init_test_mysql.sql\n$ exit\n$ exit\n````\n\n## 3.2. Create a mysql backup\n\n````\n$ INSTANCE_NAME\u003dmysql1\n$ BACKUP_NAME\u003dmysql1_backup1\n$ openstack database backup create --instance ${INSTANCE_NAME} --swift-container \u0027test\u0027 ${BACKUP_NAME}\n$ openstack database backup list\n````\n\n### 3.2.1. Debug tips\n\nYou can check if the \"main.py\" backup script have worked correctly by executing the following commands.\n\n```\n$ INSTANCE_NAME\u003dmysql1\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${INSTANCE_NAME} -f value -c ip)\n$ docker logs db_backup\n$ docker inspect db_backup\n                ...\n            \"Cmd\": [\n                \"/usr/bin/python3\",\n                \"main.py\",\n                \"--backup\",\n                \"--backup-id\u003de3baf98c-4381-41c4-9dda-d0a792bbebf6\",\n                \"--storage-driver\u003dswift\",\n                \"--driver\u003dxtrabackup\",\n                ...\n```\n\nYou can see if the \"main.py\" backup script works correctly by executing the following commands.\n```\n$ docker run --rm \\\n\t--name db_backup_temp \\\n\t--network host \\\n\t--mount \u0027type\u003dbind,src\u003d/tmp,dst\u003d/tmp\u0027 \\\n\t--mount \u0027type\u003dbind,src\u003d/var/lib/mysql,dst\u003d/var/lib/mysql\u0027 \\\n\t-ti 10.0.0.4:4000/trove-datastores/db-backup-mysql8.0:1.2.0 \\\n\t/bin/bash\n$ /usr/bin/python3 main.py --backup --backup-id\u003de3baf98c-4381-41c4-9dda-d0a792bbebf6 ...\n```\n\nYou can check the backup data.\n```\nfor file in $(swift list test)\ndo\n\tswift download test $file; gunzip $file ; echo $file; tar tvf $(echo $file|sed -e \u0027s|.gz||g\u0027)\ndone\n```\n\n## 3.3. Create an instance using the backup\n\n```\n$ DATABASE_VERSION\u003d8.0.35\n$ INSTANCE_NAME\u003dmysql1\n$ NEW_INSTANCE_NAME\u003dnew_${INSTANCE_NAME}\n$ BACKUP_NAME\u003dmysql1_backup1\n$ openstack database instance create ${NEW_INSTANCE_NAME} --flavor d2 \\\n    --nic net-id\u003d$(openstack network list -f value -c ID --name private) \\\n    --datastore mysql --datastore-version ${DATABASE_VERSION} \\\n    --datastore-version-number ${DATABASE_VERSION} --size 1 \\\n    --backup $(openstack database backup show ${BACKUP_NAME} -f value -c id)\n```\n\n### 3.3.1. Debug tips\n\nYou can check if the \"main.py\" restore script have worked correctly by executing the following commands.\n\n```\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${NEW_INSTANCE_NAME} -f value -c ip)\n$ docker logs db_restore\n$ docker inspect db_restore\n```\n\nYou can see if the \"main.py\" restore script works correctly by executing the following commands.\n\n```\n$ docker run --rm \\\n\t--name db_restore_temp \\\n\t--network host \\\n\t--mount \u0027type\u003dbind,src\u003d/tmp,dst\u003d/tmp\u0027 \\\n\t--mount \u0027type\u003dbind,src\u003d/var/lib/mysql,dst\u003d/var/lib/mysql\u0027 \\\n\t-ti 10.0.0.4:4000/trove-datastores/db-backup-mysql8.0:1.2.0 \\\n\t/bin/bash\n$ /usr/bin/python3 main.py --nobackup --storage-driver\u003dswift --driver\u003d xtrabackup --os-token\u003d ...\n```\n\nThe restored data should be expanded to the /var/lib/mysql directory.\n\n## 3.4. Create an incremental backup data.\n\n```\n$ INSTANCE_NAME\u003dmysql1\n$ BACKUP_NAME\u003dmysql1_backup1\n$ INC_BACKUP_NAME\u003dmysql1_backup1_inc\n$ openstack database backup create --instance ${INSTANCE_NAME} \\\n    --swift-container \u0027test\u0027 ${INC_BACKUP_NAME} \\\n    --parent $(openstack database backup show ${BACKUP_NAME} -f value -c id)\n$ openstack database backup list\n```\n\nIf you want to debug, See \"3.2.1. Debug tips\".\n\n## 3.5. Create an instance using the incremental backup\n\n```\n$ DATABASE_VERSION\u003d8.0.35\n$ INSTANCE_NAME\u003dmysql1\n$ NEW_INSTANCE_NAME\u003dnew_${INSTANCE_NAME}_inc\n$ BACKUP_NAME\u003dmysql1_backup1\n$ INC_BACKUP_NAME\u003d${BACKUP_NAME}_inc\n$ openstack database instance create ${NEW_INSTANCE_NAME} --flavor d2 \\\n    --nic net-id\u003d$(openstack network list -f value -c ID --name private) \\\n    --datastore mysql --datastore-version ${DATABASE_VERSION} \\\n    --datastore-version-number ${DATABASE_VERSION} --size 1 \\\n    --backup $(openstack database backup show ${INC_BACKUP_NAME} -f value -c id)\n\n```\n\nIf you want to debug, See \"3.3.1. Debug tips\".","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"ccf871a1dd19f7946d0ff4eea2a53700191f73ec","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"6221670a_accbe581","in_reply_to":"1749e1af_254f6ee3","updated":"2023-12-25 02:17:35.000000000","message":"Hi Wu, Thanks for the comment!\n\n\u003e Did you test the latest commit or your previous patch? \n\nYes, I have tested against the latest patch. Here is my general test procedure using devstack.\n\n\n## Get devstack\n```\nsudo useradd -s /bin/bash -d /opt/stack -m stack\nsudo chmod +x /opt/stack\necho \"stack ALL\u003d(ALL) NOPASSWD: ALL\" | sudo tee /etc/sudoers.d/stack\nsudo -u stack -i\ngit clone https://opendev.org/openstack/devstack\ncd devstack\n```\n\nhttps://docs.openstack.org/trove/latest/install/install-devstack.html\n\n## Get trove\n```\ncd ~/\ngit clone https://opendev.org/openstack/trove\ncd trove\n```\n\n## Get trove patch\n\n```\ngit fetch https://review.opendev.org/openstack/trove refs/changes/81/861781/15 \u0026\u0026 git checkout FETCH_HEAD\n```\n\n## Run stack.sh\n```\ncd ~/devstack\n./stack.sh\n```","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"677772d4f94901e8917b5bcb416d94141e41db40","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"87340c37_21808f9a","in_reply_to":"2e3c79fa_e1641c43","updated":"2023-12-20 02:49:51.000000000","message":"our CI tests already cover the full backup and incremental backup function. the CI passed means the functions work fine. you can test this commit on your environment, it should work on mysql, mariadb and postgresql properly","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"0cf966bee4a6dc1710fc3b9d1d97446d6e9310a9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"1749e1af_254f6ee3","in_reply_to":"6bfb2844_cdf6df7e","updated":"2023-12-22 01:46:04.000000000","message":"Hi， thanks for your great work！ It makes sense. BTW, Did you test the latest commit or your previous patch? additionally, we already have such test case in our CI system. more details: https://github.com/openstack/trove-tempest-plugin/blob/master/trove_tempest_plugin/tests/scenario/test_backup.py#L83","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"0ea3dcab82364fbb351049006998100d5b7a2a6b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"1823ce6f_4c6cc8fe","in_reply_to":"87340c37_21808f9a","updated":"2023-12-20 03:29:51.000000000","message":"I saw this patch somehow didn\u0027t get merged. so I\u0027ll wait for your feedback for one week.","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"31270ddf0c53893afb2417e73dcb89caee6734c0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"6bfb2844_cdf6df7e","in_reply_to":"a5db69b9_e6cad287","updated":"2023-12-21 12:07:46.000000000","message":"Sorry, I did not describe the details on how I have tested the incremental backup. \n\nBefore creating an incremental backup, you need add a new record. Please see the following procedure to check the restored incremental backup data.\n\n## 3.4. Create an incremental backup data.\n\n```\n$ INSTANCE_NAME\u003dmysql1\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${INSTANCE_NAME} -f value -c ip)\n$ docker exec -ti database /bin/bash\n$ cat \u003e /tmp/incremental_test_mysql.sql \u003c\u003cEOF\nINSERT INTO test.contacts(\n        first_name, last_name, email\n) VALUES (\n        \u0027fn2\u0027, \u0027ln2\u0027, \u0027fn2ln2@example.com\u0027\n);\nSELECT first_name, last_name, email FROM test.contacts;\n\nEOF\n\n$ mysql -uroot -p${MYSQL_ROOT_PASSWORD} \u003c /tmp/incremental_test_mysql.sql\n$ exit\n$ exit\n```\n\nThen, create an incremental backup data.\n\n```\n$ INSTANCE_NAME\u003dmysql1\n$ BACKUP_NAME\u003dmysql1_backup1\n$ INC_BACKUP_NAME\u003dmysql1_backup1_inc\n$ openstack database backup create --instance ${INSTANCE_NAME} \\\n    --swift-container \u0027test\u0027 ${INC_BACKUP_NAME} \\\n    --parent $(openstack database backup show ${BACKUP_NAME} -f value -c id)\n$ openstack database backup list\n```\n\n## 3.5. Create an instance using the incremental backup\n\n```\n$ DATABASE_VERSION\u003d8.0.35\n$ INSTANCE_NAME\u003dmysql1\n$ NEW_INSTANCE_NAME\u003dnew_${INSTANCE_NAME}_inc\n$ BACKUP_NAME\u003dmysql1_backup1\n$ INC_BACKUP_NAME\u003d${BACKUP_NAME}_inc\n$ openstack database instance create ${NEW_INSTANCE_NAME} --flavor d2 \\\n    --nic net-id\u003d$(openstack network list -f value -c ID --name private) \\\n    --datastore mysql --datastore-version ${DATABASE_VERSION} \\\n    --datastore-version-number ${DATABASE_VERSION} --size 1 \\\n    --backup $(openstack database backup show ${INC_BACKUP_NAME} -f value -c id)\n```\n\nThen, check the incremental backup data.\n\n```\n$ ssh -o StrictHostKeyChecking\u003daccept-new ubuntu@$(openstack database instance show ${NEW_INSTANCE_NAME} -f value -c ip)\n$ docker exec -ti database /bin/bash\n\n$ mysql -uroot -p${MYSQL_ROOT_PASSWORD} \u003c /tmp/incremental_test_mysql.sql\nmysql: [Warning] Using a password on the command line interface can be insecure.\nfirst_name      last_name       email\nfn1     ln1     fn1ln1@example.com                                                                                                                                                                                                           \nfn2     ln2     fn2ln2@example.com    \u003c--- The incremental data.\n```","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"e4931d6ed04c2a8c0bb099ece26d5b992d6f6e49","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"a5db69b9_e6cad287","in_reply_to":"aff0a75d_d0febe57","updated":"2023-12-21 06:25:27.000000000","message":"Did you check the  data after you created the instance with incremental backup?","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"e4931d6ed04c2a8c0bb099ece26d5b992d6f6e49","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"e473fc1d_f12775c8","in_reply_to":"b485b2f8_02cac9e4","updated":"2023-12-21 06:25:27.000000000","message":"It would be better to add some meaningful unit tests. but I am not sure  whether the tests in the patch[0] will be tested in our CI jobs. and it seems like that the tests only include postgresql tests? \n\n[0]:https://review.opendev.org/c/openstack/trove/+/877861","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"fb4434c83ef8509ca55acd5d77e5d39da11db3fe","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"f49b3eec_1f868309","in_reply_to":"e48e1357_c94a0098","updated":"2023-12-20 08:22:25.000000000","message":"\u003e Hi Wu, Thanks for your great work! OK, I will check the unmerged patches too.\n\nhello， Does it work properly in your environment ?","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"324d9520f4882ffa28b2ca2da5b44138530d0b0a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"b485b2f8_02cac9e4","in_reply_to":"f49b3eec_1f868309","updated":"2023-12-21 02:30:10.000000000","message":"Hello, Yes. I found no problems currently. Should we add the unit tests?\nhttps://review.opendev.org/c/openstack/trove/+/877861/18/backup/tests/unittests/drivers/test_postgres.py","commit_id":"5946e55dec0fb4d3991c1c8134685cb3dd2a630b"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"6a462b6a64988b1b78be282f3e2719b0a030b092","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"53d640a4_0330972e","updated":"2023-12-25 15:12:52.000000000","message":"I tested this in my local VM, and I hit an error:\nImportError: Start directory is not importable: \u0027./backup/tests/unittests\u0027\n\nthis directory was not installed by the python install procedure, perhaps we can\u0027t test these unittests? how did you test these  in your local environment?","commit_id":"bde508bc34968c0c0d6381dbb4a8ba2a56e01c48"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"bd804bc9a82289bf8e44228d4174bf6df2bdbe3c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"8a63f55b_629dcb5b","updated":"2023-12-26 03:27:00.000000000","message":"Hi,  Hirotaka, thanks for your great work. there is still some issue with the tox needs to be fixed.","commit_id":"a44bbdb5d0260ffc55603992fef86b0db3689118"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"4edd8ee56816da62e38febf4808d1588a0a0bd53","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"3d680de1_c92684be","updated":"2023-12-26 10:24:19.000000000","message":"Hello Wu, I appreciate your kind review!","commit_id":"ea87734ca29b5f7628826fffda53677d2319bffd"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"6e8fcd517a29976b384babe1302b85b35fcc22f8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"0866326a_a925419a","updated":"2023-12-26 10:25:19.000000000","message":"Thanks for the review. I fixed them.","commit_id":"ea87734ca29b5f7628826fffda53677d2319bffd"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"31e0e139bbc98701d6c408be838128afce77ac3b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"a4d009b5_f437c2ca","updated":"2023-12-28 07:13:29.000000000","message":"Hello Wu, I am really thankful for your review!","commit_id":"1126317f87f0c2dac74a8b6c263d38eef4130ab9"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"6126ceddfa67122b28a3cc80bce5cc55928c6ec8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"2805cdac_204c1287","updated":"2023-12-28 03:32:28.000000000","message":"Hi Wu, Thanks for the comment! I fixed the typo and removed improper lines.","commit_id":"1126317f87f0c2dac74a8b6c263d38eef4130ab9"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"28cc85a91debd3c10a9b68c06da0ce76ef65d9f0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"1e42a3d2_190541e2","updated":"2023-12-28 06:34:43.000000000","message":"Hi, LGTM, I don\u0027t review the tests carefully, but it should be fine. thanks","commit_id":"1126317f87f0c2dac74a8b6c263d38eef4130ab9"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"40dd8e9bbd6fee1f96242519159f3e938f6eab9b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"aeaa34d6_d9b4298b","in_reply_to":"a4d009b5_f437c2ca","updated":"2023-12-28 07:57:02.000000000","message":"you are welcome.😊","commit_id":"1126317f87f0c2dac74a8b6c263d38eef4130ab9"}],"backup/tests/unittests/drivers/test_postgres.py":[{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"7ec2565d85dd636b12a225a202cdbf2ce1d1dd9d","unresolved":true,"context_lines":[{"line_number":367,"context_line":"    unittest.main()"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"# Local variables:"},{"line_number":371,"context_line":"# tab-width: 4"},{"line_number":372,"context_line":"# c-basic-offset: 4"},{"line_number":373,"context_line":"# End:"}],"source_content_type":"text/x-python","patch_set":17,"id":"3588e4a8_e5a3626c","line":373,"range":{"start_line":370,"start_character":0,"end_line":373,"end_character":6},"updated":"2023-12-27 01:14:57.000000000","message":"Hi， why did you add  this four lines?","commit_id":"ea87734ca29b5f7628826fffda53677d2319bffd"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"c2b9cb1014ecea1be4847004b08daf33fb23ca43","unresolved":true,"context_lines":[{"line_number":367,"context_line":"    unittest.main()"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"# Local variables:"},{"line_number":371,"context_line":"# tab-width: 4"},{"line_number":372,"context_line":"# c-basic-offset: 4"},{"line_number":373,"context_line":"# End:"}],"source_content_type":"text/x-python","patch_set":17,"id":"4d7d9dce_69d422d6","line":373,"range":{"start_line":370,"start_character":0,"end_line":373,"end_character":6},"in_reply_to":"3588e4a8_e5a3626c","updated":"2023-12-27 01:15:35.000000000","message":"the other files also have this four lines.","commit_id":"ea87734ca29b5f7628826fffda53677d2319bffd"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"571639ccd5e49bb04a4d2ba126f448e56519567e","unresolved":false,"context_lines":[{"line_number":367,"context_line":"    unittest.main()"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":""},{"line_number":370,"context_line":"# Local variables:"},{"line_number":371,"context_line":"# tab-width: 4"},{"line_number":372,"context_line":"# c-basic-offset: 4"},{"line_number":373,"context_line":"# End:"}],"source_content_type":"text/x-python","patch_set":17,"id":"6553f5d0_05583fe8","line":373,"range":{"start_line":370,"start_character":0,"end_line":373,"end_character":6},"in_reply_to":"4d7d9dce_69d422d6","updated":"2023-12-28 03:33:01.000000000","message":"Done","commit_id":"ea87734ca29b5f7628826fffda53677d2319bffd"}],"backup/tests/unittests/drivers/test_xtrabackup.py":[{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"d8a147aca20a7679352f7b8944c5e610b528802c","unresolved":true,"context_lines":[{"line_number":104,"context_line":"            runner.post_restore()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"# Manually import XtraBackupIncrementalf to prevent from running"},{"line_number":108,"context_line":"# xtrabackup --version when calling the TestXtraBackupIncremental"},{"line_number":109,"context_line":"# constructor"},{"line_number":110,"context_line":"from backup.drivers.xtrabackup import XtraBackupIncremental"}],"source_content_type":"text/x-python","patch_set":17,"id":"b687827f_0baac0cd","line":107,"range":{"start_line":107,"start_character":18,"end_line":107,"end_character":41},"updated":"2023-12-28 01:58:05.000000000","message":"typo? XtraBackupIncremental","commit_id":"ea87734ca29b5f7628826fffda53677d2319bffd"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"571639ccd5e49bb04a4d2ba126f448e56519567e","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            runner.post_restore()"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"# Manually import XtraBackupIncrementalf to prevent from running"},{"line_number":108,"context_line":"# xtrabackup --version when calling the TestXtraBackupIncremental"},{"line_number":109,"context_line":"# constructor"},{"line_number":110,"context_line":"from backup.drivers.xtrabackup import XtraBackupIncremental"}],"source_content_type":"text/x-python","patch_set":17,"id":"7b4634ec_511cee53","line":107,"range":{"start_line":107,"start_character":18,"end_line":107,"end_character":41},"in_reply_to":"b687827f_0baac0cd","updated":"2023-12-28 03:33:01.000000000","message":"Done","commit_id":"ea87734ca29b5f7628826fffda53677d2319bffd"}],"tox.ini":[{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"75475d237c3837fbd1544e116b27019189c319a8","unresolved":true,"context_lines":[{"line_number":120,"context_line":"commands \u003d"},{"line_number":121,"context_line":"    ./trovestack {posargs}"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"[testenv:backup]"},{"line_number":124,"context_line":"setenv \u003d"},{"line_number":125,"context_line":"  {[testenv]setenv}"},{"line_number":126,"context_line":"  OS_TEST_PATH\u003d./backup/tests/unittests"}],"source_content_type":"text/x-properties","patch_set":15,"id":"aa058285_731ea12c","line":123,"updated":"2023-12-25 14:35:33.000000000","message":"This testenv seems not to be used by zuul jobs in our CI test.","commit_id":"bde508bc34968c0c0d6381dbb4a8ba2a56e01c48"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"6e8fcd517a29976b384babe1302b85b35fcc22f8","unresolved":false,"context_lines":[{"line_number":120,"context_line":"commands \u003d"},{"line_number":121,"context_line":"    ./trovestack {posargs}"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"[testenv:backup]"},{"line_number":124,"context_line":"setenv \u003d"},{"line_number":125,"context_line":"  {[testenv]setenv}"},{"line_number":126,"context_line":"  OS_TEST_PATH\u003d./backup/tests/unittests"}],"source_content_type":"text/x-properties","patch_set":15,"id":"f8727112_fc69b72f","line":123,"in_reply_to":"4e6412a4_1c267768","updated":"2023-12-26 10:25:19.000000000","message":"Done","commit_id":"bde508bc34968c0c0d6381dbb4a8ba2a56e01c48"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"e683b404968f7b3866fcb90ba175b6ee5219c72d","unresolved":true,"context_lines":[{"line_number":120,"context_line":"commands \u003d"},{"line_number":121,"context_line":"    ./trovestack {posargs}"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"[testenv:backup]"},{"line_number":124,"context_line":"setenv \u003d"},{"line_number":125,"context_line":"  {[testenv]setenv}"},{"line_number":126,"context_line":"  OS_TEST_PATH\u003d./backup/tests/unittests"}],"source_content_type":"text/x-properties","patch_set":15,"id":"4e6412a4_1c267768","line":123,"in_reply_to":"aa058285_731ea12c","updated":"2023-12-26 08:08:06.000000000","message":"Hi, Thanks for the comment!\n\nSome unit tests are still required to be updated but I would like to add the unit tests for the stability of the the backup drivers API. Here is a way to run the unit tests manually.\n```\n(.venv) stack@devstack:~/trove$ tox -e backup\n\n...(snip)...\n\n  backup: OK (1.75\u003dsetup[0.07]+cmd[0.01,0.00,1.40,0.27] seconds)\n  congratulations :) (1.85 seconds)\n```\nFYI: Python Project Guide\nhttps://docs.openstack.org/project-team-guide/project-setup/python.html#running-python-unit-tests\n\nI will also check the Zuul job docs to integrate them to the current CI jobs. \n\nThanks in advance,\nHirotaka","commit_id":"bde508bc34968c0c0d6381dbb4a8ba2a56e01c48"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"bd804bc9a82289bf8e44228d4174bf6df2bdbe3c","unresolved":true,"context_lines":[{"line_number":39,"context_line":"commands \u003d oslo_debug_helper {posargs}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"[testenv:cover]"},{"line_number":42,"context_line":"setenv \u003d"},{"line_number":43,"context_line":"  {[testenv]setenv}"},{"line_number":44,"context_line":"  PYTHON\u003dcoverage run --source trove"},{"line_number":45,"context_line":"commands \u003d"}],"source_content_type":"text/x-properties","patch_set":16,"id":"69f05036_70214c84","line":42,"updated":"2023-12-26 03:27:00.000000000","message":"add a new line with:  allowlist_externals \u003d sh","commit_id":"a44bbdb5d0260ffc55603992fef86b0db3689118"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"6e8fcd517a29976b384babe1302b85b35fcc22f8","unresolved":false,"context_lines":[{"line_number":39,"context_line":"commands \u003d oslo_debug_helper {posargs}"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"[testenv:cover]"},{"line_number":42,"context_line":"setenv \u003d"},{"line_number":43,"context_line":"  {[testenv]setenv}"},{"line_number":44,"context_line":"  PYTHON\u003dcoverage run --source trove"},{"line_number":45,"context_line":"commands \u003d"}],"source_content_type":"text/x-properties","patch_set":16,"id":"64ab3d46_f9df26c7","line":42,"in_reply_to":"69f05036_70214c84","updated":"2023-12-26 10:25:19.000000000","message":"Done","commit_id":"a44bbdb5d0260ffc55603992fef86b0db3689118"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"bd804bc9a82289bf8e44228d4174bf6df2bdbe3c","unresolved":true,"context_lines":[{"line_number":44,"context_line":"  PYTHON\u003dcoverage run --source trove"},{"line_number":45,"context_line":"commands \u003d"},{"line_number":46,"context_line":"     coverage erase"},{"line_number":47,"context_line":"     stestr run --serial {posargs}"},{"line_number":48,"context_line":"     #coverage run -a run_tests.py"},{"line_number":49,"context_line":"     coverage html -d cover"},{"line_number":50,"context_line":"     coverage xml -o cover/coverage.xml"}],"source_content_type":"text/x-properties","patch_set":16,"id":"917ffc3a_6dddb1e0","line":47,"range":{"start_line":47,"start_character":5,"end_line":47,"end_character":34},"updated":"2023-12-26 03:27:00.000000000","message":"replace this line with the following two line:\n\n```\n     sh -c \u0027OS_TEST_PATH\u003d{toxinidir}/backup/tests/unittests stestr run --serial {posargs}\u0027\n     sh -c \u0027OS_TEST_PATH\u003d{toxinidir}/trove/tests/unittests stestr run --serial {posargs}\u0027\n```\n\nwith this change, zuul will test these tests together with the previous  tests.","commit_id":"a44bbdb5d0260ffc55603992fef86b0db3689118"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"6e8fcd517a29976b384babe1302b85b35fcc22f8","unresolved":false,"context_lines":[{"line_number":44,"context_line":"  PYTHON\u003dcoverage run --source trove"},{"line_number":45,"context_line":"commands \u003d"},{"line_number":46,"context_line":"     coverage erase"},{"line_number":47,"context_line":"     stestr run --serial {posargs}"},{"line_number":48,"context_line":"     #coverage run -a run_tests.py"},{"line_number":49,"context_line":"     coverage html -d cover"},{"line_number":50,"context_line":"     coverage xml -o cover/coverage.xml"}],"source_content_type":"text/x-properties","patch_set":16,"id":"b6e78270_dc5e3891","line":47,"range":{"start_line":47,"start_character":5,"end_line":47,"end_character":34},"in_reply_to":"917ffc3a_6dddb1e0","updated":"2023-12-26 10:25:19.000000000","message":"Done","commit_id":"a44bbdb5d0260ffc55603992fef86b0db3689118"},{"author":{"_account_id":26285,"name":"wu.chunyang","email":"wchy1001@gmail.com","username":"wu.chunyang"},"change_message_id":"bd804bc9a82289bf8e44228d4174bf6df2bdbe3c","unresolved":true,"context_lines":[{"line_number":120,"context_line":"commands \u003d"},{"line_number":121,"context_line":"    ./trovestack {posargs}"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"[testenv:backup]"},{"line_number":124,"context_line":"setenv \u003d"},{"line_number":125,"context_line":"  {[testenv]setenv}"},{"line_number":126,"context_line":"  OS_TEST_PATH\u003d./backup/tests/unittests"}],"source_content_type":"text/x-properties","patch_set":16,"id":"ee415cc4_ee8b6367","line":126,"range":{"start_line":123,"start_character":1,"end_line":126,"end_character":39},"updated":"2023-12-26 03:27:00.000000000","message":"remove this tests env","commit_id":"a44bbdb5d0260ffc55603992fef86b0db3689118"},{"author":{"_account_id":31737,"name":"Hirotaka Wakabayashi","email":"hiwkby@yahoo.com","username":"hiwkby"},"change_message_id":"6e8fcd517a29976b384babe1302b85b35fcc22f8","unresolved":false,"context_lines":[{"line_number":120,"context_line":"commands \u003d"},{"line_number":121,"context_line":"    ./trovestack {posargs}"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"[testenv:backup]"},{"line_number":124,"context_line":"setenv \u003d"},{"line_number":125,"context_line":"  {[testenv]setenv}"},{"line_number":126,"context_line":"  OS_TEST_PATH\u003d./backup/tests/unittests"}],"source_content_type":"text/x-properties","patch_set":16,"id":"5b1e1d4e_bad6c0c1","line":126,"range":{"start_line":123,"start_character":1,"end_line":126,"end_character":39},"in_reply_to":"ee415cc4_ee8b6367","updated":"2023-12-26 10:25:19.000000000","message":"Done","commit_id":"a44bbdb5d0260ffc55603992fef86b0db3689118"}]}
