spdk记录

spdk记录

  • hello_bdev
    • 命令行参数

往期文章:
spdk环境搭建

hello_bdev

代码路径:examples/bdev/hello_world/hello_bdev.c
可执行文件路径:build/examples/hello_bdev

刚开始直接执行hello_bdev显示找不到Malloc0

./build/examples/hello_bdev
[2023-05-30 20:27:02.389489] Starting SPDK v23.05-pre git sha1 ee06693c3 / DPDK 22.11.1 initialization...
[2023-05-30 20:27:02.390910] [ DPDK EAL parameters: hello_bdev --no-shconf -c 0x1 --huge-unlink --log-level=lib.eal:6 --log-level=lib.cryptodev:5 --log-level=user1:6 --iova-mode=pa --base-virtaddr=0x200000000000 --match-allocations --file-prefix=spdk_pid11584 ]
TELEMETRY: No legacy callbacks, legacy socket not created
[2023-05-30 20:27:02.511380] app.c: 738:spdk_app_start: *NOTICE*: Total cores available: 1
[2023-05-30 20:27:02.561201] reactor.c: 937:reactor_run: *NOTICE*: Reactor started on core 0
[2023-05-30 20:27:02.600284] accel_sw.c: 601:sw_accel_module_init: *NOTICE*: Accel framework software module initialized.
[2023-05-30 20:27:02.621229] hello_bdev.c: 222:hello_start: *NOTICE*: Successfully started the application
[2023-05-30 20:27:02.621612] hello_bdev.c: 231:hello_start: *NOTICE*: Opening the bdev Malloc0
[2023-05-30 20:27:02.621691] bdev.c:7681:spdk_bdev_open_ext: *NOTICE*: Currently unable to find bdev with name: Malloc0
[2023-05-30 20:27:02.621761] hello_bdev.c: 235:hello_start: *ERROR*: Could not open bdev: Malloc0
[2023-05-30 20:27:02.621852] app.c: 844:spdk_app_stop: *WARNING*: spdk_app_stop'd on non-zero
[2023-05-30 20:27:02.691191] hello_bdev.c: 308:main: *ERROR*: ERROR starting application

在网上找到了相应issue,https://github.com/spdk/spdk/issues/1550
在这里插入图片描述
正确的执行方式为:

./build/examples/hello_bdev -c ./examples/bdev/hello_world/bdev.json -b Malloc0[2023-05-30 20:25:59.131197] Starting SPDK v23.05-pre git sha1 ee06693c3 / DPDK 22.11.1 initialization...
[2023-05-30 20:25:59.132037] [ DPDK EAL parameters: hello_bdev --no-shconf -c 0x1 --huge-unlink --log-level=lib.eal:6 --log-level=lib.cryptodev:5 --log-level=user1:6 --iova-mode=pa --base-virtaddr=0x200000000000 --match-allocations --file-prefix=spdk_pid11462 ]
TELEMETRY: No legacy callbacks, legacy socket not created
[2023-05-30 20:25:59.252268] app.c: 738:spdk_app_start: *NOTICE*: Total cores available: 1
[2023-05-30 20:25:59.303646] reactor.c: 937:reactor_run: *NOTICE*: Reactor started on core 0
[2023-05-30 20:25:59.359161] accel_sw.c: 601:sw_accel_module_init: *NOTICE*: Accel framework software module initialized.
[2023-05-30 20:25:59.387635] hello_bdev.c: 222:hello_start: *NOTICE*: Successfully started the application
[2023-05-30 20:25:59.388053] hello_bdev.c: 231:hello_start: *NOTICE*: Opening the bdev Malloc0
[2023-05-30 20:25:59.388153] hello_bdev.c: 244:hello_start: *NOTICE*: Opening io channel
[2023-05-30 20:25:59.388529] hello_bdev.c: 138:hello_write: *NOTICE*: Writing to the bdev
[2023-05-30 20:25:59.388757] hello_bdev.c: 117:write_complete: *NOTICE*: bdev io write completed successfully
[2023-05-30 20:25:59.388931] hello_bdev.c:  84:hello_read: *NOTICE*: Reading io
[2023-05-30 20:25:59.389019] hello_bdev.c:  65:read_complete: *NOTICE*: Read string from bdev : Hello World![2023-05-30 20:25:59.389128] hello_bdev.c:  74:read_complete: *NOTICE*: Stopping app

