0

ドキュメントに基づいて、lock=true を指定した fsync は書き込みをブロックする必要があります。しかし、注目されているのは、書き込みをブロックしているにもかかわらず、まだ書き込みを行っていることです。これは予想される動作ですか?

MongoDB を自分のマシンにローカルにインストールし、それを単一ノードのレプリカ セットとして実行しました。使用されているMongoDBのバージョンは4.2.11です ここに画像の説明を入力

以下に示すように、fsync を実行します。

ここに画像の説明を入力

そして、書き込みを試みると、ブロックされます。私はそれをキャンセルします。 ここに画像の説明を入力

そして、fsync ロック解除を実行します。

ここに画像の説明を入力

書き込みが機能しないことが予想されますが、何らかの方法で永続化されます。fsync にバグはありますか?

ここに画像の説明を入力

4

1 に答える 1

1

これは、ブロックされた挿入をシャットダウンした場合 (たとえば、control+ C またはその他のメカニズムによって) シナリオで可能になる可能性がありますが、どういうわけかプロセスは停止せず、unblock fsync を実行した後もコマンドはバックグラウンドで実行され、挿入されました。挿入コマンドがブロックされ、その後 unblock fsync を実行すると、ブロック挿入が自動的にブロック解除されました。これをv 4.4.10(あなたのものよりも高いバージョン)でテストしましたが、ドキュメントに従って完全に正常に動作します。

最初に 1 つのレコードを挿入します

ここに画像の説明を入力

次に fsync を使用します

ここに画像の説明を入力

次に、ブロックされ、その後 Ctrl + C を使用して強制終了されるレコードをもう 1 つ挿入してみてください。

ここに画像の説明を入力

次に、fsyncのブロックを解除します

ここに画像の説明を入力

2 番目の挿入が成功しなかったことを確認します (これは予期される動作です)。

ここに画像の説明を入力

サーバーが受け入れる「挿入」コマンドの違いを確認するために、前後の db.serverStatus() を確認することもできます。これにより、コマンドが何らかの形で到達したかどうかのヒントが得られます。情報はこんな感じ

ここに画像の説明を入力

于 2021-12-02T18:24:03.593 に答える