From 853f884f380dc5097811aa561f9f507461f6b225 Mon Sep 17 00:00:00 2001 From: Michael Bell Date: Tue, 24 Aug 2021 20:11:08 +0100 Subject: [PATCH 1/2] Upgrade Boost to 1.70, fix inefficient connection handling A request to osrm-routed can be assigned to a thread which is currently busy processing another request, even when there are other threads/cores available. This unnecessarily delays the response, and can make requests appear to hang when awaiting CPU intensive requests to finish. The issue looks like a bug in Boost.Asio multithreaded networking stack. osrm-routed server implementation is heavily influenced by the HTTP server 3 example in the Boost.Asio docs. By upgrading to Boost 1.70 and updating the server connections to match the example provided in the 1.70 release, the problem is resolved. The diff of the changes to the Boost.Asio stack are vast, so it's difficult to identify the exact cause. However the implementation change is to push the strand of execution into the socket (and timer) objects, which suggests it could fix the type of threading issue we are observing. --- CHANGELOG.md | 3 +++ CMakeLists.txt | 4 ++-- docker/Dockerfile | 13 ++++++------ include/server/connection.hpp | 4 ++-- include/server/server.hpp | 14 ++++++------- src/server/connection.cpp | 39 +++++++++++++++++------------------ 6 files changed, 40 insertions(+), 37 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cca1ffdefb8..70c690b94f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,10 @@ # Unreleased - Changes from 5.26.0 + - API: + - FIXED: Fix inefficient osrm-routed connection handling [#6113](https://github.com/Project-OSRM/osrm-backend/pull/6113) - Build: - CHANGED: Use Github Actions for building container images [#6138](https://github.com/Project-OSRM/osrm-backend/pull/6138) + - CHANGED: Upgrade Boost dependency to 1.70 [#6113](https://github.com/Project-OSRM/osrm-backend/pull/6113) # 5.26.0 - Changes from 5.25.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index e49fac29aad..aef612daa6f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,7 @@ list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") if(ENABLE_MASON) # versions in use - set(MASON_BOOST_VERSION "1.65.1") + set(MASON_BOOST_VERSION "1.73.0") set(MASON_EXPAT_VERSION "2.2.0") set(MASON_LUA_VERSION "5.2.4") set(MASON_BZIP2_VERSION "1.0.6") @@ -521,7 +521,7 @@ if(ENABLE_MASON) include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libosmium/include) else() - find_package(Boost 1.54 REQUIRED COMPONENTS ${BOOST_COMPONENTS}) + find_package(Boost 1.70 REQUIRED COMPONENTS ${BOOST_COMPONENTS}) add_dependency_includes(${Boost_INCLUDE_DIRS}) find_package(TBB REQUIRED) diff --git a/docker/Dockerfile b/docker/Dockerfile index 056f8c7b6ef..e3d69e3b373 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM debian:stretch-slim as builder +FROM debian:bullseye-slim as builder ARG DOCKER_TAG ARG BUILD_CONCURRENCY RUN mkdir -p /src && mkdir -p /opt @@ -8,7 +8,7 @@ WORKDIR /src RUN NPROC=${BUILD_CONCURRENCY:-$(grep -c ^processor /proc/cpuinfo 2>/dev/null || 1)} && \ apt-get update && \ apt-get -y --no-install-recommends install cmake make git gcc g++ libbz2-dev libxml2-dev \ - libzip-dev libboost1.62-all-dev lua5.2 liblua5.2-dev libtbb-dev -o APT::Install-Suggests=0 -o APT::Install-Recommends=0 && \ + libzip-dev libboost1.74-all-dev lua5.2 liblua5.2-dev libtbb-dev -o APT::Install-Suggests=0 -o APT::Install-Recommends=0 && \ echo "Building OSRM ${DOCKER_TAG}" && \ git show --format="%H" | head -n1 > /opt/OSRM_GITSHA && \ echo "Building OSRM gitsha $(cat /opt/OSRM_GITSHA)" && \ @@ -30,12 +30,13 @@ RUN NPROC=${BUILD_CONCURRENCY:-$(grep -c ^processor /proc/cpuinfo 2>/dev/null || # Multistage build to reduce image size - https://docs.docker.com/engine/userguide/eng-image/multistage-build/#use-multi-stage-builds # Only the content below ends up in the image, this helps remove /src from the image (which is large) -FROM debian:stretch-slim as runstage +FROM debian:bullseye-slim as runstage RUN mkdir -p /src && mkdir -p /opt RUN apt-get update && \ - apt-get install -y --no-install-recommends libboost-program-options1.62.0 libboost-regex1.62.0 \ - libboost-date-time1.62.0 libboost-chrono1.62.0 libboost-filesystem1.62.0 \ - libboost-iostreams1.62.0 libboost-thread1.62.0 expat liblua5.2-0 libtbb2 &&\ + apt-get install -y --no-install-recommends libboost-program-options1.74.0 libboost-regex1.74.0 \ + libboost-date-time1.74.0 libboost-chrono1.74.0 libboost-filesystem1.74.0 \ + libboost-iostreams1.74.0 libboost-system1.74.0 libboost-thread1.74.0 \ + expat liblua5.2-0 libtbb2 &&\ rm -rf /var/lib/apt/lists/* COPY --from=builder /usr/local /usr/local COPY --from=builder /opt /opt diff --git a/include/server/connection.hpp b/include/server/connection.hpp index b40fa2912f3..df5b47d2681 100644 --- a/include/server/connection.hpp +++ b/include/server/connection.hpp @@ -37,7 +37,7 @@ class RequestHandler; class Connection : public std::enable_shared_from_this { public: - explicit Connection(boost::asio::io_service &io_service, RequestHandler &handler); + explicit Connection(boost::asio::io_context &io_context, RequestHandler &handler); Connection(const Connection &) = delete; Connection &operator=(const Connection &) = delete; @@ -60,7 +60,7 @@ class Connection : public std::enable_shared_from_this std::vector compress_buffers(const std::vector &uncompressed_data, const http::compression_type compression_type); - boost::asio::io_service::strand strand; + boost::asio::strand strand; boost::asio::ip::tcp::socket TCP_socket; boost::asio::deadline_timer timer; RequestHandler &request_handler; diff --git a/include/server/server.hpp b/include/server/server.hpp index 06d2ec8e92b..1cc3f11d24f 100644 --- a/include/server/server.hpp +++ b/include/server/server.hpp @@ -43,12 +43,12 @@ class Server } explicit Server(const std::string &address, const int port, const unsigned thread_pool_size) - : thread_pool_size(thread_pool_size), acceptor(io_service), - new_connection(std::make_shared(io_service, request_handler)) + : thread_pool_size(thread_pool_size), acceptor(io_context), + new_connection(std::make_shared(io_context, request_handler)) { const auto port_string = std::to_string(port); - boost::asio::ip::tcp::resolver resolver(io_service); + boost::asio::ip::tcp::resolver resolver(io_context); boost::asio::ip::tcp::resolver::query query(address, port_string); boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query); @@ -74,7 +74,7 @@ class Server for (unsigned i = 0; i < thread_pool_size; ++i) { std::shared_ptr thread = std::make_shared( - boost::bind(&boost::asio::io_service::run, &io_service)); + boost::bind(&boost::asio::io_context::run, &io_context)); threads.push_back(thread); } for (auto thread : threads) @@ -83,7 +83,7 @@ class Server } } - void Stop() { io_service.stop(); } + void Stop() { io_context.stop(); } void RegisterServiceHandler(std::unique_ptr service_handler_) { @@ -96,7 +96,7 @@ class Server if (!e) { new_connection->start(); - new_connection = std::make_shared(io_service, request_handler); + new_connection = std::make_shared(io_context, request_handler); acceptor.async_accept( new_connection->socket(), boost::bind(&Server::HandleAccept, this, boost::asio::placeholders::error)); @@ -108,7 +108,7 @@ class Server } unsigned thread_pool_size; - boost::asio::io_service io_service; + boost::asio::io_context io_context; boost::asio::ip::tcp::acceptor acceptor; std::shared_ptr new_connection; RequestHandler request_handler; diff --git a/src/server/connection.cpp b/src/server/connection.cpp index 31fed90e8e2..ace70b75429 100644 --- a/src/server/connection.cpp +++ b/src/server/connection.cpp @@ -14,8 +14,9 @@ namespace osrm namespace server { -Connection::Connection(boost::asio::io_service &io_service, RequestHandler &handler) - : strand(io_service), TCP_socket(io_service), timer(io_service), request_handler(handler) +Connection::Connection(boost::asio::io_context &io_context, RequestHandler &handler) + : strand(boost::asio::make_strand(io_context)), TCP_socket(strand), timer(strand), + request_handler(handler) { } @@ -24,12 +25,11 @@ boost::asio::ip::tcp::socket &Connection::socket() { return TCP_socket; } /// Start the first asynchronous operation for the connection. void Connection::start() { - TCP_socket.async_read_some( - boost::asio::buffer(incoming_data_buffer), - strand.wrap(boost::bind(&Connection::handle_read, - this->shared_from_this(), - boost::asio::placeholders::error, - boost::asio::placeholders::bytes_transferred))); + TCP_socket.async_read_some(boost::asio::buffer(incoming_data_buffer), + boost::bind(&Connection::handle_read, + this->shared_from_this(), + boost::asio::placeholders::error, + boost::asio::placeholders::bytes_transferred)); if (keep_alive) { @@ -123,9 +123,9 @@ void Connection::handle_read(const boost::system::error_code &error, std::size_t // write result to stream boost::asio::async_write(TCP_socket, output_buffer, - strand.wrap(boost::bind(&Connection::handle_write, - this->shared_from_this(), - boost::asio::placeholders::error))); + boost::bind(&Connection::handle_write, + this->shared_from_this(), + boost::asio::placeholders::error)); } else if (result == RequestParser::RequestStatus::invalid) { // request is not parseable @@ -133,19 +133,18 @@ void Connection::handle_read(const boost::system::error_code &error, std::size_t boost::asio::async_write(TCP_socket, current_reply.to_buffers(), - strand.wrap(boost::bind(&Connection::handle_write, - this->shared_from_this(), - boost::asio::placeholders::error))); + boost::bind(&Connection::handle_write, + this->shared_from_this(), + boost::asio::placeholders::error)); } else { // we don't have a result yet, so continue reading - TCP_socket.async_read_some( - boost::asio::buffer(incoming_data_buffer), - strand.wrap(boost::bind(&Connection::handle_read, - this->shared_from_this(), - boost::asio::placeholders::error, - boost::asio::placeholders::bytes_transferred))); + TCP_socket.async_read_some(boost::asio::buffer(incoming_data_buffer), + boost::bind(&Connection::handle_read, + this->shared_from_this(), + boost::asio::placeholders::error, + boost::asio::placeholders::bytes_transferred)); } } From 84ed6f7d1983e39ea861ebe2991dc763f4a15504 Mon Sep 17 00:00:00 2001 From: Michael Bell Date: Sat, 28 Aug 2021 23:27:18 +0100 Subject: [PATCH 2/2] Upgrade Ubuntu CI builds to use 20.04 Moves Linux CI builds to the latest Ubuntu LTS. - Bumps the GCC matrix to versions {7,8,9,10,11}, making 9 the default for testing non-standard builds. - Bump Node matrix to {12,14,16,LTS,latest} now that 10 is EOL. - Fixes to CI builds due to library changes on newer distro. --- .github/workflows/osrm-backend.yml | 163 +++++++++++++++-------------- CHANGELOG.md | 1 + CMakeLists.txt | 2 +- scripts/ci/before_install.i686.sh | 2 +- 4 files changed, 85 insertions(+), 83 deletions(-) diff --git a/.github/workflows/osrm-backend.yml b/.github/workflows/osrm-backend.yml index 41793473f30..eb4fc4f3fd9 100644 --- a/.github/workflows/osrm-backend.yml +++ b/.github/workflows/osrm-backend.yml @@ -21,13 +21,13 @@ env: jobs: format-taginfo-docs: - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Use Node.js uses: actions/setup-node@v2 with: - node-version: 10 + node-version: 12 - name: Enable Node.js cache uses: actions/cache@v2 with: @@ -54,33 +54,33 @@ jobs: strategy: matrix: include: - - name: gcc-7-debug-cov + - name: gcc-9-debug-cov continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TOOLS: ON BUILD_TYPE: Debug - CCOMPILER: gcc-7 + CCOMPILER: gcc-9 CUCUMBER_TIMEOUT: 20000 - CXXCOMPILER: g++-7 + CXXCOMPILER: g++-9 ENABLE_COVERAGE: ON - - name: gcc-7-debug-asan + - name: gcc-9-debug-asan continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TOOLS: ON BUILD_TYPE: Debug - CCOMPILER: gcc-7 + CCOMPILER: gcc-9 CUCUMBER_TIMEOUT: 20000 - CXXCOMPILER: g++-7 + CXXCOMPILER: g++-9 ENABLE_SANITIZER: ON TARGET_ARCH: x86_64-asan - name: clang-5.0-debug continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TOOLS: ON BUILD_TYPE: Debug CLANG_VERSION: 5.0.0 @@ -88,8 +88,8 @@ jobs: - name: mason-linux-debug-asan continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TOOLS: ON BUILD_TYPE: Release CLANG_VERSION: 5.0.0 @@ -98,76 +98,76 @@ jobs: - name: mason-linux-release continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TOOLS: ON BUILD_TYPE: Release CLANG_VERSION: 5.0.0 ENABLE_MASON: ON - - name: gcc-9-release + - name: gcc-11-release continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TOOLS: ON BUILD_TYPE: Release - CCOMPILER: gcc-9 - CXXCOMPILER: g++-9 - CXXFLAGS: -Wno-cast-function-type + CCOMPILER: gcc-11 + CXXCOMPILER: g++-11 - - name: gcc-8-release + - name: gcc-10-release continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TOOLS: ON BUILD_TYPE: Release - CCOMPILER: gcc-8 - CXXCOMPILER: g++-8 - CXXFLAGS: -Wno-cast-function-type + CCOMPILER: gcc-10 + CXXCOMPILER: g++-10 - - name: gcc-7-release + - name: gcc-9-release continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TOOLS: ON BUILD_TYPE: Release - CCOMPILER: gcc-7 - CXXCOMPILER: g++-7 + CCOMPILER: gcc-9 + CXXCOMPILER: g++-9 + CXXFLAGS: -Wno-cast-function-type - - name: gcc-7-release-i686 + - name: gcc-9-release-i686 continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TOOLS: ON BUILD_TYPE: Release - CCOMPILER: gcc-7 + CCOMPILER: gcc-9 CFLAGS: "-m32 -msse2 -mfpmath=sse" - CXXCOMPILER: g++-7 + CXXCOMPILER: g++-9 CXXFLAGS: "-m32 -msse2 -mfpmath=sse" TARGET_ARCH: i686 - - name: gcc-5-release + - name: gcc-8-release continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TOOLS: ON BUILD_TYPE: Release - CCOMPILER: gcc-5 - CXXCOMPILER: g++-5 + CCOMPILER: gcc-8 + CXXCOMPILER: g++-8 + CXXFLAGS: -Wno-cast-function-type - - name: gcc-6-release + - name: gcc-7-release continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TOOLS: ON BUILD_TYPE: Release - CCOMPILER: gcc-6 - CXXCOMPILER: g++-6 + CCOMPILER: gcc-7 + CXXCOMPILER: g++-7 - - name: mason-osx-release-node-10 + - name: mason-osx-release-node-12 build_node_package: true continue-on-error: false - node: 10 + node: 12 runs-on: macos-10.15 BUILD_TOOLS: ON BUILD_TYPE: Release @@ -177,10 +177,10 @@ jobs: ENABLE_ASSERTIONS: ON ENABLE_MASON: ON - - name: mason-osx-release-node-12 + - name: mason-osx-release-node-14 build_node_package: true continue-on-error: false - node: 12 + node: 14 runs-on: macos-10.15 BUILD_TOOLS: ON BUILD_TYPE: Release @@ -190,10 +190,10 @@ jobs: ENABLE_ASSERTIONS: ON ENABLE_MASON: ON - - name: mason-osx-release-node-14 + - name: mason-osx-release-node-16 build_node_package: true continue-on-error: false - node: 14 + node: 16 runs-on: macos-10.15 BUILD_TOOLS: ON BUILD_TYPE: Release @@ -205,74 +205,75 @@ jobs: - name: gcc-7-release-shared continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TOOLS: ON BUILD_TYPE: Release BUILD_SHARED_LIBS: ON CCOMPILER: gcc-7 CXXCOMPILER: g++-7 - - name: node-14-mason-linux-release + - name: node-12-mason-linux-release build_node_package: true continue-on-error: false - node: 14 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TYPE: Release CLANG_VERSION: 5.0.0 ENABLE_GLIBC_WORKAROUND: ON ENABLE_MASON: ON NODE_PACKAGE_TESTS_ONLY: ON - - name: node-14-mason-linux-debug + - name: node-12-mason-linux-debug build_node_package: true continue-on-error: false - node: 14 - runs-on: ubuntu-18.04 + node: 12 + runs-on: ubuntu-20.04 BUILD_TYPE: Debug CLANG_VERSION: 5.0.0 ENABLE_GLIBC_WORKAROUND: ON ENABLE_MASON: ON NODE_PACKAGE_TESTS_ONLY: ON - - name: node-12-mason-linux-release + - name: node-14-mason-linux-release build_node_package: true continue-on-error: false - node: 12 - runs-on: ubuntu-18.04 + node: 14 + runs-on: ubuntu-20.04 BUILD_TYPE: Release CLANG_VERSION: 5.0.0 ENABLE_GLIBC_WORKAROUND: ON ENABLE_MASON: ON NODE_PACKAGE_TESTS_ONLY: ON - - name: node-12-mason-linux-debug + - name: node-14-mason-linux-debug build_node_package: true continue-on-error: false - node: 12 - runs-on: ubuntu-18.04 + node: 14 + runs-on: ubuntu-20.04 BUILD_TYPE: Debug CLANG_VERSION: 5.0.0 ENABLE_GLIBC_WORKAROUND: ON ENABLE_MASON: ON NODE_PACKAGE_TESTS_ONLY: ON - - name: node-10-mason-linux-release + + - name: node-16-mason-linux-release build_node_package: true continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 16 + runs-on: ubuntu-20.04 BUILD_TYPE: Release CLANG_VERSION: 5.0.0 ENABLE_GLIBC_WORKAROUND: ON ENABLE_MASON: ON NODE_PACKAGE_TESTS_ONLY: ON - - name: node-10-mason-linux-debug + - name: node-16-mason-linux-debug build_node_package: true continue-on-error: false - node: 10 - runs-on: ubuntu-18.04 + node: 16 + runs-on: ubuntu-20.04 BUILD_TYPE: Debug CLANG_VERSION: 5.0.0 ENABLE_GLIBC_WORKAROUND: ON @@ -297,7 +298,7 @@ jobs: continue-on-error: true # TODO: Use node 'latest' once supported: https://github.com/actions/setup-node/issues/257 node: 16 - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 BUILD_TYPE: Release CLANG_VERSION: 5.0.0 ENABLE_GLIBC_WORKAROUND: ON @@ -309,7 +310,7 @@ jobs: continue-on-error: true # TODO: Use node 'latest' once supported: https://github.com/actions/setup-node/issues/257 node: 16 - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 BUILD_TYPE: Debug CLANG_VERSION: 5.0.0 ENABLE_GLIBC_WORKAROUND: ON @@ -332,7 +333,7 @@ jobs: build_node_package: true continue-on-error: true node: "lts/*" - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 BUILD_TYPE: Release CLANG_VERSION: 5.0.0 ENABLE_GLIBC_WORKAROUND: ON @@ -343,7 +344,7 @@ jobs: build_node_package: true continue-on-error: true node: "lts/*" - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 BUILD_TYPE: Debug CLANG_VERSION: 5.0.0 ENABLE_GLIBC_WORKAROUND: ON @@ -410,7 +411,7 @@ jobs: if [[ "$ENABLE_SANITIZER" == 'ON' ]]; then # We can only set this after checkout once we know the workspace directory - echo "LSAN_OPTIONS=suppressions=${GITHUB_WORKSPACE}/scripts/ci/leaksanitizer.conf" >> $GITHUB_ENV + echo "LSAN_OPTIONS=print_suppressions=0:suppressions=${GITHUB_WORKSPACE}/scripts/ci/leaksanitizer.conf" >> $GITHUB_ENV fi if [[ "${RUNNER_OS}" == "Linux" ]]; then diff --git a/CHANGELOG.md b/CHANGELOG.md index 70c690b94f8..decc3da2f76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Build: - CHANGED: Use Github Actions for building container images [#6138](https://github.com/Project-OSRM/osrm-backend/pull/6138) - CHANGED: Upgrade Boost dependency to 1.70 [#6113](https://github.com/Project-OSRM/osrm-backend/pull/6113) + - CHANGED: Upgrade Ubuntu CI builds to 20.04 [#6119](https://github.com/Project-OSRM/osrm-backend/pull/6119) # 5.26.0 - Changes from 5.25.0 diff --git a/CMakeLists.txt b/CMakeLists.txt index aef612daa6f..131db890a22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -697,7 +697,7 @@ install(TARGETS osrm-components DESTINATION bin) if(BUILD_TOOLS) message(STATUS "Activating OSRM internal tools") add_executable(osrm-io-benchmark src/tools/io-benchmark.cpp $) - target_link_libraries(osrm-io-benchmark ${BOOST_BASE_LIBRARIES}) + target_link_libraries(osrm-io-benchmark ${BOOST_BASE_LIBRARIES} ${TBB_LIBRARIES}) install(TARGETS osrm-io-benchmark DESTINATION bin) endif() diff --git a/scripts/ci/before_install.i686.sh b/scripts/ci/before_install.i686.sh index ce0e23a2d1e..a7b8c5f614f 100644 --- a/scripts/ci/before_install.i686.sh +++ b/scripts/ci/before_install.i686.sh @@ -3,4 +3,4 @@ sudo dpkg --add-architecture i386 sudo add-apt-repository --yes ppa:ubuntu-toolchain-r/test && ( sudo apt-get update -qq --yes || true ) -sudo apt-get install -qq --yes --force-yes g++-7-multilib libxml2-dev:i386 libexpat1-dev:i386 libzip-dev:i386 libbz2-dev:i386 libtbb-dev:i386 lua5.2:i386 liblua5.2-dev:i386 libboost-date-time-dev:i386 libboost-filesystem-dev:i386 libboost-iostreams-dev:i386 libboost-program-options-dev:i386 libboost-regex-dev:i386 libboost-system-dev:i386 libboost-thread-dev:i386 libboost-test-dev:i386 +sudo apt-get install -qq --yes --force-yes g++-9-multilib libxml2-dev:i386 libexpat1-dev:i386 libzip-dev:i386 libbz2-dev:i386 libtbb-dev:i386 lua5.2:i386 liblua5.2-dev:i386 libboost-date-time-dev:i386 libboost-filesystem-dev:i386 libboost-iostreams-dev:i386 libboost-program-options-dev:i386 libboost-regex-dev:i386 libboost-system-dev:i386 libboost-thread-dev:i386 libboost-test-dev:i386