命令行参数

-b参数

static char *g_bdev_name = "Malloc0";
/** Usage function for printing parameters that are specific to this application*/
static void
hello_bdev_usage(void)
{printf(" -b <bdev>                 name of the bdev to use\n");
}/** This function is called to parse the parameters that are specific to this application*/
static int
hello_bdev_parse_arg(int ch, char *arg)
{switch (ch) {case 'b':g_bdev_name = arg;break;default:return -EINVAL;}return 0;
}
spdk_app_parse_args(argc, argv, &opts, "b:", NULL, hello_bdev_parse_arg, hello_bdev_usage)
hello_context.bdev_name = g_bdev_name;

可以看出,g_bdev_name本来就是Malloc0,-b Malloc0没啥用

-c参数

static void
usage(void (*app_usage)(void))
{printf("%s [options]\n", g_executable_name);printf("options:\n");printf(" -c, --config <config>     JSON config file (default %s)\n",g_default_opts.json_config_file != NULL ? g_default_opts.json_config_file : "none");

-c后加json配置文件名,bdev.json文件内容如下:

{"subsystems": [{"subsystem": "bdev","config": [{"method": "bdev_malloc_create","params": {"name": "Malloc0","num_blocks": 32768,"block_size": 512}}]}]
}

简要看json的解析过程,全局查询json_config_file,找到spdk_subsystem_init_from_json_config函数

void
spdk_subsystem_init_from_json_config(const char *json_config_file, const char *rpc_addr,spdk_subsystem_init_fn cb_fn, void *cb_arg,bool stop_on_error)
{struct load_json_config_ctx *ctx = calloc(1, sizeof(*ctx));int rc;assert(cb_fn);if (!ctx) {cb_fn(-ENOMEM, cb_arg);return;}ctx->cb_fn = cb_fn;ctx->cb_arg = cb_arg;ctx->stop_on_error = stop_on_error;ctx->thread = spdk_get_thread();rc = app_json_config_read(json_config_file, ctx);if (rc) {goto fail;}/* Capture subsystems array */rc = spdk_json_find_array(ctx->values, "subsystems", NULL, &ctx->subsystems);switch (rc) {case 0:/* Get first subsystem */ctx->subsystems_it = spdk_json_array_first(ctx->subsystems);if (ctx->subsystems_it == NULL) {SPDK_NOTICELOG("'subsystems' configuration is empty\n");}break;case -EPROTOTYPE:SPDK_ERRLOG("Invalid JSON configuration: not enclosed in {}.\n");goto fail;case -ENOENT:SPDK_WARNLOG("No 'subsystems' key JSON configuration file.\n");break;case -EDOM:SPDK_ERRLOG("Invalid JSON configuration: 'subsystems' should be an array.\n");goto fail;default:SPDK_ERRLOG("Failed to parse JSON configuration.\n");goto fail;}/* If rpc_addr is not an Unix socket use default address as prefix. */if (rpc_addr == NULL || rpc_addr[0] != '/') {rpc_addr = SPDK_DEFAULT_RPC_ADDR;}/* FIXME: rpc client should use socketpair() instead of this temporary socket nonsense */rc = snprintf(ctx->rpc_socket_path_temp, sizeof(ctx->rpc_socket_path_temp), "%s.%d_config",rpc_addr, getpid());if (rc >= (int)sizeof(ctx->rpc_socket_path_temp)) {SPDK_ERRLOG("Socket name create failed\n");goto fail;}rc = spdk_rpc_initialize(ctx->rpc_socket_path_temp);if (rc) {goto fail;}ctx->client_conn = spdk_jsonrpc_client_connect(ctx->rpc_socket_path_temp, AF_UNIX);if (ctx->client_conn == NULL) {SPDK_ERRLOG("Failed to connect to '%s'\n", ctx->rpc_socket_path_temp);goto fail;}rpc_client_set_timeout(ctx, RPC_CLIENT_CONNECT_TIMEOUT_US);ctx->client_conn_poller = SPDK_POLLER_REGISTER(rpc_client_connect_poller, ctx, 100);return;fail:app_json_config_load_done(ctx, -EINVAL);
}

全局查询bdev_malloc_create,找到rpc_bdev_malloc_create函数

static void
rpc_bdev_malloc_create(struct spdk_jsonrpc_request *request,const struct spdk_json_val *params)
{struct malloc_bdev_opts req = {NULL};struct spdk_json_write_ctx *w;struct spdk_bdev *bdev;int rc = 0;if (spdk_json_decode_object(params, rpc_construct_malloc_decoders,SPDK_COUNTOF(rpc_construct_malloc_decoders),&req)) {SPDK_DEBUGLOG(bdev_malloc, "spdk_json_decode_object failed\n");spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR,"spdk_json_decode_object failed");goto cleanup;}rc = create_malloc_disk(&bdev, &req);if (rc) {spdk_jsonrpc_send_error_response(request, rc, spdk_strerror(-rc));goto cleanup;}free_rpc_construct_malloc(&req);w = spdk_jsonrpc_begin_result(request);spdk_json_write_string(w, spdk_bdev_get_name(bdev));spdk_jsonrpc_end_result(request, w);return;cleanup:free_rpc_construct_malloc(&req);
}
SPDK_RPC_REGISTER("bdev_malloc_create", rpc_bdev_malloc_create, SPDK_RPC_RUNTIME)  

