CHUNGYUN / flylinkdc

Automatically exported from code.google.com/p/flylinkdc
0 stars 0 forks source link

Зависание при завершении приложения (после согласия на обновление) #1280

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
На слабом нетбуке и провисело всю ночь.
http://www.flickr.com/photos/96019675@N02/9736045294/

очень критично.

Код оригинального клиента
void BufferedSocket::shutdown() {
    disconnecting = true;

    Lock l(cs);
    addTask(SHUTDOWN, 0);
}

У нас с фиксом от Ежика

void BufferedSocket::shutdown()
{
    // [!] IRainman fix: turning off the socket in the asynchronous mode is prohibited because the listeners of its events will have been destroyed by the time of processing the shutdown event.
    FastLock l(cs);
    if (m_threadId != GetSelfThreadID())
    {
        while (m_speaking)
        {
            sleep(1); // [+] We are waiting for the full processing of the current event.
        }
    }
    m_state = STARTING; // [+]
    m_disconnecting = true;
    addTask(SHUTDOWN, nullptr);
    // [~] IRainman fix.
}

Также странно что на завершении 
присваивается 
m_state = STARTING

Original issue reported on code.google.com by Pavel.Pimenov@gmail.com on 13 Sep 2013 at 2:31

GoogleCodeExporter commented 9 years ago
При этот ClientManager::g_isShutdown == true

Полный дамп и исходники http://yadi.sk/d/KvJ6cLHJ9BVy8

Алексей прошу посмотреть на код повторно и 
до вечера рассказать
что тут хотел сделать и что фиксил

Если не помнишь или некогда я вечером 
откатываю это потенциальное место 
зависания
 до состояние оригинального клиента.

Original comment by Pavel.Pimenov@gmail.com on 13 Sep 2013 at 2:39

GoogleCodeExporter commented 9 years ago
Пока поправил так
http://code.google.com/p/flylinkdc/source/detail?r=15385

TODO - найти еще цикл бесконечного сна и там 
тоже внести таймаут.
Зависания очень сложно отловить т.к. 
пользователи не умеют делать дампы
пусть лучше прога упадет на краш сервер.

Original comment by Pavel.Pimenov@gmail.com on 13 Sep 2013 at 2:49

GoogleCodeExporter commented 9 years ago
Всё просто: ожидаем m_speaking, что бы не было 
рандомных крашей при закрытии. По сути этот 
код дожидается завершения всех эвентов в 
сокете.

Собственно это там и написано
// [!] IRainman fix: turning off the socket in the asynchronous mode is 
prohibited because the listeners of its events will have been destroyed by the 
time of processing the shutdown event.

Код сегодня ещё разок проверю. Откатывать 
это нельзя поскольку у нас исправлена туча 
различных проблем в тех областях.

Original comment by a.rain...@gmail.com on 13 Sep 2013 at 2:50

GoogleCodeExporter commented 9 years ago
r15385 равносильно тому, что бы совсем 
откатить :) Падать начнёт теперь рандомно в 
тех краях.

Original comment by a.rain...@gmail.com on 13 Sep 2013 at 2:52

GoogleCodeExporter commented 9 years ago
Посмотри не только код но и дамп.
Также бесконечные циклы допускать нельзя - 
это 100%

Original comment by Pavel.Pimenov@gmail.com on 13 Sep 2013 at 2:52

GoogleCodeExporter commented 9 years ago
Цикл очень даже конечный, дамп тоже 
посмотрю, в код нет смысла смотреть без 
дампа этого.

Original comment by a.rain...@gmail.com on 13 Sep 2013 at 2:54

GoogleCodeExporter commented 9 years ago
Лучше пусть упадет чем намертво зависает.
Также может нужно диалог юзеру выдвать по 
аналогии с виндой  
"Вы хотите подождать еще или все равно 
завершиться"
+ диагностику на телеметрию...

Original comment by Pavel.Pimenov@gmail.com on 13 Sep 2013 at 3:01

GoogleCodeExporter commented 9 years ago
и в дампе Dead Lock - цикл никогда не закончится.
он ночь грел мне полку :)

Original comment by Pavel.Pimenov@gmail.com on 13 Sep 2013 at 3:05

GoogleCodeExporter commented 9 years ago
Фликр не работает. Я так понимаю, это тот 
самый момент, когда обновление скачано и 
ждёт наката, но не было (корректно) 
установлено после завершения флая. Затем, 
при старте флая, выдаётся запрос, мол, 
установить апдейт или удалить его и при 
положительном ответе, идёт ожидание 
завершения флая, который как бы начал 
стартовать.
Вот у меня в этом месте висит. Ночь, конечно, 
не тестил, но подождал полчасика (обычно 
этого времени должно быть более чем 
достаточно) - висит, с периодическими 
вопросами от апдейтера подождать ещё.

