diff --git a/app/wizard_demo/pkv/db/rocksdb/rdb.cpp b/app/wizard_demo/pkv/db/rocksdb/rdb.cpp index cbd30a2e1..0483e95f1 100644 --- a/app/wizard_demo/pkv/db/rocksdb/rdb.cpp +++ b/app/wizard_demo/pkv/db/rocksdb/rdb.cpp @@ -16,6 +16,7 @@ rdb::rdb() : db_(nullptr) {} rdb::~rdb() { delete db_; + logger("rdb in %s closed", path_.c_str()); } bool rdb::open(const char* path) { diff --git a/app/wizard_demo/pkv/db/wt/wdb.cpp b/app/wizard_demo/pkv/db/wt/wdb.cpp index 892a63654..b7964a05b 100644 --- a/app/wizard_demo/pkv/db/wt/wdb.cpp +++ b/app/wizard_demo/pkv/db/wt/wdb.cpp @@ -17,6 +17,7 @@ wdb::wdb(size_t cache_max) : db_(nullptr), cache_max_(cache_max) {} wdb::~wdb() { if (db_) { 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 -#endif // HAS_WT \ No newline at end of file +#endif // HAS_WT diff --git a/app/wizard_demo/pkv/main.cpp b/app/wizard_demo/pkv/main.cpp index e024f9a03..ac5d32026 100644 --- a/app/wizard_demo/pkv/main.cpp +++ b/app/wizard_demo/pkv/main.cpp @@ -1,7 +1,16 @@ #include "stdafx.h" +#include #include "proto/redis_coder.h" #include "master_service.h" +static void on_sigint(int) { + master_service& ms = acl::singleton2::get_instance(); + logger("---Begin to close db---"); + ms.close_db(); + logger("---Close db ok---"); + exit(0); +} + static bool test_redis_coder(const char* file) { #if 1 printf(">>>>>>>>Begin to test redis parsing<<<<<<<<<\r\n"); @@ -42,6 +51,8 @@ int main(int argc, char *argv[]) { test_redis_coder(file); return 0; } else if (argc == 1 || (argc >= 2 && strcasecmp(argv[1], "alone") == 0)) { + signal(SIGINT, on_sigint); + // 日志输出至标准输出 acl::log::stdout_open(true); // 禁止生成 acl_master.log 日志 diff --git a/app/wizard_demo/pkv/master_service.cpp b/app/wizard_demo/pkv/master_service.cpp index cb2ce074f..e8f863f17 100644 --- a/app/wizard_demo/pkv/master_service.cpp +++ b/app/wizard_demo/pkv/master_service.cpp @@ -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() { logger(">>>proc_on_exit<<<"); + close_db(); } bool master_service::proc_on_sighup(acl::string&) { diff --git a/app/wizard_demo/pkv/master_service.h b/app/wizard_demo/pkv/master_service.h index bad34a986..518931fc0 100644 --- a/app/wizard_demo/pkv/master_service.h +++ b/app/wizard_demo/pkv/master_service.h @@ -7,6 +7,8 @@ public: master_service() = default; ~master_service() override = default; + void close_db(); + protected: // @override void on_accept(acl::socket_stream& conn) override; @@ -27,7 +29,7 @@ protected: bool proc_on_sighup(acl::string&) override; private: - pkv::shared_db db_; + pkv::shared_db db_ = nullptr; void run(acl::socket_stream& conn, size_t size); }; diff --git a/app/wizard_demo/pkv/nodb.cf b/app/wizard_demo/pkv/nodb.cf new file mode 100644 index 000000000..69e482e77 --- /dev/null +++ b/app/wizard_demo/pkv/nodb.cf @@ -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 +} diff --git a/app/wizard_demo/pkv/rdb.cf b/app/wizard_demo/pkv/rdb.cf new file mode 100644 index 000000000..e47f5a27f --- /dev/null +++ b/app/wizard_demo/pkv/rdb.cf @@ -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 +} diff --git a/app/wizard_demo/pkv/wdb.cf b/app/wizard_demo/pkv/wdb.cf new file mode 100644 index 000000000..39c0317fe --- /dev/null +++ b/app/wizard_demo/pkv/wdb.cf @@ -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 +}