Описание
I am utilizing the MongoDb change stream (C# MongoDB.Driver v2.12.0) to track changes on a single collection. In an experimental use case the collection stores information about execution of threads.У потока есть два свойства:
Status
- РАБОТАЕТ, ЗАБЛОКИРОВАНО или ЗАВЕРШЕНОBlockedCount
- количество блокирующих потоков
Во время своего выполнения поток может порождать дочерние потоки и блокироваться до тех пор, пока все дочерние потоки не будут завершены. Каждый раз, когда дочерний поток завершает свое выполнение, он обновляет базу данных, уменьшая BlockedCount
родительского. Как только BlockedCount
упадет до 0, родительский поток должен продолжить выполнение.
Код для подписки на смену потока:
var pipeline = new EmptyPipelineDefinition<ChangeStreamDocument<T>>()
.Match(change => change.OperationType == ChangeStreamOperationType.Insert ||
change.OperationType == ChangeStreamOperationType.Update ||
change.OperationType == ChangeStreamOperationType.Replace)
.AppendStage<ChangeStreamDocument<T>, ChangeStreamDocument<T>, ChangeStreamOutputWrapper<T>>(
"{ $project: { '_id': 1, 'fullDocument': 1, 'ns': 1, 'documentKey': 1 }}");
var options = new ChangeStreamOptions
{
FullDocument = ChangeStreamFullDocumentOption.UpdateLookup
};
using (var cursor = await coll.WatchAsync(pipeline, options, cancellationToken))
{
await cursor.ForEachAsync(async change =>
{
// await some handler routine
}, cancellationToken);
}
Проблема
What I have noticed is that the change events can be different even if the update operations are exactly the same. To better explain this, here is an example:Есть 1 родительский поток и 3 дочерних потока, завершающих свое выполнение, наблюдаются два разных поведения:
3 различных события обновления для родительского потока:
- "Status" : "BLOCKED", "BlockedCount" : 2
- Статус: ЗАБЛОКИРОВАН, Заблокировано Количество: 1
- Статус: ЗАБЛОКИРОВАНО, Заблокировано Количество: 0
3 идентичных события обновления для родительского потока:
- "Status" : "BLOCKED", "BlockedCount" : 0
- Статус: ЗАБЛОКИРОВАНО, Заблокировано Количество: 0
- Статус: ЗАБЛОКИРОВАН, Заблокировано: 0
Вопросов
- Считается ли это нормальным поведением?
- Есть ли какая-то конфигурация, которая предотвратит это и запустит только «последнее» обновление?