По поводу выхода стабильной node.js 0.4, выкатил ее на продакшен и плотно занялся вычисткой NNTP-гейта. Заборол 2 неочевидных косяка.
Если кто пользуется напрямую связкой Server/Socket, то не надо пытаться в сокете ловить событие “connect”. Потому что оно устарело. Вся инициализация пишется прямо в listener сервера.
После этого сразу заработали TLS-разновидности сокета и сервера.
Поймал некислый race condition.
Предыстория такова. У NNTP протокол получается stateful. В HTTP соединения “короткие”, и авторизация делается каждый раз по кукам. В NNTP все не так - кук нет, коннекты могут быть по несколько минут, и авторизация надо помнить.
Ну я организовал объект сессии, а по разрыву соединения сессию грохал. И вот тут словил глюк, когда клиент рвал коннект в середине обмена. Система ведь асинхронная. Ответ может прийти с задержкой, когда его уже перестали ждать.
Вот и получалось иногда, что отвечалка пыталась лезть к удаленной сессии, вызывая эксепшен. Не особо фатально, но внутри мусор копился. Прока просто на всех callback-ах поставил проверок. Не очень нравится, но красивее пока не придумал. Как будет настроение - еще чего-нибудь порефакторю.
С памятью после правок вроде полегчало. И похоже, что меньше кушает теперь.
{"assets_hash":"a8b26fa7f6e768b07a72c8c9aadb9422","page_data":{"users":{"39c21abc3df9550077797d18":{"_id":"39c21abc3df9550077797d18","hid":349,"name":"Vitaly","nick":"Vitaly","avatar_id":null,"css":""}},"settings":{"blogs_can_create":false,"blogs_mod_can_delete":false,"blogs_mod_can_hard_delete":false,"blogs_mod_can_add_infractions":false,"can_report_abuse":false,"can_vote":false,"can_see_ip":false,"blogs_edit_comments_max_time":30,"blogs_show_ignored":false,"blogs_reply_old_comment_threshold":30,"votes_add_max_time":168},"entry":{"_id":"4d639cd69970730077101c5c","hid":11252,"title":"Node 0.4 вышла. Проапдейтил NNTP","html":"<p>По поводу выхода стабильной node.js 0.4, выкатил ее на продакшен и плотно занялся вычисткой NNTP-гейта. Заборол 2 неочевидных косяка.</p>\n<ol>\n<li>Если кто пользуется напрямую связкой Server/Socket, то не надо пытаться в сокете ловить событие “connect”. Потому что оно устарело. Вся инициализация пишется прямо в listener сервера.</li>\n</ol>\n<p><a href=\"https://github.com/rcdesign/vb-nntp/commit/ad6db4af0b307445066eaae6ae43badd166e98f6\" class=\"link link-ext link-auto\" data-nd-link-type=\"autolink\" data-nd-link-orig=\"https://github.com/rcdesign/vb-nntp/commit/ad6db4af0b307445066eaae6ae43badd166e98f6\" target=\"_blank\" rel=\"nofollow noopener\">github.com/…/ad6db4af0b307445066eaae6ae43badd166e9…</a></p>\n<p>После этого сразу заработали TLS-разновидности сокета и сервера.</p>\n<ol start=\"2\">\n<li>Поймал некислый race condition.</li>\n</ol>\n<p>Предыстория такова. У NNTP протокол получается stateful. В HTTP соединения “короткие”, и авторизация делается каждый раз по кукам. В NNTP все не так - кук нет, коннекты могут быть по несколько минут, и авторизация надо помнить.</p>\n<p>Ну я организовал объект сессии, а по разрыву соединения сессию грохал. И вот тут словил глюк, когда клиент рвал коннект в середине обмена. Система ведь асинхронная. Ответ может прийти с задержкой, когда его уже перестали ждать.</p>\n<p>Вот и получалось иногда, что отвечалка пыталась лезть к удаленной сессии, вызывая эксепшен. Не особо фатально, но внутри мусор копился. Прока просто на всех callback-ах поставил проверок. Не очень нравится, но красивее пока не придумал. Как будет настроение - еще чего-нибудь порефакторю.</p>\n<!--cut-->\n<p>С памятью после правок вроде полегчало. И похоже, что меньше кушает теперь.</p>\n","user":"39c21abc3df9550077797d18","ts":"2011-02-22T11:24:06.000Z","st":1,"cache":{"comment_count":0},"views":584,"bookmarks":0,"votes":0},"subscription":null},"locale":"en-US","user_id":"000000000000000000000000","user_hid":0,"user_name":"","user_nick":"","user_avatar":null,"is_member":false,"settings":{"can_access_acp":false,"can_use_dialogs":false,"hide_heavy_content":false},"unread_dialogs":false,"footer":{"rules":{"to":"common.rules"},"contacts":{"to":"rco-nodeca.contacts"}},"navbar":{"tracker":{"to":"users.tracker","autoselect":false,"priority":10},"forum":{"to":"forum.index"},"blogs":{"to":"blogs.index"},"clubs":{"to":"clubs.index"},"market":{"to":"market.index.buy"}},"recaptcha":{"public_key":"6LcyTs0dAAAAADW_1wxPfl0IHuXxBG7vMSSX26Z4"},"layout":"common.layout"}