运行到该函数的回溯栈为

(gdb) bt
#0  rpc_bdev_malloc_create (request=0xcac1f474c379e400, params=0x555555cc9570) at bdev_malloc_rpc.c:49
#1  0x00005555556b0a53 in jsonrpc_handler (request=0x555555cc04e0, method=0x555555c648e0, params=0x555555c64900) at rpc.c:124
#2  0x00005555556b2c5e in jsonrpc_server_handle_request (request=0x555555cc04e0, method=0x555555c648e0, params=0x555555c64900) at jsonrpc_server_tcp.c:222
#3  0x00005555556b1665 in parse_single_request (request=0x555555cc04e0, values=0x555555c64880) at jsonrpc_server.c:75
#4  0x00005555556b1c68 in jsonrpc_parse_request (conn=0x7ffff5f7e040, json=0x7ffff5f7e058, size=172) at jsonrpc_server.c:205
#5  0x00005555556b2eaa in jsonrpc_server_conn_recv (conn=0x7ffff5f7e040) at jsonrpc_server_tcp.c:284
#6  0x00005555556b3297 in spdk_jsonrpc_server_poll (server=0x7ffff5f7e010) at jsonrpc_server_tcp.c:402
#7  0x00005555556b0d59 in spdk_rpc_accept () at rpc.c:213
#8  0x00005555556a13c4 in rpc_subsystem_poll (arg=0x0) at rpc.c:21
#9  0x00005555556a82fd in thread_execute_timed_poller (thread=0x555555c9ec00, poller=0x555555cbf2c0, now=41542509569737) at thread.c:970
#10 0x00005555556a8613 in thread_poll (thread=0x555555c9ec00, max_msgs=0, now=41542509569737) at thread.c:1060
#11 0x00005555556a8837 in spdk_thread_poll (thread=0x555555c9ec00, max_msgs=0, now=41542509569737) at thread.c:1119
#12 0x000055555566d309 in _reactor_run (reactor=0x555555c7b780) at reactor.c:914
#13 0x000055555566d3fb in reactor_run (arg=0x555555c7b780) at reactor.c:952
#14 0x000055555566d887 in spdk_reactors_start () at reactor.c:1068
#15 0x0000555555669c5d in spdk_app_start (opts_user=0x7fffffffdea0, start_fn=0x55555556e1fb <hello_start>, arg1=0x7fffffffde40) at app.c:779
#16 0x000055555556e5d9 in main (argc=5, argv=0x7fffffffe078) at hello_bdev.c:306p req
$19 = {name = 0x555555cc9580 "Malloc0", uuid = {u = {raw = '\000' <repeats 15 times>}}, num_blocks = 32768, block_size = 512, physical_block_size = 0, optimal_io_boundary = 0, md_size = 0, md_interleave = false, dif_type = SPDK_DIF_DISABLE, dif_is_head_of_md = false}

