1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mll-facil.io

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
CHANGELOG.md 140 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 10.03.2025 09:54 5aeb79c

Журнал изменений

v. 0.7.5 (2020-05-18)

Безопасность: обратная совместимость с парсером HTTP/1.1 версий 0.8.x и его безопасностями в ветке версий 0.7.x. Это исправляет вектор атаки через маскирование запросов и вектор атаки через кодировку передачи данных, выявленные Самом Саноопом из команды безопасности компании Snyk. Парсер был обновлён для решения этих потенциальных проблем.

Исправление: (http) исправление проблемы с расчётом даты путём обратной совместимости кода из ветки 0.8.x.

Исправление: (fio) вызов меньшего количества сигналов при завершении работы.

v. 0.7.4

Исправление: (http) исправление проблемы и улучшение поддержки закодированных пакетами данных. Благодарим Иана Кер-Сеймера (@ianks) за выявление этой проблемы, написание тестов (для обёртки на Ruby) и открытие как проблемы boazsegev/iodine#87, так и предложения boazsegev/iodine#88.

Исправление: (http) запросы будут проваливаться, если путь содержит висящий вопросительный знак (пустой запрос). Благодарим @adam12 за выявление этой проблемы и открытие проблемы boazsegev/iodine#86.

v. 0.7.3

Исправление: (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) исправление теста восстановления обработчиков сигналов для предотвращения рекурсивного вызова сигналов.

v. 0.7.2

