fix: pack without libaio (#676)

diff --git a/.github/workflows/ci-pull-request.yaml b/.github/workflows/ci-pull-request.yaml
index ee3c3fb..e6e3109 100644
--- a/.github/workflows/ci-pull-request.yaml
+++ b/.github/workflows/ci-pull-request.yaml
@@ -17,10 +17,7 @@
     paths:
       - 'rdsn/**'
       - 'src/**'
-      - '.github/workflows/ci-pull-request.yml'
-  push:
-    paths:
-      - '.github/workflows/ci-pull-request.yml'
+      - '.github/workflows/ci-pull-request.yaml'
   # for manually triggering workflow
   workflow_dispatch:
 
@@ -50,18 +47,21 @@
     needs: lint
     runs-on: ubuntu-latest
     container:
-      image: apachepegasus/ci-env
+      image: ghcr.io/pegasus-kv/thirdparties-bin:ubuntu1804
     defaults:
       run:
         working-directory: /root/incubator-pegasus
+        shell: bash
     steps:
       - name: Clone Apache Pegasus Source
         working-directory: /root
         run: |
           git clone --recursive --depth=1 https://github.com/apache/incubator-pegasus.git
       - name: Unpack prebuilt third-parties
-        run: unzip /root/pegasus-thirdparty-output.zip -d ./rdsn/thirdparty
+        run: unzip /root/thirdparties-bin.zip -d ./rdsn/thirdparty
       - name: Compilation
         run: ./run.sh build -c --skip_thirdparty
       - name: Unit Testing
-        run: ./run.sh test --on_travis
+        run: |
+          source ./config_hdfs.sh
+          ./run.sh test --on_travis
diff --git a/rdsn b/rdsn
index d8cbbe5..c057d35 160000
--- a/rdsn
+++ b/rdsn
@@ -1 +1 @@
-Subproject commit d8cbbe59854fd382d10954349f24c058ffa1b107
+Subproject commit c057d35c93ff9d895d5eefef343b6c7afd74812d
diff --git a/scripts/pack_common.sh b/scripts/pack_common.sh
index 532ded2..48d3221 100755
--- a/scripts/pack_common.sh
+++ b/scripts/pack_common.sh
@@ -100,3 +100,17 @@
     fi
 }
 
+function pack_system_lib()
+{
+    local package_path=$1
+    local package_type=$2
+    local lib_name=$3
+
+    SYS_LIB_PATH=$(get_system_lib "${package_type}" "${lib_name}")
+    if [ -z "${SYS_LIB_PATH}" ]; then
+        echo "ERROR: library ${lib_name} is missing on your system"
+        exit 1
+    fi
+    SYS_LIB_NAME=$(get_system_libname "${package_type}" "${lib_name}")
+    copy_file "${SYS_LIB_PATH}" "${package_path}/${SYS_LIB_NAME}"
+}
diff --git a/scripts/pack_server.sh b/scripts/pack_server.sh
index 94b7f72..ff97858 100755
--- a/scripts/pack_server.sh
+++ b/scripts/pack_server.sh
@@ -6,9 +6,9 @@
 # to you under the Apache License, Version 2.0 (the
 # "License"); you may not use this file except in compliance
 # with the License.  You may obtain a copy of the License at
-# 
+#
 #   http://www.apache.org/licenses/LICENSE-2.0
-# 
+#
 # Unless required by applicable law or agreed to in writing,
 # software distributed under the License is distributed on an
 # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -18,8 +18,7 @@
 
 source $(dirname $0)/pack_common.sh
 