В кастнмном таскменеджере в списке окон 
флая всего два посредственных окошка (GDI+ и 
Default IME), правда не помню, обращения к 
файловой системе есть или нет. В трее 
иконки тоже нет. Короче, выглядит повисшим, 
приходится прибивать через таскменеджер.

Original comment by masteral...@googlemail.com on 13 Sep 2013 at 8:32

GoogleCodeExporter commented 9 years ago
Какой билд у вас повесился?
моеже при зависании снять дамп процесса и 
послать его мне приватно на почту через 
обменник?

Original comment by Pavel.Pimenov@gmail.com on 13 Sep 2013 at 10:10

GoogleCodeExporter commented 9 years ago
Ну до последних 2-3 обновлений было на 
последних парочке билдов именно как 
описано выше у меня.
Дамп чем снять можно в XP, чем-нибудь 
легковесным?

Original comment by masteral...@googlemail.com on 13 Sep 2013 at 11:06

GoogleCodeExporter commented 9 years ago
Issue 1245 has been merged into this issue.

Original comment by a.rain...@gmail.com on 13 Sep 2013 at 12:13

GoogleCodeExporter commented 9 years ago
Вероятно ишья поправлена r15388, ну вернее 
дедлок то точно поправлен в той области, а 
вот исправится ли полностью описанная 
проблема - надо потестировать.

Original comment by a.rain...@gmail.com on 13 Sep 2013 at 12:41

GoogleCodeExporter commented 9 years ago
r15388 скачать пока не предлагает.
Потестить смогу, разумеется, только при 
очередном обновлении, некорректно 
завершив флай и не дав ему обновиться после 
выхода.

Original comment by masteral...@googlemail.com on 13 Sep 2013 at 1:23

GoogleCodeExporter commented 9 years ago
в XP попробуй http://technet.microsoft.com/en-US/sysinternals/bb896645
или так

Версия так же как и ранее периодически 
подвисает при загадочных обстоятельствах. 
:(

Пришли, пожалуйста, дамп программы, в 
момент, когда она подвисла.
Дамп делается так:
1. дожидаемся, пока окно Флая не перестает 
реагировать на внешние раздражители
2. в таскбаре щелкаем на кнопке окна правой 
кнопкой мыши и выбираем "Закрыть". Надо 
добиться, чтобы выскочило системное 
окошко, что мол программа перестала 
отвечать на запросы: "The program is not responding" и 
нажать кнопку "End now" (то бишь закрыть 
программу). Важно! кнопку "End now" нажимать 
только один раз
3. Выскочит окошко, что программа прикрыта и 
чтоб отослали инфу мелкомягким: "Please tell 
Microsoft about this problem.". В этом окошке внизу есть 
ссылка, чтб посмотреть, что за инфа 
ассоциирована с ошибкой: "To see what data this error 
report contains, click here" - щелкаем на нее.
4. Появляется окошко со всякой технической 
белибердой, внизу две ссылки. Щелкаем на 
предпоследнюю - "To view technical information about the error 
report, click here"
5. Появится окошко со списком файлов. Одним 
из них будет *.mdmp - нужно прислать его и еще 
обязательно *.hdmp, который должен лежать 
рядом (в списке он не указан). Важно! файлы 
надо скопировать до того, как будет закрыто 
окошко с инфой по ошибке, иначе они 
сотрутся. 

дамп слать на pavel.pimenov@gmail.com

Original comment by Pavel.Pimenov@gmail.com on 14 Sep 2013 at 3:04

GoogleCodeExporter commented 9 years ago
Не совсем понял, какого вида дамп я могу 
сделать Procmon'ом - он же, как и в прошлом filemon, 
просто пишет лог по какой-либо заметной 
активности - э то ведь не дамп.
А вторым способом - я попробую сделать, вот 
только нужно вспомнить, где я отключил эти 
репорты :)

Original comment by masteral...@googlemail.com on 14 Sep 2013 at 10:57

GoogleCodeExporter commented 9 years ago
Блин. ошибся.
process explorer качай
тоже с сисинтернал

Original comment by Pavel.Pimenov@gmail.com on 14 Sep 2013 at 11:00

GoogleCodeExporter commented 9 years ago
|1. дожидаемся, пока окно Флая не перестает 
реагировать на внешние раздражители

