test socket
This commit is contained in:
@ -60,6 +60,12 @@ FetchContent_Declare(
|
|||||||
URL ${CMAKE_SOURCE_DIR}/deps/spdlog-v1.13.0-mirror.zip
|
URL ${CMAKE_SOURCE_DIR}/deps/spdlog-v1.13.0-mirror.zip
|
||||||
)
|
)
|
||||||
FetchContent_MakeAvailable(spdlog)
|
FetchContent_MakeAvailable(spdlog)
|
||||||
|
FetchContent_Declare(
|
||||||
|
sockpp
|
||||||
|
URL_HASH SHA256=d144b3dcc7e9f031a9205395deb334b0b9681e1e7db61c066cca22ec2650a77b
|
||||||
|
URL ${CMAKE_SOURCE_DIR}/deps/sockpp-v1.0.0-mirror.zip
|
||||||
|
)
|
||||||
|
FetchContent_MakeAvailable(sockpp)
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/bpt/include)
|
include_directories(${CMAKE_SOURCE_DIR}/bpt/include)
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/stlite)
|
include_directories(${CMAKE_SOURCE_DIR}/stlite)
|
||||||
enable_testing()
|
enable_testing()
|
||||||
|
BIN
deps/sockpp-v1.0.0-mirror.zip
vendored
Normal file
BIN
deps/sockpp-v1.0.0-mirror.zip
vendored
Normal file
Binary file not shown.
19
design.md
19
design.md
@ -1,11 +1,14 @@
|
|||||||
# 规划的Bonus实现方式
|
# 规划的Bonus实现方式
|
||||||
- 缓存:LRU
|
- 缓存:LRU
|
||||||
- 空间回收
|
- 空间回收
|
||||||
- 快照:不内置于数据库系统,而是直接针对整个数据文件夹打快照(类似于git,在火车票系统后端处于非活动状态时操作,比对工作文件夹和版本库中的最后一次commit,然后打一个新的commit进去),额外消耗空间为压缩后的 当前文件实际大小+变化量,使用zstd算法压缩。交互方式:`./core-cli snapshot [options]`
|
- 快照:贯通于数据库系统和火车票系统整体,而是直接针对整个数据文件夹打快照(类似于git,在火车票系统后端处于非活动状态时操作,比对工作文件夹和版本库中的最后一次commit,然后打一个新的commit进去),额外消耗空间为压缩后的 当前文件实际大小+变化量,使用zstd算法压缩。交互方式:`./core-cli snapshot [options]`
|
||||||
- 并发:内置于数据库系统,基于`std::shared_mutex`的简单并发。(但火车票系统会直接在整个业务层面上读写锁,因此不会直接使用数据库系统的并发安全)。
|
- 并发:内置于数据库系统,基于`std::shared_mutex`的简单并发。(但火车票系统会直接在整个业务层面上读写锁,因此不会直接使用数据库系统的并发安全)。
|
||||||
- 容错:不内置于数据库系统,由火车票系统针对实际业务逻辑记录日志。在文件系统层级上修复完损伤后,运行`./core-cli fsck`检查是否有可能有损坏,借助快照工具修复可能的损伤。
|
- 容错:不内置于数据库系统,由火车票系统针对实际业务逻辑记录日志。在文件系统层级上修复完损伤后,运行`./core-cli fsck`检查是否有可能有损坏,借助快照系统修复可能的损伤。
|
||||||
- 前端:一个使用正经框架写的简洁美观的UI,无响应式设计。
|
- 前端:一个使用正经框架写的简洁美观的UI,无响应式设计。
|
||||||
|
|
||||||
|
## 快照系统
|
||||||
|
一个仿照git的直接针对文件的快照库,有Work Tree、Stage、Commit等概念。虽然快照系统直接集成于数据库系统,但对用户开放的操作是以整个火车票系统为单位的。火车票系统会每隔数秒或数千比交易执行一次暂存,此时数据库系统会把缓存写回磁盘,记录数据操作日志,以及在快照系统中执行Stash;打快照时,会依次把缓存写回磁盘、记录日志(以单笔业务为最小单位)、stage工作目录、创建commit。
|
||||||
|
|
||||||
因为详细的数据库相关知识没学,所以正经并发和更细粒度的容错就不打算自己瞎搓了。
|
因为详细的数据库相关知识没学,所以正经并发和更细粒度的容错就不打算自己瞎搓了。
|
||||||
|
|
||||||
# 内核设计
|
# 内核设计
|
||||||
@ -13,8 +16,16 @@
|
|||||||
- bpt:原始B+树以及相关简单封装,和其他一些涉及具体磁盘存储的东西
|
- bpt:原始B+树以及相关简单封装,和其他一些涉及具体磁盘存储的东西
|
||||||
- 一个火车票系统执行引擎
|
- 一个火车票系统执行引擎
|
||||||
- 一个直接的命令行交互系统,用于OJ测试/单会话模式/快照管理/数据错误检查
|
- 一个直接的命令行交互系统,用于OJ测试/单会话模式/快照管理/数据错误检查
|
||||||
- C Extensions封装,用于对接服务端
|
- 一个Socket服务端,用于对接服务端
|
||||||
# UI设计
|
# UI设计
|
||||||
- 语言:Python
|
- 语言:Python
|
||||||
- 与内核的交互:C Extensions
|
- 与内核的交互:Socket
|
||||||
- Web框架:FastAPI + socket.IO + (React?) + BootStrap
|
- Web框架:FastAPI + socket.IO + (React?) + BootStrap
|
||||||
|
|
||||||
|
___
|
||||||
|
# 使用到的第三方库
|
||||||
|
均为在不涉及核心功能的情况下为了让程序更优雅而使用:
|
||||||
|
- argparse:提供优雅的命令行参数解析
|
||||||
|
- googletest:调试用
|
||||||
|
- spdlog:运行日志,调试用(不是数据库系统日志)
|
||||||
|
- sockpp:服务器模式下与Python交互用
|
@ -6,4 +6,5 @@ endif()
|
|||||||
add_executable(${BACKEND_EXETUABLE_NAME} main.cpp)
|
add_executable(${BACKEND_EXETUABLE_NAME} main.cpp)
|
||||||
target_link_libraries(${BACKEND_EXETUABLE_NAME} argparse)
|
target_link_libraries(${BACKEND_EXETUABLE_NAME} argparse)
|
||||||
target_link_libraries(${BACKEND_EXETUABLE_NAME} spdlog::spdlog)
|
target_link_libraries(${BACKEND_EXETUABLE_NAME} spdlog::spdlog)
|
||||||
|
target_link_libraries(${BACKEND_EXETUABLE_NAME} sockpp)
|
||||||
set_target_properties(${BACKEND_EXETUABLE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
set_target_properties(${BACKEND_EXETUABLE_NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})
|
24
src/main.cpp
24
src/main.cpp
@ -1,3 +1,4 @@
|
|||||||
|
#include <sockpp/tcp_acceptor.h>
|
||||||
#include "basic_defs.h"
|
#include "basic_defs.h"
|
||||||
const std::string main_version = "0.0.1";
|
const std::string main_version = "0.0.1";
|
||||||
const std::string build_version = GIT_COMMIT_HASH;
|
const std::string build_version = GIT_COMMIT_HASH;
|
||||||
@ -17,6 +18,14 @@ int main(int argc, char *argv[]) {
|
|||||||
argparse::ArgumentParser fsck_command("fsck");
|
argparse::ArgumentParser fsck_command("fsck");
|
||||||
fsck_command.add_description("Check and fix data");
|
fsck_command.add_description("Check and fix data");
|
||||||
program.add_subparser(fsck_command);
|
program.add_subparser(fsck_command);
|
||||||
|
argparse::ArgumentParser server_command("server");
|
||||||
|
server_command.add_description("Start a socket server");
|
||||||
|
server_command.add_argument("-p", "--port").help("Port to listen").default_value(8085).nargs(1, 1).scan<'i', int>();
|
||||||
|
server_command.add_argument("-a", "--address")
|
||||||
|
.help("Address to bind")
|
||||||
|
.default_value(std::string("127.0.0.1"))
|
||||||
|
.nargs(1, 1);
|
||||||
|
program.add_subparser(server_command);
|
||||||
program.add_argument("-d", "--directory").help("Directory to serve").default_value(std::string(".")).nargs(1, 1);
|
program.add_argument("-d", "--directory").help("Directory to serve").default_value(std::string(".")).nargs(1, 1);
|
||||||
auto &group = program.add_mutually_exclusive_group();
|
auto &group = program.add_mutually_exclusive_group();
|
||||||
group.add_argument("-c", "--consolelog").help("Enable console log").default_value(false).implicit_value(true);
|
group.add_argument("-c", "--consolelog").help("Enable console log").default_value(false).implicit_value(true);
|
||||||
@ -62,5 +71,20 @@ int main(int argc, char *argv[]) {
|
|||||||
LOG->info("Starting backend");
|
LOG->info("Starting backend");
|
||||||
LOG->info("Compile optimization enabled: {}", optimize_enabled);
|
LOG->info("Compile optimization enabled: {}", optimize_enabled);
|
||||||
LOG->info("Data directory: {}", data_directory);
|
LOG->info("Data directory: {}", data_directory);
|
||||||
|
bool is_server = program.is_subcommand_used("server");
|
||||||
|
LOG->info("Server mode: {}", is_server);
|
||||||
|
if (is_server) {
|
||||||
|
auto port = server_command.get<int>("--port");
|
||||||
|
auto address = server_command.get<std::string>("--address");
|
||||||
|
LOG->info("Server port: {}", port);
|
||||||
|
LOG->info("Server address: {}", address);
|
||||||
|
LOG->info("Starting server");
|
||||||
|
sockpp::tcp_acceptor acceptor(sockpp::inet_address(address, port));
|
||||||
|
if (!acceptor) {
|
||||||
|
LOG->error("Error creating acceptor: {}", acceptor.last_error_str());
|
||||||
|
return 1;
|
||||||
|
} else
|
||||||
|
LOG->info("successfully bind to address {} port {}", address, port);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
Reference in New Issue
Block a user