Исправление: (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-скрипта, демонстрирующего атаку.

Версия 0.7.0

Стабильный выпуск API. Будущие обновления API будут ждать выпуска версии 0.8.x.

Исправление: (fio, fiobj) исправлены некоторые проблемы совместимости и предупреждения компилятора gcc и clang.

Исправление: (http) исправлен формат даты HTTP, чтобы принудительно использовать два знака для дня месяца. Благодарность @ianks (Иан Кар-Саймер) за выявление этой проблемы (iodine#64).

Компаративность: (http) обновлены тесты времени компиляции с более безопасным запасным вариантом.

Версия 0.7.0.beta8

Безопасность: (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), которая не была протестирована на безопасность. По этой причине её следует ограничивать использованием для внутренних/безопасных данных, таких как имена аргументов командной строки.

Версия 0.7.0.beta6

ПРЕРЫВАНИЕ: (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) для отсутствующих значений, как ожидалось. Примечание: это связано с новой поддержкой шестнадцатеричной и двоичной систем счисления в командной строке.

Версия 0.7.0.beta4НЕСОМПАТРИБЕЛЬНОЕ ИЗМЕНЕНИЕ: (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) обновлены автоматические вычисления параллелизма для оставления ресурсов системе при предоставлении отрицательного значения (ранее доступно только для расчета количества рабочих процессов, теперь также доступно для расчета количества потоков).

Версия 0.7.0.beta3

Исправление: (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.

Версия 0.7.0.beta2

Критические изменения!

Большая часть кода была переписана и переупорядочена, минимизируя пространство имён, используемое основной библиотекой, и объединив её в двухфайловую библиотеку (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)

Документация: Создана новая веб-страница!

Версия 0.6.4

Исправление: (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

(Отозвано)

Версия 0.6.3

Исправление: (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) при прослушивании соединений.

Версия 0.6.2

Эта версия исправляет ряд проблем, включая серьёзную проблему, которая препятствовала полному очистительному действию буфера сокетов.

В этой версии также улучшена логика завершения работы и горячего перезапуска, а также исправлены множество проблем с режимом кластера и службами 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 рекомендовано.


Исправлены непонятные части:

  • "Yöntem 0.6.0.beta, 0.6.0 и 0.6.1" заменено на "версий 0.6.0.beta, 0.6.0 и 0.6.1".Исправление: (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) логика завершения теперь предоставляет больше времени для очистки буферов сокетов (только когда это требуется).

Версия 0.6.1

Исправление: (pubsub) исправлена проблема, при которой имя канала может быть освобождено до обработки обратного вызова. Это было пропущено во время обновления логики кэширования хешей, которое предотвращало хеширование ключей, когда последний элемент упорядоченного хеша удаляется.

Исправление: (pubsub) теперь публичная подписка компактизирует используемую память для данных клиентов и каналов, если хранилище становится чрезмерно фрагментированным.

Исправление: (hashmap) исправлена проблема чтения памяти, которая могла возникнуть, когда хеш содержит только один объект и этот объект удаляется (что приводит к чтению памяти в расположении сразу перед адресом карты хеша).Исправление: (defer) теперь defer предпочитает статически выделенный буфер динамическому, когда все задачи завершены, что предотвращает утечку последнего выделенного буфера на этапе завершения.

Исправление: (websocket) подписки, созданные во время обратного вызова on_close (кроме указания злоупотребления API), теперь правильно удаляются.

Версия 0.6.0

Версия 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) двусвязный список логики заменён на односвязный список, чтобы сделать библиотеку более независимой и уменьшить некоторые операции.

А также проведены рефакторинг и небольшие коррективы.

Версия 0.6.0.beta.8

Исправление: (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 и обновление документации.

Версия 0.6.0.beta.7

Исправление: (websockets) исправлена проблема с клиентским пингом, которая могла нарушить протокол, приведя к потери данных или отключению соединения.

Исправление: (websockets) удалён отладочный пинг (пинг каждые 3 секунды) из клиента WebSocket. Пинги могут отправляться вручную или путём установки времени ожидания соединения с помощью facil_set_timeout.Исправление: (websockets) гарантируется, что маска клиента никогда не будет равна нулю благодаря установке нескольких битов, не зависящих от случайности.

Исправление: (redis) исправлена проблема, при которой очередь команд (для занятых команд Redis в режиме трубопровода и для повторного подключения) отправляла последнее сообщение циклически вместо отправки всех сообщений из очереди.

Исправление: (facil) исправлена возможная утечка памяти, связанная с facil_connect и неудачными подключениями к локальному хосту. Улучшена очистка процесса при завершении работы.

Исправление: (pubsub) улучшена очистка процесса при завершении работы.

Исправление: (fio_cli) исправлен цветовой вывод текста на терминал.

Исправление: (fio_hash) исправлена логика цикла для удаления необходимости маркера "data-end", что позволяет немного оптимизировать выделение памяти.

Обновление: (websockets) добавлен пример использования терминального ввода/вывода для текстового общения через WebSocket.

Версия 0.6.0.beta.6

Эта бета-версия направлена на повышение производительности и включает в себя в основном изменения, связанные с производительностью.

Эта версия обновляет некоторые значения по умолчанию, чтобы сделать их более реалистичными для типовых случаев использования и помочь минимизировать потребление памяти.Эти значения, такие как LIB_SOCK_MAX_CAPACITY, FIO_HASH_INITIAL_CAPACITY и FIOBJ_ARRAY_DEFAULT_CAPA, можно обновлять во время компиляции.

Некоторые из этих значений по умолчанию можно обойти во время выполнения с помощью специальных вызовов функций (например, fio_hash_new2).

Другие значимые изменения в плане производительности включают кэширование коротких строк (уменьшение емкости коротких строк FIOBJ в обмен на снижение количества вызовов fio_siphash).

Это уроки, полученные из тестирования TechEmpower... хотя они не будут отражены в результатах Ронда 15.

Версия 0.6.0.beta.5

Выпущены исправления для проблем, связанных с запуском на 80 ядрах в рамках TechEmpower Framework Benchmarks. Исправление: исправлено управление ошибками при запуске в режиме кластера, что гарантирует, что facil.io не сможет запуститься при возникновении ошибок.

Обновление: установлен верхний предел значения выявления ядер до 120 ядер. Любое значение больше 120 вызовет предупреждение, а предел (120) будет использоваться.

Версия 0.6.0.beta.4

Выпущена после стресс-тестирования и тестирования утечек памяти.

Версия 0.6.0.beta.3

Разрыв изменений: (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.beta

Версия 0.6.0 является значительным выпуском, который меняет много аспектов расширяемого API (HTTP, pub/sub, CLI) и некоторых аспектов базового API (например, перемещение опроса evio на одноразовый опрос).В этом бета-выпуске:

Исправление (http): исправлена проблема, при которой получение одного и того же имени заголовка более одного раза приводило к невозможности преобразования значения заголовка в массив значений.

Мелкие исправления: улучшено управление ошибками, добавлены тесты, исправлено поведение fiobj_iseq, чтобы проверять ключи хэшей, а также объекты. Кэширование ключей в fio_hashmap.h для удалённых объектов очищается, когда хэш пуст (то есть, если он пуст, то он действительно пуст).

Производительность: небольшие улучшения. Например, хэш-карты заголовков теперь очищаются и переиспользуются HTTP/1.1 во время keep-alive (вместо освобождения и заново выделения).

Версия 0.6.0.dev

Этот выпуск является значительным, который меняет много аспектов расширяемого 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):

  • API WebSocket включает множество разрушительных изменений, не говоря уже о переписанном API публикаций и подписок, который теперь использует строки и символы 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).---

Версия 0.5.10 (обратная совместимость)

Исправление (обратная совместимость): (facil / pubsub) исправлена проблема с повреждением кластерных сообщений при передаче в высокой последовательности. Благодарность Дмитрию Давыдову (@haukot) за выявление этой проблемы через реализацию сервера Iodine (Ruby порт).

Должно быть отмечено, что это не решает основной недостаток, связанный с большими кластерными или паб/суб сообщениями, который вызван дизайнерским недостатком в реализации pipe (в некоторых ядрах).

Единственный способ решения проблемы повреждения больших сообщений — использование нового движка паб/суб, представленного в ветке выпусков facil.io 0.6.x, который использует Unix сокеты вместо труб.

Версия 0.5.9 (обратная совместимость)Исправление (обратная совместимость из версии 0.6.0): (websocket_parser) парсер WebSocket имел проблему с смещением памяти и выравниванием при обработке логики unmasking (XOR) и новым кодом защиты выравнивания памяти. Проблема могла затронуть парсер в редких случаях, когда несколько сообщений были помещены в внутренний буфер и их длина создала нечёткое выравнивание (проблема могла возникнуть с очень быстрыми клиентами или сильно нагруженным сервером).### Версия 0.5.8

Исправление: (defer, fiobj) исправлена проблема совместимости с Linux (при использовании GCC). Благодарность @kotocom за открытие проблемы #23.

Версия 0.5.7

Исправление: (defer) исправлено неполное определение некоторых макросов отладки в непрофилированной версии (версия 0.5.6).

Обновления: небольшие обновления в шаблонной документации и процессе создания новых приложений.

Версия 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.4

Я внес так много изменений, что мне потребовалось время, чтобы всё завершить.

Эта версия включает все обновления из нераскрытой версии 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! Я надеюсь получить её публично замеренную.

Версия 0.5.2

Изменение: неблокирующие изменения в структуре папок также отражены в обновленном makefile и .clang_complete.

Исправление: (defer) исправлена обработка сигнала SIGTERM (сигнал ошибочно фильтровался).Исправление: (http_response) исправлена функция http_response_sendfile2, где конкатенация пути происходила без разделителя каталога (/) и безопасные пути к файлам игнорировались (функция предполагала использование хотя бы частично опасного пути).

Исправление: мелкие исправления и доработка документации.

Исправление / Новая функциональность: (facil) родственные процессы теперь будут обнаруживать смерть своего близкого родственного процесса (в результате аварийного завершения работы) и выполнять автоматическое завершение работы.

Новая функциональность: @benjcal предложил скрипт для создания новых приложений. Текущая версия является временным черновиком для тестирования.

Новая функциональность: временное шаблонное кодирование простого HTTP-приложения "Hello World", использующее новый скрипт для создания приложений (см. README). Это временное решение позволяет нам протестировать функциональность скрипта и принять решение о конечном дизайне шаблона.

Версия 0.5.1

Исправление: (sock) исправлена проблема, когда sock_flush всегда вызывала sock_touch, даже если данные фактически не передавались по сети.

Исправление: (sock) исправлен потенциальный сбой в работе sock_flush_strong, который мог привести к зависанию facil.io.

Исправление: (WebSocket) исправлена проблема с фрагментированной последовательной серией сообщений WebSocket.Новая функциональность: (facil) Теперь можно искусственно вызвать событие ввода-вывода, даже если оно не произошло, используя facil_force_event.

Версия 0.5.0

Разрыв изменений: (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.

Версия 0.4.4

Исправление: (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 и т.д.

Версия OnClickListener 0.4.3

Исправление: Некоторое убийственное обработание ошибок теперь должно сигнализировать всем процессам группы об окончании работы.

Исправление: (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, как я понимаю.

Версия 0.4.2

Исправление: (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.


Версия Yöntem 0.4.1

Исправление: (HTTP/1.1) Исправлено значение ответа по умолчанию date (должно было быть "сейчас", но было инициализировано значением 0 вместо этого).

Исправление: Исправлена регулировка потока для лучшей экономии энергии.

Исправление: Исправлен логгинг стримовых ответов.

Совместимость: (HTTP/1.1) Автоматическое проверение should_close теперь проверяет наличие клиентов HTTP/1.0 для определения устойчивости соединения.


Версия 0.4.1

Исправление: (HTTP/1.1) Исправлено значение ответа по умолчанию date (должно было быть "сейчас", но было инициализировано значением 0 вместо этого).

Исправление: Исправлена регулировка потока для лучшей экономии энергии.

Исправление: Исправлен логгинг стримовых ответов.

Совместимость: (HTTP/1.1) Автоматическое проверение should_close теперь проверяет наличие клиентов HTTP/1.0 для определения устойчивости соединения.Совместимость: (HTTP/1.1) Добавлены пробелы после имен заголовков, поскольку некоторые парсеры не следуют за RFC.

Исправление/совместимость: Улучшение сборки под Linux.


Версия 0.4.0

Обновлено ядро и дизайн. Новый API. Мелкие исправления для HTTP pipelining и парсинга.

Исторический журнал изменений

Ниже приведён исторический журнал изменений, до внедрения API facil_.


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

Хотя эти библиотеки в этом репозитории предназначены для совместной работы, они также спроектированы для работы отдельно друг от друга. Поэтому журналы изменений для каждой библиотеки управляются отдельно. Вот различные библиотеки и изменения:

Общие замечания и планы на будущее

Изменения, которые я планирую внести в будущих версиях:

  • Реализация метода Server.connect для клиентских соединений и реализация клиента WebSocket.

  • Реализация записи через WebSocket с использованием пакетов libsock, вместо использования malloc.

  • Удаление / исправление пула контейнеров задач сервера (FDTask и GroupTask).

Замечание о номерах версий

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

Библиотеки с версиями меньше 0.1.0 имеют недостающие функции (например, mini-crypt почти ничего не имеет, кроме небольших опубликованных функций).

Мелкие исправления ошибок, оптимизации реализации и т.п. могут не вызывать изменения в номерах версий (не говоря уже о действительно мелких изменениях).

При разрыве API всегда происходит увеличение версии (может быть даже незначительное увеличение версии для незначительных изменений API).

Git-коммиты пока автоматически не тестируются и могут вносить новые проблемы или ломать существующий код (я использую Git также для целей резервного копирования)...... другими словами, поскольку эти библиотеки всё ещё находятся в ранней стадии разработки, следует проводить тестирование перед внедрением любых обновлений.

Библиотека React

Версия 0.3.0

  • Переписана с нуля. Код теперь (по моему мнению) лучше организован.

  • Различный API.

  • Теперь реактор является бессостоятельным объектом, вместо того чтобы быть объектом. Все состояние данных (кроме идентификатора реактора, который остаётся постоянным в течение всего его существования), управляет операционная система (kqueue/epoll).

  • Коллбэки статически связаны, вместо динамического назначения.

  • Лучшая интеграция с libsock.

  • (необязательно) Обрабатывает UUID библиотеки libsock вместо прямого файла-дескриптора, что предотвращает коллизии файловых дескрипторов.

Версия 0.2.2

  • Устранена проблема с поддержкой libsock, где sock_flush автоматически не вызывался из-за оптимизации встроенных функций компилятором (и моей ошибочной реализации).

Версия 0.2.1

Основной выпуск (изменения, не зафиксированные до этой точки времени).

Библиотeka Sock

Версия 0.2.3 (следующий номер версии)

  • Проблема с getrlimit от Apple, которая приводит к ограничению емкости сервера ниже допустимого уровня.

Версия 0.2.2

  • Устранена проблема, возникшая в libsock 0.2.1, где sock_close не закрывал соединение даже после отправки всех данных.### В. 0.2.1

  • Больший буфер уровня пользователя — увеличен с ~4 МБ до ~16 МБ.

  • Вызов системной функции write будет асинхронным при использовании libasync. Это можно изменить путём изменения значения SOCK_DELAY_WRITE в файле libsock.c.

    Это не помешает sock_write эмулировать блокирующее состояние, когда буфер уровня пользователя заполнен.

В. 0.2.0

  • Почти такой же API. Обратите внимание на следующее: нет необходимости в инициализации; коллбэки rw_hooks не защищены блокировками (используйте свой собственный код защиты потока).

    В версии 0.1.0 была неизвестная проблема, которая привела к зависанию при отправке больших объёмов данных... отслеживание проблемы было сложнее, чем перезапись всего логики, что позволило упростить некоторые части кода для лучшего обслуживания.

  • sock_checkout_packet теперь будет ждать доступности пакета. Не проверяйте более одного пакета одновременно и не удерживайте выделенные пакеты, чтобы избежать зависаний потоков.

В. 0.1.0

  • Огромная переработка. Различный API.

  • Использует UUID соединений вместо прямых файловых дескрипторов, предотвращая коллизии файловых дескрипторов. Обратите внимание, что UUID не являются случайными и не могут быть использованы для идентификации соединений между машинами или процессами.

  • Отсутствие глобальной блокировки, ориентированная на спин-блокировки архитектура.* Лучшая (опциональная) интеграция с libreact.

Версия 0.0.6

  • libsock претерпела небольшие изменения в API, особенно в функции init_socklib (теперь принимает Yöntem 0 аргументов).

  • Коллбэки rw_hooks теперь поддерживают коллбэк flush для хуков, использующих внутренний буфер. Реализация коллбэка flush позволит этим коллбэкам предотвратить преждевременное закрытие потока и гарантировать передачу всех данных.

Версия 0.0.5

  • Добавлена клиентская реализация (sock_connect).

  • Переписана вся библиотека для обеспечения фиксированного лимита буфера в пространстве пользователя. Это значит, что вместо автоматического выделения пакетов буферов при необходимости больше памяти, функция sock_write(2) будет зависеть и очищать все ожидающие буферы сокета до тех пор, пока пакеты не станут доступными.

  • Отправка файла теперь основана на смещении, поэтому данные от fseek игнорируются. Это позволяет кэшировать открытые fd файлы и отправлять тот же файловый дескриптор нескольким клиентам.

Версия 0.0.4

  • Устранены проблемы с ненаследованным 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.

В. 0.0.3

  • Изменено struct Packet на typedef sock_packet_s.

  • Исправлена проблема, когда использование sock_write(2) для больших блоков данных приводило к ошибкам при копировании данных в пользовательский буфер.

    Для повышения производительности следует отметить, что лучше использовать внешние указатели для отправки больших данных (особенно если данные кэшированы) с помощью функции sock_send_packet — для кэшированных данных не устанавливайте флаг packet->external, чтобы данные не освобождались после отправки.

В. 0.0.2

  • Исправлены ситуации, когда send_packet может не закрывать файл (если буфер пакета ссылается на FILE) перед возвратом ошибки.* Теперь обязательна функция sock_free_packet для всех неиспользуемых указателей объектов пакета, полученных с помощью sock_checkout_packet. Этот требование позволяет менеджменту пула минимизировать фрагментацию памяти для долгоживущих процессов.

  • Требования к памяти libsock теперь выше, так как буфер пользователя пакета в пуле памяти предварительно выделен для минимизации фрагментации памяти.

  • Исправлены ошибки документации, такие как утверждение, что функция sock_send_packet при ошибке не будет управлять памятью объекта пакета (она управляет памятью всегда).

В. 0.0.1

Основной уровень (изменения, не зафиксированные до этой точки времени).

Lib-Async

В. 0.4.0

  • Я полностью переписал всё (почти).

  • Теперь libasync работает как глобальная машина состояний. Больше нет объектов async_p.

  • По умолчанию используется nanosleep вместо труб (можно вернуться к использованию труб, установив простой флаг). Это пока кажется более эффективным (за счёт незначительного увеличения нагрузки на ЦПУ).

В. 0.3.0

  • Устранены проблемы инициализации пула задач, чтобы избежать сегментационных ошибок.

  • Оптимизации и ограничения пула задач libasync были добавлены для минимизации проблем фрагментации памяти для долгоживущих процессов.

Основной уровень (изменения, не зафиксированные до этой точки времени).## Lib-Server

Версия 0.4.2 (следующий номер версии)

  • Ограничено количество потоков (1023) и процессов (127), которые могут быть запущены без изменения кода библиотеки.

  • Небольшие изменения, направленные на повышение производительности.

  • Исправлена проблема, при которой обновление протокола WebSocket позволяло параллельное выполнение кода вместе с on_open (фиксация протокола была исправлена во время смены протокола).

  • Добавлен метод server_each_unsafe, который позволяет выполнять задачу для всех клиентских соединений. Часть слова unsafe очень важна — например, память может быть освобождена во время выполнения.

Версия 0.4.1

  • Небольшие изменения, направленные на повышение производительности.

  • Процесс завершения работы теперь позволяет однопоточному асинхронному планированию задач (событий).

  • Обновление настроек таймаута сокета автоматически "касается" сокета (сбрасывает счетчик таймаута).

Версия 0.4.0

  • Полная переработка с центра. Код стал более лаконичным и менее дублированным.

  • Различный 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 файлов и отправлять тот же файловый дескриптор нескольким клиентам.

Версия 0.3.4

  • Обновлено sendfile, чтобы он принимал только файловые дескрипторы (а не FILE *). Это требование оптимизации.

Версия 0.3.3

  • Исправлены ситуации, когда sendfile может не закрывать файл перед возвратом ошибки.

  • Было вероятно, что обратный вызов on_data может вернуть управление после отключения соединения и установки нового соединения для того же fd. Это могло привести к тому, что флаг busy будет сброшен, даже если новое соединение было занятым. Эта потенциальная проблема была исправлена путём проверки соединения против счетчика UUID перед сбросом флага busy.

  • Напоминание: Возможность Server.rw_hooks устарела. Используйте возможности TLC (Callbackes уровня транспорта) библиотеки libsock вместо этого.

Версия 0.3.2

Базовая версия (изменения, не зарегистрированные ранее этой точки времени).

MiniCrypt (разработка незакончена)

Версия 0.1.1* Добавлено грязное (и немного быстрее, чем libc) выполнение gmtime, которое игнорирует локализацию.

Базовая версия (изменения, не зарегистрированные ранее этой точки времени).

Протокол HTTP

  • 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: Базовый уровень (изменения до этого момента времени не были учтены).

Расширение WebSocket

  • Решена проблема #6, благодарность @Filly за открытие проблемы.

  • Удалён пул памяти. Может быть восстановлен после устранения недочётов, но при добавлении новых тестов пул памяти проваливал их.* 12 января 2017: Улучшение производительности памяти.

    Протокол соединения WebSocket теперь использует как уровень C пулы памяти, так и локальное хранилище потока для временных данных. Это помогает минимизировать возможные проблемы фрагментации памяти, связанные с длительными процессами и долгоживущими объектами.

    Кроме того, буфер чтения сокета был перемещён из объекта протокола в локальное хранилище потока (предполагается использование pthreads, а не green threads). Это минимизирует размер потребляемой памяти для каждого соединения (за счёт утраты локальности памяти) и должно позволить Iodine поддерживать большее количество одновременных соединений при меньших системных ресурсах. Наконец, буфер сообщений по умолчанию на соединении начинается с 4 КБ вместо 16 КБ (растёт по мере необходимости до значения Iodine::Rack.max_msg_size), что предполагает, что более короткие сообщения являются нормой.

Дата 20160607

Основной уровень (изменения, не зафиксированные ранее этой точки во времени).

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/mll-facil.io.git
git@api.gitlife.ru:oschina-mirror/mll-facil.io.git
oschina-mirror
mll-facil.io
mll-facil.io
master