Безопасность: обратная совместимость с парсером HTTP/1.1 версий 0.8.x и его безопасностями в ветке версий 0.7.x. Это исправляет вектор атаки через маскирование запросов и вектор атаки через кодировку передачи данных, выявленные Самом Саноопом из команды безопасности компании Snyk. Парсер был обновлён для решения этих потенциальных проблем.
Исправление: (http
) исправление проблемы с расчётом даты путём обратной совместимости кода из ветки 0.8.x.
Исправление: (fio
) вызов меньшего количества сигналов при завершении работы.
Исправление: (http
) исправление проблемы и улучшение поддержки закодированных пакетами данных. Благодарим Иана Кер-Сеймера (@ianks) за выявление этой проблемы, написание тестов (для обёртки на Ruby) и открытие как проблемы boazsegev/iodine#87, так и предложения boazsegev/iodine#88.
Исправление: (http
) запросы будут проваливаться, если путь содержит висящий вопросительный знак (пустой запрос). Благодарим @adam12 за выявление этой проблемы и открытие проблемы boazsegev/iodine#86.
Исправление: (http
) исправление проблемы безопасности в логике разрешения имени файла, где злонамеренно закодированный запрос мог бы вызвать произвольный ответ.
Исправление: (fio
) исправление проблемы, когда установка другого значения для FIO_SLOWLORIS_LIMIT
игнорировалось.Исправление: (fio
, fiobj
) улучшение совместимости с C++. Благодарим Джоэля (@joeyhoek) за предложение #76.
Исправление: (fio
) исправление проблемы, когда очистка таймера не выполнялась после fio_stop
(или SIGINT/SIGTERM). Теперь будет предоставлен чистый слот, если fio_start
вызывается более одного раза. Примечание: это может нарушить предыдущее поведение, которое должно рассматриваться как недокументированное и непредвиденное поведение. (этот фактический момент может быть отложен до версии OnClickListener 0.8.x, решение ещё не принято). Благодарим @fbrausse за открытие проблемы #72.
Исправление: (fio
) исправление проблемы, когда очистка таймера выполнялась после вызова обратных функций AT_EXIT. Теперь обратные функции очистки таймера будут выполняться до вызова функций AT_EXIT (как они должны). (См. проблему #72).
Исправление: (fio
) исправление теста восстановления обработчиков сигналов для предотвращения рекурсивного вызова сигналов.
Исправление: (fio_tls
) исправление утечки памяти в цепочке доверенных сертификатов. Благодарим @fbrausse за открытие предложения #71.Исправление: (fio_tls
) исправление флагов компиляции/связывания (включая ошибку, вызванную оптимизатором GCC -fipa-icf
) и улучшение поддержки OpenSSL с использованием pkg-config
. Благодарим @fbrausse за предложение #71. Исправление: (http1
) исправляет проблему конкурентного доступа между событиями on_ready
и on_data
, которая могла привести к тому, что событие on_data
будет вызвано дважды вместо одного (возможно только с некоторыми клиентами). В многопоточных рабочих процессах это может привести к тому, что процессор будет работать в режиме постоянной загрузки, пока блокировка задачи остаётся активной. Благодарим Нестора Коппи (@Shelvak) за выявление проблемы и предоставление примера приложения с подробными отчётами. Проблема №75.### Версия 0.7.1
Безопасность: исправлена уязвимость переполнения кучи в парсере WebSocket, которая могла быть активирована специально сконструированным заголовком сообщения. Благодарность Дане (dane@silvertoque) за выявление этой проблемы и предоставление Python-скрипта, демонстрирующего атаку.
Стабильный выпуск API. Будущие обновления API будут ждать выпуска версии 0.8.x.
Исправление: (fio
, fiobj
) исправлены некоторые проблемы совместимости и предупреждения компилятора gcc
и clang
.
Исправление: (http
) исправлен формат даты HTTP, чтобы принудительно использовать два знака для дня месяца. Благодарность @ianks (Иан Кар-Саймер) за выявление этой проблемы (iodine#64).
Компаративность: (http
) обновлены тесты времени компиляции с более безопасным запасным вариантом.
Безопасность: (fio
) реализация защиты от Slowloris теперь является частью основной библиотеки, где FIO_SLOWLORIS_LIMIT
(текущее значение — 1024) ожидающих вызовов write
будет указывать на то, что соединение является атакой, и либо закрывать его, либо игнорировать. Этот протокол-независимый подход повышает безопасность.Безопасность: (http
) ограничение скорости HTTP/1.1 клиента — новые запросы не будут приниматься до тех пор, пока не будут получены все ожидающие ответы. Поскольку HTTP/1.1 является протоколом запрос-ответ, этот протокол-зависимый подход должен защитить HTTP-приложение от медленных клиентов.Исправление: (fio
) исправлена реализация запасного варианта для fio_atomic_xchange
при отсутствии атомарных примитивов в компиляторе (старых компиляторах). Благодарность @Low-power за выявление и исправление проблемы (PR #55).
Исправление: (fio
) исправлен возможный случай неразблокированного блока памяти при неудачной попытке выделения памяти (нет свободной памяти в системе). Благодарность @Low-power за выявление и исправление проблемы (PR #54).
Исправление: (fio
) исправлен запасный вариант для fio_sock_sendfile_from_fd
при отсутствии sendfile
. Благодарность @Low-power за выявление и исправление ошибки (PR #49).
Исправление: (fio
) исправлено неверное уменьшение счетчика пакетов в fio_pending
до достижения нуля.
Исправление: (fio
) исправлено сообщение журналирования при переполнении логов. Благодарю @weskerfoot (Wesley Kerfoot) и @adam12 (Adam Daniels) за выявление проблемы (вопрос iodine/#56).
Исправление: (fio
, fio_risky_hash
) Florian Weber (@Florianjw) выявил ошибку порядка байтов (последних 7 байт) и провёл тестирование алгоритма. Выявленные ошибки были исправлены, а также обнаружена возможность атаки на RiskyHash с использованием вариации метода "Meet-In-The-Middle". Это было сделано Henning Makholm (@hmakholm). Это привело к обновлению и исправлению функции.Исправление: (fio
) исправлено поведение fio_str_resize
, где данные могут быть потеряны, если они записываются за пределы текущего размера и запрошенный размер больше, чем вместимость строки (например, когда fio_str_resize
используется как альтернатива для fio_str_capa_assert
).Исправление: (json
/ redis
) исправлено форматирование JSON при реаллокации буфера при обнаружении более 48 последовательных экранированных последовательностей. Эта проблема также затрагивает обработчик обратного вызова команд Redis (который использует JSON для IPC).
Исправление: (redis
) исправлен потенциальный двойной вызов free
.
Исправление: (redis
) исправлен бесконечный рекурсивный цикл при конвертации вложенных таблиц хэшей в объекты Redis (что обычно не происходит, так как они обрабатываются как JSON).
Исправление: (redis
) исправлено соединение Redis. Данные адреса и порта были случайно записаны в неправильное место, что приводило к их перезаписи входящими данными (не pub/sub).
Исправление: (redis
) исправлено конкурентное состояние в логике восстановления соединения Redis, которое могло привести к установке более одного соединения pub/sub и повторному отправлению первого ожидающего команды.
Исправление: (fio
) исправлено сообщение журналирования максимальизации вместимости для учета случаев, когда getrlimit
возвращает значение rlim_max
, слишком большое для rlim_cur
(macOS).
Исправление: (fio
) исправлено непредставленное сообщение журналирования kqueue
в fio_poll_remove_fd
.
Исправление: (http
) возможное исправление для http_connect
, где длина заголовка Host
может остаться неинициализированной, что может привести к ошибкам.Исправление: (fio
) исправлено сообщение журналирования для длинных сообщений об ошибках.Обновление: (fio
/ makefile
) улучшена детекция системного вызова для опроса, sendfile
и других.
Обновление: (fio
) улучшено управление сигналами. Теперь управление сигналами распространяется на существующие обработчики сигналов. В дополнение, функция fio_signal_handler_reset
сделана публичной, что позволяет немедленно удалять обработчики сигналов Facil.io после запуска (используя fio_state_callback_add
с FIO_CALL_PRE_START
для вызова fio_signal_handler_reset
).
Обновление: (fio
) улучшена производительность использования памяти в режиме публикации/подписки для минимизации копирования сообщений в режиме кластера (также используется память для IPC и локального процесса).
Обновление: (fиo
) обновлён алгоритм псевдослучайного генератора (ПСГ) для повышения производительности и скорости. Теперь функции fio_rand
основаны на алгоритме xoroshiro128+
, с автоматическим счетчиком переинициализации на основе RiskyHash. Это должно повысить производительность для требований к случайным числам, не использующим шифрование.
Компаративная совместимость: (fio
) снижение влияния неопределённого MAP_ANONYMOUS на MacOS <= 10.10. Благодарим @xicreative (Еван Павлика) за iodine/PR#61.
Компаративная совместимость: (fio
) различные исправления совместимости с операционной системой Solaris, благодаря @Low-power (PR #52, #53).### Версия 0.7.0.beta7
НЕДОСТАВАНИЕ: (fio_tls
) Изменения в API SSL/TLS... Я знаю, извините, особенно учитывая небольшие и вводящие в заблуждение изменения порядка аргументов для fio_tls_cert_add
и fio_tls_new
... Но если мы не исправим API сейчас, перед выпуском 0.7.0, плохое проектирование может испортить нашу среду медитации на всю вечность.
НЕДОСТАВАНИЕ: (http
) Изменения в API для http_connect
, необходимые для поддержки соединений через Unix сокеты в клиентском режиме.
Устаревание: (http
) Устарел http_url_parse
в пользу fio_url_parse
(функция перемещена в основную библиотеку и частично переписана).
Безопасность: Хеш-карты facil.io теперь ограничивают количество полных коллизий. Это снижает воздействие атак типа "хеш-флуд". В результате, хеш-карты, находящиеся под атакой, могут возвращать неверные результаты для объектов коллизии.
Исправление: (websocket
) Исправлена проблема с парсером WebSockets, где сетевой порядок байтов для длинных сообщений иногда игнорировался, а размер бита целого числа был неверным для больших нагрузок. Благодарим Мароуана Эльмидгауи (@moxgeek) за выявление проблемы.
Исправление: (http
) Исправлено использование udata
в колбэке клиента WebSocket при неудачных соединениях WebSocket клиента.
Исправление: (fio
) Сообщение журналирования при прослушивании Unix сокета.Исправление: (fio
) проведено множество мелких дизайнерских исправлений, таких как доступ к памяти строки в Big-Endian, что позволяет использовать fio.h
как библиотечный заголовок (требует FIO_FORCE_MALLOC
) и другие коррективы.
Исправление: (fio
) исправлено незаконченное чтение памяти в реализации SipHash и добавлено случайное заполнение секретами для каждого перезапуска программы.
Исправление: (redis
) исправлено проблемное поведение при разрушении движка Redis и преждевременном завершении работы до выполнения facilio.io
(fio_start
), что приводило бы к ошибке сегментации во время очистки.
Обновление: (fio
) добавлено использование Риского хеша для быстрого хеширования безопасных данных. Это быстрая функция хеширования (в два раза быстрее по сравнению с базовым защищённым функционалом SipHash1-3), которая не была протестирована на безопасность. По этой причине её следует ограничивать использованием для внутренних/безопасных данных, таких как имена аргументов командной строки.
ПРЕРЫВАНИЕ: (fio_tls
) изменения в API SSL/TLS, добавляющие поддержку защищённых паролями файлов закрытых ключей. Примечание: API SSL/TLS всё ещё является недостаточно надёжным и может считаться стабильным только после выпуска версии 0.7.0 с поддержкой SSL/TLS.Безопасность / Исправление: (http
) исправлено поведение парсера HTTP/1.1, где злонамеренно созданные данные пробела могли вызвать ошибку сегментации, которая могла привести к потенциальному отказу сервиса.Исправление: (fio
) исправлено поведение, выявленное при внедрении слоя TLS, где самый высокий fd
для соединения, которое не было немедленно присвоено объекту protocol_s
сразу после открытия соединения, могло избежать проверки таймаута или очистки при завершении работы (что будет отмечено как утечка памяти).
Обновление: (fio_tls
) добавлена экспериментальная поддержка OpenSSL. Это было частично протестировано и должно рассматриваться как экспериментальное.
Обновление: (fio
) добавлено fio_rw_hook_replace_unsafe
для возможности замены r/w hook внутри колбэка r/w hook.
Обновление: (fio_cli
) распространенная ошибка пользователя — отсутствие fio_cli_end
, что приводит к уведомлению о утечке памяти. Теперь facil.io защищает от этой распространенной ошибки, автоматически вызывая fio_cli_end
на этапе выхода, если был вызван fio_cli_start
.
Исправление: (fio_cli
) исправлена проблема, возникшая в версии 0.7.0.beta4, при которой fio_cli_get_i
бы обращался к NULL, если значение не было установлено. Теперь fio_cli_get_i
возвращает ноль (0) для отсутствующих значений, как ожидалось. Примечание: это связано с новой поддержкой шестнадцатеричной и двоичной систем счисления в командной строке.
fio_cli
) изменения в API делают это расширение проще, чем когда-либо... Прошу прощения за это, но часть причины, по которой 0.7.0 всё ещё находится в бете, заключается в тестировании самого API на удобство использования и читаемость.*Исправление: (fio
) исправлена небольшая утечка памяти в режиме кластера, вызванная тем, что процесс-родитель не освобождал хэш-карту, используемую для мониторинга подписок дочерних процессов.Исправление: (fio
) исправлены избыточные и потенциально ошибочные вызовы обратных вызовов движка pub/sub к unsubscribe
, вызванные (по ошибке) сообщением о закрытии канала фильтрации.
Исправление: (mustache
, FIOBJ
) добавлена поддержка записи через точку в шаблонах Mustache.
Исправление: (http/1.1
) прекращено дальнейшее обработку запросов, если соединение было закрыто.
Исправление: (fio_test
) исправлены некоторые утечки памяти в тестовых функциях.
Обновление: (fio_cli
) оформлены и улучшены строки FIO_CLI_PRINT_HEADER
.
Обновление: (fio
) обновлены автоматические вычисления параллелизма для оставления ресурсов системе при предоставлении отрицательного значения (ранее доступно только для расчета количества рабочих процессов, теперь также доступно для расчета количества потоков).
Исправление: (fio
) исправлены избыточные события ping
, которые могли происходить после fio_write
(но до фактической запланированной записи).Исправление: (mustache
) обновлен парсер Mustache для исправления проблемы с путями загрузки шаблонов. Логика разрешения частичных шаблонов была переписана, исправлена и улучшена (надеюсь). Это также добавляет поддержку текста в лямбда-функциях Mustache, хотя эта функциональность не применима при использовании с FIOBJ.Исправление: (fio
) предотвращено замедление fio_force_close
из-за задержек чтения/записи при возникновении ошибки во время опроса соединения.
Исправление: (fio
) удалены Unix сокеты после завершения прослушивания. Исправлена проблема, при которой файлы оставались целыми.
Исправление: (fio
) заменена существующая реализация выделения памяти / списка свободной памяти fio_malloc
. Это также исправляет проблему с сохранением больших пулов памяти на многоядерных системах с большим количеством отчетных ядер ЦПУ.
Исправление: (fio
) флаг FIO_FORCE_MALLOC
был исправлен с учетом того факта, что fio_malloc
возвращает нулевые данные (все байты установлены в ноль) вместо системной функции malloc
, которая может вернуть мусорные данные.
Исправление: (http
) исправлена возможная утечка памяти в http_mimetype_register
, где очистка реестра не освобождала строки типа данных FIOBJ.
Обновление: (cli
) обработка пустых строк в значениях CLI была обновлена, игнорируются аргументы вместо вывода ошибки или получения неопределенного значения.
Оптимизация: (fio
) имена каналов подписки/публикации теперь часто являются объектами с длительным сроком службы. Поэтому эти объекты используют malloc
(вместо fio_malloc
). Также были удалены временные распределения в fio_subscribe
.Оптимизация: (fio
) метаданные и обратные вызовы для подписки/публикации теперь используют массив (вместо связанных списков и хэш-таблиц). Это должно улучшить локальность кеша при установке и получении метаданных подписки/публикации.Оптимизация: (fio
) добавлено экстренное задание для внешнего ввода-вывода, что может улучшить защиту от ненаблюдаемого/блокирующего кода пользователя.
Оптимизация: (http
) автоматизация оптимизации широковещательной передачи через WebSockets.
Критические изменения!
Большая часть кода была переписана и переупорядочена, минимизируя пространство имён, используемое основной библиотекой, и объединив её в двухфайловую библиотеку (fio.h
и fio.c
).
Это привело к разрыву API и ABI и увеличению номера версии.
Это должно сделать библиотеку легче копировать и использовать, а также минимизировать возможные коллизии имён (за счёт использования нескольких моносвязных файлов как основной библиотеки).
Основные изменения:
Библиотека FIOBJ была выделена из основной библиотеки, сделав её дополняющей, которую можно использовать расширениями (например, расширением HTTP) вместо требования к использованию в качестве основной библиотеки.
Уменьшение основной библиотеки и её пространства имён до двух файлов (fio.h
и fio.c
) — замена всех функций facil_
на fio_
для соответствия новому пространству имён.
...почему?
Это выбор, который предпочитает удобство использования за счёт удобства поддержки. Хотя два файла труднее поддерживать, чем десять файлов (предполагая одинаковое количество кода)... кажется, что два файла проще копировать и вставлять в проекты других разработчиков.* Добавлена поддержка опроса для возможности тестирования производительности и совместимости с CYGWIN. Вызовы системных функций epoll/kqueue должны работать лучше при высоких нагрузках, но теперь вы можете проверить это самостоятельно.* Таймеры теперь находятся в пространстве пользователя, что позволяет использовать больше таймеров и иметь меньше зависимостей от ядра.
Настройки on_idle
и on_finish
в facil_run
(теперь fio_start
) были удалены, заменены более гибким подходом через fio_state_callback_add
.
Функции fio_listen
и http_listen
теперь возвращают UUID прослушиваемого сокета (похоже на то, как это делали fio_connect
и http_connect
).
Теперь вызов обратного вызова on_shutdown
протокола ожидает возврата значения типа uint8_t
, указывающего на запрошенное время ожидания перед принудительным закрытием сокета. Возврат значением 0 будет указывать на немедленное закрытие сокета с временным ограничением 8 секунд для очистки выходящего буфера.
Система межузловой связи и система публикаций/подписок были переработаны, API изменился, а также была удалена зависимость от FIOBJ. Это изменение затрагивает все элементы системы публикаций/подписок.
Аргумент use_pattern
системы публикаций/подписок был заменён опциональным аргументом обратного вызова match
(указатель на функцию), позволяющим использовать пользовательские методы соответствия шаблонов (например, реализация NAT и соответствия шаблонов RabbitMQ). Предыдущий подход с использованием шаблонов (совместимый с Redis) доступен через предоставленный указатель на функцию FIO_MATCH_GLOB
.* Обновление WebSocket (http_upgrade2ws
) теперь соответствует функции обновления SSE (начинается с хендла http_s *
и именованными аргументами).
API и реализация командной строки полностью переписаны. Новый код немного более "монолитный" (одна длинная функция выполняет большую часть работы), но должен потреблять меньше памяти благодаря более простому API (также устранено использование некоторых постоянных данных).
Хуки чтения/записи сокетов были переработаны.
Был спроектирован заготовочный API для абстракции SSL/TLS библиотек (ещё не реализовано). Этот API экспериментальный и может измениться по мере создания первых обёрток для SSL/TLS библиотек (в планах включены OpenSSL и BearSSL).
Обновление: (fio_mem
=> fio.h
) обновлены параметры по умолчанию аллокатора для снижения стоимости долгоживущих распределений. Уведомление: аллокатор был спроектирован для коротких/средних сроков жизни распределений или больших распределений (которые напрямую отображаются на mmap
). Теперь 16 КБ будут считаться большим распределением, и стоимость его хранения снижается (меньше фрагментации). Исправление: (fio
) исправлена ошибка в выводе при выключении системы. Благодарю @bjeanes (Бо Жейнс) за вклад в PR Iodine#39.
Новая функциональность: (FIOBJ
) добавлена поддержка шаблонов Mustache (подробнее).Логотип: Логотип создан @area55git (Area55)
Документация: Создана новая веб-страница!
Исправление: (sock
) исправлено поведение вызова sock_write
, которое могло приводить к добавлению данных в очередь отправки даже после выполнения sock_close
в случае непустой очереди.
Исправление: (facil.io
) исправлено конкурентное состояние между предварительно запланированными задачами (defer
вызовы) и процессом инициализации рабочего потока. Конкурентное состояние могло приводить к тому, что некоторые предварительно запланированные задачи не выполнялись во всех рабочих потоках.
Исправление: (http
) исправлено отсутствие адреса соединения в логах запросов HTTP.
Исправление: (websocket
) гарантируется, что on_ready
никогда не будет вызван до завершения on_open
.
Исправление: (fio_mem
, facil
, http
) исправлены проблемы совместимости с дистрибутивом Alpine Linux и старыми версиями macOS (< 10.12).
Исправление: (http
) исправлен метод http_date2rfc2109
, где пробел не был записан после имени месяца (что приводило к появлению лишнего байта).
Исправление: (pubsub
) гарантируется, что новые зарегистрированные движки получают полный список существующих подписок (не требуется вызывать pubsub_engine_resubscribe
).
Исправление: (facil
) возможное исправление проблемы прикрепления протокола с использованием NULL
протокола.### Версия 0.7.0.beta1
(Отозвано)
Исправление: (fio_hashmap
/ fiobj_hash
) исправлена возможность возникновения ошибки при компактной очистке сильно фрагментированного хэша (где размер нового хранилища меньше размера фрагментированного массива данных).
Исправление: (http
/ websocket
) исправлено поведение, когда вызов WebSocket'a on_close
не осуществлялся при наличии определённых ошибок, препятствующих переходу в режим WebSocket. Теперь on_close
всегда вызывается.
Исправление: (http
) исправлено отсутствие заголовка Content-Type при передаче неопознанных файлов. Теперь производится дополнительная попытка определения типа содержимого (в этот раз используя URL вместо имени файла). Если тип содержимого не определяется, применяется значение по умолчанию согласно RFC (application/octet-stream
).
Исправление: (http1_parser
) исправлено возможное обращение к незаполненной памяти.
Исправление: (FIOBJ
) исправлена совместимость компилятора с логикой fiobj_num_new
, что устранило некоторые случаи неопределенного поведения.
Исправление: (facil
) отсутствие протокольной обратной связи on_data
(отсутствовало при facil_attach
) теперь вызывает facil_quit
, что предотвращает бесконечное срабатывание события.
Обновление: (http
) обратная связь on_upgrade
теперь поддерживает соединения SSE с идентификатором протокола sse
и функцией http_upgrade2sse
.Обновление: (sock
) начальная поддержка TCP Fast Open (TFO) при прослушивании соединений.
Эта версия исправляет ряд проблем, включая серьёзную проблему, которая препятствовала полному очистительному действию буфера сокетов.
В этой версии также улучшена логика завершения работы и горячего перезапуска, а также исправлены множество проблем с режимом кластера и службами pub/sub.
Рекомендовано всем пользователям версий Yöntem 0.6.0.beta, 0.6.0 и 0.6.1 обновиться до данной версии.
Безопасность: (http1
) добавлен жесткий лимит на количество заголовков, разрешённых на запрос (независимо от размера). HTTP_MAX_HEADER_COUNT
по умолчанию равен 128, что должно быть достаточно во всех случаях.
Исправление: (pubsub
, facil
, redis-engine
) исправлены множественные проблемы кластера и pub/sub, включая поддержку нового обратного вызова on_startup
для объектов pubsub_engine_s
(что делает обработку fork
ещё проще). Это исправляет утечку памяти, ошибку учёта ссылок, которая освобождала память слишком рано, ошибки парсинга сообщений на фрагментированных сообщениях, устаревший формат пакета ping и многое другое.
Исправление: (sock
, facil
) исправлена проблема, когда буферы сокетов не полностью очищались (событие on_ready
не было правильно переустановлено). Это была выявлена как серьёзная проблема, и обновление до версии 0.6.2 рекомендовано.
Исправлены непонятные части:
http
) исправлена ошибка вывода строки состояния HTTP, где коды состояний выше 410 приводили к внутренней ошибке (код 500) вместо правильной строки состояния.Исправление: (websockets
) исправлена недостающая сигнализация пакета "close", который должен был быть отправлен сразу после обратного вызова on_shutdown
пользователя.
Исправление: (FIOBJ
) исправлена функция fiobj_str_tmp
для добавления потока безопасности (временная строка должна храниться в локальном хранилище потока, а не быть глобально доступной).
Исправление: (redis
) исправлена проблема конкурентного доступа в движке Redis, которая могла препятствовать установке соединений для публикаций в рабочих процессах.
Исправление: (facil
) исправлено поведение функции facil_attach
, которое не вызывало обратный вызов on_close
, если сбой был связан с файловым дескриптором равным -1.
Исправление: (facil
) исправлена проблема сигнализации, при которой сигнал SIGUSR1
, отправленный рабочему процессу, мог случайно привести к завершению работы сервера вместо того, чтобы завершить конкретный рабочий процесс и восстановить новый.
Исправление: (facil
) исправлена логика обработки сигналов для обеспечения асинхронной безопасности, что защищает от возможных мертвых замков или корRUPTIONа потока кластера.Обновление/Исправление: (facil
) событие on_data
больше не будет вызываться для сокетов, помеченных для закрытия с помощью sock_close
.
Обновление: (FIOBJ
) обновлен метод fiobj_str_readfile
, который позволяет использовать отрицательное значение stat_at
(расчетное относительно конца файла).
Обновление: (facil
) усилен блокировщик обратного вызова on_shutdown
, чтобы предотвратить его вызов во время выполнения обратного вызова on_data
(или других задач соединения).
Обновление: (facil
) логика завершения теперь предоставляет больше времени для очистки буферов сокетов (только когда это требуется).
Исправление: (pubsub
) исправлена проблема, при которой имя канала может быть освобождено до обработки обратного вызова. Это было пропущено во время обновления логики кэширования хешей, которое предотвращало хеширование ключей, когда последний элемент упорядоченного хеша удаляется.
Исправление: (pubsub
) теперь публичная подписка компактизирует используемую память для данных клиентов и каналов, если хранилище становится чрезмерно фрагментированным.
Исправление: (hashmap
) исправлена проблема чтения памяти, которая могла возникнуть, когда хеш содержит только один объект и этот объект удаляется (что приводит к чтению памяти в расположении сразу перед адресом карты хеша).Исправление: (defer
) теперь defer
предпочитает статически выделенный буфер динамическому, когда все задачи завершены, что предотвращает утечку последнего выделенного буфера на этапе завершения.
Исправление: (websocket
) подписки, созданные во время обратного вызова on_close
(кроме указания злоупотребления API), теперь правильно удаляются.
Версия 0.6.0 является значительным выпуском, который меняет много аспектов расширенного API (HTTP, pub/sub, CLI) и некоторых аспектов базового API (например, переход от уровня-триггерного до одноразового триггерного опроса evio, перезапись типов динамических объектов FIOBJ и других).
Следующие обновления включены в этот выпуск (в дополнение к бета-обновлениям):
Исправление: (pubsub
) Устранена проблема, при которой отложенные сообщения pub/sub имели значение udata2
, равное значению udata1
, вместо фактического правильного значения.
Исправление: (facil
) Устранена проблема с функцией facil_is_running()
, которая могла привести к аварийному завершению программы, если facil.io не был инициализирован до вызова этой функции.
Исправление: (facil
) Устранено обнаружение ограничения использования ЦП. Отрицательные значения теперь имеют смысл (дробная часть ядер процессора, так что -2 равно ядрам/2). Нулевые значения заменяются facil.io.Обновление: (facil
) Теперь доступна горячая перезагрузка для режима кластера. Отправив сигнал SIGUSR1
программе, facil.io будет закрывать все рабочие процессы и запускать новые, обеспечивая возможность горячей перезагрузки. Отключение возможно через установку FACIL_DISABLE_HOT_RESTART
.
Обновление: (facil
) Опция системы может быть активирована или деактивирована путём установки макроса FIO_DEDICATED_SYSTEM
во время компиляции. При установленном FIO_DEDICATED_SYSTEM
facil.io считает, что все ядра процессора доступны, и активирует потоки раньше. При определении FIO_DEDICATED_SYSTEM
как 0, facil.io ограничивает количество потоков для защиты от медленного пользовательского кода (вместо попытки параллельной работы с вводом-выводом).
Обновление: (fio_mem
) двусвязный список логики заменён на односвязный список, чтобы сделать библиотеку более независимой и уменьшить некоторые операции.
А также проведены рефакторинг и небольшие коррективы.
Исправление: (defer
) символ defer_free_thread
теперь правильно помечен как слабый, позволяя переопределить эту функцию.
Исправление: (http
) исправлена проблема, при которой куки без явного возраста были помечены для немедленного удаления (вместо ожидаемого срока жизни "сеанс").
Исправление: (http
) исправлен потенциальный сбой, при котором отсутствие или повреждение заголовка accept-encoding
могло привести к ошибке сегментации.Исправление: (http
) исправлена проблема, при которой ошибки шифрования куки повторялись.
Исправление: (fio_hash
) исправлена проблема, при которой заново отправленный удалённый объект не увеличивал общее число объектов.
Исправление: (fiobj
) исправлена проблема, при которой тест типа специальных объектов FIOBJ_T_NUMBER с помощью FIOBJ_TYPE_IS
возвращал положительный ответ для типов FIOBJ_T_HASH или FIOBJ_T_STRING. Обновление: Добавлен экспериментальный пользовательский менеджер памяти (fio_mem.h
), оптимизированный для малых одновременных краткосрочных выделений памяти (все, что превышает 16КБ, и реаллокация начинают влиять на производительность). Он может заменить семейство системных функций malloc
, если определено FIO_OVERRIDE_MALLOC
. Для использования tcmalloc
или jemalloc
определите FIO_FORCE_MALLOC
, чтобы предотвратить компиляцию fio_mem
.
Исправление: (http
) добавлен парсинг cookies.
Обновление: небольшие оптимизации, включающие fio_malloc
и обновление документации.
Исправление: (websockets
) исправлена проблема с клиентским пингом, которая могла нарушить протокол, приведя к потери данных или отключению соединения.
Исправление: (websockets
) удалён отладочный пинг (пинг каждые 3 секунды) из клиента WebSocket. Пинги могут отправляться вручную или путём установки времени ожидания соединения с помощью facil_set_timeout
.Исправление: (websockets
) гарантируется, что маска клиента никогда не будет равна нулю благодаря установке нескольких битов, не зависящих от случайности.
Исправление: (redis
) исправлена проблема, при которой очередь команд (для занятых команд Redis в режиме трубопровода и для повторного подключения) отправляла последнее сообщение циклически вместо отправки всех сообщений из очереди.
Исправление: (facil
) исправлена возможная утечка памяти, связанная с facil_connect
и неудачными подключениями к локальному хосту. Улучшена очистка процесса при завершении работы.
Исправление: (pubsub
) улучшена очистка процесса при завершении работы.
Исправление: (fio_cli
) исправлен цветовой вывод текста на терминал.
Исправление: (fio_hash
) исправлена логика цикла для удаления необходимости маркера "data-end", что позволяет немного оптимизировать выделение памяти.
Обновление: (websockets
) добавлен пример использования терминального ввода/вывода для текстового общения через WebSocket.
Эта бета-версия направлена на повышение производительности и включает в себя в основном изменения, связанные с производительностью.
Эта версия обновляет некоторые значения по умолчанию, чтобы сделать их более реалистичными для типовых случаев использования и помочь минимизировать потребление памяти.Эти значения, такие как LIB_SOCK_MAX_CAPACITY
, FIO_HASH_INITIAL_CAPACITY
и FIOBJ_ARRAY_DEFAULT_CAPA
, можно обновлять во время компиляции.
Некоторые из этих значений по умолчанию можно обойти во время выполнения с помощью специальных вызовов функций (например, fio_hash_new2
).
Другие значимые изменения в плане производительности включают кэширование коротких строк (уменьшение емкости коротких строк FIOBJ в обмен на снижение количества вызовов fio_siphash
).
Это уроки, полученные из тестирования TechEmpower... хотя они не будут отражены в результатах Ронда 15.
Выпущены исправления для проблем, связанных с запуском на 80 ядрах в рамках TechEmpower Framework Benchmarks. Исправление: исправлено управление ошибками при запуске в режиме кластера, что гарантирует, что facil.io не сможет запуститься при возникновении ошибок.
Обновление: установлен верхний предел значения выявления ядер до 120 ядер. Любое значение больше 120 вызовет предупреждение, а предел (120) будет использоваться.
Выпущена после стресс-тестирования и тестирования утечек памяти.
Разрыв изменений: (websockets
) сигнатура обратного вызова on_close
для websocket была изменена, чтобы позволить её вызывать при сбоях соединения или обновлений (более простой процесс очистки udata
).Исправление (facil
): исправлена проблема, возникшая в версии beta.2, где отложенные события, расписание которых происходило до вызова facil_run
, вызывались только для родительского процесса. Теперь эти события будут выполняться так, как было задумано (один раз в корневом процессе и один раз в каждом рабочем процессе).
Исправление (facil
): обновлен логический подход к открытому соединению, чтобы гарантировать закрытие всех активных соединений при перезапуске рабочего процесса. Это изменяет предположение о безопасности соединений с небезопасного (распределённые соединения должны быть закрыты расширением) на безопасное (переустановка соединений должна быть выполнена расширением). Это изменение должно затронуть только внутренние расширения, поскольку активные соединения не управляются корневым процессом в режиме кластера.
Изменение (websocket
): протокол стал более щедрым в случаях, когда клиенты не маскируют пустые сообщения.
Новая функциональность (websockets
): простой и удобный клиент WebSocket с использованием websocket_connect
, а также поддержка более сложных клиентов (с логикой аутентификации и т.д.) с помощью сочетания функций http_connect
и http_upgrade2ws
.
Мелкие изменения: некоторые изменения в внутренней логике HTTP, исправлены некоторые сообщения об ошибках и другие мелкие обновления.### Версия 0.6.0.beta.2
Версия 0.6.0 является значительной версией, которая меняет много аспектов API расширений (HTTP, pub/sub, CLI) и некоторых аспектов основного API (например, перемещение опроса evio
на одноразовое событие).
В этой бета-версии 2:
Исправление (facil
): исправлено возможное возникновение проблемы при форкировании большого количества процессов, где блокировки соединений кластера остаются заблокированными, что приводит к завышенному использованию ЦПУ и препятствует нормальной остановке.
Исправление (redis
, pubsub
, evio
): исправлены внутренние ошибки движка Redis. Было замечено, что есть ошибка восстановления соединения, связанная с обновлениями новой логики событий evio
.
Обновление: (http
) Добавлены экспериментальные вспомогательные функции для парсинга запросов, которые выполняют разрешение вложенного имени параметра (например, named_hash[named_array][]=значение
). Логика может измениться в зависимости от соображений производительности. Буду рад получить ваши отзывы об этой функции.
Обновление: (facil
) Упрощена логика наблюдения за дочерними рабочими процессами, используя потоки вместо IPC.
Версия 0.6.0 является значительным выпуском, который меняет много аспектов расширяемого API (HTTP, pub/sub, CLI) и некоторых аспектов базового API (например, перемещение опроса evio
на одноразовый опрос).В этом бета-выпуске:
Исправление (http
): исправлена проблема, при которой получение одного и того же имени заголовка более одного раза приводило к невозможности преобразования значения заголовка в массив значений.
Мелкие исправления: улучшено управление ошибками, добавлены тесты, исправлено поведение fiobj_iseq
, чтобы проверять ключи хэшей, а также объекты. Кэширование ключей в fio_hashmap.h
для удалённых объектов очищается, когда хэш пуст (то есть, если он пуст, то он действительно пуст).
Производительность: небольшие улучшения. Например, хэш-карты заголовков теперь очищаются и переиспользуются HTTP/1.1 во время keep-alive (вместо освобождения и заново выделения).
Этот выпуск является значительным, который меняет много аспектов расширяемого API (HTTP, pub/sub, CLI) и некоторых аспектов базового API (например, перемещение опроса evio
на одноразовый опрос).
Перемещение не представляет большой сложности, но и не является полностью прозрачным.Исправление (перенесено): (websocket_parser
) Парсер WebSocket имел проблему с смещением памяти и выравниванием в его логике размыкания (XOR) и новым кодом защиты выравнивания памяти. Проблема могла затронуть парсер в редких случаях, когда несколько сообщений были помещены внутрь внутреннего буфера и их длина создала нечетное выравнивание (проблема могла возникнуть с очень быстрыми клиентами или сильно нагруженным сервером).Примечание об исправлениях
Я просто переписал большую часть кода, чтобы понять, существовали ли исправленные мной проблемы в версии 0.5.x.
Я считаю, что некоторые вещи работают лучше. Некоторые вопросы блокировки будут иметь меньше конкуренции, и я уверен, что я исправил некоторые проблемы в основных типах данных fiobj
и расширении http
.
Однако опыт показывает, что новый значительный выпуск (0.6.0) всегда более хрупкий, чем патч-выпуск. Я сделал всё возможное, чтобы протестировать новый код, но опыт говорит мне, что мои тесты часто так же полны ошибок, как и код, которым они тестируются. Конечно, выпускаю версию 0.6.0, зная, что она работает лучше, чем версия 0.5.8, но также понимая, что она ещё не была полностью протестирована в боевых условиях.
Изменения! (fiobj
/ объекты facil.io):
Основные изменения API.
Динамическая библиотека типов facil.io была значительно сведена к основному ядру, интегрирована в обработку HTTP запросов и ответов, движок публикаций и подписок, внутренний буфер WebSocket и практически во все аспекты библиотеки.
Это потребовало некоторого упрощения fiobj
и обеспечения того, чтобы будущие изменения требовали меньшего процесса миграции.
Типы Symbol и Couplet были удалены, вместе с поддержкой защиты от вложенного доступа (что никто, кажется, и не использовал).- Мы вернулись к статическому типированию с помощью enum
, используя макросы и встроенные функции для идентификации типа (лучшая производительность за счёт усложнения расширяемости).
Хэши теперь полностью защищены от коллизий и имеют улучшенную локальность памяти, хотя это привело к увеличению использования памяти и необходимости вызова memcmp
(это можно избежать при поиске / удалении / удалении элементов, но не при перезаписи элементов).
Изменения! (http
):
HTTP API и движок были полностью переписаны (за исключением парсера HTTP/1.1), чтобы поддерживать будущий режим клиента (включая использование чанков для трейлинговых заголовков) и сделать маршрутизацию и анализ запросов проще.
Обновление HTTP API может привести к снижению производительности при чтении HTTP-запросов из-за необходимости выделения ресурсов и возможной копии части данных в динамическое хранилище... Например, таблицы хэшей заголовков заменили массивы заголовков, что улучшило время поиска и увеличило время создания.
Парсер HTTP теперь разбивает длинные URI-схемы на короткий URI + заголовок Host
(который может стать массивом, если он будет использоваться).
Изменения! (websocket
):
FIOBJ
.- websocket_write_each
стал устаревшим (предпочтение отдается дизайну только с публикациями и подписками).Изменения! (pubsub
):
API pubsub
был переработан после переоценки роли движка публикаций и подписок и для возможности использования системы типов FIOBJ
.
Названия каналов теперь используют хэш-карту с защитой от коллизий (используется memcmp
для сравнения названий каналов). Это означает, что четырёхуровневое дерево TRIE больше не используется и станет устаревшим. Изменения! (redis
):
Был переписан модуль redis_engine
, а также парсер RESP, чтобы отразить изменения в новом сервисе pubsub
и удалить устаревший код.
Изменения! (facil
):
Незначительные изменения в API:
Теперь функция facil_last_tick
возвращает тип данных struct timespec
вместо time_t
, что позволяет использовать более точные метки времени.
Функции facil_cluster_send
и facil_cluster_set_handler
были переработаны с учётом нового механизма работы кластера (теперь использует Unix сокеты вместо труб).
Внутренние обновления для адаптации к изменениям других библиотек.
Кластерный режим теперь работает как сentinels, автоматически восстанавливая любые завершившие работу рабочие процессы (кроме режима DEBUG).
Изменения! (evio
):
Библиотека событийного ввода-вывода была переработана для одноразовых уведомлений, требуя вызова функций evio_add
или evio_set_timer
для получения будущих уведомлений. Это было значительным изменением поведения, и изменения в API (что привело к обратной непригодности) были сделаны намеренно.
Код был рефакторирован для разделения логики системы на различные файлы, что делает его проще для поддержки большего количества систем в будущем.
Изменения!: (sock
):
Библиотека сокетов теперь поддерживает автоматическое обнаружение Unix (установите port
в NULL и предоставьте действительный путь Unix сокета в поле address
).
API хуков чтения/записи библиотеки сокетов был пересмотрен, отделив указатели функций от данных пользователя. При нагрузках сервера выше 25% это снижает потребление памяти.
API буферизации пакетов библиотеки сокетов был устаревшим, и все операции sock_write2(...)
теперь берут на себя владение памятью/файлом (обеспечивают move
).
Внутренний движок был обновлен, полностью убрав заранее выделенные буферы пакетов и активировав выделение заголовков пакетов через malloc
, что вносит значительные изменения внутреннего поведения, возможно влияющие на встраиваемые системы.
Изменения!: (defer
):
Удалено форкирование из библиотеки defer, переместив логику fork
в основной код facil
.
Пуллы потоков defer теперь включают два слабых метода, позволяющих настроить расписание потоков (просыпание/ожидание). Эти методы перезаписываются facil.io (в facil.c
). По умолчанию, defer будет использовать nanosleep
.
Рефакторинг: (fiobj
) логика базового динамического массива и хэш-таблицы была перемещена в единую библиотеку, поддерживающую указатели типа void *
, что позволяет использовать ту же логику для любого набора объектов C (а также для объектов facil.io).---
Исправление (обратная совместимость): (facil
/ pubsub
) исправлена проблема с повреждением кластерных сообщений при передаче в высокой последовательности. Благодарность Дмитрию Давыдову (@haukot) за выявление этой проблемы через реализацию сервера Iodine (Ruby порт).
Должно быть отмечено, что это не решает основной недостаток, связанный с большими кластерными или паб/суб сообщениями, который вызван дизайнерским недостатком в реализации pipe
(в некоторых ядрах).
Единственный способ решения проблемы повреждения больших сообщений — использование нового движка паб/суб, представленного в ветке выпусков facil.io 0.6.x, который использует Unix сокеты вместо труб.
websocket_parser
) парсер WebSocket имел проблему с смещением памяти и выравниванием при обработке логики unmasking (XOR) и новым кодом защиты выравнивания памяти. Проблема могла затронуть парсер в редких случаях, когда несколько сообщений были помещены в внутренний буфер и их длина создала нечёткое выравнивание (проблема могла возникнуть с очень быстрыми клиентами или сильно нагруженным сервером).### Версия 0.5.8Исправление: (defer
, fiobj
) исправлена проблема совместимости с Linux (при использовании GCC). Благодарность @kotocom за открытие проблемы #23.
Исправление: (defer
) исправлено неполное определение некоторых макросов отладки в непрофилированной версии (версия 0.5.6).
Обновления: небольшие обновления в шаблонной документации и процессе создания новых приложений.
Исправление: добавлено cmake_minimum_required
и связанные исправления CMake в файл CMake и генератор. Благодарность Дэвиду Морану (@david-moran) за PR #22 исправления файла CMakelist.txt.
Совместимость: (websocket_parser
) удалено несоответствие выравнивания памяти из логики XOR парсера, сделав его более совместимым со старыми системами ЦПУ, которые не поддерживают несоответствие выравнивания памяти или имеют длину слова 64 бита.
Оптимизация: (defer
) переписана структура данных для использования гибридного циклического буфера и связанного списка для очереди задач (вместо простого связанного списка), что оптимизирует локальность и минимизирует выделение памяти.
Разное: небольшие обновления и доработки, такие как добавление функции fiobj_ary2prt
для операций, таких как быстрая сортировка, обновление части документации и т.д.### Версия 0.5.5Исправление: (fiobj
) исправлена проблема #21, где gcc
жаловался на перезапись структуры fio_cstr_s
из-за константных членов. Благодарность @vit1251 за выявление этой проблемы.
Исправление: (fiobj
) исправлена проверка null указателя для fiobj_free(NULL)
.
Совместимость: (gcc-6
) исправлены некоторые вопросы совместимости с версией компилятора gcc
OnClickListener 6, а также некоторые предупреждения, которые были выявлены при тестировании с помощью gcc
.
Оптимизация: (fiobj
) оптимизированы выделения памяти для парсинга JSON, а также исправлены некоторые объявления функций для добавления ключевого слова const
, когда это уместно.
Я внес так много изменений, что мне потребовалось время, чтобы всё завершить.
Эта версия включает все обновления из нераскрытой версии 0.5.3, а также некоторую дополнительную работу.
Новый парсер HTTP/1.1 и WebSocket был отлажен и протестирован в сервере Ruby Iodine, система динамических типов (fiobj_s
) будет обновлена до редакции 2 в этом выпуске...
Изменение/Обновление: (fiobj
) библиотека динамического типа была переработана для повышения её расширяемости. Это означает, что код, использующий тестирование типа с помощью оператора switch
, должен быть переписан.
Исправление: (websocket
) проблемы с новым парсером WebSocket были исправлены. Благодарность Тому Лахти (@uidzip) за выявление этих проблем.### Версия 0.5.3 (нераскрытая, включена в 0.5.4)
Изменение: Небольшие изменения в схеме версионирования, удалены некоторые макросы версий... Это не относится к API, поэтому я не считаю это разрывом, но это может повлиять на код, который слишком сильно зависел от внутренних механизмов. Единственные действительные макросы версий — это макросы FACIL_VERSION_*
в заголовочном файле facil.h
.
Изменение: (http
) Парсер HTTP/1.x был переписан и заменён. Он должен выполнять ту же задачу, но теперь проще поддерживать. Также новый парсер потенциально может использоваться для создания клиента HTTP.Изменение: (websocket
) парсер WebSocket был переписан и заменён, что позволило отделить парсер и обёртку сообщений от слоя ввода-вывода. Производительность может немного увеличиться, но в целом она должна оставаться примерно такой же. Новый код проще поддерживать и легче портировать на другие реализации. Также новый парсер поддерживает режим клиента (маскирование сообщений).
Исправление: (websocket
) исправлено Issue #16, где первое сообщение клиента могло быть потеряно из-за длительного времени обработки события on_open
. Это было исправлено путём разделения события upgrade
на два события, добавлением возможности facil_attach_locked
и подключением нового протокола перед отправкой ответа. Благодарность @madsheep и @nilclass за выявление проблемы и её отслеживание до вызова обратного вызова on_open
.
Исправление: (sock
) сокеты, созданные с использованием библиотеки TCP/IP sock
, теперь по умолчанию используют TCP_NODELAY
. Это нельзя рассматривать как разрыв совместимости, а скорее как исправление.Исправление: (http1
) HTTP/1.x теперь более фрагментирован, что позволяет избежать цикла чтения для возможности протокольного обновления в середине потока или процесса. Это также исправляет проблему #16 в её основе (кроме улучшенной обработки обратного вызова websocket
).
Исправление: (http1
) HTTP/1.x теперь правильно инициализирует указатель udata
значением NULL для каждого нового запроса.
Исправление: (facil
) функция facil_run_every
теперь корректно вызывает обратный вызов on_finish
, когда инициализация таймера завершается ошибкой. Это исправляет утечку памяти, которая могла произойти из-за непоследовательных ожиданий API. Временные решения, написанные из-за этой проблемы, следует удалить.
Исправление: (facil
) время выключения соединения теперь корректно игнорируется для таймеров.
Исправление: (defer
) проблема отключения в defer_perform_in_fork
была обнаружена @cdkrot и его решение было внедрено.
Исправление: (evio
) исправлено поведение, при котором библиотека событийного ввода-вывода не сбрасывала состояние после вызова evio_close
, что приводило к тому, что некоторые функции считали события активными. Теперь evio_isactive
будет корректно показывать, что событийное ввод-вывод прекратил работу после вызова evio_close
.Исправление: (evio
) исправлено поведение, при котором evio_add_timer
сообщал об ошибке EEXIST
вместо успешного выполнения (это может быть связано с проблемами консолидации таймеров в ядре Linux).Исправление: (evio
) улучшена совместимость создания fd
таймера с различными версиями ядра Linux.
Исправление: (документация) благодарность @cdkrot за отчет о старом демонстрационном примере в README.
Исправление: (компоновка) добавлена недостающая флаг компоновщика -lm
для gcc/Linux
(я использовал clang
, который автоматически связывается с математической библиотекой, поэтому я этого не заметил).
Портабельность: добавлена директива extern "C"
для не тестированной поддержки C++.
Новая функциональность: 🎉 добавлен сервис помощник командной строки, позволяющий легко парсить и публиковать возможные аргументы командной строки.
Новая функциональность: 🎉🎉 добавлена динамическая типовая библиотека в ядро facil.io
, что делает некоторые общие задачи, связанные с вебом, проще управления.
Новая функциональность: 🎉🎉🎉 добавлена нативная поддержка JSON. JSON-строки могут быть преобразованы в объекты типа fiobj_s *
, а объекты типа fiobj_s *
могут быть представлены в виде JSON! Я надеюсь получить её публично замеренную.
Изменение: неблокирующие изменения в структуре папок также отражены в обновленном makefile
и .clang_complete
.
Исправление: (defer
) исправлена обработка сигнала SIGTERM
(сигнал ошибочно фильтровался).Исправление: (http_response
) исправлена функция http_response_sendfile2
, где конкатенация пути происходила без разделителя каталога (/
) и безопасные пути к файлам игнорировались (функция предполагала использование хотя бы частично опасного пути).
Исправление: мелкие исправления и доработка документации.
Исправление / Новая функциональность: (facil
) родственные процессы теперь будут обнаруживать смерть своего близкого родственного процесса (в результате аварийного завершения работы) и выполнять автоматическое завершение работы.
Новая функциональность: @benjcal предложил скрипт для создания новых приложений. Текущая версия является временным черновиком для тестирования.
Новая функциональность: временное шаблонное кодирование простого HTTP-приложения "Hello World", использующее новый скрипт для создания приложений (см. README). Это временное решение позволяет нам протестировать функциональность скрипта и принять решение о конечном дизайне шаблона.
Исправление: (sock
) исправлена проблема, когда sock_flush
всегда вызывала sock_touch
, даже если данные фактически не передавались по сети.
Исправление: (sock
) исправлен потенциальный сбой в работе sock_flush_strong
, который мог привести к зависанию facil.io.
Исправление: (WebSocket
) исправлена проблема с фрагментированной последовательной серией сообщений WebSocket.Новая функциональность: (facil
) Теперь можно искусственно вызвать событие ввода-вывода, даже если оно не произошло, используя facil_force_event
.
Разрыв изменений: (pubsub
) API был изменён / обновлён, что сделало объекты типа pubsub_engine_s
проще для авторизации и позволило избежать выделения памяти путём использования двух полей void *udata
. Поскольку это разрыв изменений, согласно семантической версионированию, увеличивается минорная версия. Хотелось бы задержать этот шаг, но планы на будущее требуют этого.
Разрыв изменений: (facil
) Поскольку API уже меняется, решил немного его улучшить и сделать так, чтобы все события потока on_X
(on_close
, on_fail
, on_start
...) использовали одинаковый сигнатур функции, где возможно.
Изменения: (facil
) Мелкие изменения в API fio_cluster_*
теперь используют знаковые типы сообщений. Все отрицательные значения msg_type
зарезервированы для внутреннего использования. Исправление: ликвидация утечек памяти при тестировании системы в условиях очень высокого стресса.
Исправление: (pubsub
, fio_dict
) Устранена проблема сопоставления шаблонов glob... надеюсь. Похоже, что это работает правильно, но я не уверен, соответствует ли алгоритм реализации Redis, которая является де-факто стандартом для сопоставления шаблонов каналов.Безопасность: (http
) парсер HTTP теперь разбивает последовательные запросы HTTP на отдельные события, что предотвращает возможность атаки, когда злоумышленник может монополизировать запросы через бесконечное последовательное отправление запросов с длительным временем выполнения.
Исправление: (http
) http_listen
теперь всегда будет копировать строку для public_folder
, что позволяет безопасно использовать динамические строки.
Исправление: (http
) по умолчанию файлы ошибок не находились из-за отсутствия /
в имени. Исправлено путём адаптивной корректировки требований к наличию /
.
Исправление: (http
) даты были смещены на один день. Теперь это исправлено.
Исправление: (http1
) небольшая проблема в обратном вызове on_data
могла привести к аварийному завершению парсера в редких случаях фрагментированного последовательного запроса на медленных соединениях. Это исправлено.
Исправление?: (http
) При декодировании пути или запроса, знак +
теперь остаётся не закодированным (правильное поведение), доверяя более качественным клиентам в этом великом джунглях.
Исправление: (facil
) facil_defer
могли приводить к утечкам памяти, если соединение было отключено во время планирования задачи.
Исправление: (facil
) facil_connect
теперь правильно вызывает обратный вызов on_fail
даже при немедленных ошибках (например, когда вызов функции был без целевого адреса и порта).Исправление: (facil
) facil_connect
теперь можно вызывать до других событий сокета (защита от конфликтов инициализации библиотеки).
Исправление: (facil
) facil_listen
теперь всегда будет копировать строку для port
, позволяя безопасно использовать динамические строки при установке FACIL_PRINT_STATE
.
Исправление: (facil
) facil_last_tick
мог бы выдавать ошибку, если был вызван до инициализации библиотеки во время операций сокета (facil_listen
, facil_attach
и т.д.). Теперь facil_last_tick
использует time()
, если ещё ничего не происходило.Исправление: (facil
) .on_idle
теперь правильно проверяет наличие несетевых событий перед вызовом обратного вызова. Исправление: (defer
) В случае использования достаточно большого (или быстродействующего) пула потоков в форкнутом процессе существующие задачи могли завершаться до того, как была установлена активная метка, что приводило к тому, что реактор facil.io застревал в режиме, не предназначенном для планирования, будто бы ожидающем выхода. Теперь это исправлено путём установки временного указателя на метку для форкнутых потомков, что предотвращает преждевременную очистку задач. Изменения: Основные изменения в структуре папок сделали развитие и поддержку подмодулей CMake более удобными. Эти изменения также должны сделать процесс отправки запросов на слияние проще за счёт предложения папки dev
для локального тестирования перед отправкой запроса на слияние.Новая функциональность: (websockets
) Поддержка публикаций и подписок через WebSocket теперь доступна — поддерживаются задачи протокола, а также прямое публикование клиентами (и автоматическое распознавание текстовых/бинарных данных)! Есть ограничения и высокие затраты памяти, связанные с названиями каналов, так как pubsub
использует дерево паттернов для абсолютной проверки совпадений каналов (т.е. длина названий каналов должна быть короткой, определенно меньше 1024 байтов).
Новая функциональность: (redis
) Поддержка публикаций и подписок через WebSocket включает новый блестящий движок Redis для синхронизации публикаций и подписок между машинами! Я протестировал его насколько смог, но знаю, что мои тесты могут быть такими же ошибочными, как и мой код, поэтому просим протестировать перед использованием.
Новая функциональность: (facil_listen
, http_listen
) теперь поддерживает опциональный обратный вызов on_finish_rw
для очистки объекта rw_udata
.Новая функциональность: (pubsub
) каналы теперь используют доступное хранилище данных типа fio_dict_s
(деревья паттернов). Возможная цена увеличенной структуры данных компенсируется абсолютной защитой от коллизий хэшей. Также надеюсь, что поскольку каналы чаще всего ищутся, чем создаются, это должно повысить производительность при поиске каналов как по шаблону, так и по точному совпадению. Надеюсь, что сочетание таблиц хэширования (для поиска клиентов) и деревьев паттернов (для перехода по каналам) обеспечит лучший баланс между поиском строк, шаблонов, итераций и управлением подписками.Новая функциональность: (http
) http_listen
теперь поддерживает обратный вызов on_finish
.
Новая функциональность: (http1
) В некоторых случаях HTTP/1.1 будет искать доступные файлы ошибок (например, "404 Not Found.html") в корневой директории public_folder
, позволяя использовать пользовательские сообщения об ошибках.
Новая функциональность: Интеграция с CMake. Благодарю @OwenDelahoy (PR#8).
Чтобы использовать facil.io в сборке CMake, вы можете добавить его как подмодуль в репозиторий проекта.
git submodule add https://github.com/boazsegev/facil.io.git
Затем добавьте следующую строку в файл
CMakeLists.txt
вашего проекта.add_subdirectory(facil.io)
Оптимизация: (fio_hash_table
) оптимизация выделения памяти для fio_ht_s
.
Исправление: (pubsub
) Устранены коллизии между одинаковыми именами каналов в разных движках, так что каналы считаются равными только если они имеют одинаковое имя и тот же двигатель (а не только одно и то же имя)... фактически, если они имеют одинаковое значение хэша имени канала SipHash, взаимоисключающее с адресацией памяти двигателя.
Исправление: (facil
) Устранена ошибка компиляции на старой версии gcc
v.4.8.4, обнаружена на Ubuntu trusty/64.
Исправление: Исправлено увеличение циклов процессора, введенное в обновлении v.0.4.3. Теперь количество циклов процессора снизилось, а управление потоками пустых очередей стало более эффективным.Производительность: (pubsub
) теперь используется хэш-таблица для хранения каналов, клиентов и шаблонов, что значительно ускоряет проверку дубликатов в pubsub_subscribe
. Также улучшена производительность работы с большими каналами (ничего, что можно было бы сделать с шаблонами pub/sub, так как они всё ещё требуют совпадения путём итераций по каждому каналу).
Новая функциональность: (http
) Функция http_response_sendfile2
теперь будет тестировать наличие альтернативного файла с сжатием gzip
, если клиент указал поддержку этого сжатия. Для предоставления альтернативного файла с сжатием gzip
просто сожмите исходный файл и поместите его в ту же директорию с расширением .gz
.
Структура каталогов: Обновлена структура каталогов для отображения связи между исходным кодом и библиотекой. core
— это необходимые файлы, http
относится к HTTP и т.д.
Исправление: Некоторое убийственное обработание ошибок теперь должно сигнализировать всем процессам группы об окончании работы.
Исправление: (sock
, websocket
) sock_buffer_send
не автоматически планировал очистку буфера сокета. Это приводило к тому, что некоторые сообщения WebSocket оставались в незаполненном буфере до тех пор, пока новое событие не заставляло их продвигаться. Теперь очистка планируется, и сообщения отправляются немедленно, независимо от размера.Исправление: (facil
) facil_attach
теперь правильно вызывает обратный вызов on_close
при возникновении ошибки.
Исправление: (facil
) facil_protocol_try_lock
ранее возвращал ложноположительные ошибки, препятствуя внешнему доступу к внутренним данным протокола... это исправлено.
Новая функциональность: (facil
) Экспериментальный режим кластера для отправки сообщений ко всем рабочим процессам кластера. Пример использования — локализованное обслуживание pub/sub через WebSocket, которое не требует базы данных для синхронизации одного компьютера... О, подождите, мы уже добавили эту возможность тоже.
Новая функциональность: (facil
) Экспериментальная система широковещательной рассылки pub/sub для всего кластера с возможностью расширения движка (например, планирую добавить Redis как один из вариантов движков для pub/sub через WebSocket).
Обновление: (http
) Обновлен метод http_listen
для поддержки новых опций sock_rw_hook_set
и rw_udata
.
Обновление: (sock
) Переписана часть кода для обработки ошибок. Будет ли это что-то менять? Только если были проблемы, о которых я не знал. В основном это влияет на доступность значения errno, как я понимаю.
Исправление: (sock
) Устранена проблема с реализацией sendfile
в macOS и BSD, где средние и большие файлы не отправлялись правильно.Исправление: (sock
) Устранена проблема с реализацией sock_rw_hook_set
(был заблокирован неправильный fd
).
Проектирование: (facil
) Читательские/записывающие хуки разделены от обратного вызова протокола on_open
, добавив обратный вызов set_rw_hook
. Это позволяет использовать один и тот же протокол как с, так и без читательских/записывающих хуков (например, как HTTP, так и HTTPS могут использовать одну и ту же функцию on_open
).
Исправление: (evio
, facil
) Закрывается evio
после завершения работы facil.io
, что должно позволить повторной инициализации и запуску facil.io
снова.
Исправление: (defer
) Возвращается ошибка при вызове defer_perform_in_fork
внутри выполняющегося процесса, форкнутого через defer
.
Исправление: (sock
, facil
, bscrypt
) Добавлены недостающие ключевые слова static
.
Совместимость: (bscrypt
) Добавлен альтернативный тест HAS_UNIX_FEATURES
, который лучше работает со старыми компиляторами *nix.
Исправление: (HTTP/1.1) Исправлено значение ответа по умолчанию date
(должно было быть "сейчас", но было инициализировано значением 0 вместо этого).
Исправление: Исправлена регулировка потока для лучшей экономии энергии.
Исправление: Исправлен логгинг стримовых ответов.
Совместимость: (HTTP/1.1) Автоматическое проверение should_close
теперь проверяет наличие клиентов HTTP/1.0 для определения устойчивости соединения.
Исправление: (HTTP/1.1) Исправлено значение ответа по умолчанию date
(должно было быть "сейчас", но было инициализировано значением 0 вместо этого).
Исправление: Исправлена регулировка потока для лучшей экономии энергии.
Исправление: Исправлен логгинг стримовых ответов.
Совместимость: (HTTP/1.1) Автоматическое проверение should_close
теперь проверяет наличие клиентов HTTP/1.0 для определения устойчивости соединения.Совместимость: (HTTP/1.1) Добавлены пробелы после имен заголовков, поскольку некоторые парсеры не следуют за RFC.
Исправление/совместимость: Улучшение сборки под Linux.
Обновлено ядро и дизайн. Новый API. Мелкие исправления для HTTP pipelining и парсинга.
Ниже приведён исторический журнал изменений, до внедрения API facil_
.
Примечание: Этот журнал изменений является неполным. Я начал его поздно, когда интерес к библиотекам стал требовать более подробной документации любых сделанных изменений.
Хотя эти библиотеки в этом репозитории предназначены для совместной работы, они также спроектированы для работы отдельно друг от друга. Поэтому журналы изменений для каждой библиотеки управляются отдельно. Вот различные библиотеки и изменения:
Библиотека React (libreact
) - Библиотека реактора.
Библиотека сокетов (libsock
) - Библиотечная помощь для работы с сокетами (разработка не завершена).
Библиотека асинхронной работы (libasync
) - Библиотека пула потоков и задач.
Библиотека сервера (libserver
) - Библиотека для написания сервера.
Миникрипт (minicrypt
) - Общая простая библиотека шифрования (разработка не завершена).
Протокол HTTP (http
) - Включает в себя помощники для запросов и ответов, и т.д.* Расширение WebSocket (websockets
) - протокол WebSocket для базовой реализации HTTP.
Изменения, которые я планирую внести в будущих версиях:
Реализация метода Server.connect
для клиентских соединений и реализация клиента WebSocket.
Реализация записи через WebSocket с использованием пакетов libsock
, вместо использования malloc
.
Удаление / исправление пула контейнеров задач сервера (FDTask
и GroupTask
).
Я стараюсь следовать семантическому версионированию, за исключением того, что библиотеки все еще находятся в стадии предварительной разработки, поэтому номера версий обновляются только при значительных изменениях или разрыве API.
Библиотеки с версиями меньше 0.1.0 имеют недостающие функции (например, mini-crypt
почти ничего не имеет, кроме небольших опубликованных функций).
Мелкие исправления ошибок, оптимизации реализации и т.п. могут не вызывать изменения в номерах версий (не говоря уже о действительно мелких изменениях).
При разрыве API всегда происходит увеличение версии (может быть даже незначительное увеличение версии для незначительных изменений API).
Git-коммиты пока автоматически не тестируются и могут вносить новые проблемы или ломать существующий код (я использую Git также для целей резервного копирования)...... другими словами, поскольку эти библиотеки всё ещё находятся в ранней стадии разработки, следует проводить тестирование перед внедрением любых обновлений.
Переписана с нуля. Код теперь (по моему мнению) лучше организован.
Различный API.
Теперь реактор является бессостоятельным объектом, вместо того чтобы быть объектом. Все состояние данных (кроме идентификатора реактора, который остаётся постоянным в течение всего его существования), управляет операционная система (kqueue
/epoll
).
Коллбэки статически связаны, вместо динамического назначения.
Лучшая интеграция с libsock
.
(необязательно) Обрабатывает UUID библиотеки libsock
вместо прямого файла-дескриптора, что предотвращает коллизии файловых дескрипторов.
libsock
, где sock_flush
автоматически не вызывался из-за оптимизации встроенных функций компилятором (и моей ошибочной реализации).Основной выпуск (изменения, не зафиксированные до этой точки времени).
getrlimit
от Apple, которая приводит к ограничению емкости сервера ниже допустимого уровня.Устранена проблема, возникшая в libsock
0.2.1, где sock_close
не закрывал соединение даже после отправки всех данных.### В. 0.2.1
Больший буфер уровня пользователя — увеличен с ~4 МБ до ~16 МБ.
Вызов системной функции write
будет асинхронным при использовании libasync
. Это можно изменить путём изменения значения SOCK_DELAY_WRITE
в файле libsock.c
.
Это не помешает sock_write
эмулировать блокирующее состояние, когда буфер уровня пользователя заполнен.
Почти такой же API. Обратите внимание на следующее: нет необходимости в инициализации; коллбэки rw_hooks
не защищены блокировками (используйте свой собственный код защиты потока).
В версии 0.1.0 была неизвестная проблема, которая привела к зависанию при отправке больших объёмов данных... отслеживание проблемы было сложнее, чем перезапись всего логики, что позволило упростить некоторые части кода для лучшего обслуживания.
sock_checkout_packet
теперь будет ждать доступности пакета. Не проверяйте более одного пакета одновременно и не удерживайте выделенные пакеты, чтобы избежать зависаний потоков.
Огромная переработка. Различный API.
Использует UUID соединений вместо прямых файловых дескрипторов, предотвращая коллизии файловых дескрипторов. Обратите внимание, что UUID не являются случайными и не могут быть использованы для идентификации соединений между машинами или процессами.
Отсутствие глобальной блокировки, ориентированная на спин-блокировки архитектура.* Лучшая (опциональная) интеграция с libreact
.
libsock
претерпела небольшие изменения в API, особенно в функции init_socklib
(теперь принимает Yöntem 0 аргументов).
Коллбэки rw_hooks
теперь поддерживают коллбэк flush
для хуков, использующих внутренний буфер. Реализация коллбэка flush
позволит этим коллбэкам предотвратить преждевременное закрытие потока и гарантировать передачу всех данных.
Добавлена клиентская реализация (sock_connect
).
Переписана вся библиотека для обеспечения фиксированного лимита буфера в пространстве пользователя. Это значит, что вместо автоматического выделения пакетов буферов при необходимости больше памяти, функция sock_write(2)
будет зависеть и очищать все ожидающие буферы сокета до тех пор, пока пакеты не станут доступными.
Отправка файла теперь основана на смещении, поэтому данные от fseek
игнорируются. Это позволяет кэшировать открытые fd
файлы и отправлять тот же файловый дескриптор нескольким клиентам.
Устранены проблемы с ненаследованным sendfile
и недостаточным использованием пула памяти для пакетов.
Добавлен флаг .metadata.keep_open
, чтобы позволить кэширование файлов... Однако, стоит помнить, что смещение для чтения/записи файла — это его положение lseek
, а отправка одного и того же файла на различные сокеты создаст условия гонки, связанные со смещением lseek
файла.* Исправление для epoll's on_ready, которое не было отправлено (sock flush должно вызывать ошибку EAGAIN, иначе событие on_ready не будет вызвано). Kqueue лучше, так как on_ready
относится к тому, что буфер очищен, а не доступен (меньше событий для копирования одинакового объёма данных, поскольку каждое запись данных является оптимальной при наличии достаточного количества данных для записи).
Опциональная реализация sendfile для Apple, BSD и Linux (BSD не тестировалось).
Различные оптимизации. Например, размер пакета буфера увеличен до 64КБ, чтобы соответствовать выделению буфера Linux.
Отправка файла теперь поддерживает файловые дескрипторы.
Поддержка TLC заменена упрощённым хуком для чтения/записи.
Изменено struct SockWriteOpt
на typedef sock_write_info_s
.
Изменено struct Packet
на typedef sock_packet_s
.
Исправлена проблема, когда использование sock_write(2)
для больших блоков данных приводило к ошибкам при копировании данных в пользовательский буфер.
Для повышения производительности следует отметить, что лучше использовать внешние указатели для отправки больших данных (особенно если данные кэшированы) с помощью функции sock_send_packet
— для кэшированных данных не устанавливайте флаг packet->external
, чтобы данные не освобождались после отправки.
Исправлены ситуации, когда send_packet
может не закрывать файл (если буфер пакета ссылается на FILE
) перед возвратом ошибки.* Теперь обязательна функция sock_free_packet
для всех неиспользуемых указателей объектов пакета, полученных с помощью sock_checkout_packet
. Этот требование позволяет менеджменту пула минимизировать фрагментацию памяти для долгоживущих процессов.
Требования к памяти libsock
теперь выше, так как буфер пользователя пакета в пуле памяти предварительно выделен для минимизации фрагментации памяти.
Исправлены ошибки документации, такие как утверждение, что функция sock_send_packet
при ошибке не будет управлять памятью объекта пакета (она управляет памятью всегда).
Основной уровень (изменения, не зафиксированные до этой точки времени).
Я полностью переписал всё (почти).
Теперь libasync
работает как глобальная машина состояний. Больше нет объектов async_p
.
По умолчанию используется nanosleep
вместо труб (можно вернуться к использованию труб, установив простой флаг). Это пока кажется более эффективным (за счёт незначительного увеличения нагрузки на ЦПУ).
Устранены проблемы инициализации пула задач, чтобы избежать сегментационных ошибок.
Оптимизации и ограничения пула задач libasync
были добавлены для минимизации проблем фрагментации памяти для долгоживущих процессов.
Основной уровень (изменения, не зафиксированные до этой точки времени).## Lib-Server
Ограничено количество потоков (1023) и процессов (127), которые могут быть запущены без изменения кода библиотеки.
Небольшие изменения, направленные на повышение производительности.
Исправлена проблема, при которой обновление протокола WebSocket позволяло параллельное выполнение кода вместе с on_open
(фиксация протокола была исправлена во время смены протокола).
Добавлен метод server_each_unsafe
, который позволяет выполнять задачу для всех клиентских соединений. Часть слова unsafe
очень важна — например, память может быть освобождена во время выполнения.
Небольшие изменения, направленные на повышение производительности.
Процесс завершения работы теперь позволяет однопоточному асинхронному планированию задач (событий).
Обновление настроек таймаута сокета автоматически "касается" сокета (сбрасывает счетчик таймаута).
Полная переработка с центра. Код стал более лаконичным и менее дублированным.
Различный API.
Сервер теперь является глобальной машиной состояний вместо объекта.
Лучшая интеграция с libsock
.* Обрабатывает UUID libsock
вместо прямых дескрипторов файлов, предотвращая коллизии дескрипторов файлов и предотвращая запись в неправильного клиента долгоживущими задачами (например, если дескриптор файла 6 был отключен и кто-то другой подключился и получил дескриптор файла 6 для идентификации сокета).* Улучшенная защита от конкурентного доступа и очистка протокола при закрытии соединения on_close
. Теперь отложенные задачи (server_task
/ server_each
), обратный вызов on_data
и даже обратный вызов on_close
выполняются внутри блока "лок" (флага занятости) соединения, ограничивая конкурентность для одного соединения до обратных вызовов on_ready
и ping
. Теперь безопасно освобождать память протокола во время обратного вызова on_close
, так как это почти гарантировано тем, что никакие выполняющиеся задачи не используют эту память (это предполагает, что ping
и on_ready
не используют никаких данных, хранящихся в памяти протокола).### Версия 0.3.5
Глобальный блок сервера (тот, который обеспечивает целостность глобальных данных сервера) был перенесён с мьютекса на спин-блок. Рассматриваются изменения в дизайне API, которые могут позволить избежать блокировки.
Отправка файла теперь основана на смещении, поэтому данные lseek
игнорируются. Это означает, что можно кэшировать открытые fd
файлов и отправлять тот же файловый дескриптор нескольким клиентам.
sendfile
, чтобы он принимал только файловые дескрипторы (а не FILE *
). Это требование оптимизации.Исправлены ситуации, когда sendfile
может не закрывать файл перед возвратом ошибки.
Было вероятно, что обратный вызов on_data
может вернуть управление после отключения соединения и установки нового соединения для того же fd
. Это могло привести к тому, что флаг busy
будет сброшен, даже если новое соединение было занятым. Эта потенциальная проблема была исправлена путём проверки соединения против счетчика UUID перед сбросом флага busy
.
Напоминание: Возможность Server.rw_hooks
устарела. Используйте возможности TLC (Callbackes уровня транспорта) библиотеки libsock
вместо этого.
Базовая версия (изменения, не зарегистрированные ранее этой точки времени).
gmtime
, которое игнорирует локализацию.Базовая версия (изменения, не зарегистрированные ранее этой точки времени).
13 сентября 2016 года: Поддержка ETag
для статического сервера файлов, ответ с 304 при действительном If-None-Match
.
13 сентября 2016 года: Обновлено обработывание запроса HEAD
для статических файлов.
Исправлено pipelining... надеюсь.
26 июня 2016 года: Исправлено журналирование для диапазона запросов статических файлов.
26 июня 2016 года: Логика декодирования URL перемещена в объект HttpRequest
.
20 июня 2016 года: Добавлена базовая поддержка логгирования.
20 июня 2016 года: Автоматические ограничения заголовка Content-Length
при установке статус-кода в значения 1xx, 204 или 304.
20 июня 2016 года: Улучшены сообщения при запуске.
20 июня 2016 года: Обновлено для новой версии библиотек lib-server
и libsock
.
16 июня 2016 года: Обработка дат в объекте HttpResponse теперь использует более быстрое решение (и менее надёжное), чем стандартные решения libc gmtime_r
и strftime
.
12 июня 2016 года: Внесены исправления и оптимизации для протокола HTTP и методов sendfile
и HttpResponse.sendfile
. Теперь отправка файлов осуществляется с использованием файловых дескрипторов вместо FILE *
, что позволяет избежать выделения памяти, связанного с данными типа FILE *
.* 12 июня 2016: Оптимизация копирования HttpResponse улучшает первый заголовочный буфер, позволяя скопировать как можно больше данных тела сразу после заголовков.
12 июня 2016: Улучшено поисковое действие MIME-типов для статических файлов.
9 июня 2016: Реализация HttpResponse была переработана для использования прямого внедрения буферного пакета из libsock
, что минимизирует копирование данных в пользовательском пространстве.
9 июня 2016: Переработано управление sendfile
для публичной папки.
9 июня 2016: Исправлена проблема, связанная с новой схемой пулинга, где старые данные могли сохраняться в некоторых объектах запроса.
8 июня 2016: Объект HttpRequest теперь хранится в пуле внутри библиотеки запросов (не реализации протокола HTTP) с использованием атомарных операций (менее блокировки мьютексами) и минимизацией фрагментации памяти путём предварительной инициализации буфера при первом запросе (что предотвращает застревание выделенной памяти после первого запроса).
7 июня 2016: Базовый уровень (изменения до этого момента времени не были учтены).
Решена проблема #6, благодарность @Filly за открытие проблемы.
Удалён пул памяти. Может быть восстановлен после устранения недочётов, но при добавлении новых тестов пул памяти проваливал их.* 12 января 2017: Улучшение производительности памяти.
Протокол соединения WebSocket теперь использует как уровень C пулы памяти, так и локальное хранилище потока для временных данных. Это помогает минимизировать возможные проблемы фрагментации памяти, связанные с длительными процессами и долгоживущими объектами.
Кроме того, буфер чтения сокета был перемещён из объекта протокола в локальное хранилище потока (предполагается использование pthreads, а не green threads). Это минимизирует размер потребляемой памяти для каждого соединения (за счёт утраты локальности памяти) и должно позволить Iodine поддерживать большее количество одновременных соединений при меньших системных ресурсах. Наконец, буфер сообщений по умолчанию на соединении начинается с 4 КБ вместо 16 КБ (растёт по мере необходимости до значения Iodine::Rack.max_msg_size
), что предполагает, что более короткие сообщения являются нормой.
Основной уровень (изменения, не зафиксированные ранее этой точки во времени).
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )