Экспериментально обнаружил, что если вызвать sendto() на UDP-сокете 100500 раз подряд с маленькими сообщениями, то все вызовы вернут успех, но получателю приедет лишь малая доля отправленных сообщений.
For UDP sockets, there are no send buffers, so send() and sendto() never return EWOULDBLOCK
Packets are just silently dropped when a device queue overflows.
Получается, что в случае UDP-сокета, sendto() пишет сразу в буфер адаптера.
Я не стану задавать риторический вопрос, что мешало этим чертям проверять переполнение буфера адаптера и честно возвращать EWOULDBLOCK – чтобы отправитель мог сразу регулировать плотность трафика, а не через ожидание отсутствия подтверждения от получателя по таймауту (в результате чего у отправителя ВСЕГДА устаревшие данные о пропускной способности канала).
Мне интересно более практичное: если UDP-сокет никогда не возвращает EWOULDBLOCK (т.е. не проверяет переполнение буфера адаптера), есть ли смысл добавлять его во writeSet для select(), и как он себя в этом случае поведёт (ведь для срабатывания writeSet таки-нужно проверять наличие свободного места в буфере адаптера)?
Или же тупо писать в него безо всяких select(&writeSet)? Даже если writeSet сработает корректно, один хрен невозможно узнать, сколько можно записать и когда нужно остановиться.
Мигрирую тут своё барахлишко с -std=c++20 на -std=c++23, и всё чистенько, кроме одного затыка:
#include <unordered_map>
class C {};
int main() {
C c;
std::unordered_map<C*, int> m;
m.insert({&c, 0}); // no matching function for call to 'get'
return 0;
}
C++20 компилял это нормально, C++23 ругается на &c. Что поменяли, чего ей надо?
Я тут подумываю, а не вернуться ли мне на генту. Правда, от этих мыслей меня существенно подташнивает. Тем не менее, не поделитесь ли, товарищи гентушники,
чё у вас там новенького, кроме бинарных пакетов?
Насколько runit юзабелен как полная замена OpenRC? Поддерживается ли он для всех сервисов?
2a. К слову, а почему они вообще до сих пор от этого громоздкого говна мамонта не отказались? (Гы, на всякий случай уточню, что я про OpenRC.)
Недопонял я, что там с ускорением портежа. Вижу USE=native-extensions, но недопонял, много ли он на данный момент даёт и какие дальнейшие планы?
После обновления mdadm 4.2 —> 4.3, массивы не собираются с вышеуказанной ошибкой. WTF?!
Не из-за двоеточия ли это в начале имени? У меня в заметках записано, это чтобы оно не добавляло homehost. Видимо, чтобы при загрузке с флешки не ругалось, что хост неправильный. Возможно вместо этого можно вписать в /etc/mdadm.conf HOMEHOST=<ignore> (глобально для всех массивов), но прежде чем пердолиться с переименованием массивов и подкручиванием конфигов, мечтается получить подтверждение, что причина действительно в этом. Чёт не гуглится ничего, кроме аналогичного багрепорта без обсуждения.
У меня artix linux на компе и на загрузочном portable ssd, почти идентичные системы. После где-то полугодичного перерыва грузанулся в ssd чтобы его обновить. Обновил, перегрузился – всё работает, но идёт непрерывная запись на ssd на максимальной скорости, почти без остановки: gkrellm показывает, и светодиод на ssd непрерывно моргает. И сдаётся мне, редкие паузы там только потому что SSD отказывается принимать новые данные пока старые не раскидает.
iotop -a показывает с гулькин хрен – только jdb2 немного, несопоставимо по объёмам. UPD: Вернее, в строке заголовка он показывает большой общий объём записи (Actual DISK WRITE:), а в разбивке по процессам – хрен.
Грузился в runlevel 1 без графики и сети – всё равно моргает непрерывно.
Насколько я себе представляю, если бы только сам SSD внутри себя освежал давно не перезаписывавшиеся данные, он бы сильно грелся, но gkrellm запись не показывал бы.
Думал, может драйвер ядра форсирует освежение, но пока я копировал конфиги с основной системы на ssd, непрерывная запись на него не шла.
nginx динамически грузит мой .so-модуль, который прилинкован к lucene++.so.
Изредка сегфолтится, и я склонен полагать, что это баг lucene++, но хочется быть уверенным, прежде чем скомпилять и заюзать его последний снапшот, где этот баг пофиксен. И пока я жду очередного сегфолта,
Вопрос: как объяснить gdb -c /tmp/core-xxx, чтобы он подцепил мою .so, или он сам это из дампа увидит?
Моя .so с отладочной инфой, nginx и lucene++ без (лень: они установлены тупо из пакетов).
На этом своём каменте или через-следующем жму – в адресной строке появляется https://www.linux.org.ru/forum/development/17495702?cid=17520734#comment-er=show&cid=17521254 (на втором каменте последнее число другое) и всё, дальше ничего не происходит. В других выборочно проверенных темах всё работает.
UPD. Вот дьявол, а когда открываю второй камент по прямой второй ссылке выше, ссылка «показать ответ» из него работает.
UPD2. Похоже дело в том, что второй камент открывается в режиме «игнорируемые скрыты», а мой камент – в режиме «игнорируемые видны», а там навигация давно известно что подглюкивает, и давно смирился как с платой за возможность пол-ЛОРа игнорить. В общем, ложная тревога.
В смысле, при перезапуске приложения. Уже с полгода имеет место быть, созрел пожаловаться. У меня окна не maximized, справа ~=200px отступ чтобы кусок десктопа был виден (а точнее gkrellm). А при перезапуске ещё и сверху отступ 5-10px образуется, каждый раз приходится ресайзить. QtCreator, QBitTorrent (этот ещё на 1px вправо сдвигает окно), не помню что ещё.
(при редактировании HTML – WYSIWYG) Генерить diff: минималистичный, но достаточный для восстановления предыдущей версии по текущей, как в VCS.
Применять diff к текущей версии для получения предыдущей.
Выводить diff с раскраской, или лучше подготавливать какие-то структуры для вывода, по которым я сам быстренько-простенько раскрашу.
Загвоздка в том, что у меня HTML, и надо как-то типа как на ЛОРе: если отличие не в тексте, а в HTML тегах/атрибутах, оно должно сохраняться (для восстановления предыдущей версии), но не показываться.
В крайнем случае п.3 попробую сам запилить. Но уж для п.1+2 что-то наверняка да есть.
Несколько лет назад по форумам пробежала ссылка на сабж, где чел плакался, что мол из инженерной дисциплины программирование превратилось в гадание на койфейной гуще: тупо и бессмысленно бродишь-ищешь, где забыл аннотацию воткнуть. Не помнит ли кто?
В моём приложении создаю коннекты и prepared statements по запросу, и в описываемом сценарии считаем что кеширую их вечно. Все обновления базы – внутри транзакций.
Во время работы приложения в консоли запускаю sqlite3 mydb и там что-нибудь модифицирую (create table aaa(id int);, drop table aaa;) в auto-commit режиме. После чего моё приложение естественно начинает ругаться «database is locked» (SQLITE_BUSY). (А может и не естественно, если консоль в auto-commit отпускает лок после каждой команды.)
Проблема в том, что даже после того, как я выйду из sqlite3 в консоли, моё приложение продолжает ругаться.
Причём там непонятная хрень какая-то творится. Prepared statements, которые были созданы ПОСЛЕ того, как я вышел из консоли, работают. Решил убедиться, запустил консоль, сделал create/drop table, а потом, НЕ выходя из консоли, запустил приложение – всё работает. Но стоит ещё раз повторить в этой же консоли create/drop table – начинает ругаться.
SQLite 3.43.2, база на локальной ФС, режим журналирования WAL, по коннекту на поток, sqlite3_open_v2(...SQLITE_OPEN_NOMUTEX...), pragma locking_mode = normal.
Куда копать, кроме постгреса и кладбища? Ну и кроме очевидного, но чересчур грубого pragma locking_mode = exclusive. Что там вообще происходит?
Т.е. независимо от того, сколько между ними разновсяческих открывающих и закрывающих тегов. Надо на голом js, покомпактнее и побыстрее; рекурсивно сканировать DOM я и сам догадаюсь.
Например, в <p><b>Hello</b> <i>world</i>!</p> – следующий текстовый узел после «Hello» – пробел, а после пробела – «world».
И архитектура красивая и минималистичная (не надо подгонять свои высокоуровневые фантазии под – surprise! – совершенно по-другому работающие базовые технологии), и с самого начала тестируешь-дебажишь всю логику настоящую с самого низу (а не заглушки, заменив которые вдруг обнаруживаешь, что работает оно через раз, и тестировать всё надо снова), и писать много лишнего соответственно не приходится, но…
…Но сука пишешь-пишешь, пишешь-пишешь, пишешь-пишешь, ПИШЕШЬ-ПИШЕШЬ – и конца-края мать его не видно!!! Тошнит уже. :(
Хотя тут конечно фактор новизны ещё. Если последние 10 лет сидел на JVM, а плюсы последний раз ещё в яслях видел, то нарабатывать себе тулзы под практически новую для меня платформу – и libtooling изучать (и фасады под свой cake к нему клепать – многопоточность чтобы, и хелперы всякие, в т.ч. обход багов), и nginx (в котором для проксирования до хрена всего, а для бакенда – нихрена), и весь квадриллион граблей пока соберёшь…
Имеем сайт, т.е. приложение с очень большим аптаймом. База – SQLite. Нужно чтобы всё работало быстро, и стартовало / завершалось тоже.
Если вызывать pragma optimize при закрытии каждого соединения, как рекомендуют по ссылке выше, то есть шанс, что рано или поздно – и как положено, в самый неподходящий момент – оно задумается. А вместе с ним и админ: с чего это вдруг nginx не хочет завершаться? kill -9 его.
Понятно, что перед pragma optimize я ещё выдам pragma analysis_limit = 1000, чтобы оно совсем уж неприлично не задумывалось. Но внутренний перфекционист всё равно недоволен.
Для долгоиграющих приложений, по первой ссылке рекомендуют запускать pragma optimize раз в несколько часов. Делать это в рабочих коннектах – нехорошо, юзеры также будут время от времени ни с того ни с сего задумываться.
Отсюда вопросы:
Много ли выгоды я потеряю, если буду вызывать optimizeиз-под отдельного коннекта в фоновом потоке? Не спроста ж они рекомендуют вызывать его перед закрытием коннектов – небось накопленную коннектом статистику используют. Впрочем, бит 8 в MASK я в любом случае буду отключать – ещё блин какая-то сраная железка за меня не решала, какие индексы ей нужны. Но хотя бы тупой analyze-то отработает?
Если я буду запускать optimize в фоновом потоке при старте, и оно решит задуматься, оно не заблокирует DML в других коннектах? Если нет, то это был бы идеальный вариант: шустрая работа сайта с первых секунд, даже если админ кильнул предыдущую оптимизацию, задумавшуюся при завершении. Ну а дальше также фоном раз в несколько часов, а оптимизации при закрытии коннектов тогда с гораздо большей вероятностью отработают мгновенно.