Надежные коллекции Service Fabric - применяются ли ключевые фильтры в детерминированном порядке для CreateEnumerableAsync? - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь реализовать разбиение на страницы курсором для надежного словаря. Я знаю, что IReliableDictionary ключи должны реализовывать IComparable, и что IReliableDictionary этот метод для перечисления словарных статей:

IAsyncEnumerable<KeyValuePair<TKey,TValue>>> 
CreateEnumerableAsync (
    ITransaction txn, 
    Func<TKey,bool> filter,
    EnumerationMode enumerationMode);

Когда используется EnumerationMode.Ordered, я предполагаю, что мы перечисляем пары ключ-значение в соответствии с реализацией ключа IComparable.

Можем ли мы также предположить, что параметр filter применяется к каждому ключу в порядке реализации ключа IComparable? Может быть, другой способ спросить - ключи расположены в памяти и / или перечислены в порядке их реализации IComparable? Если да, задокументировано ли это поведение или его следует считать деталями реализации, которые могут измениться?

1 Ответ

0 голосов
/ 05 марта 2019

Я провел эксперимент с использованием образца Voting Web , и ключи, похоже, фильтруются в порядке их реализации IComparable, с некоторыми оговорками:

  • ItПохоже, что фильтр может быть запущен несколько раз с одним и тем же ключом
  • Фильтр может применяться к элементам, которые были недавно удалены

VotingData.Controllers.VoteDataController имеет следующие операции get и put дляперечислите и добавьте категории для голосования:

[HttpPut("{name}")]
public async Task<IActionResult> Put(string name)
{
    IReliableDictionary<string, int> votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");

    using (ITransaction tx = this.stateManager.CreateTransaction())
    {
        await votesDictionary.AddOrUpdateAsync(tx, name, 1, (key, oldvalue) => oldvalue + 1);
        await tx.CommitAsync();
    }

    return new OkResult();
}

Я изменил Get, чтобы перечислить по порядку votesDictionary, и применил фильтр, который создает список ключей, видимых фильтром:

[HttpGet]
public async Task<IActionResult> Get()
{
     CancellationToken ct = new CancellationToken();
     IReliableDictionary<string, int> votesDictionary = await this.stateManager.GetOrAddAsync<IReliableDictionary<string, int>>("counts");            

     var filteredKeys = new List<string>();

     using (ITransaction tx = this.stateManager.CreateTransaction())
     {
        IAsyncEnumerable<KeyValuePair<string, int>> list = await votesDictionary.CreateEnumerableAsync(tx,                                                                                                        key =>
                                                                                                     {
                                                                                                           lock (this.locker)
                                                                                                           {
                                                                                                               filteredKeys.Add(key);
                                                                                                               return true;
                                                                                                           }
                                                                                                       },
                                                                                                       EnumerationMode.Ordered);
        IAsyncEnumerator<KeyValuePair<string, int>> enumerator = list.GetAsyncEnumerator();
        List<KeyValuePair<string, int>> result = new List<KeyValuePair<string, int>>();

        while (await enumerator.MoveNextAsync(ct))
        {
            result.Add(enumerator.Current);
        }
         return this.Json(result);
    }
}

Я добавил ключи в словарь в случайном алфавитном порядке и обновил страницу, чтобы выполнить запрос Get.При каждом обновлении коллекция filteredKeys содержала мои записи в отсортированном алфавитном порядке.Как уже упоминалось выше, коллекция иногда содержала повторяющиеся записи для определенных строк.Когда я удалил элементы из коллекции и обновил страницу, я обнаружил, что удаленные ключи все еще добавляются в filteredKeys, хотя эти элементы не возвращаются в перечислении результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...