@@ -377,6 +377,7 @@ function dbg_cli_parameters() {
377
377
echo " AWS_EBS_VOLUME_SIZE: $AWS_EBS_VOLUME_SIZE "
378
378
echo " AWS_REGION: ${AWS_REGION} "
379
379
echo " AWS_ZONE: ${AWS_ZONE} "
380
+ echo " DB_LOCAL_PGDATA: ${DB_LOCAL_PGDATA} "
380
381
fi
381
382
}
382
383
@@ -461,6 +462,10 @@ function check_cli_parameters() {
461
462
err " ERROR: Container ID may be specified only for local runs ('--run-on localhost')."
462
463
exit 1
463
464
fi
465
+ if [[ ! -z ${DB_LOCAL_PGDATA+x} ]]; then
466
+ err " ERROR: --db-local-pgdata may be specified only for local runs ('--run-on localhost')."
467
+ exit 1
468
+ fi
464
469
if [[ -z ${AWS_KEYPAIR_NAME+x} ]] || [[ -z ${AWS_SSH_KEY_PATH+x} ]]; then
465
470
err " ERROR: AWS keypair name and ssh key file must be specified to run on AWS EC2."
466
471
exit 1
@@ -505,6 +510,10 @@ function check_cli_parameters() {
505
510
fi
506
511
fi
507
512
elif [[ " $RUN_ON " == " localhost" ]]; then
513
+ if [[ ! -z ${CONTAINER_ID+x} ]] && [[ ! -z ${DB_LOCAL_PGDATA+x} ]]; then
514
+ err " ERROR: Both --container-id and --db-local-pgdata are provided. Cannot use --db-local-pgdata with existing container."
515
+ exit 1
516
+ fi
508
517
if [[ ! -z ${AWS_KEYPAIR_NAME+x} ]] || [[ ! -z ${AWS_SSH_KEY_PATH+x} ]] ; then
509
518
err " ERROR: options '--aws-keypair-name' and '--aws-ssh-key-path' must be used with '--run-on aws'."
510
519
exit 1
@@ -560,7 +569,8 @@ function check_cli_parameters() {
560
569
[[ ! -z ${WORKLOAD_PGBENCH+x} ]] && let workloads_count=$workloads_count +1
561
570
562
571
if [[ -z ${DB_PREPARED_SNAPSHOT+x} ]] && [[ -z ${DB_DUMP+x} ]] \
563
- && [[ -z ${DB_PGBENCH+x} ]] && [[ -z ${DB_EBS_VOLUME_ID+x} ]]; then
572
+ && [[ -z ${DB_PGBENCH+x} ]] && [[ -z ${DB_EBS_VOLUME_ID+x} ]] \
573
+ && [[ -z ${DB_LOCAL_PGDATA+x} ]]; then
564
574
err " ERROR: The object (database) is not defined."
565
575
exit 1
566
576
fi
@@ -606,8 +616,8 @@ function check_cli_parameters() {
606
616
check_path PG_CONFIG
607
617
if [[ " $? " -ne " 0" ]]; then # TODO(NikolayS) support file:// and s3://
608
618
# err "WARNING: Value given as pg_config: '$PG_CONFIG' not found as file will use as content"
609
- echo " $PG_CONFIG " > $TMP_PATH /pg_config_tmp.sql
610
- PG_CONFIG=" $TMP_PATH /pg_config_tmp.sql "
619
+ echo " $PG_CONFIG " > $TMP_PATH /pg_config_tmp.conf
620
+ PG_CONFIG=" $TMP_PATH /pg_config_tmp.conf "
611
621
fi
612
622
fi
613
623
@@ -1123,6 +1133,8 @@ while [ $# -gt 0 ]; do
1123
1133
AWS_BLOCK_DURATION=$2 ; shift 2 ;;
1124
1134
--db-ebs-volume-id )
1125
1135
DB_EBS_VOLUME_ID=$2 ; shift 2;;
1136
+ --db-local-pgdata )
1137
+ DB_LOCAL_PGDATA=$2 ; shift 2;;
1126
1138
1127
1139
--s3cfg-path )
1128
1140
S3_CFG_PATH=" $2 " ; shift 2 ;;
@@ -1162,10 +1174,18 @@ trap cleanup_and_exit EXIT
1162
1174
1163
1175
if [[ " $RUN_ON " == " localhost" ]]; then
1164
1176
if [[ -z ${CONTAINER_ID+x} ]]; then
1165
- CONTAINER_HASH=$( docker run --name=" pg_nancy_${CURRENT_TS} " \
1166
- -v $TMP_PATH :/machine_home \
1167
- -dit " postgresmen/postgres-with-stuff:postgres${PG_VERSION} _pgbadger10" \
1168
- )
1177
+ if [[ -z ${DB_LOCAL_PGDATA+x} ]]; then
1178
+ CONTAINER_HASH=$( docker run --name=" pg_nancy_${CURRENT_TS} " \
1179
+ -v $TMP_PATH :/machine_home \
1180
+ -dit " postgresmen/postgres-with-stuff:pg${PG_VERSION} " \
1181
+ )
1182
+ else
1183
+ CONTAINER_HASH=$( docker run --name=" pg_nancy_${CURRENT_TS} " \
1184
+ -v $TMP_PATH :/machine_home \
1185
+ -v $DB_LOCAL_PGDATA :/pgdata \
1186
+ -dit " postgresmen/postgres-with-stuff:pg${PG_VERSION} " \
1187
+ )
1188
+ fi
1169
1189
else
1170
1190
CONTAINER_HASH=" $CONTAINER_ID "
1171
1191
fi
@@ -1279,6 +1299,30 @@ function cp_db_ebs_backup() {
1279
1299
docker_exec bash -c " localedef -f UTF-8 -i ru_RU ru_RU.UTF-8"
1280
1300
}
1281
1301
1302
+ # ######################################
1303
+ # Copy pgdata to postgres localtion
1304
+ # Globals:
1305
+ # PG_VERSION
1306
+ # Arguments:
1307
+ # None
1308
+ # Returns:
1309
+ # None
1310
+ # ######################################
1311
+
1312
+ function attach_pgdata() {
1313
+ local op_start_time=$( date +%s)
1314
+ docker_exec bash -c " sudo /etc/init.d/postgresql stop"
1315
+ docker_exec bash -c " sudo rm -rf /var/lib/postgresql/$PG_VERSION /main"
1316
+ docker_exec bash -c " ln -s /pgdata/ /var/lib/postgresql/$PG_VERSION /main"
1317
+ docker_exec bash -c " chown -R postgres:postgres /var/lib/postgresql/$PG_VERSION /main"
1318
+ docker_exec bash -c " chmod -R 0700 /var/lib/postgresql/9.6/main/"
1319
+ local end_time=$( date +%s) ;
1320
+ local duration=$( echo $(( end_time- op_start_time)) | awk ' {printf "%d:%02d:%02d", $1/3600, ($1/60)%60, $1%60}' )
1321
+ msg " Time taken to attach PGDATA: $duration ."
1322
+ docker_exec bash -c " sudo /etc/init.d/postgresql start"
1323
+ sleep 30 # wait for postgres started, may be will recover database
1324
+ }
1325
+
1282
1326
# ######################################
1283
1327
# Detach EBS volume
1284
1328
# Globals:
@@ -1313,6 +1357,10 @@ if [[ "$RUN_ON" == "aws" ]]; then
1313
1357
1314
1358
docker_exec bash -c " sudo /etc/init.d/postgresql start"
1315
1359
sleep 2 # wait for postgres started
1360
+ else
1361
+ if [[ ! -z ${DB_LOCAL_PGDATA+x} ]]; then
1362
+ attach_pgdata
1363
+ fi
1316
1364
fi
1317
1365
1318
1366
# ######################################
@@ -1736,11 +1784,11 @@ fi
1736
1784
1737
1785
# # Apply machine features
1738
1786
# Dump
1739
- sleep 2 # wait for postgres up&running
1787
+ sleep 10 # wait for postgres up&running
1740
1788
1741
1789
apply_commands_after_container_init
1742
1790
apply_sql_before_db_restore
1743
- if [[ -z ${DB_EBS_VOLUME_ID +x} ]]; then
1791
+ if [[ ! -z ${DB_DUMP+x} ]] || [[ ! -z ${DB_PGBENCH +x} ]]; then
1744
1792
restore_dump
1745
1793
fi
1746
1794
apply_sql_after_db_restore
0 commit comments