Merge branch 'gitee-master' into gitlab-upstream

This commit is contained in:
zhengshuxin 2023-07-27 18:48:31 +08:00
commit 1d5cdb4298
8 changed files with 413 additions and 2 deletions

View File

@ -16,6 +16,7 @@ rdb::rdb() : db_(nullptr) {}
rdb::~rdb() { rdb::~rdb() {
delete db_; delete db_;
logger("rdb in %s closed", path_.c_str());
} }
bool rdb::open(const char* path) { bool rdb::open(const char* path) {

View File

@ -17,6 +17,7 @@ wdb::wdb(size_t cache_max) : db_(nullptr), cache_max_(cache_max) {}
wdb::~wdb() { wdb::~wdb() {
if (db_) { if (db_) {
db_->close(db_, nullptr); db_->close(db_, nullptr);
logger("wdb in %s closed", path_.c_str());
} }
} }
@ -96,4 +97,4 @@ void wdb::put_session(wt_sess* sess) {
} // namespace pkv } // namespace pkv
#endif // HAS_WT #endif // HAS_WT

View File

@ -1,7 +1,16 @@
#include "stdafx.h" #include "stdafx.h"
#include <signal.h>
#include "proto/redis_coder.h" #include "proto/redis_coder.h"
#include "master_service.h" #include "master_service.h"
static void on_sigint(int) {
master_service& ms = acl::singleton2<master_service>::get_instance();
logger("---Begin to close db---");
ms.close_db();
logger("---Close db ok---");
exit(0);
}
static bool test_redis_coder(const char* file) { static bool test_redis_coder(const char* file) {
#if 1 #if 1
printf(">>>>>>>>Begin to test redis parsing<<<<<<<<<\r\n"); printf(">>>>>>>>Begin to test redis parsing<<<<<<<<<\r\n");
@ -42,6 +51,8 @@ int main(int argc, char *argv[]) {
test_redis_coder(file); test_redis_coder(file);
return 0; return 0;
} else if (argc == 1 || (argc >= 2 && strcasecmp(argv[1], "alone") == 0)) { } else if (argc == 1 || (argc >= 2 && strcasecmp(argv[1], "alone") == 0)) {
signal(SIGINT, on_sigint);
// 日志输出至标准输出 // 日志输出至标准输出
acl::log::stdout_open(true); acl::log::stdout_open(true);
// 禁止生成 acl_master.log 日志 // 禁止生成 acl_master.log 日志

View File

@ -111,8 +111,15 @@ void master_service::proc_on_init() {
} }
} }
void master_service::close_db() {
if (db_) {
db_ = nullptr;
}
}
void master_service::proc_on_exit() { void master_service::proc_on_exit() {
logger(">>>proc_on_exit<<<"); logger(">>>proc_on_exit<<<");
close_db();
} }
bool master_service::proc_on_sighup(acl::string&) { bool master_service::proc_on_sighup(acl::string&) {

View File

@ -7,6 +7,8 @@ public:
master_service() = default; master_service() = default;
~master_service() override = default; ~master_service() override = default;
void close_db();
protected: protected:
// @override // @override
void on_accept(acl::socket_stream& conn) override; void on_accept(acl::socket_stream& conn) override;
@ -27,7 +29,7 @@ protected:
bool proc_on_sighup(acl::string&) override; bool proc_on_sighup(acl::string&) override;
private: private:
pkv::shared_db db_; pkv::shared_db db_ = nullptr;
void run(acl::socket_stream& conn, size_t size); void run(acl::socket_stream& conn, size_t size);
}; };

131
app/wizard_demo/pkv/nodb.cf Normal file
View File

@ -0,0 +1,131 @@
service pkv
{
# 进程是否禁止运行
master_disable = no
# 服务地址及端口号
# for master_type = inet
# master_service = 127.0.0.1|5001
# for master_type = unix
# master_service = echo.sock
# for master_type = sock
master_service = 127.0.0.1|19001
# 服务监听为域套接口
# master_service = aio_echo.sock
# 服务类型
# master_type = inet
# master_type = unix
master_type = sock
# 停止子进程时是否采用强行停止的方式(即给子进程发送 SIGTERM 信号)
master_stop_kill = false
# master_stop_kill true 该配置决定是否要等待子进程退出
master_stop_wait = false
# 当系统支持 SO_REUSEPORT 是否启用该功能
master_reuseport = yes
# 当启用 SO_REUSEPORT ( master_reuseport=yes ), 是否需要 acl_master
# 也监听该地址, 对于使用旧版 acl(< 3.5.3-17) 编写的服务, 必须将此项设为
# yes, : master_reuseport_listen = yes; 对于使用 acl 版本 >= 3.5.3-17
# 编写的服务需设置为 no; master_reuseport=no时,该项设置将被忽略; 当未
# 设置此项时内部缺省值为 yes. 以便使 acl_master 保持对于旧版服务的兼容性.
master_reuseport_listen = no
# 是否针对监听套接口设定为非阻塞方式
master_nonblock = yes
# 当系统支持 TCP_FASTOPEN 是否启用该功能
master_fastopen = no
# 当子进程异常退出时如果该值非空则将子进程异常退出的消息通知该服务
# master_notify_addr = 127.0.0.1:5801
# 邮件通知接收者
# master_notify_recipients = zhengshuxin@hotmail.com
# 是否允许延迟接受客户端连接如果为0则表示关闭该功能如果大于0则表示打开此功能
# 并且此值代表延迟接受连接的超时值超过此值时如果客户端依然没有发来数据则操作
# 系统会在系统层直接关闭该连接
# master_defer_accept = 0
# 是否只允许私有访问, 如果为 y, 则域套接口创建在 {install_path}/var/log/private/ 目录下,
# 如果为 n, 则域套接口创建在 {install_path}/var/log/public/ 目录下,
master_private = n
master_unpriv = n
# 是否需要 chroot: n -- no, y -- yes
master_chroot = n
# 每隔多长时间触发一次单位为秒(仅对 trigger 模式有效)
master_wakeup = -
# 最大进程数
master_maxproc = 1
# 预启动进程数该值不得大于 master_maxproc
master_prefork = 1
# 进程程序名
master_command = {install_path}/sbin/pkv
# 进程日志记录文件
master_log = {install_path}/var/log/pkv.log
# 调试日志方式格式tag:level; tag:level; tab:level, all:1; 101:2
# master_debug =
# 进程启动参数只能为: -u [是否允许以某普通用户的身份运行]
# master_args =
# 传递给服务子进程的环境变量, 可以通过 getenv("SERVICE_ENV") 获得此值
# master_env = mempool_limit:512000000
# 当启动多个子进程实例时该开关控制多个子进程在接收连接时是否向 acl_master 发送消息报告自己的状态
# master_status_notify = 1
# 程序标准输出重定向至指定文件中
# master_stdout = {install_path}/var/log/stdout.log
# 程序错误输出重定向至指定文件中
# master_stderr = {install_path}/var/log/stderr.log
# 事件引擎: kernel, poll, select, io_uring
fiber_schedule_event = kernel
# fiber_schedule_event = io_uring
# 是否允许产生 core 文件
# fiber_enable_core = 1
# core 文件大小限制-1 表示不限制 core 文件大小0 表示禁止产生 core> 0 表示 core 文件最大大小
# fiber_core_limit = -1
# 进程退出时是否禁止产生 core 文件
# fiber_disable_core_onexit = 1
# 每个进程实例处理连接数的最大次数超过此值后进程实例主动退出
fiber_use_limit = 0
# 每个进程实例的空闲超时时间超过此值后进程实例主动退出
fiber_idle_limit = 0
# 每个进程启动的线程数
fiber_threads = 1
# 进程运行时所在的路径
fiber_queue_dir = {install_path}/var
# 读写超时时间, 单位为秒
fiber_rw_timeout = 120
# 读缓冲区的缓冲区大小
fiber_buf_size = 8192
# 进程运行时的用户身份
fiber_owner = root
# 当启用 master_dispatch 连接分开服务后该配置指定 master_dispatch 所监听的
# 域套接口的全路径这样本子进程就可以从 master_dispatch 获得客户端连接
# fiber_dispatch_addr = {install_path}/var/private/dispatch.sock
# fiber_dispatch_addr 开启后下面参数控制本服务进程发给前端 master_dispatch 的服务标识信息
# fiber_dispatch_type = default
# 线程的堆栈空间大小单位为字节
fiber_stack_size = 256000
# 允许访问 udserver 的客户端IP地址范围
# fiber_access_allow = 127.0.0.1:255.255.255.255, 127.0.0.1:127.0.0.1
fiber_access_allow = all
# acl_master 退出时如果该值置1则该程序不等所有连接处理完毕便立即退出
fiber_quick_abort = 1
# 是否启用协程共享栈模式
fiber_share_stack = 0
# fiber_quick_abort 0 且本配置项大于 0 该配置项才有效指定了
# 本进程在所有连接退出前的最大等待时间()
fiber_wait_limit = 0
############################################################################
# 应用自己的配置选项
disable_serialize = 1
disable_save = 1
buf_size = 8192
dbpath = ./data
dbtype = wdb
}

129
app/wizard_demo/pkv/rdb.cf Normal file
View File

@ -0,0 +1,129 @@
service pkv
{
# 进程是否禁止运行
master_disable = no
# 服务地址及端口号
# for master_type = inet
# master_service = 127.0.0.1|5001
# for master_type = unix
# master_service = echo.sock
# for master_type = sock
master_service = 127.0.0.1|19001
# 服务监听为域套接口
# master_service = aio_echo.sock
# 服务类型
# master_type = inet
# master_type = unix
master_type = sock
# 停止子进程时是否采用强行停止的方式(即给子进程发送 SIGTERM 信号)
master_stop_kill = false
# master_stop_kill true 该配置决定是否要等待子进程退出
master_stop_wait = false
# 当系统支持 SO_REUSEPORT 是否启用该功能
master_reuseport = yes
# 当启用 SO_REUSEPORT ( master_reuseport=yes ), 是否需要 acl_master
# 也监听该地址, 对于使用旧版 acl(< 3.5.3-17) 编写的服务, 必须将此项设为
# yes, : master_reuseport_listen = yes; 对于使用 acl 版本 >= 3.5.3-17
# 编写的服务需设置为 no; master_reuseport=no时,该项设置将被忽略; 当未
# 设置此项时内部缺省值为 yes. 以便使 acl_master 保持对于旧版服务的兼容性.
master_reuseport_listen = no
# 是否针对监听套接口设定为非阻塞方式
master_nonblock = yes
# 当系统支持 TCP_FASTOPEN 是否启用该功能
master_fastopen = no
# 当子进程异常退出时如果该值非空则将子进程异常退出的消息通知该服务
# master_notify_addr = 127.0.0.1:5801
# 邮件通知接收者
# master_notify_recipients = zhengshuxin@hotmail.com
# 是否允许延迟接受客户端连接如果为0则表示关闭该功能如果大于0则表示打开此功能
# 并且此值代表延迟接受连接的超时值超过此值时如果客户端依然没有发来数据则操作
# 系统会在系统层直接关闭该连接
# master_defer_accept = 0
# 是否只允许私有访问, 如果为 y, 则域套接口创建在 {install_path}/var/log/private/ 目录下,
# 如果为 n, 则域套接口创建在 {install_path}/var/log/public/ 目录下,
master_private = n
master_unpriv = n
# 是否需要 chroot: n -- no, y -- yes
master_chroot = n
# 每隔多长时间触发一次单位为秒(仅对 trigger 模式有效)
master_wakeup = -
# 最大进程数
master_maxproc = 1
# 预启动进程数该值不得大于 master_maxproc
master_prefork = 1
# 进程程序名
master_command = {install_path}/sbin/pkv
# 进程日志记录文件
master_log = {install_path}/var/log/pkv.log
# 调试日志方式格式tag:level; tag:level; tab:level, all:1; 101:2
# master_debug =
# 进程启动参数只能为: -u [是否允许以某普通用户的身份运行]
# master_args =
# 传递给服务子进程的环境变量, 可以通过 getenv("SERVICE_ENV") 获得此值
# master_env = mempool_limit:512000000
# 当启动多个子进程实例时该开关控制多个子进程在接收连接时是否向 acl_master 发送消息报告自己的状态
# master_status_notify = 1
# 程序标准输出重定向至指定文件中
# master_stdout = {install_path}/var/log/stdout.log
# 程序错误输出重定向至指定文件中
# master_stderr = {install_path}/var/log/stderr.log
# 事件引擎: kernel, poll, select, io_uring
fiber_schedule_event = kernel
# fiber_schedule_event = io_uring
# 是否允许产生 core 文件
# fiber_enable_core = 1
# core 文件大小限制-1 表示不限制 core 文件大小0 表示禁止产生 core> 0 表示 core 文件最大大小
# fiber_core_limit = -1
# 进程退出时是否禁止产生 core 文件
# fiber_disable_core_onexit = 1
# 每个进程实例处理连接数的最大次数超过此值后进程实例主动退出
fiber_use_limit = 0
# 每个进程实例的空闲超时时间超过此值后进程实例主动退出
fiber_idle_limit = 0
# 每个进程启动的线程数
fiber_threads = 1
# 进程运行时所在的路径
fiber_queue_dir = {install_path}/var
# 读写超时时间, 单位为秒
fiber_rw_timeout = 120
# 读缓冲区的缓冲区大小
fiber_buf_size = 8192
# 进程运行时的用户身份
fiber_owner = root
# 当启用 master_dispatch 连接分开服务后该配置指定 master_dispatch 所监听的
# 域套接口的全路径这样本子进程就可以从 master_dispatch 获得客户端连接
# fiber_dispatch_addr = {install_path}/var/private/dispatch.sock
# fiber_dispatch_addr 开启后下面参数控制本服务进程发给前端 master_dispatch 的服务标识信息
# fiber_dispatch_type = default
# 线程的堆栈空间大小单位为字节
fiber_stack_size = 256000
# 允许访问 udserver 的客户端IP地址范围
# fiber_access_allow = 127.0.0.1:255.255.255.255, 127.0.0.1:127.0.0.1
fiber_access_allow = all
# acl_master 退出时如果该值置1则该程序不等所有连接处理完毕便立即退出
fiber_quick_abort = 1
# 是否启用协程共享栈模式
fiber_share_stack = 0
# fiber_quick_abort 0 且本配置项大于 0 该配置项才有效指定了
# 本进程在所有连接退出前的最大等待时间()
fiber_wait_limit = 0
############################################################################
# 应用自己的配置选项
buf_size = 8192
dbpath = ./data
dbtype = rdb
}

129
app/wizard_demo/pkv/wdb.cf Normal file
View File

@ -0,0 +1,129 @@
service pkv
{
# 进程是否禁止运行
master_disable = no
# 服务地址及端口号
# for master_type = inet
# master_service = 127.0.0.1|5001
# for master_type = unix
# master_service = echo.sock
# for master_type = sock
master_service = 127.0.0.1|19001
# 服务监听为域套接口
# master_service = aio_echo.sock
# 服务类型
# master_type = inet
# master_type = unix
master_type = sock
# 停止子进程时是否采用强行停止的方式(即给子进程发送 SIGTERM 信号)
master_stop_kill = false
# master_stop_kill true 该配置决定是否要等待子进程退出
master_stop_wait = false
# 当系统支持 SO_REUSEPORT 是否启用该功能
master_reuseport = yes
# 当启用 SO_REUSEPORT ( master_reuseport=yes ), 是否需要 acl_master
# 也监听该地址, 对于使用旧版 acl(< 3.5.3-17) 编写的服务, 必须将此项设为
# yes, : master_reuseport_listen = yes; 对于使用 acl 版本 >= 3.5.3-17
# 编写的服务需设置为 no; master_reuseport=no时,该项设置将被忽略; 当未
# 设置此项时内部缺省值为 yes. 以便使 acl_master 保持对于旧版服务的兼容性.
master_reuseport_listen = no
# 是否针对监听套接口设定为非阻塞方式
master_nonblock = yes
# 当系统支持 TCP_FASTOPEN 是否启用该功能
master_fastopen = no
# 当子进程异常退出时如果该值非空则将子进程异常退出的消息通知该服务
# master_notify_addr = 127.0.0.1:5801
# 邮件通知接收者
# master_notify_recipients = zhengshuxin@hotmail.com
# 是否允许延迟接受客户端连接如果为0则表示关闭该功能如果大于0则表示打开此功能
# 并且此值代表延迟接受连接的超时值超过此值时如果客户端依然没有发来数据则操作
# 系统会在系统层直接关闭该连接
# master_defer_accept = 0
# 是否只允许私有访问, 如果为 y, 则域套接口创建在 {install_path}/var/log/private/ 目录下,
# 如果为 n, 则域套接口创建在 {install_path}/var/log/public/ 目录下,
master_private = n
master_unpriv = n
# 是否需要 chroot: n -- no, y -- yes
master_chroot = n
# 每隔多长时间触发一次单位为秒(仅对 trigger 模式有效)
master_wakeup = -
# 最大进程数
master_maxproc = 1
# 预启动进程数该值不得大于 master_maxproc
master_prefork = 1
# 进程程序名
master_command = {install_path}/sbin/pkv
# 进程日志记录文件
master_log = {install_path}/var/log/pkv.log
# 调试日志方式格式tag:level; tag:level; tab:level, all:1; 101:2
# master_debug =
# 进程启动参数只能为: -u [是否允许以某普通用户的身份运行]
# master_args =
# 传递给服务子进程的环境变量, 可以通过 getenv("SERVICE_ENV") 获得此值
# master_env = mempool_limit:512000000
# 当启动多个子进程实例时该开关控制多个子进程在接收连接时是否向 acl_master 发送消息报告自己的状态
# master_status_notify = 1
# 程序标准输出重定向至指定文件中
# master_stdout = {install_path}/var/log/stdout.log
# 程序错误输出重定向至指定文件中
# master_stderr = {install_path}/var/log/stderr.log
# 事件引擎: kernel, poll, select, io_uring
fiber_schedule_event = kernel
# fiber_schedule_event = io_uring
# 是否允许产生 core 文件
# fiber_enable_core = 1
# core 文件大小限制-1 表示不限制 core 文件大小0 表示禁止产生 core> 0 表示 core 文件最大大小
# fiber_core_limit = -1
# 进程退出时是否禁止产生 core 文件
# fiber_disable_core_onexit = 1
# 每个进程实例处理连接数的最大次数超过此值后进程实例主动退出
fiber_use_limit = 0
# 每个进程实例的空闲超时时间超过此值后进程实例主动退出
fiber_idle_limit = 0
# 每个进程启动的线程数
fiber_threads = 1
# 进程运行时所在的路径
fiber_queue_dir = {install_path}/var
# 读写超时时间, 单位为秒
fiber_rw_timeout = 120
# 读缓冲区的缓冲区大小
fiber_buf_size = 8192
# 进程运行时的用户身份
fiber_owner = root
# 当启用 master_dispatch 连接分开服务后该配置指定 master_dispatch 所监听的
# 域套接口的全路径这样本子进程就可以从 master_dispatch 获得客户端连接
# fiber_dispatch_addr = {install_path}/var/private/dispatch.sock
# fiber_dispatch_addr 开启后下面参数控制本服务进程发给前端 master_dispatch 的服务标识信息
# fiber_dispatch_type = default
# 线程的堆栈空间大小单位为字节
fiber_stack_size = 256000
# 允许访问 udserver 的客户端IP地址范围
# fiber_access_allow = 127.0.0.1:255.255.255.255, 127.0.0.1:127.0.0.1
fiber_access_allow = all
# acl_master 退出时如果该值置1则该程序不等所有连接处理完毕便立即退出
fiber_quick_abort = 1
# 是否启用协程共享栈模式
fiber_share_stack = 0
# fiber_quick_abort 0 且本配置项大于 0 该配置项才有效指定了
# 本进程在所有连接退出前的最大等待时间()
fiber_wait_limit = 0
############################################################################
# 应用自己的配置选项
buf_size = 8192
dbpath = ./data
dbtype = wdb
}