Найти фундаментальные ошибки в многопоточном кэше
От: Juster  
Дата: 22.10.15 05:53
Оценка:
Здравствуйте!

Я выполнял задание, в котором нужно написать многопоточный кэш для БД.

— Изначально кэш пустой, потом при обращении клиентов, начинает дергать данные из БД.
— Запись одновременно может читать только один поток.
— Периодически кэш-система заливает изменения обратно в БД.
— Прослойка БД — сделана условно, сэмулированна, это нормально.

https://github.com/Yukigaru/RJCache

Ревьюверу реализация не понравилось и он отметил, что есть баги.
Я очень хочу поднять свой уровень, поэтому обращаюсь за помощью. Могли бы вы обратить моё внимание на:
— баги в многопоточности (неверная синхронизация, потенциальные deadlocks, races, AV, и т.п.)
— серьезные performance баги (совсем мелкие можно не замечать) из-за неверных структур или суровая неэффективность алгоритмов
— по стилистике (оформление, названия, форматирование и т.п.) можно не обращать внимание, сейчас не это главное

Спасибо!
Re: Найти фундаментальные ошибки в многопоточном кэше
От: VTT http://vtt.to
Дата: 22.10.15 06:42
Оценка:
Здравствуйте, Juster, Вы писали:

J>Здравствуйте!


J>Я выполнял задание, в котором нужно написать многопоточный кэш для БД.


J>- Изначально кэш пустой, потом при обращении клиентов, начинает дергать данные из БД.

J>- Запись одновременно может читать только один поток.
J>- Периодически кэш-система заливает изменения обратно в БД.
J>- Прослойка БД — сделана условно, сэмулированна, это нормально.

J>https://github.com/Yukigaru/RJCache


J>Ревьюверу реализация не понравилось и он отметил, что есть баги.

J>Я очень хочу поднять свой уровень, поэтому обращаюсь за помощью. Могли бы вы обратить моё внимание на:
J>- баги в многопоточности (неверная синхронизация, потенциальные deadlocks, races, AV, и т.п.)
J>- серьезные performance баги (совсем мелкие можно не замечать) из-за неверных структур или суровая неэффективность алгоритмов
J>- по стилистике (оформление, названия, форматирование и т.п.) можно не обращать внимание, сейчас не это главное

J>Спасибо!


Тут жесть прямо на каждом шагу. Если бы я был ревьювером, то до вопросов про многопоточность и алгоритмы я бы не дошел.
Вроде как везде советуют писать код так, чтобы его было потом удобно читать. Код, отправляемый на ревью наверное стоило бы писать особенно аккуратно.
Собирается с 7 предупреждениями, но фиг с ними...
О существовании typedef вам явно известно, отчего же везде копипаста навроде std::vector<std::pair<const std::string*, const std::string*>>?
О существовании многих других полезных вещей, навроде namespaces, ::std::map, references вроде тоже. Отчего же не используете?
Зато глобальные переменные, бардак с инклюдами, синхронизация и через ::std::atomic и через volotile bool тут как тут.

Начните заново с основ короче.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Отредактировано 22.10.2015 6:55 VTT . Предыдущая версия .
Re[2]: Найти фундаментальные ошибки в многопоточном кэше
От: Juster  
Дата: 22.10.15 06:56
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>Тут жесть прямо на каждом шагу. Если бы я был ревьювером, то до вопросов про многопоточность и алгоритмы я бы не дошел.

VTT>Вроде как везде советуют писать код так, чтобы его было потом удобно читать. Код, отправляемый на ревью наверное стоило бы писать особенно аккуратно.
VTT>Собирается с 7 предупреждениями, но фиг с ними...
VTT>О существовании typedef вам явно известно, отчего же везде копипаста типа навроде std::vector<std::pair<const std::string*, const std::string*>>?
VTT>О существовании многих других полезных вещей, навроде namespaces, ::std::map, references вроде тоже. Отчего же не используете?
VTT>Зато глобальные переменные, бардак с инклюдами, синхронизация и через ::std::atomic и через volotile bool тут как тут.
VTT>Начните заново с основ короче.

Спасибо за уделенное время и ответ.
Re[2]: Найти фундаментальные ошибки в многопоточном кэше
От: Juster  
Дата: 24.10.15 15:42
Оценка:
Здравствуйте, VTT, Вы писали:

VTT>Тут жесть прямо на каждом шагу. Если бы я был ревьювером, то до вопросов про многопоточность и алгоритмы я бы не дошел.

VTT>Вроде как везде советуют писать код так, чтобы его было потом удобно читать. Код, отправляемый на ревью наверное стоило бы писать особенно аккуратно.
VTT>Собирается с 7 предупреждениями, но фиг с ними...
VTT>О существовании typedef вам явно известно, отчего же везде копипаста навроде std::vector<std::pair<const std::string*, const std::string*>>?
VTT>О существовании многих других полезных вещей, навроде namespaces, ::std::map, references вроде тоже. Отчего же не используете?
VTT>Зато глобальные переменные, бардак с инклюдами, синхронизация и через ::std::atomic и через volotile bool тут как тут.
VTT>Начните заново с основ короче.

Многое исправил:
— Убраны глобальные переменные.
— Исправлена утечка RecordCached структур в RJCache.
— Исправлена логическая ошибка в RJCache::getForWrite, теперь в нём не вызывается load.
— В DBEmulatorLayer vector заменён на map, O(N^2) алгоритм заменён на O(N log N).
— Добавлена thread safe обёртка для printf.
— Добавлены файлы Utils.h/cpp с random ф-циями.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.