猜测rpc_bdev_malloc_create函数与spdk_subsystem_init_from_json_config中的
SPDK_POLLER_REGISTER(rpc_client_connect_poller, ctx, 100);有关。

有兴趣的可以继续研究rpc_bdev_malloc_create函数中的create_malloc_disk函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/253266.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

FinChat.io,金融领域的chatgpt

投资股票是一个充满挑战的过程,随着市场的起起伏伏,要抓住每一个机会,同时规避各种风险,这需要投资者具有敏锐的洞察力和快速的决策能力。不过现在有好消息,一款人工智能聊天机器人 FinChat.io 诞生了!它能帮助投资者分析市场,挖掘有潜力的股票,并提供买卖的实时建议 --------…

码农翻身——JDBC的诞生

随着 Oracle, Sybase, SQL Server ,DB2, Mysql 等人陆陆续续住进数据库村&#xff0c; 这里呈现出一片兴旺发达的景象&#xff0c; 无数的程序在村里忙忙碌碌&#xff0c; 读写数据库&#xff0c; 实际上一个村落已经容不下这么多人了&#xff0c; 数据库村变成了数据镇。 这…

码农翻身(随笔)

书一直都有在读&#xff0c;我会一直更新博文&#xff0c;欢迎大家前来阅读、指教&#xff01; XML和注解 xml&#xff1a;应用于集中配置的场合&#xff0c;比如数据源的配置&#xff1b; 注解&#xff1a;像Controller、RequestMapping、Transactional这样的注解&#xff…

码农翻身摘录

三次握手:验证双方发信和收信能力问题  第一次握手:京城发信&#xff0c;县衙收到了&#xff0c;此时县衙就会明白&#xff0c;京城的发信能力和自己的收信能力没有问题。  第二次握手:县衙发信&#xff0c;京城收到了&#xff0c;此时京城就会明白&#xff0c;京城的发信和收…

《码农翻身》

大话编程 我是一个线程 我是一个Java class Javascript: 一个屌丝的逆袭 Java:一个帝国的诞生 JSP:一个装配工的没落 TCP/IP 之 大明王朝的邮差 TCP/IP 之 大明内阁 TCP/IP 之 蓟辽督师 CPU 阿甘 CPU 阿甘之烦恼 CPU 阿甘&#xff1a;函数调用的秘密 我是一个网卡 …

码农翻身

ISBN&#xff1a;978-7-121-34117-5 作者&#xff1a;刘欣 页数&#xff1a;324 推荐指数&#xff1a;★★★★★ 阅读日期&#xff1a;2020-02-04 用故事的形式来讲述技术&#xff0c; 从这个技术的诞生到如何发展优化&#xff0c; 一步步探究原理&#xff0c; 讲的非常生动形…

读书笔记(一)《码农翻身》

好久都没有写技术博客了&#xff0c;大概有一年左右没有开始写了&#xff0c;原因是自己弄了一个日志博文&#xff0c;当然这不是重点&#xff0c;重点是心态发生了改变&#xff0c;从心里上感觉技术兴趣不大了&#xff0c;后来又发现&#xff0c;并不是对技术失去了兴趣&#…

最担心的还是发生了,程序员失业来得太突然!

周末我在后台收到一条私信&#xff0c;事情很有代表性&#xff0c;这里分享一下。 这位老哥在一家互联网头部公司做了 6 年的技术&#xff0c;最好的年纪都留在了这家公司。上个月底&#xff0c;赶上所在的部门重组。 公司动作很快&#xff0c;开完年中回顾会就裁掉了一批人&am…

《码农翻身》之技术之路

《码农翻身》读书笔记之技术之路 这是我的后端读书笔记系列文章的第四三篇&#xff0c;选取的是最近刚刚圈粉的知名博主刘欣创作的《码农翻身》。这篇文章只是最后一部分内容。 本文内容主要根据知名博主刘欣一作《码农翻身》的内容总结而来&#xff0c;本书的内容风趣幽默&a…

码农翻身 各章节链接

大话编程 我是一个线程 我是一个Java class Javascript: 一个屌丝的逆袭 Java:一个帝国的诞生 JSP:一个装配工的没落 TCP/IP 之 大明王朝的邮差 TCP/IP 之 大明内阁 TCP/IP 之 蓟辽督师 CPU 阿甘 CPU 阿甘之烦恼 CPU 阿甘&#xff1a;函数调用的秘密 我是一个网卡 …

码农翻身全年文章精华

在码农翻身公众号写了一年多&#xff0c; 最大的体会就是&#xff1a;原创真心不易&#xff01; 每天思考的最大问题就是&#xff1a; 下一篇文章写啥&#xff1f; 在大家的支持和鼓励下&#xff0c;还是坚持了下来&#xff0c; 回头看看走过的路&#xff0c;这一年过得还算…

python笔记16_实例练习_二手车折旧分析p1

python数据分析练习&#xff0c;具体数据不放出。 分析实践很简单。目的不是做完&#xff0c;而是讲清楚每一步的目的和连带的知识点&#xff08;所以才叫学习笔记&#xff09; 0.数据准备 原始数据格式&#xff1a;csv文件 原始数据结构&#xff1a; 数据格式 字段名 int…

MySQL第二章、数据库基础

回顾&#xff1a; 目录 一、数据库的操作 1.1创建数据库 1.2显示当前数据库 1.3使用数据库 1.4删除数据库 二、常用数据类型 2.1数值类型&#xff08;分为整型和浮点型&#xff09; 2.2字符串类型 2.3 日期类型 三、表的操作 ​编辑 3.1创建表 3.2查看表结构 ​编…

苹果手机如何实现微信多开分身

微信现在是生活中使用最多的聊天软件&#xff0c;而且很多人的微信都不止一个&#xff0c;一般都是一个用来工作使用&#xff0c;一个用来日常使用。 安卓手机在很早之前就可以安装两个微信了&#xff0c;目前还有部分用苹果的朋友不知道微信怎么分身&#xff0c;接下来小编就…

苹果手机如何微信分身?

苹果微信分身&#xff0c;既是你的生活伴侣&#xff0c;又是你的工作好帮手。对于那些工作繁忙&#xff0c;生活节奏快的人来说&#xff0c;这款产品非常实用。让你随时切换身份&#xff0c;一种生活&#xff0c;一种工作&#xff0c;既避免了不必要的误会和困扰&#xff0c;也…

苹果手机微信分身

QQ慢慢退出历史舞台后&#xff0c;我们的生活与工作又重新与微信拾起了联系&#xff0c;并且无法离开。虽然安卓用户很多都有自带两个微信&#xff0c;但由于系统的限制&#xff0c;iPhone手机还不能正常安装两个微信。那这些想安装两个微信的iPhone用户怎么办&#xff1f;iPho…

苹果微信分身版ios_微信正式支持暗黑模式:iOS版已上线 安卓版随后就来

微信暗黑模式一直受到网友的极大期待&#xff0c;今天(22日)&#xff0c;微信 iOS版 终于迎来了 7.0.12 更新&#xff0c;正式加入对深色模式的支持。 微信 7.0.12 更新日志显示可跟随系统的设置&#xff0c;切换为深色模式。 从目前网友的反馈来看&#xff0c;一方面对微信终于…

苹果微信分身版ios_苹果手机ios14系统微信分身地址安装教程

大家期待已久的苹果12终于也到来了。是否达到了你的预期&#xff1f;惊喜多还是失望多呢&#xff1f; 随着苹果12的到来&#xff0c;市面上百分之80的苹果手机用户的苹果手机系统版本都更新到了ios14版本了。ios14系统可以说在使用体验上给用户们有很大的视觉提升跟操作舒心。为…

微信分身服务器,苹果微信分身版

苹果微信分身版 定制技巧一、怎样去做做seo&#xff1f;出现seo&#xff0c;一看就知道。seo如同天上掉馅饼&#xff0c;做到专注优化&#xff0c;那么就是正确的seo&#xff0c;后面的会做出***好的seo。 打造微信中的自我推广、商业协同等。微信公众平台做业务流程也可以分为…

苹果微信分身版使用教程与注意事项

许多苹果手机用户都听说过&#xff1a;苹果微信分身版这一款手机软件&#xff0c;不过&#xff0c;什么是苹果微信分身版&#xff1f;微信分身版有什么功能&#xff1f;还有&#xff0c;苹果微信分身版怎么使用呢&#xff1f;相信这一些问题大家都不知道&#xff0c;在今天的教…