InvalidOptions: Requested option conflicts with current storage engine option for directoryPerDB

本文讲述了如何修复MongoDB启动时因directoryPerDB选项冲突导致的错误,介绍了配置文件检查、错误原因及解决方案,包括初次启动时务必设置directoryPerDB以及重启时如何正确配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

运行Mongod进程,查看日志信息如下:

2022-05-24T14:52:07.742+0800 I  STORAGE  [initandlisten] Detected data files in /data/mongodb/data created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'.
2022-05-24T14:52:07.742+0800 I  STORAGE  [initandlisten] exception in initAndListen: InvalidOptions: Requested option conflicts with current storage engine option for directoryPerDB; you requested true but the current server storage is already set to false and cannot be changed, terminating

这里显示InvalidOptions:请求的选项与当前directoryPerDB的存储引擎选项冲突;

检查配置文件

 cat /etc/mongod.conf 
   ......
   journal:
      enabled: true
   directoryPerDB: true
   ....

报错原因为: 但当前服务器存储已设置为false,无法更改,终止 !

storage.directoryPerDB
类型:布尔值

默认值:false

设置为true,MongoDB 使用单独的目录来存储每个数据库的数据。目录在storage.dbPath目录下,每个子目录名对应数据库名。

即在首次启动时设置需设置为true,加上–directoryperdb参数如下启动:

/usr/local/mongodb/bin/mongod --dbpath /data/mongodb/data --bind_ip localhost,192.168.1.1 --port 27017 --fork --journal --logpath /data/mongodb/log/mongod.log --logappend --noauth --directoryperdb

如果首次没加 --directoryperdb , 之后重启再加该参数,则冲突报错。 设置该参数之后,每个库单独一个目录:

