Skip to content

Commit 380fea3

Browse files
authored
observer可以直接在控制台输入命令 (#199)
### What problem were solved in this pull request? Issue Number: close #162 Problem: 当前的observer启动流程和调试方法比较繁琐,必须使用客户端服务端的方式,先启动服务端程序,再使用客户端启动调试 ### What is changed and how it works? observer可以直接启动,不监听tcp或unix socket,直接通过终端/控制台输入命令并执行,极大的方便了调试 ### Other information 新的启动方法: ./bin/observer -P cli -f ../etc/observer.ini
1 parent 39042c9 commit 380fea3

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+878
-614
lines changed

.github/workflows/build.yml

+1
Original file line numberDiff line numberDiff line change
@@ -64,4 +64,5 @@ jobs:
6464
shell: bash
6565
run: |
6666
sudo bash build.sh init
67+
echo "begin test..."
6768
python3 test/case/miniob_test.py --test-cases=basic | tail -1 | grep "basic is success"

CMakeLists.txt

+18-23
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
1-
# include 另外一个cmake 配置
2-
#INCLUDE(file1 [OPTIONAL])
3-
41
cmake_minimum_required(VERSION 3.10)
52
set(CMAKE_CXX_STANDARD 20)
6-
#SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
73

84
project(minidb)
95

10-
MESSAGE(STATUS "This is SOURCE dir " ${test_SOURCE_DIR})
11-
MESSAGE(STATUS "This is BINARY dir " ${test_BINARY_DIR})
126
MESSAGE(STATUS "This is Project source dir " ${PROJECT_SOURCE_DIR})
137
MESSAGE(STATUS "This is PROJECT_BINARY_DIR dir " ${PROJECT_BINARY_DIR})
148

159
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
16-
#SET(LIBRARY_OUTPUT_PATH <路径>)
1710

18-
OPTION(ENABLE_ASAN "Enable build with address sanitizer" OFF)
11+
SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake)
12+
13+
OPTION(ENABLE_ASAN "Enable build with address sanitizer" ON)
1914
OPTION(WITH_UNIT_TESTS "Compile miniob with unit tests" ON)
2015
OPTION(CONCURRENCY "Support concurrency operations" OFF)
2116

@@ -77,6 +72,21 @@ ELSE()
7772
ENDIF()
7873
MESSAGE("Install target dir is " ${CMAKE_INSTALL_PREFIX})
7974

75+
IF (DEFINED ENV{LD_LIBRARY_PATH})
76+
SET(LD_LIBRARY_PATH_STR $ENV{LD_LIBRARY_PATH})
77+
string(REPLACE ":" ";" LD_LIBRARY_PATH_LIST ${LD_LIBRARY_PATH_STR})
78+
MESSAGE(" Add LD_LIBRARY_PATH to -L flags " ${LD_LIBRARY_PATH_LIST})
79+
LINK_DIRECTORIES(${LD_LIBRARY_PATH_LIST})
80+
ENDIF ()
81+
82+
IF (EXISTS /usr/local/lib)
83+
LINK_DIRECTORIES (/usr/local/lib)
84+
ENDIF ()
85+
IF (EXISTS /usr/local/lib64)
86+
LINK_DIRECTORIES (/usr/local/lib64)
87+
ENDIF ()
88+
89+
INCLUDE_DIRECTORIES(. ${PROJECT_SOURCE_DIR}/deps /usr/local/include)
8090

8191
# ADD_SUBDIRECTORY(src bin) bin 为目标目录, 可以省略
8292
ADD_SUBDIRECTORY(deps)
@@ -91,16 +101,6 @@ IF(WITH_UNIT_TESTS)
91101
ADD_SUBDIRECTORY(unittest)
92102
ENDIF()
93103