-function usage()
-{
+function usage() {
     echo "Options for subcommand 'pack_server':"
     echo "  -h"
     echo "  -p|--update-package-template <minos-package-template-file-path>"
@@ -28,55 +27,49 @@
     exit 0
 }
 
-pwd="$( cd "$( dirname "$0"  )" && pwd )"
-shell_dir="$( cd $pwd/.. && pwd )"
-cd $shell_dir
+pwd="$(cd "$(dirname "$0")" && pwd)"
+shell_dir="$(cd $pwd/.. && pwd)"
+cd "$shell_dir" || exit 1
 
-if [ ! -f src/include/pegasus/git_commit.h ]
-then
+if [ ! -f src/include/pegasus/git_commit.h ]; then
     echo "ERROR: src/include/pegasus/git_commit.h not found"
     exit 1
 fi
 
-if [ ! -f DSN_ROOT/bin/pegasus_server/pegasus_server ]
-then
+if [ ! -f DSN_ROOT/bin/pegasus_server/pegasus_server ]; then
     echo "ERROR: DSN_ROOT/bin/pegasus_server/pegasus_server not found"
     exit 1
 fi
 
-if [ ! -f src/builder/CMAKE_OPTIONS ]
-then
+if [ ! -f src/builder/CMAKE_OPTIONS ]; then
     echo "ERROR: src/builder/CMAKE_OPTIONS not found"
     exit 1
 fi
 
-if grep -q Debug src/builder/CMAKE_OPTIONS
-then
+if grep -q Debug src/builder/CMAKE_OPTIONS; then
     build_type=debug
 else
     build_type=release
 fi
-version=`grep "VERSION" src/include/pegasus/version.h | cut -d "\"" -f 2`
-commit_id=`grep "GIT_COMMIT" src/include/pegasus/git_commit.h | cut -d "\"" -f 2`
-glibc_ver=`ldd --version | grep ldd | grep -Eo "[0-9]+.[0-9]+$"`
+version=$(grep "VERSION" src/include/pegasus/version.h | cut -d "\"" -f 2)
+commit_id=$(grep "GIT_COMMIT" src/include/pegasus/git_commit.h | cut -d "\"" -f 2)
+glibc_ver=$(ldd --version | grep ldd | grep -Eo "[0-9]+.[0-9]+$")
 echo "Packaging pegasus server $version ($commit_id) glibc-$glibc_ver $build_type ..."
 
 pack_version=server-$version-${commit_id:0:7}-glibc${glibc_ver}-${build_type}
 pack=pegasus-$pack_version
 
-if [ -f ${pack}.tar.gz ]
-then
+if [ -f ${pack}.tar.gz ]; then
     rm -f ${pack}.tar.gz
 fi
 
-if [ -d ${pack} ]
-then
+if [ -d ${pack} ]; then
     rm -rf ${pack}
 fi
 
 pack_template=""
 if [ -n "$MINOS_CONFIG_FILE" ]; then
-    pack_template=`dirname $MINOS_CONFIG_FILE`/xiaomi-config/package/pegasus.yaml
+    pack_template=$(dirname $MINOS_CONFIG_FILE)/xiaomi-config/package/pegasus.yaml
 fi
 
 custom_gcc="false"
@@ -85,20 +78,20 @@
 while [[ $# > 0 ]]; do
     option_key="$1"
     case $option_key in
-        -p|--update-package-template)
-            pack_template="$2"
-            shift
-            ;;
-        -g|--custom-gcc)
-            custom_gcc="true"
-            ;;
-        -h|--help)
-            usage
-            ;;
-        -k|--keytab-file)
-            keytab_file="$2"
-            shift
-            ;;
+    -p | --update-package-template)
+        pack_template="$2"
+        shift
+        ;;
+    -g | --custom-gcc)
+        custom_gcc="true"
+        ;;
+    -h | --help)
+        usage
+        ;;
+    -k | --keytab-file)
+        keytab_file="$2"
+        shift
+        ;;
     esac
     shift
 done
@@ -121,14 +114,20 @@
 copy_file ./rdsn/thirdparty/output/lib/sasl2 ${pack}/bin
 copy_file ./scripts/sendmail.sh ${pack}/bin
 copy_file ./src/server/config.ini ${pack}/bin
