2
* Copyright (c) 2021 OceanBase
3
* OceanBase CE is licensed under Mulan PubL v2.
4
* You can use this software according to the terms and conditions of the Mulan PubL v2.
5
* You may obtain a copy of Mulan PubL v2 at:
6
* http://license.coscl.org.cn/MulanPubL-2.0
7
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
8
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
9
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
10
* See the Mulan PubL v2 for more details.
13
#define USING_LOG_PREFIX SERVER
15
#include "observer/ob_signal_handle.h"
17
#include "io/easy_log.h"
19
#include "share/ob_define.h"
20
#include "share/ob_errno.h"
21
#include "lib/allocator/ob_malloc.h"
22
#include "lib/profile/ob_profile_log.h"
23
#include "lib/profile/ob_perf_event.h"
24
#include "lib/profile/ob_atomic_event.h"
25
#include "lib/signal/ob_signal_struct.h"
26
#include "storage/memtable/ob_memtable.h"
27
#include "observer/ob_server.h"
28
#include "observer/ob_dump_task_generator.h"
29
#include "sql/ob_sql_init.h"
30
#include "lib/allocator/ob_pcounter.h"
31
#include "storage/tx_storage/ob_tenant_memory_printer.h"
35
using namespace common;
36
using namespace storage;
40
void ObSignalHandle::run1()
45
lib::set_thread_name("SignalHandle");
47
if (OB_FAIL(add_signums_to_set(waitset))) {
48
LOG_ERROR("Add signal set error", K(ret));
51
//to check _stop every second
52
struct timespec timeout = {1, 0};
53
while (!has_set_stop()) {//need not to check ret
55
oceanbase::lib::Thread::WaitGuard guard(oceanbase::lib::Thread::WAIT);
56
signum = sigtimedwait(&waitset, NULL, &timeout);
59
//do not log error, because timeout will also return -1.
60
} else if (OB_FAIL(deal_signals(signum))) {
61
LOG_WARN("Deal signal error", K(ret), K(signum));
69
int ObSignalHandle::change_signal_mask()
72
sigset_t block_set, old_set;
73
if (OB_FAIL(add_signums_to_set(block_set))) {
74
LOG_ERROR("Add signal set error", K(ret));
75
} else if (0 != pthread_sigmask(SIG_BLOCK, &block_set, &old_set)) {
76
ret = OB_ERR_UNEXPECTED;
77
LOG_ERROR("Fail to change mask of blcked signals", K(ret));
84
int ObSignalHandle::add_signums_to_set(sigset_t &sig_set)
87
if (0 != sigemptyset(&sig_set)) {
88
ret = OB_ERR_UNEXPECTED;
89
LOG_ERROR("Empty signal set error", K(ret));
92
int signals[] = {SIGPIPE, SIGTERM, SIGUSR1,
93
40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
94
50, 51, 52, 53, 55, 56, 57, 59, 60, 62,
96
for (int64_t i = 0; OB_SUCC(ret) && i < ARRAYSIZEOF(signals); ++i) {
97
if (0 != (rc = sigaddset(&sig_set, signals[i]))) {
98
ret = OB_ERR_UNEXPECTED;
99
LOG_ERROR("failed to add signal to block", "signum", signals[i], K(ret), K(rc));
106
//signal http://blog.csdn.net/yiyeguzhou100/article/details/51316175
107
int ObSignalHandle::deal_signals(int signum)
109
int ret = OB_SUCCESS;
110
LOG_INFO("received signal", K(signum));
121
ObServer::get_instance().prepare_stop();
122
ObServer::get_instance().set_stop();
126
OB_LOGGER.check_file();
130
int64_t version = ::oceanbase::common::ObTimeUtility::current_time();
131
OB_LOGGER.down_log_level(version);
132
// ASYNC_LOG_LOGGER.down_log_level();
133
//to echo info when change to warn level
134
LOG_WARN("Signal 41 down ObLogger level", "current level", OB_LOGGER.get_level());
138
int64_t version = ::oceanbase::common::ObTimeUtility::current_time();
139
OB_LOGGER.up_log_level(version);
140
// ASYNC_LOG_LOGGER.up_log_level();
141
LOG_WARN("Signal 42 up ObLogger level", "current level", OB_LOGGER.get_level());
144
case 43: { // toggle atomic operation profiler
145
if (OB_ATOMIC_EVENT_IS_ENABLED()) {
146
OB_DISABLE_ATOMIC_EVENT();
147
LOG_WARN("atomic operation profiler disabled, see `atomic.pfda'");
149
OB_ENABLE_ATOMIC_EVENT();
150
LOG_WARN("atomic operation profiler enabled");
155
if (OB_ISNULL(ObProfileLogger::getInstance())) {
156
ret = OB_ERR_UNEXPECTED;
157
LOG_ERROR("ObProfileLogger instance should not be NULL", K(ret));
159
ObProfileLogger::getInstance()->setLogLevel("INFO");
164
if (OB_ISNULL(ObProfileLogger::getInstance())) {
165
ret = OB_ERR_UNEXPECTED;
166
LOG_ERROR("ObProfileLogger instance should not be NULL", K(ret));
168
ObProfileLogger::getInstance()->setLogLevel("DEBUG");
173
easy_log_level = static_cast<easy_log_level_t>(static_cast<int>(easy_log_level) + 1);
174
LOG_INFO("libeasy log level changed", K(easy_log_level));
178
easy_log_level = static_cast<easy_log_level_t>(static_cast<int>(easy_log_level) - 1);
179
LOG_INFO("libeasy log level changed", K(easy_log_level));
183
ob_print_mod_memory_usage();
186
ObTenantMemoryPrinter::get_instance().print_tenant_usage();
191
LOG_WARN("perf event enabled");
195
DISABLE_PERF_EVENT();
196
LOG_WARN("perf event disabled");
202
ObLogger::get_logger().set_mod_log_levels("ALL.*:ERROR, SQL.*:DEBUG, RPC.*:WARN"))) {
203
LOG_WARN("Set mod log level error", K(ret));
208
if (OB_ISNULL(ObServer::get_instance().get_gctx().omt_)) {
209
ret = OB_ERR_UNEXPECTED;
210
LOG_ERROR("ObMultiTenant in global context should not be NULL", K(ret));
212
ObServer::get_instance().get_gctx().omt_->set_cpu_dump();
213
LOG_INFO("CPU_DUMP: switch on");
218
if (OB_ISNULL(ObServer::get_instance().get_gctx().omt_)) {
219
ret = OB_ERR_UNEXPECTED;
220
LOG_ERROR("ObMultiTenant in global context should not be NULL", K(ret));
222
ObServer::get_instance().get_gctx().omt_->unset_cpu_dump();
223
LOG_INFO("CPU_DUMP: switch off");
228
// clog::ObBatchSubmitMockTest::handle_signal();
231
case 59: { // similar to 49, verbose mode
232
ob_print_mod_memory_usage(false, true);
233
sql::print_sql_stat();
238
send_request_and_wait(VERB_LEVEL_1,
239
syscall(SYS_gettid)/*exclude_id*/);
244
//RESP_DUMP_TRACE_TO_FILE();
245
ObDumpTaskGenerator::generate_task_from_file();
249
// print tenant memstore consumption condition by wenduo.swd
250
ObTenantMemoryPrinter::get_instance().print_tenant_usage();
254
LOG_WARN("Ignore unknown signal", K(signum));