94-
# install 准备安装的目录是cmakefile 的当前目录, 不是build 后生成的目录
95-
# Files 默认权限OWNER_WRITE, OWNER_READ, GROUP_READ,和WORLD_READ,即644权限
96-
# INSTALL(FILES docs/README DESTINATION ./ )
97-
# INSTALL(DIRECTORY docs DESTINATION ./
98-
# PATTERN "README" EXCLUDE)
99-
# PERMISSIONS 可以直接替换
100-
#INSTALL(DIRECTORY bin DESTINATION ./
101-
# FILE_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_READ
102-
# DIRECTORY_PERMISSIONS OWNER_EXECUTE OWNER_WRITE OWNER_READ GROUP_EXECUTE GROUP_READ WORLD_READ WORLD_EXECUTE)
103-
104104
INSTALL(DIRECTORY etc DESTINATION .
105105
FILE_PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
106106

@@ -113,11 +113,6 @@ INSTALL(CODE "MESSAGE(\"Sample install message.\")")
113113
# [ARGS <arguments to executable>]
114114
# [OUTPUT_VARIABLE <var>]
115115

116-
117-
118-
119-
# ADD_TEST与ENABLE_TESTING 参考书籍
120-
121116
#EXEC_PROGRAM(Executable [directory in which to run]
122117
# [ARGS <arguments to executable>]
123118
# [OUTPUT_VARIABLE <var>]

README.md

+7-6
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@ MiniOB 设计的目标是面向在校学生、数据库从业者、爱好者,
88

99
为了帮助开发者更好的上手并学习 miniob, 建议阅读:
1010

11-
1. [miniob 框架介绍](docs/miniob-introduction.md)
12-
2. [如何编译 MiniOB 源码](docs/how_to_build.md)
13-
3. [使用 GitPod 开发 MiniOB](docs/dev_by_gitpod.md)
14-
4. [开发环境搭建(本地调试, 适用 Linux 和 Mac)](docs/how_to_dev_miniob_by_vscode.md)
15-
5. [开发环境搭建(远程调试, 适用于 Window, Linux 和 Mac)](docs/how_to_dev_in_docker_container_by_vscode.md)
16-
6. [MiniOB 词法语法解析开发与测试](docs/miniob-sql-parser.md)
11+
1. [miniob 框架介绍](docs/src/miniob-introduction.md)
12+
2. [如何编译 MiniOB 源码](docs/src/how_to_build.md)
13+
3. [如何运行 MiniOB](docs/src/how_to_run.md)
14+
3. [使用 GitPod 开发 MiniOB](docs/src/dev-env/dev_by_gitpod.md)
15+
4. [开发环境搭建(本地调试, 适用 Linux 和 Mac)](docs/src/dev-env/how_to_dev_miniob_by_vscode.md)
16+
5. [开发环境搭建(远程调试, 适用于 Window, Linux 和 Mac)](docs/src/dev-env/how_to_dev_in_docker_container_by_vscode.md)
17+
6. [MiniOB 各模块文档](docs/src/design/introduction.md)
1718
7. [doxygen 代码文档](docs/doxy/html/index.html)
1819

1920
或者直接看 [MiniOB GitHub Pages](https://oceanbase.github.io/miniob/).

benchmark/CMakeLists.txt

+2-25
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,7 @@
1-
PROJECT(benchmark)
2-
MESSAGE("Begin to build " ${PROJECT_NAME})
3-
MESSAGE(STATUS "This is PROJECT_BINARY_DIR dir " ${PROJECT_BINARY_DIR})
4-
MESSAGE(STATUS "This is PROJECT_SOURCE_DIR dir " ${PROJECT_SOURCE_DIR})
5-
6-
# 可以获取父cmake的变量
7-
MESSAGE("${CMAKE_COMMON_FLAGS}")
8-
9-
#INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
10-
INCLUDE_DIRECTORIES(. ${PROJECT_SOURCE_DIR}/../deps ${PROJECT_SOURCE_DIR}/../src/observer /usr/local/include SYSTEM)
11-
# 父cmake 设置的include_directories 和link_directories并不传导到子cmake里面
12-
#INCLUDE_DIRECTORIES(BEFORE ${CMAKE_INSTALL_PREFIX}/include)
13-
LINK_DIRECTORIES(/usr/local/lib /usr/local/lib64 ${PROJECT_BINARY_DIR}/../lib)
14-
15-
IF (DEFINED ENV{LD_LIBRARY_PATH})
16-
SET(LD_LIBRARY_PATH_STR $ENV{LD_LIBRARY_PATH})
17-
#separate_arguments(LD_LIBRARY_PATH_STR) #只能处理空行
18-
string(REPLACE ":" ";" LD_LIBRARY_PATH_LIST ${LD_LIBRARY_PATH_STR})
19-
MESSAGE(" Add LD_LIBRARY_PATH to -L flags " ${LD_LIBRARY_PATH_LIST})
20-
LINK_DIRECTORIES(${LD_LIBRARY_PATH_LIST})
21-
ELSE ()
22-
LINK_DIRECTORIES(/usr/local/lib)
23-
ENDIF ()
24-
251
find_package(benchmark CONFIG REQUIRED)
262

3+
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/observer)
4+
275
FILE(GLOB_RECURSE ALL_SRC *.cpp)
286
# AUX_SOURCE_DIRECTORY 类似功能
297
FOREACH (F ${ALL_SRC})
@@ -32,4 +10,3 @@ FOREACH (F ${ALL_SRC})
3210
ADD_EXECUTABLE(${prjName} ${F})
3311
TARGET_LINK_LIBRARIES(${prjName} common pthread dl benchmark observer_static)
3412
ENDFOREACH (F)
35-

cmake/readline.cmake

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
2+
MACRO (MINIOB_FIND_READLINE)
3+
4+
FIND_PATH(READLINE_INCLUDE_DIR readline.h PATH_SUFFIXES readline)
5+
FIND_LIBRARY(READLINE_LIBRARY NAMES readline)
6+
IF (READLINE_INCLUDE_DIR AND READLINE_LIBRARY)
7+
SET(HAVE_READLINE 1)
8+
ELSE ()
9+
MESSAGE("cannot find readline")
10+
ENDIF()
11+
12+
ENDMACRO (MINIOB_FIND_READLINE)

deps/CMakeLists.txt

-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,2 @@
11

2-
32
ADD_SUBDIRECTORY(common)

deps/common/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
MESSAGE(STATUS "This is PROJECT_BINARY_DIR dir " ${PROJECT_BINARY_DIR})
22
MESSAGE(STATUS "This is PROJECT_SOURCE_DIR dir " ${PROJECT_SOURCE_DIR})
33

4-
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/deps)
4+
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
55