+copy_file ./src/server/config.min.ini ${pack}/bin
+copy_file ./config_hdfs.sh ${pack}/bin
 
-copy_file `get_stdcpp_lib $custom_gcc` ${pack}/bin
-copy_file `get_system_lib server snappy` ${pack}/bin/`get_system_libname server snappy`
-copy_file `get_system_lib server crypto` ${pack}/bin/`get_system_libname server crypto`
-copy_file `get_system_lib server ssl` ${pack}/bin/`get_system_libname server ssl`
-copy_file `get_system_lib server aio` ${pack}/bin/`get_system_libname server aio`
-copy_file `get_system_lib server zstd` ${pack}/bin/`get_system_libname server zstd`
-copy_file `get_system_lib server lz4` ${pack}/bin/`get_system_libname server lz4`
+copy_file "$(get_stdcpp_lib $custom_gcc)" "${pack}/bin"
+
+pack_server_lib() {
+    pack_system_lib "${pack}/bin" server "$1"
+}
+
+pack_server_lib snappy
+pack_server_lib crypto
+pack_server_lib ssl
+pack_server_lib zstd
+pack_server_lib lz4
 
 # Pack hadoop-related files.
 # If you want to use hdfs service to backup/restore/bulkload pegasus tables,
@@ -160,12 +159,12 @@
 DISTRIB_ID=$(cat /etc/*-release | grep DISTRIB_ID | awk -F'=' '{print $2}')
 DISTRIB_RELEASE=$(cat /etc/*-release | grep DISTRIB_RELEASE | awk -F'=' '{print $2}')
 if [ -n "$DISTRIB_ID" ] && [ -n "$DISTRIB_RELEASE" ]; then
-  if [ "$DISTRIB_ID" == "Ubuntu" ] && [ "$DISTRIB_RELEASE" == "18.04" ]; then
-    copy_file "$(get_system_lib server icui18n)" "$pack/bin/$(get_system_libname server icui18n)"
-    copy_file "$(get_system_lib server icuuc)" "$pack/bin/$(get_system_libname server icuuc)"
-    copy_file "$(get_system_lib server icudata)" "$pack/bin/$(get_system_libname server icudata)"
-  fi
-  # more cases can be added here.
+    if [ "$DISTRIB_ID" == "Ubuntu" ] && [ "$DISTRIB_RELEASE" == "18.04" ]; then
+        pack_system_lib icui18n
+        pack_system_lib icuuc
+        pack_system_lib icudata
+    fi
+    # more cases can be added here.
 fi
 
 chmod +x ${pack}/bin/pegasus_* ${pack}/bin/*.sh
@@ -182,6 +181,6 @@
     sed -i "/^source:/c source: \"$PEGASUS_ROOT\"" $pack_template
 fi
 
-echo ${pack} > PACKAGE
+echo ${pack} >PACKAGE
 
 echo "Done"
diff --git a/scripts/pack_tools.sh b/scripts/pack_tools.sh
index 0bc80e1..9f45b0d 100755
--- a/scripts/pack_tools.sh
+++ b/scripts/pack_tools.sh
@@ -114,12 +114,17 @@
 copy_file ./rdsn/thirdparty/output/lib/libtcmalloc_and_profiler.so.4 ${pack}/DSN_ROOT/lib/
 copy_file ./rdsn/thirdparty/output/lib/libboost*.so.1.69.0 ${pack}/DSN_ROOT/lib/
 copy_file `get_stdcpp_lib $custom_gcc` ${pack}/DSN_ROOT/lib/
-copy_file `get_system_lib shell snappy` ${pack}/DSN_ROOT/lib/`get_system_libname shell snappy`
-copy_file `get_system_lib shell crypto` ${pack}/DSN_ROOT/lib/`get_system_libname shell crypto`
-copy_file `get_system_lib shell ssl` ${pack}/DSN_ROOT/lib/`get_system_libname shell ssl`
-copy_file `get_system_lib shell aio` ${pack}/DSN_ROOT/lib/`get_system_libname shell aio`
-copy_file `get_system_lib shell zstd` ${pack}/DSN_ROOT/lib/`get_system_libname shell zstd`
-copy_file `get_system_lib shell lz4` ${pack}/DSN_ROOT/lib/`get_system_libname shell lz4`
+
+pack_tools_lib() {
+    pack_system_lib "${pack}/DSN_ROOT/lib" shell "$1"
+}
+
+pack_tools_lib snappy
+pack_tools_lib crypto
+pack_tools_lib ssl
+pack_tools_lib zstd
+pack_tools_lib lz4
+
 chmod -x ${pack}/DSN_ROOT/lib/*
 
 mkdir -p ${pack}/scripts
diff --git a/src/base/test/CMakeLists.txt b/src/base/test/CMakeLists.txt
index 651e0c0..b3e4e1a 100644
--- a/src/base/test/CMakeLists.txt
+++ b/src/base/test/CMakeLists.txt
@@ -29,6 +29,7 @@
 
 set(MY_PROJ_LIBS
         dsn_runtime
+        dsn_aio
         dsn_utils
         pegasus_base
         gtest)
diff --git a/src/client_lib/CMakeLists.txt b/src/client_lib/CMakeLists.txt
index f2a9986..5b1f96f 100644
--- a/src/client_lib/CMakeLists.txt
+++ b/src/client_lib/CMakeLists.txt
@@ -46,6 +46,7 @@
 set_target_properties(pegasus_client_static
     PROPERTIES
     IMPORTED_LOCATION ${pegasus_client_static_lib})
+target_link_libraries(pegasus_client_static INTERFACE dsn_aio)
 install(FILES ${pegasus_client_static_lib} DESTINATION "lib")
 
 # link the shared lib of pegasus client
diff --git a/src/server/config.ini b/src/server/config.ini
index eb6e560..4b52ffd 100644
--- a/src/server/config.ini
+++ b/src/server/config.ini
@@ -200,7 +200,6 @@
   verbose_commit_log_on_start = false
   delay_for_fd_timeout_on_start = false
   empty_write_disabled = false
-  allow_non_idempotent_write = false
 
   prepare_timeout_ms_for_secondaries = 3000
   prepare_timeout_ms_for_potential_secondaries = 5000
diff --git a/src/server/config.min.ini b/src/server/config.min.ini
index 76612b4..5b9a7b1 100644
--- a/src/server/config.min.ini
+++ b/src/server/config.min.ini
@@ -111,12 +111,9 @@
   recover_from_replica_server = false
 
 [replication]
-  allow_non_idempotent_write = true
   mutation_2pc_min_replica_count = 1
   cold_backup_root = onebox
-  duplication_disabled = true
   cluster_name = onebox
-  cold_backup_checkpoint_reserve_minutes = 10
 
 [meta_server.apps.@APP_NAME@]
   app_name = @APP_NAME@
@@ -134,7 +131,7 @@
   # Options:
   #   - falcon
   #   - prometheus
-  perf_counter_sink =
+  perf_counter_sink = prometheus
   # The HTTP port exposed to Prometheus for pulling metrics from pegasus server.
   prometheus_port = @PROMETHEUS_PORT@
 
diff --git a/src/shell/command_helper.h b/src/shell/command_helper.h
index 65403e7..d345ad6 100644
--- a/src/shell/command_helper.h
+++ b/src/shell/command_helper.h
@@ -1093,3 +1093,14 @@
     st_stat.timestamp = buf;
     return true;
 }
+
+inline configuration_proposal_action new_proposal_action(const dsn::rpc_address &target,
+                                                         const dsn::rpc_address &node,
+                                                         config_type::type type)
+{
+    configuration_proposal_action act;
+    act.__set_target(target);
+    act.__set_node(node);
+    act.__set_type(type);
+    return act;
+}
diff --git a/src/shell/commands/rebalance.cpp b/src/shell/commands/rebalance.cpp
index b326d23..ad3dc38 100644
--- a/src/shell/commands/rebalance.cpp
+++ b/src/shell/commands/rebalance.cpp
@@ -110,7 +110,7 @@
         type_from_string(_config_type_VALUES_TO_NAMES, proposal_type, config_type::CT_INVALID);
     verify_logged(
         tp != config_type::CT_INVALID, "parse %s as config_type failed.\n", proposal_type.c_str());
-    request.action_list = {configuration_proposal_action{target, node, tp}};
+    request.action_list = {new_proposal_action(target, node, tp)};
     dsn::error_code err = sc->ddl_client->send_balancer_proposal(request);
     std::cout << "send proposal response: " << err.to_string() << std::endl;
     return true;
@@ -172,21 +172,18 @@
     actions.reserve(4);
     if (balance_type == "move_pri") {
         actions.emplace_back(
-            configuration_proposal_action{from, from, config_type::CT_DOWNGRADE_TO_SECONDARY});
-        actions.emplace_back(
-            configuration_proposal_action{to, to, config_type::CT_UPGRADE_TO_PRIMARY});
+            new_proposal_action(from, from, config_type::CT_DOWNGRADE_TO_SECONDARY));
+        actions.emplace_back(new_proposal_action(to, to, config_type::CT_UPGRADE_TO_PRIMARY));
     } else if (balance_type == "copy_pri") {
+        actions.emplace_back(new_proposal_action(from, to, config_type::CT_ADD_SECONDARY_FOR_LB));
         actions.emplace_back(
-            configuration_proposal_action{from, to, config_type::CT_ADD_SECONDARY_FOR_LB});
-        actions.emplace_back(
-            configuration_proposal_action{from, from, config_type::CT_DOWNGRADE_TO_SECONDARY});
-        actions.emplace_back(
-            configuration_proposal_action{to, to, config_type::CT_UPGRADE_TO_PRIMARY});
+            new_proposal_action(from, from, config_type::CT_DOWNGRADE_TO_SECONDARY));
+        actions.emplace_back(new_proposal_action(to, to, config_type::CT_UPGRADE_TO_PRIMARY));
     } else if (balance_type == "copy_sec") {
-        actions.emplace_back(configuration_proposal_action{
-            dsn::rpc_address(), to, config_type::CT_ADD_SECONDARY_FOR_LB});
-        actions.emplace_back(configuration_proposal_action{
-            dsn::rpc_address(), from, config_type::CT_DOWNGRADE_TO_INACTIVE});
+        actions.emplace_back(
+            new_proposal_action(dsn::rpc_address(), to, config_type::CT_ADD_SECONDARY_FOR_LB));
+        actions.emplace_back(
+            new_proposal_action(dsn::rpc_address(), from, config_type::CT_DOWNGRADE_TO_INACTIVE));
     } else {
         fprintf(stderr, "parse %s as a balance type failed\n", balance_type.c_str());
         return false;
diff --git a/src/shell/commands/recovery.cpp b/src/shell/commands/recovery.cpp
index 2b58a3e..b1f539b 100644
--- a/src/shell/commands/recovery.cpp
+++ b/src/shell/commands/recovery.cpp
@@ -350,8 +350,8 @@
             if (!primary.is_invalid() && !skip_this) {
                 dsn::replication::configuration_balancer_request request;
                 request.gpid = pinfo.config.pid;
-                request.action_list = {configuration_proposal_action{
-                    primary, primary, config_type::CT_ASSIGN_PRIMARY}};
+                request.action_list = {
+                    new_proposal_action(primary, primary, config_type::CT_ASSIGN_PRIMARY)};
                 request.force = false;
                 dsn::error_code err = sc->ddl_client->send_balancer_proposal(request);
                 out << "    propose_request: propose -g " << request.gpid.to_string()