@@ -95,7 +95,7 @@ while true; do
95
95
96
96
Specify the path to database dump (created by pg_dump) to be used as an input.
97
97
98
- \033[1m--after-db-init-code \033[22m (string)
98
+ \033[1m--sql- after-db-restore \033[22m (string)
99
99
100
100
Specify additional commands to be executed after database is initiated (dump
101
101
loaded or snapshot attached).
@@ -199,10 +199,12 @@ while true; do
199
199
DB_PREPARED_SNAPSHOT=" $2 " ; shift 2 ;;
200
200
--db-dump )
201
201
DB_DUMP_PATH=" $2 " ; shift 2 ;;
202
- --after-db-init-code )
202
+ --commands-after-docker-init )
203
+ AFTER_DOCKER_INIT_CODE=" $2 " ; shift 2 ;;
204
+ --sql-after-db-restore )
203
205
# s3 url|filename|content
204
206
AFTER_DB_INIT_CODE=" $2 " ; shift 2 ;;
205
- --before-db-init-code )
207
+ --sql- before-db-restore )
206
208
# s3 url|filename|content
207
209
BEFORE_DB_INIT_CODE=" $2 " ; shift 2 ;;
208
210
--workload-real )
@@ -264,6 +266,7 @@ RUN_ON=${RUN_ON:-localhost}
264
266
265
267
if [ $DEBUG -eq 1 ]; then
266
268
echo " debug: ${DEBUG} "
269
+ echo " debug timeout: ${DEBUG_TIMEOUT} "
267
270
echo " run_on: ${RUN_ON} "
268
271
echo " container_id: ${CONTAINER_ID} "
269
272
echo " aws_ec2_type: ${AWS_EC2_TYPE} "
@@ -284,6 +287,7 @@ if [ $DEBUG -eq 1 ]; then
284
287
echo " s3-cfg-path: $S3_CFG_PATH "
285
288
echo " tmp-path: $TMP_PATH "
286
289
echo " after-db-init-code: $AFTER_DB_INIT_CODE "
290
+ echo " after_docker_init_code: $AFTER_DOCKER_INIT_CODE "
287
291
echo " before-db-init-code: $BEFORE_DB_INIT_CODE "
288
292
echo " ebs-volume-size: $EBS_VOLUME_SIZE "
289
293
fi
@@ -466,25 +470,36 @@ function checkParams() {
466
470
fi
467
471
fi
468
472
473
+ if [ ! -z ${AFTER_DOCKER_INIT_CODE+x} ]; then
474
+ checkPath AFTER_DOCKER_INIT_CODE
475
+ if [ " $? " -ne " 0" ]; then
476
+ # >&2 echo "WARNING: Value given as after_db_init_code: '$AFTER_DOCKER_INIT_CODE' not found as file will use as content"
477
+ echo " $AFTER_DOCKER_INIT_CODE " > $TMP_PATH /after_docker_init_code_tmp.sh
478
+ AFTER_DOCKER_INIT_CODE=" $TMP_PATH /after_docker_init_code_tmp.sh"
479
+ else
480
+ [ " $DEBUG " -eq " 1" ] && echo " DEBUG: Value given as commands-after-docker-init will use as filename"
481
+ fi
482
+ fi
483
+
469
484
if [ ! -z ${AFTER_DB_INIT_CODE+x} ]; then
470
485
checkPath AFTER_DB_INIT_CODE
471
486
if [ " $? " -ne " 0" ]; then
472
487
# >&2 echo "WARNING: Value given as after_db_init_code: '$AFTER_DB_INIT_CODE' not found as file will use as content"
473
488
echo " $AFTER_DB_INIT_CODE " > $TMP_PATH /after_db_init_code_tmp.sql
474
489
AFTER_DB_INIT_CODE=" $TMP_PATH /after_db_init_code_tmp.sql"
475
490
else
476
- [ " $DEBUG " -eq " 1" ] && echo " DEBUG: Value given as after_db_init_code will use as filename"
491
+ [ " $DEBUG " -eq " 1" ] && echo " DEBUG: Value given as sql-after-db-restore will use as filename"
477
492
fi
478
493
fi
479
494
480
495
if [ ! -z ${BEFORE_DB_INIT_CODE+x} ]; then
481
496
checkPath BEFORE_DB_INIT_CODE
482
497
if [ " $? " -ne " 0" ]; then
483
- # >&2 echo "WARNING: Value given as after_db_init_code : '$AFTER_DB_INIT_CODE ' not found as file will use as content"
498
+ # >&2 echo "WARNING: Value given as before_db_init_code : '$BEFORE_DB_INIT_CODE ' not found as file will use as content"
484
499
echo " $BEFORE_DB_INIT_CODE " > $TMP_PATH /before_db_init_code_tmp.sql
485
500
BEFORE_DB_INIT_CODE=" $TMP_PATH /before_db_init_code_tmp.sql"
486
501
else
487
- [ " $DEBUG " -eq " 1" ] && echo " DEBUG: Value given as before_db_init_code will use as filename"
502
+ [ " $DEBUG " -eq " 1" ] && echo " DEBUG: Value given as sql-before-db-restore will use as filename"
488
503
fi
489
504
fi
490
505
@@ -570,7 +585,7 @@ if ([ "$RUN_ON" == "aws" ] && [ ! ${AWS_EC2_TYPE:0:2} == "i3" ] && \
570
585
fi
571
586
572
587
set -ueo pipefail
573
- [ $DEBUG -eq 1 ] && set -ueox pipefail # to debug
588
+ [ $DEBUG -eq 1 ] && set -uox pipefail # to debug
574
589
shopt -s expand_aliases
575
590
576
591
# # Docker tools
@@ -614,6 +629,7 @@ function createDockerMachine() {
614
629
--amazonec2-ssh-keypath=" $6 " \
615
630
--amazonec2-instance-type=$2 \
616
631
--amazonec2-spot-price=$3 \
632
+ --amazonec2-zone $7 \
617
633
$1 2> >( grep -v " failed waiting for successful resource state" >&2 ) &
618
634
# --amazonec2-block-duration-minutes=$4 \
619
635
}
@@ -641,6 +657,7 @@ function cleanupAndExit {
641
657
echo " $( date " +%Y-%m-%d %H:%M:%S" ) : Remove temp files..." # if exists
642
658
docker $dockerConfig exec -i ${containerHash} sh -c " sudo rm -rf $MACHINE_HOME "
643
659
rm -f " $TMP_PATH /after_db_init_code_tmp.sql"
660
+ rm -f " $TMP_PATH /after_docker_init_code_tmp.sh"
644
661
rm -f " $TMP_PATH /before_db_init_code_tmp.sql"
645
662
rm -f " $TMP_PATH /workload_custom_sql_tmp.sql"
646
663
rm -f " $TMP_PATH /target_ddl_do_tmp.sql"
@@ -684,17 +701,24 @@ elif [[ "$RUN_ON" = "aws" ]]; then
684
701
--start-time=$( date +%s) --product-descriptions=" Linux/UNIX (Amazon VPC)" \
685
702
--query ' SpotPriceHistory[*].{az:AvailabilityZone, price:SpotPrice}'
686
703
)
687
- maxprice=$( echo $prices | jq ' max_by(.price) | .price' )
688
- maxprice=" ${maxprice/ \" / } "
689
- maxprice=" ${maxprice/ \" / } "
690
- echo " $( date " +%Y-%m-%d %H:%M:%S" ) : Max price from history: $maxprice "
691
- multiplier=" 1.1"
692
- price=$( echo " $maxprice * $multiplier " | bc -l)
704
+ minprice=$( echo $prices | jq ' min_by(.price) | .price' )
705
+ region=$( echo $prices | jq ' min_by(.price) | .az' )
706
+ region=" ${region/ \" / } "
707
+ region=" ${region/ \" / } "
708
+ minprice=" ${minprice/ \" / } "
709
+ minprice=" ${minprice/ \" / } "
710
+ zone=${region: -1}
711
+ echo " $( date " +%Y-%m-%d %H:%M:%S" ) : Min price from history: $minprice in $region (zone: $zone )"
712
+ multiplier=" 1.01"
713
+ price=$( echo " $minprice * $multiplier " | bc -l)
693
714
echo " $( date " +%Y-%m-%d %H:%M:%S" ) : Increased price: $price "
694
715
EC2_PRICE=$price
716
+ if [ -z $zone ]; then
717
+ region=' a' # default zone
718
+ fi
695
719
696
720
createDockerMachine $DOCKER_MACHINE $AWS_EC2_TYPE $EC2_PRICE \
697
- 60 $AWS_KEY_PAIR $AWS_KEY_PATH ;
721
+ 60 $AWS_KEY_PAIR $AWS_KEY_PATH $zone ;
698
722
status=$( waitEC2Ready " docker-machine create" " $DOCKER_MACHINE " 1)
699
723
if [ " $status " == " price-too-low" ]
700
724
then
@@ -740,6 +764,8 @@ elif [[ "$RUN_ON" = "aws" ]]; then
740
764
exit 1;
741
765
fi
742
766
echo " $( date " +%Y-%m-%d %H:%M:%S" ) : Docker $DOCKER_MACHINE is running."
767
+ echo " To connect docker machine use:"
768
+ echo " docker \` docker-machine config $DOCKER_MACHINE \` exec -it pg_nancy_${CURRENT_TS} bash"
743
769
744
770
docker-machine ssh $DOCKER_MACHINE " sudo sh -c \" mkdir /home/storage\" "
745
771
if [ ${AWS_EC2_TYPE: 0: 2} == ' i3' ]
@@ -839,6 +865,19 @@ function copyFile() {
839
865
# # Apply machine features
840
866
# Dump
841
867
sleep 2 # wait for postgres up&running
868
+ OP_START_TIME=$( date +%s) ;
869
+ if ([ ! -z ${AFTER_DOCKER_INIT_CODE+x} ] && [ " $AFTER_DOCKER_INIT_CODE " != " " ])
870
+ then
871
+ echo " $( date " +%Y-%m-%d %H:%M:%S" ) : Apply code after docker init"
872
+ AFTER_DOCKER_INIT_CODE_FILENAME=$( basename $AFTER_DOCKER_INIT_CODE )
873
+ copyFile $AFTER_DOCKER_INIT_CODE
874
+ # --set ON_ERROR_STOP=on
875
+ docker_exec bash -c " chmod +x $MACHINE_HOME /$AFTER_DOCKER_INIT_CODE_FILENAME "
876
+ docker_exec sh $MACHINE_HOME /$AFTER_DOCKER_INIT_CODE_FILENAME
877
+ END_TIME=$( date +%s) ;
878
+ DURATION=$( echo $(( END_TIME- OP_START_TIME)) | awk ' {printf "%d:%02d:%02d", $1/3600, ($1/60)%60, $1%60}' )
879
+ echo " $( date " +%Y-%m-%d %H:%M:%S" ) : After docker init code applied for $DURATION ."
880
+ fi
842
881
843
882
OP_START_TIME=$( date +%s) ;
844
883
if ([ ! -z ${BEFORE_DB_INIT_CODE+x} ] && [ " $BEFORE_DB_INIT_CODE " != " " ])
854
893
fi
855
894
OP_START_TIME=$( date +%s) ;
856
895
echo " $( date " +%Y-%m-%d %H:%M:%S" ) : Restore database dump"
896
+ # CPU_CNT=$(cat /proc/cpuinfo | grep processor | wc -l)
897
+ CPU_CNT=$( docker_exec bash -c " cat /proc/cpuinfo | grep processor | wc -l" ) # for execute in docker
857
898
case " $DB_DUMP_EXT " in
858
899
sql)
859
900
docker_exec bash -c " cat $MACHINE_HOME /$DB_DUMP_FILENAME | psql --set ON_ERROR_STOP=on -U postgres test $OUTPUT_REDIRECT "
@@ -864,6 +905,9 @@ case "$DB_DUMP_EXT" in
864
905
gz)
865
906
docker_exec bash -c " zcat $MACHINE_HOME /$DB_DUMP_FILENAME | psql --set ON_ERROR_STOP=on -U postgres test $OUTPUT_REDIRECT "
866
907
;;
908
+ pgdmp)
909
+ docker_exec bash -c " pg_restore -j $CPU_CNT --no-owner --no-privileges -U postgres -d test $MACHINE_HOME /$DB_DUMP_FILENAME " || true
910
+ ;;
867
911
esac
868
912
END_TIME=$( date +%s) ;
869
913
DURATION=$( echo $(( END_TIME- OP_START_TIME)) | awk ' {printf "%d:%02d:%02d", $1/3600, ($1/60)%60, $1%60}' )
938
982
939
983
# Clear statistics and log
940
984
echo " $( date " +%Y-%m-%d %H:%M:%S" ) : Execute vacuumdb..."
941
- docker_exec vacuumdb -U postgres test -j $( cat /proc/cpuinfo | grep processor | wc -l ) --analyze
985
+ docker_exec vacuumdb -U postgres test -j $CPU_CNT --analyze
942
986
docker_exec bash -c " echo '' > /var/log/postgresql/postgresql-$PG_VERSION -main.log"
943
987
# Execute workload
944
988
OP_START_TIME=$( date +%s) ;
@@ -947,7 +991,11 @@ if [ ! -z ${WORKLOAD_REAL+x} ] && [ "$WORKLOAD_REAL" != '' ];then
947
991
echo " $( date " +%Y-%m-%d %H:%M:%S" ) : Execute pgreplay queries..."
948
992
docker_exec psql -U postgres test -c ' create role testuser superuser login;'
949
993
WORKLOAD_FILE_NAME=$( basename $WORKLOAD_REAL )
950
- docker_exec bash -c " pgreplay -r -j $MACHINE_HOME /$WORKLOAD_FILE_NAME "
994
+ if [ ! -z ${WORKLOAD_REAL_REPLAY_SPEED+x} ] && [ " $WORKLOAD_REAL_REPLAY_SPEED " != ' ' ]; then
995
+ docker_exec bash -c " pgreplay -r -s $WORKLOAD_REAL_REPLAY_SPEED $MACHINE_HOME /$WORKLOAD_FILE_NAME "
996
+ else
997
+ docker_exec bash -c " pgreplay -r -j $MACHINE_HOME /$WORKLOAD_FILE_NAME "
998
+ fi
951
999
else
952
1000
if ([ ! -z ${WORKLOAD_CUSTOM_SQL+x} ] && [ " $WORKLOAD_CUSTOM_SQL " != " " ]); then
953
1001
WORKLOAD_CUSTOM_FILENAME=$( basename $WORKLOAD_CUSTOM_SQL )
@@ -963,26 +1011,30 @@ echo "$(date "+%Y-%m-%d %H:%M:%S"): Workload executed for $DURATION."
963
1011
OP_START_TIME=$( date +%s) ;
964
1012
echo " $( date " +%Y-%m-%d %H:%M:%S" ) : Prepare JSON log..."
965
1013
docker_exec bash -c " /root/pgbadger/pgbadger \
966
- -j $( cat /proc/cpuinfo | grep processor | wc -l ) \
1014
+ -j $CPU_CNT \
967
1015
--prefix '%t [%p]: [%l-1] db=%d,user=%u (%a,%h)' /var/log/postgresql/* -f stderr \
968
1016
-o $MACHINE_HOME /$ARTIFACTS_FILENAME .json"
969
1017
# 2> >(grep -v "install the Text::CSV_XS" >&2)
970
1018
971
1019
docker_exec bash -c " gzip -c $logpath > $MACHINE_HOME /$ARTIFACTS_FILENAME .log.gz"
1020
+ docker_exec bash -c " gzip -c /etc/postgresql/$PG_VERSION /main/postgresql.conf > $MACHINE_HOME /$ARTIFACTS_FILENAME .conf.gz"
972
1021
echo " $( date " +%Y-%m-%d %H:%M:%S" ) : Save artifcats..."
973
1022
if [[ $ARTIFACTS_DESTINATION =~ " s3://" ]]; then
974
1023
docker_exec s3cmd put /$MACHINE_HOME /$ARTIFACTS_FILENAME .json $ARTIFACTS_DESTINATION /
975
1024
docker_exec s3cmd put /$MACHINE_HOME /$ARTIFACTS_FILENAME .log.gz $ARTIFACTS_DESTINATION /
1025
+ docker_exec s3cmd put /$MACHINE_HOME /$ARTIFACTS_FILENAME .conf.gz $ARTIFACTS_DESTINATION /
976
1026
else
977
1027
if [ " $RUN_ON " = " localhost" ]; then
978
1028
docker cp $containerHash :$MACHINE_HOME /$ARTIFACTS_FILENAME .json $ARTIFACTS_DESTINATION /
979
1029
docker cp $containerHash :$MACHINE_HOME /$ARTIFACTS_FILENAME .log.gz $ARTIFACTS_DESTINATION /
1030
+ docker cp $containerHash :$MACHINE_HOME /$ARTIFACTS_FILENAME .conf.gz $ARTIFACTS_DESTINATION /
980
1031
# TODO option: ln / cp
981
1032
# cp "$TMP_PATH/nancy_$containerHash/"$ARTIFACTS_FILENAME.json $ARTIFACTS_DESTINATION/
982
1033
# cp "$TMP_PATH/nancy_$containerHash/"$ARTIFACTS_FILENAME.log.gz $ARTIFACTS_DESTINATION/
983
1034
elif [ " $RUN_ON " = " aws" ]; then
984
1035
docker-machine scp $DOCKER_MACHINE :/home/storage/$ARTIFACTS_FILENAME .json $ARTIFACTS_DESTINATION /
985
1036
docker-machine scp $DOCKER_MACHINE :/home/storage/$ARTIFACTS_FILENAME .log.gz $ARTIFACTS_DESTINATION /
1037
+ docker-machine scp $DOCKER_MACHINE :/home/storage/$ARTIFACTS_FILENAME .conf.gz $ARTIFACTS_DESTINATION /
986
1038
else
987
1039
>&2 echo " ASSERT: must not reach this point"
988
1040
exit 1
0 commit comments