66
FILE(GLOB_RECURSE ALL_SRC *.cpp)
77
FOREACH(F ${ALL_SRC})

deps/common/seda/stage.h

+3-2
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ class Stage {
205205

206206
/**
207207
* Perform Stage-specific processing for an event
208-
* Processing one event without swtich thread.
208+
* Processing one event without switch thread.
209209
* Handle the event according to requirements of specific stage. Pure
210210
* virtual member function.
211211
*
@@ -222,7 +222,8 @@ class Stage {
222222
*
223223
* @param[in] event Pointer to event that initiated the callback.
224224
*/
225-
virtual void callback_event(StageEvent *event, CallbackContext *context) = 0;
225+
virtual void callback_event(StageEvent *event, CallbackContext *context)
226+
{}
226227

227228
/**
228229
* Perform Stage-specific callback processing for a timed out event

docs/src/SUMMARY.md

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
- [MiniOB 简介](./miniob-introduction.md)
44
- [如何编译](./how_to_build.md)
5+
- [如何运行](./how_to_run.md)
56
- [开发环境搭建](./dev-env/introduction.md)
67
- [使用 GitPod 开发 MiniOB](./dev-env/dev_by_gitpod.md)
78
- [开发环境搭建(本地调试, 适用 Linux 和 Mac)](./dev-env/how_to_dev_miniob_by_vscode.md)

docs/src/how_to_run.md

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# 如何运行
2+
3+
编译完成后,可以在build目录(可能是build_debug或build_release)下找到bin/observer,就是我们的服务端程序,bin/obclient是自带的客户端程序。
4+
当前服务端程序启动已经支持了多种模式,可以以TCP、unix socket方式启动,这时需要启动客户端以发起命令。observer还支持直接执行命令的模式,这时不需要启动客户端,直接在命令行输入命令即可。
5+
6+
**以直接执行命令的方式启动服务端程序**
7+
```bash
8+
./bin/observer -f ../etc/observer.ini -P cli
9+
```
10+
这会以直接执行命令的方式启动服务端程序,可以直接输入命令,不需要客户端。所有的请求都会以单线程的方式运行,配置项中的线程数不再有实际意义。
11+
12+
**以监听TCP端口的方式启动服务端程序**
13+
14+
```bash
15+
./bin/observer -f ../etc/observer.ini -p 6789
16+
```
17+
这会以监听6789端口的方式启动服务端程序。
18+
启动客户端程序:
19+
```bash
20+
./bin/obclient -p 6789
21+
```
22+
这会连接到服务端的6789端口。
23+
24+
**以监听unix socket的方式启动服务端程序**
25+
```bash
26+
./bin/observer -f ../etc/observer.ini -s miniob.sock
27+
```
28+
这会以监听unix socket的方式启动服务端程序。
29+
启动客户端程序:
30+
```bash
31+
./bin/obclient -s miniob.sock
32+
```
33+
这会连接到服务端的miniob.sock文件。
34+
35+
**更多**
36+
observer还提供了一些其它参数,可以通过./bin/observer -h查看。

src/CMakeLists.txt

-13
This file was deleted.

src/obclient/CMakeLists.txt

+5-15
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,14 @@
11
ADD_EXECUTABLE(obclient)
22
MESSAGE("Begin to build " obclient)
33

4-
INCLUDE(CheckIncludeFiles)
4+
INCLUDE(readline)
5+
MINIOB_FIND_READLINE()
56

6-
#INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
7-
TARGET_INCLUDE_DIRECTORIES(obclient PRIVATE . ${PROJECT_SOURCE_DIR}/deps /usr/local/include /usr/include)
8-
# 父cmake 设置的include_directories 和link_directories并不传导到子cmake里面
9-
#INCLUDE_DIRECTORIES(BEFORE ${CMAKE_INSTALL_PREFIX}/include)
10-
11-
# stdio.h 必须放在readline/readline.h 前面,因为readline头文件不能直接单独编译
12-
CHECK_INCLUDE_FILES("stdio.h;readline/readline.h" HAVE_READLINE_HEADER)
13-
14-
FIND_LIBRARY(READLINE_LIBRARY readline)
15-
IF (HAVE_READLINE_HEADER AND READLINE_LIBRARY)
7+
IF (HAVE_READLINE)
168
TARGET_LINK_LIBRARIES(obclient ${READLINE_LIBRARY})
9+
TARGET_INCLUDE_DIRECTORIES(obclient PRIVATE ${READLINE_INCLUDE_DIR})
1710
ADD_DEFINITIONS(-DUSE_READLINE)
11+
MESSAGE ("obclient use readline")
1812
ELSE ()
1913
MESSAGE ("readline is not found")
2014
ENDIF()
@@ -27,13 +21,9 @@ FOREACH (F ${ALL_SRC})
2721

2822
ENDFOREACH (F)
2923

30-
# 指定目标文件位置
31-
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
32-
MESSAGE("Binary directory:" ${EXECUTABLE_OUTPUT_PATH})
3324
TARGET_SOURCES(obclient PRIVATE ${PRJ_SRC})
3425
TARGET_LINK_LIBRARIES(obclient common pthread dl)
3526

36-
3727
# Target 必须在定义 ADD_EXECUTABLE 之后, programs 不受这个限制
3828
# TARGETS和PROGRAMS 的默认权限是OWNER_EXECUTE, GROUP_EXECUTE, 和WORLD_EXECUTE,即755权限, programs 都是处理脚步类
3929
# 类型分为RUNTIME/LIBRARY/ARCHIVE, prog

src/obclient/client.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ char *my_readline(const char *prompt)
7575
fprintf(stderr, "failed to alloc line buffer");
7676
return nullptr;
7777
}
78-
fprintf(stdout, prompt);
78+
fprintf(stdout, "%s", prompt);
7979
char *s = fgets(buffer, MAX_MEM_BUFFER_SIZE, stdin);
8080
if (nullptr == s) {
8181
fprintf(stderr, "failed to read message from console");

src/observer/CMakeLists.txt

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
MESSAGE(STATUS "This is CMAKE_CURRENT_SOURCE_DIR dir " ${CMAKE_CURRENT_SOURCE_DIR})
22

3-
INCLUDE_DIRECTORIES(. ${CMAKE_CURRENT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/deps /usr/local/include)
4-
LINK_DIRECTORIES(/usr/local/lib)
3+
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
54

65
FILE(GLOB_RECURSE ALL_SRC *.cpp *.c)
76
SET(MAIN_SRC main.cpp)
@@ -33,6 +32,17 @@ ADD_EXECUTABLE(observer ${MAIN_SRC})
3332
TARGET_LINK_LIBRARIES(observer observer_static)
3433

3534
ADD_LIBRARY(observer_static STATIC ${LIB_SRC})
35+
INCLUDE (readline)
36+
MINIOB_FIND_READLINE()
37+
IF (HAVE_READLINE)
38+
TARGET_LINK_LIBRARIES(observer_static ${READLINE_LIBRARY})
39+
TARGET_INCLUDE_DIRECTORIES(observer_static PRIVATE ${READLINE_INCLUDE_DIR})
40+
ADD_DEFINITIONS(-DUSE_READLINE)
41+
MESSAGE ("observer_static use readline")
42+
ELSE ()
43+
MESSAGE ("readline is not found")
44+
ENDIF()
45+
3646
SET_TARGET_PROPERTIES(observer_static PROPERTIES OUTPUT_NAME observer)
3747
TARGET_LINK_LIBRARIES(observer_static ${LIBRARIES})
3848

src/observer/common/rc.h

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ See the Mulan PSL v2 for more details. */
1616

1717
/**
1818
* @brief 这个文件定义函数返回码/错误码(Return Code)
19+
* @enum RC
1920
*/
2021

2122
#define DEFINE_RCS \

src/observer/main.cpp

+8-7
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ void usage()
3838
std::cout << "-p: server port. if not specified, the item in the config file will be used" << std::endl;
3939
std::cout << "-f: path of config file." << std::endl;
4040
std::cout << "-s: use unix socket and the argument is socket address" << std::endl;
41-
std::cout << "-P: protocol. {plain(default), mysql}." << std::endl;
41+
std::cout << "-P: protocol. {plain(default), mysql, cli}." << std::endl;
4242
std::cout << "-t: transaction model. {vacuous(default), mvcc}." << std::endl;
4343
std::cout << "-n: buffer pool memory size in byte" << std::endl;
4444
exit(0);
@@ -75,9 +75,6 @@ void parse_parameter(int argc, char **argv)
7575
case 'e':
7676
process_param->set_std_err(optarg);
7777
break;
78-
case 'd':
79-
process_param->set_demon(true);
80-
break;
8178
case 't':
8279
process_param->set_trx_kit_name(optarg);
8380
break;
@@ -131,11 +128,14 @@ Server *init_server()
131128
server_param.port = port;
132129
if (0 == strcasecmp(process_param->get_protocol().c_str(), "mysql")) {
133130
server_param.protocol = CommunicateProtocol::MYSQL;
131+
} else if (0 == strcasecmp(process_param->get_protocol().c_str(), "cli")) {
132+
server_param.use_std_io = true;
133+
server_param.protocol = CommunicateProtocol::CLI;
134134
} else {
135135
server_param.protocol = CommunicateProtocol::PLAIN;
136136
}
137137

138-
if (process_param->get_unix_socket_path().size() > 0) {
138+
if (process_param->get_unix_socket_path().size() > 0 && !server_param.use_std_io) {
139139
server_param.use_unix_socket = true;
140140
server_param.unix_socket_path = process_param->get_unix_socket_path();
141141
}
@@ -166,13 +166,14 @@ void quit_signal_handle(int signum)
166166

167167
int main(int argc, char **argv)
168168
{
169+
int rc = STATUS_SUCCESS;
170+
169171
setSignalHandler(quit_signal_handle);
170172

171173
parse_parameter(argc, argv);
172174

173-
int rc = STATUS_SUCCESS;
174175
rc = init(the_process_param());
175-
if (rc) {
176+
if (rc != STATUS_SUCCESS) {
176177
std::cerr << "Shutdown due to failed to init!" << std::endl;
177178
cleanup();
178179
return rc;

src/observer/net/buffered_writer.cpp

+1-4
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,7 @@ RC BufferedWriter::close()
4343
return rc;
4444
}
4545

46-
if (fd_ >= 0) {
47-
::close(fd_);
48-
fd_ = -1;
49-
}
46+
fd_ = -1;
5047

5148
return RC::SUCCESS;
5249
}

0 commit comments

Comments
 (0)