root@ubuntu:/data/mongodb/data# ls -l 
total 292
drwxr-x--- 7 mongodb mongodb   4096 524 15:53 ./
drwxr-x--- 4 mongodb mongodb   4096 524 15:30 ../
drwx------ 2 mongodb mongodb   4096 524 15:31 admin/
drwx------ 2 mongodb mongodb   4096 524 15:31 config/
drwx------ 2 mongodb mongodb   4096 524 15:53 diagnostic.data/
drwx------ 2 mongodb mongodb   4096 524 15:30 journal/
drwx------ 2 mongodb mongodb   4096 524 15:30 local/
-rw------- 1 mongodb mongodb  36864 524 15:32 _mdb_catalog.wt
-rw------- 1 mongodb mongodb      6 524 15:30 mongod.lock
-r-------- 1 mongodb mongodb   1024 524 15:30 replsetAIK
-rw------- 1 mongodb mongodb  36864 524 15:53 sizeStorer.wt
-rw------- 1 mongodb mongodb    114 524 15:30 storage.bson
-rw------- 1 mongodb mongodb     47 524 15:30 WiredTiger
-rw------- 1 mongodb mongodb   4096 524 15:30 WiredTigerLAS.wt
-rw------- 1 mongodb mongodb     21 524 15:30 WiredTiger.lock
-rw------- 1 mongodb mongodb   1192 524 15:53 WiredTiger.turtle
-rw------- 1 mongodb mongodb 167936 524 15:53 WiredTiger.wt
<think>首先,用户的问题是关于Linux内核中断处理的一个警告:"genirqThreadedirqrequested withhandler NULLand notONESHOT irq40"。我需要理解这个警告的含义并提供解决方案。从用户提供的引用中,我可以提取相关信息: -引用[3]提到:"Threadedirqrequested withhandler=NULLand !ONE_SHOT forirq420.",这类似于用户的警告。-引用[3]解释说,如果使用线程化中断(threadedIRQ)但没有设置IRQF_ONESHOT标志,并且中断处理函数为NULL,可能会导致问题。-引用[1]展示了使用request_threaded_irq函数的例子,其中handler参数设置为NULL,而thread_fn参数设置为irq_interrupt。-引用[2]显示了中断处理的实际输出,其中handler和thread_fn都被调用。关键点:- request_threaded_irq函数用于申请线程化中断。-函数原型:intrequest_threaded_irq(unsigned intirq, irq_handler_t handler, irq_handler_t thread_fn,unsigned longflags,const char*name, void*dev); -如果handler为NULL,则使用默认的primaryhandler。- IRQF_ONESHOT标志用于确保中断线在threaded handler完成前不会被重新启用。-警告表明,当handler为NULL且没有设置IRQF_ONESHOT时,可能会导致问题,因为线程化中断需要这个标志来防止中断嵌套。警告的含义:- "genirq Threaded irq requestedwith handlerNULL andnot ONESHOT"意味着在申请线程化中断时,handler参数为NULL,但没有设置IRQF_ONESHOT标志。这违反了内核的要求,因为线程化中断通常需要IRQF_ONESHOT来确保中断处理的正确性,避免中断重入问题。 解决方案: -根据引用[3],添加IRQF_ONESHOT标志可以解决这个问题。-在request_threaded_irq调用中,设置flags为包括IRQF_ONESHOT。例如,在用户代码中,修改flags:原代码:IRQF_TRIGGER_RISING |IRQF_SHARED修改后:IRQF_TRIGGER_RISING |IRQF_SHARED |IRQF_ONESHOT在回答中,我需要:-使用中文。-结构清晰,逐步解释。-确保LaTeX格式正确:行内数学表达式用$...$,独立公式用$$...$$。-在引用的段落末尾添加引用标识,如[^1]。 -生成相关问题。回答结构:1.**解释警告含义**:简要描述警告的原因和影响。 2. **分析问题根源**:基于内核机制,解释为什么handler为NULL时需要IRQF_ONESHOT。 3. **提供解决方案**:建议添加IRQF_ONESHOT标志。 4. **代码示例**:展示修改后的代码。 5. **生成相关问题**:在末尾添加相关问题。 生成相关问题:-基于主题,例如:1.什么是线程化中断(threadedIRQ)?2. IRQF_ONESHOT标志的作用是什么?3.如何调试Linux内核中断问题? 确保回答真实可靠:基于Linux内核文档和用户提供的引用。 最终回答: -开头:直接回应用户的问题。-主体:逐步解释。 -结尾:相关问题。</think>### 中断警告 "genirq Threaded irq requested with handler NULL and not ONESHOT irq 40" 的分析与解决方案 用户遇到的警告信息 `genirq Threaded irq requested with handler NULL and not ONESHOT irq 40` 是 Linux 内核在申请线程化中断(threaded IRQ)时触发的错误提示。它表明在调用 `request_threaded_irq()` 函数时,`handler` 参数被设置为 `NULL`,但未设置 `IRQF_ONESHOT` 标志(irq 40 是具体的中断号)。这违反了内核的安全机制,可能导致中断重入(re-entrancy)或竞争条件(race condition),最终引发系统不稳定或驱动故障[^3]。下面我将逐步解释问题原因并提供解决方案。 #### 1. **警告含义与问题根源** - **线程化中断机制**:Linux 内核的线程化中断允许将中断处理分为两部分: - `handler`(顶半部):在中断上下文中快速执行,通常用于紧急任务。 - `thread_fn`(底半部):在独立的线程中运行,处理耗时操作。 如果 `handler` 设置为 `NULL`,内核会使用默认的顶半部处理函数(仅标记中断事件),但要求必须设置 `IRQF_ONESHOT` 标志以确保安全[^1][^3]。 - **IRQF_ONESHOT 的作用**:该标志强制内核在底半部线程完成前**屏蔽中断线**,防止新中断打断未完成的处理。数学上,这保证了中断处理序列的原子性:设中断事件序列为 $E_1, E_2, \dots, E_n$,则处理函数 $f(E_i)$ 必须满足: $$ f(E_i) \text{ 完成前 } \rightarrow E_{i+1} \text{ 被阻塞} $$ 否则,多个中断可能同时访问共享资源,导致数据损坏或死锁[^3][^4]。 - **警告触发条件**:当 `request_threaded_irq(irq, NULL, thread_fn, flags, ...)` 被调用时,如果 `flags` 未包含 `IRQF_ONESHOT`,内核会拒绝申请并输出此警告。这常见于共享中断(`IRQF_SHARED`)或电平触发(level-triggered)场景[^1][^3]。 #### 2. **解决方案:添加 IRQF_ONESHOT 标志** 修改中断申请代码,在 `flags` 参数中加入 `IRQF_ONESHOT`。以下是修复后的代码示例(基于用户提供的引用[^1]): ```c // 原代码(可能触发警告) err = request_threaded_irq(irq, NULL, irq_interrupt, IRQF_TRIGGER_RISING | IRQF_SHARED, devname, (void*)(irq_interrupt)); // 修复后:添加 IRQF_ONESHOT err = request_threaded_irq(irq, NULL, irq_interrupt, IRQF_TRIGGER_RISING | IRQF_SHARED | IRQF_ONESHOT, devname, (void*)(irq_interrupt)); if (err) { printk(KERN_ALERT "irq_probe error=%d\n", err); goto fail; } ``` - **关键修改**: - 将 `flags` 从 `IRQF_TRIGGER_RISING | IRQF_SHARED` 改为 `IRQF_TRIGGER_RISING | IRQF_SHARED | IRQF_ONESHOT`。 - 这显式启用“单次处理”模式,确保底半部线程的安全执行。 - **验证方法**: - 加载驱动后,检查内核日志(`dmesg`)是否不再出现警告。 - 如果中断是共享的(如多个设备共用 irq 40),需确认所有驱动都兼容 `IRQF_ONESHOT`[^1][^3]。 #### 3. **其他注意事项** - **电平触发中断的额外要求**:如果中断是电平触发(如 `IRQF_TRIGGER_LOW`),则 `IRQF_ONESHOT` 是强制的。否则,中断线可能持续有效,导致处理函数被重复调用,引发警告和失败[^3]。 - **调试工具**:使用 `cat /proc/interrupts` 查看 irq 40 的状态,或通过 `ftrace` 监控中断处理流程[^2]。 - **性能影响**:`IRQF_ONESHOT` 可能轻微增加中断延迟,但能显著提升稳定性。在实时系统中,需权衡响应时间和可靠性[^4]。 通过以上步骤,问题通常可解决。如果警告仍存在,建议检查中断号(irq 40)是否冲突或设备树(Device Tree)配置是否正确[^2][^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ethanchen's notes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值