現在、MongoDB 内で Capped Collections と Tailable Cursors を調査して、通知用のキューイング システムを作成しています。ただし、単純な LinqPad テスト (以下のコード) を作成した後、実行時に気づいたのですが、Mongo は、レコードを挿入していなくても、使用可能なリソースがなくなるまでメモリを常に割り当てます。この割り当ては、すべてのシステム RAM が使用されるまで続き、その時点で Mongo は単に応答を停止します。
Capped Collections と Tailable Cursor は初めてなので、バグを送信する前に、何か明らかなことを見落としていないことを確認したかったのです。
注: 以下のコードをジャーナリングをオンまたはオフにして試してみましたが、結果は同じでした。
- プラットフォーム: Windows Server 2012 64bit
- MongoDB : バージョン 2.4.8 64bit
- ドライバー: 公式 C# 10gen v1.8.3.9
Linqpad スクリプト
var conn = new MongoClient("mongodb://the.server.url").GetServer().GetDatabase("TestDB");
if(!conn.CollectionExists("Queue")) {
conn.CreateCollection("Queue", CollectionOptions
.SetCapped(true)
.SetMaxSize(100000)
.SetMaxDocuments(100)
);
//Insert an empty document as without this 'cursor.IsDead' is always true
var coll = conn.GetCollection("Queue");
coll.Insert(
new BsonDocument(new Dictionary<string, object> {
{ "PROCESSED", true },
}), WriteConcern.Unacknowledged
);
}
var coll = conn.GetCollection("Queue");
var query = coll.Find(Query.EQ("PROCESSED", false))
.SetFlags(QueryFlags.AwaitData | QueryFlags.NoCursorTimeout | QueryFlags.TailableCursor);
var cursor = new MongoCursorEnumerator<BsonDocument>(query);
while(true) {
if(cursor.MoveNext()) {
string.Format(
"{0:yyyy-MM-dd HH:mm:ss} - {1}",
cursor.Current["Date"].ToUniversalTime(),
cursor.Current["X"].AsString
).Dump();
coll.Update(
Query.EQ("_id", cursor.Current["_id"]),
Update.Set("PROCESSED", true),
WriteConcern.Unacknowledged
);
} else if(cursor.IsDead) {
"DONE".Dump();
break;
}
}