diff --git a/roles/check_system_static/tasks/main.yml b/roles/check_system_static/tasks/main.yml index 832fd9980..54432335e 100644 --- a/roles/check_system_static/tasks/main.yml +++ b/roles/check_system_static/tasks/main.yml @@ -13,8 +13,26 @@ - name: Preflight check - Linux OS family and distribution version fail: - msg: "Red Hat Enterprise Linux/CentOS 6 is deprecated. Please use CentOS 7.3 and above. See https://github.com/pingcap/docs/blob/master/op-guide/recommendation.md" - when: "ansible_os_family == 'RedHat' and ansible_distribution_major_version == '6'" + msg: "System versions lower than Red Hat Enterprise Linux / CentOS 7.3 have been deprecated. Please use CentOS 7.3 and above. See https://github.com/pingcap/docs/blob/master/op-guide/recommendation.md" + when: + - ansible_os_family == 'RedHat' + - ansible_distribution != 'Amazon' + - ansible_distribution_version < '7.3' + +- name: Deploy epollexclusive script + copy: src="{{ script_dir }}/check/epollexclusive" dest="{{ deploy_dir }}/epollexclusive" mode=0755 + +- name: Preflight check - Check if the operating system supports EPOLLEXCLUSIVE + shell: "{{ deploy_dir }}/epollexclusive" + register: epollexclusive_check + +- name: Clean epollexclusive script + file: path={{ deploy_dir }}/epollexclusive state=absent + +- name: Preflight check - Fail when epollexclusive is unavailable + fail: + msg: "The current machine may be a docker virtual machine, and the corresponding physical machine operating system does not support epollexclusive" + when: epollexclusive_check.stdout.find("True") == -1 - name: Deploy check_cpufreq script copy: src="{{ script_dir }}/check/check_cpufreq.py" dest="{{ deploy_dir }}/check_cpufreq.py" mode=0755 @@ -29,7 +47,7 @@ - name: Preflight check - Fail when CPU frequency governor is not set to performance mode fail: - msg: To achieve maximum performance, it is recommended to set The CPU frequency governor to performance mode, see https://github.com/pingcap/docs/blob/master/op-guide/ansible-deployment.md#step-7-configure-the-cpufreq-governor-mode-on-the-target-machine + msg: "To achieve maximum performance, it is recommended to set The CPU frequency governor to performance mode, see https://github.com/pingcap/docs/blob/master/op-guide/ansible-deployment.md#step-7-configure-the-cpufreq-governor-mode-on-the-target-machine" when: - cpufreq_available_governors.stdout.find("performance") != -1 - cpufreq_current_governor.stdout.find("performance") == -1 diff --git a/rolling_update.yml b/rolling_update.yml index 54cce4ca0..f23945389 100644 --- a/rolling_update.yml +++ b/rolling_update.yml @@ -38,6 +38,22 @@ roles: - check_config_dynamic +- name: Pre-check for rolling update + hosts: tidb_servers + any_errors_fatal: true + serial: 1 + tags: + - always + tasks: + - shell: "{{ deploy_dir }}/bin/tidb-server -V" + register: current_version + + - name: Check whether can perform rolling update + fail: + msg: "Rolling update from {{ current_version.stdout_lines[0].replace(' ','').split(':')[1] }} to {{ tidb_version }} is forbidden" + when: + - current_version.stdout_lines[0].replace(' ','').split(':')[1] <= "v2.0.1" + - tidb_version >= "v2.1.0" or tidb_version == "latest" - name: rolling update PD cluster hosts: pd_servers diff --git a/scripts/check/check_cpufreq.py b/scripts/check/check_cpufreq.py old mode 100644 new mode 100755 diff --git a/scripts/check/epoll_chk.cc b/scripts/check/epoll_chk.cc new file mode 100644 index 000000000..5f6e99813 --- /dev/null +++ b/scripts/check/epoll_chk.cc @@ -0,0 +1,100 @@ +/* + * + * Copyright 2017 gRPC authors. + * + * Licensed 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 KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include +#include +#include + +#ifndef EPOLLEXCLUSIVE +#define EPOLLEXCLUSIVE (1 << 28) +#endif + +/* This polling engine is only relevant on linux kernels supporting epoll() */ +bool grpc_is_epollexclusive_available(void) { + static bool logged_why_not = false; + + int fd = epoll_create1(EPOLL_CLOEXEC); + if (fd < 0) { + if (!logged_why_not) { + printf( + "epoll_create1 failed with error: %d. Not using epollex polling " + "engine.", + fd); + logged_why_not = true; + } + return false; + } + int evfd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC); + if (evfd < 0) { + if (!logged_why_not) { + printf( + "eventfd failed with error: %d. Not using epollex polling " + "engine.", + fd); + logged_why_not = true; + } + close(fd); + return false; + } + struct epoll_event ev; + /* choose events that should cause an error on + EPOLLEXCLUSIVE enabled kernels - specifically the combination of + EPOLLONESHOT and EPOLLEXCLUSIVE */ + ev.events = (uint32_t)(EPOLLET | EPOLLIN | EPOLLEXCLUSIVE | EPOLLONESHOT); + ev.data.ptr = NULL; + if (epoll_ctl(fd, EPOLL_CTL_ADD, evfd, &ev) != 0) { + if (errno != EINVAL) { + if (!logged_why_not) { + printf( + "epoll_ctl with EPOLLEXCLUSIVE | EPOLLONESHOT failed with error: " + "%d. Not using epollex polling engine.", + errno); + logged_why_not = true; + } + close(fd); + close(evfd); + return false; + } + } else { + if (!logged_why_not) { + printf( + "epoll_ctl with EPOLLEXCLUSIVE | EPOLLONESHOT succeeded. This is " + "evidence of no EPOLLEXCLUSIVE support. Not using " + "epollex polling engine."); + logged_why_not = true; + } + close(fd); + close(evfd); + return false; + } + close(evfd); + close(fd); + return true; +} + +int main() { + if (grpc_is_epollexclusive_available()) { + printf("True: epollexclusive is available\n"); + return 0; + } else { + printf("False: epollexclusive is NOT available\n"); + return 1; + } +} diff --git a/scripts/check/epollexclusive b/scripts/check/epollexclusive new file mode 100755 index 000000000..f8d73a4c9 Binary files /dev/null and b/scripts/check/epollexclusive differ