Conversation
module/bdev/raid/bdev_raid.c
Outdated
| static void | ||
| raid_free_merge_info(struct raid_bdev *raid_bdev) | ||
| { | ||
| if (raid_bdev->merge_info) { raid_clear_ht(raid_bdev); } |
module/bdev/raid/bdev_raid.c
Outdated
| switch (raid_bdev->level) { | ||
| case RAID1: | ||
| if (raid_bdev->num_base_bdevs % 2 == 1) { | ||
| SPDK_WARNLOG("Merging requests is not supported for RAID1 with an odd number of base bdevs\n"); |
module/bdev/raid/bdev_raid.c
Outdated
| raid_bdev->merge_info = NULL; | ||
| return 0; | ||
| } else { | ||
| num_parity_strips = raid_bdev->num_base_bdevs / 2; |
There was a problem hiding this comment.
У нас же рейд 1, а не рейд 10. В нем "не данные" это raid_bdev->num_base_bdevs - 1
| return -ENOMEM; | ||
| } | ||
|
|
||
| raid_bdev->merge_info->merge_ht = ht_create(); |
| if (merge) { | ||
| int ret = raid_merge_info_alloc(raid_bdev); | ||
| if (ret) { | ||
| free(raid_bdev->base_bdev_info); |
module/bdev/raid/bdev_raid.h
Outdated
| enum raid_level level; | ||
|
|
||
| /* Info required for merging requests */ | ||
| struct raid_bdev_merge_info *merge_info; |
| } | ||
|
|
||
| static uint64_t | ||
| hash_key(const char *key) |
There was a problem hiding this comment.
Так как хешируем ключ. Или вы что-то другое имеете ввиду?
| ht_get(ht *table, const char *key) | ||
| { | ||
| uint64_t hash = hash_key(key); | ||
| size_t index = (size_t)(hash & (uint64_t)(table->capacity - 1)); |
There was a problem hiding this comment.
Тут видимо использован прием, что capacity это степень двойки, но вроде это нигде не проверяется
There was a problem hiding this comment.
В ht.h define стоит, что изначальная длина 16, а так расширяемся в два раза, то и будет всегда степень двойки
|
|
||
| index++; | ||
| if (index >= table->capacity) { | ||
| index = 0; |
There was a problem hiding this comment.
Тут нет бесконечного цикла при заполненной таблице без нужного элемента?
There was a problem hiding this comment.
Таблица никогда не бывает полностью заполненной. Иначе очень часто бы встречались с коллизией. Таблица расширяется в два раза, когда достигается половина изначальной вместимости
| } | ||
| } | ||
|
|
||
| if (plength != NULL) { |
There was a problem hiding this comment.
Без указателя на длину же получим некорректную работу, длина не будет уыеличиваться. Тут разве не надо завершить функцию с ошибкой в этом случае?
There was a problem hiding this comment.
Вспомогательная функция ht_set_entry используется в двух местах: в ht_expand и в ht_set. В первом случае указатель на длину ставится NULL, чтобы её не увеличивать при расширении, во втором передается указатель на длину таблицы, так как это штатная вставка ключа-значения пользователем
Description
Added implementation of merging sequentional write requests
Implementation:
raid_request_merge.c,raid_request_merge.h) - Implemented interface for the merging requests processbdev_raid.h,raid5.c) - Integrated into the raid5Integration tests:
run_tests.sh) - A script that tests for the correctness of operationstest$i/) - Contains fio configuration of the tests