И вот тут у нас тоже загвоздка. Похоже, 
всё-таки мы немного о разных зависаниях 
говорим и я выше описал свой варивант.
Ещё раз, вкратце:
1. Обновление скачано, ждёт когда я прекращу 
пользоваться флаем;
2. Когда завершаю флай корректно, должно 
автоматически запуститься обновление;
3. Если я сделал некорректное завершение 
(прибил процесс), то обновление не 
накатывается;
4. При следующем старте флая, где-то после 
сплеш-скрина, предлагается либо установить 
апдейт, либо он удалится;
5. Выбирая "Да" (обновить, тобишь), возникает 
окошко с прогрессбаром "ожидание 
завершения флая" - вот тут-то и всё и уходит 
в инфинайт луп :)

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

Original comment by masteral...@googlemail.com on 14 Sep 2013 at 11:03

GoogleCodeExporter commented 9 years ago
Качни http://technet.microsoft.com/en-US/sysinternals/bb896653
там по правой кнопке на процессе - есть 
сделать дамп под XP?

Original comment by Pavel.Pimenov@gmail.com on 14 Sep 2013 at 11:12

GoogleCodeExporter commented 9 years ago
Есть там полный и минидамп.
Какой снимать?

Original comment by masteral...@googlemail.com on 14 Sep 2013 at 12:18

GoogleCodeExporter commented 9 years ago
Есть штук 5 скринов всего процесса, от 
вопроса про обновление до момента, когда 
апдейтер не может дождаться флая.
Скрины и минидамп прямо сейчас скину на 
почту, а фулдамп весит 212Мб - его надо?

Original comment by masteral...@googlemail.com on 14 Sep 2013 at 12:32

GoogleCodeExporter commented 9 years ago
Фул дамп как раз и надо, без него дедлок не 
починить.

Original comment by a.rain...@gmail.com on 14 Sep 2013 at 12:40

GoogleCodeExporter commented 9 years ago
Отправл 5 скринов и миник во вложениях и жду 
пока фул дамп зальётся на ядиск - кину 
следом позже.

Original comment by masteral...@googlemail.com on 14 Sep 2013 at 12:54

GoogleCodeExporter commented 9 years ago
Прокомментирую процесс и скрины прямо 
здесь.
После того, как обновление скачалось и я 
прибил флай, запустив его снова, он ведёт 
стандартный процесс загрузки, после того, 
как прочитает расшаренные файлы, выдаётся 
запрос на установку или удаление 
обновления, окна от самого флая не 
создаются (основного приложения), сплэш 
флая висит, хотя, тем временем, флай активно 
читает всякие файлы, работает с БД (на 
скринах кое-где видно, на фоне висит procmon с 
фильтром по флаю и там куча событий).
Можно заметить, что сам флай не имеет main 
window, да и вообще никаких окон он не имеет. 
Апдейтер, не дождавшись выгрузки флая, 
предлагает подождать ещё или забить.

ИМХО, можно просто задавать запрос об 
обновлении и до ответа на него вообще не 
грузить флай, иначе он живёт своей жизнью в 
фоне и без окон.

Original comment by masteral...@googlemail.com on 14 Sep 2013 at 1:00

GoogleCodeExporter commented 9 years ago
*задавать=выдавать :)

Минидамп и фулдамп делался не 
одновременно, разумеется. Более того, дампы 
снимаются, а тем временем флай работает.
Потом я снова его прибил в процессах и 
обновление накатилось, а затем флай 
запустился.

PS. Обновление накатывалось 389-е, в котором, 
по идее, должен был быть этот фикс :)

Original comment by masteral...@googlemail.com on 14 Sep 2013 at 1:03

GoogleCodeExporter commented 9 years ago
Фул дамп не удалось залить на ядиск, жду, 
когда зальётся в дропбокс и кину ссылку.
Надеюсь, сегодня успею. Мне кажется, до 
четверга я буду практически недоступен.

Original comment by masteral...@googlemail.com on 14 Sep 2013 at 2:26

GoogleCodeExporter commented 9 years ago
Всё, ссылка на фул в ящике :)

Original comment by masteral...@googlemail.com on 14 Sep 2013 at 3:02

GoogleCodeExporter commented 9 years ago
Ещё в это время висит единственное 
соединение от флая к fly-server.ru (не знаю, это 
хаб или что-то другое)

Original comment by masteral...@googlemail.com on 16 Sep 2013 at 4:30

GoogleCodeExporter commented 9 years ago
Проверьте пожалуйста сборку после r15458 - 
провёл ревизию механизма синхронного 
выключения сокетов, и поправил найденные 
ошибки.

Original comment by a.rain...@gmail.com on 21 Sep 2013 at 2:22