Перейти к содержимому

один из пользователей не может подключиться


Рекомендованные сообщения

А покажи, плиз, код include/utime.h

Там в операторах одно время были проблемы. Может, тебе достался непофикшенный вариант?

Ссылка на сообщение
Поделиться на других сайтах
  • Ответы 124
  • Created
  • Последний ответ

Top Posters In This Topic

в таймаутере всё в порядке.

принимаем пакет от пользователя, переводим в фазу 2 и отправляем пакет:

 

inetaccess.cpp > 20:46:25 > recv from 192.168.10.217 5554 len=64

inetaccess.cpp > 20:46:25 > User Plan FOUND!

inetaccess.cpp > 20:46:25 > ======================> InitEncrypt dont needed

inetaccess.cpp > 20:46:25 > User Plan phase changed from 1 to 2

inetaccess.cpp > 20:46:25 > Phase changed from 1 to 2

inetaccess.cpp > 20:46:25 > 1215884811.7439 192 bytes sent to 192.168.10.217:5555 len=192

 

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

 

inetaccess.cpp > 20:46:31 > Phase2.user Plan curtime-2ndtime 6, udelay 15

inetaccess.cpp > 20:46:31 > recv from 192.168.10.217 5554 len=64

inetaccess.cpp > 20:46:31 > User Plan FOUND!

inetaccess.cpp > 20:46:31 > ======================> InitEncrypt dont needed

inetaccess.cpp > 20:46:31 > User Plan phase not1 and not3 - return from CONN_SYN_6. phase 2

 

 

таймаутер отсчитывает до 15 секунд и переводит назад в фазу 1

 

inetaccess.cpp > 20:46:40 > Phase2.user Plan curtime-2ndtime 14, udelay 15

inetaccess.cpp > 20:46:40 > Phase2.user Plan curtime-2ndtime 15, udelay 15

inetaccess.cpp > 20:46:40 > Phase2. BIGGER THAT ZERO VALUE

inetaccess.cpp > 20:46:40 > Phase changed from 2 to 1. Reason: timeout

 

сейчас проблему наблюдаю у двух пользователей. куда копать не понимаю...

 

странно, но перезапуск сервера не изменил ситуацию.

возможно это у них с фаерволом проблема.

 

всё же ситуация не вчерашняя, тогда не было фазопереходов.

жду дальше...

Ссылка на сообщение
Поделиться на других сайтах

Изначально пользователь находится в фазе 1.

Он присылает пакет CONN_SYN - запрос на соединение. Сервер переводит его в фазу 2 и посылает запрос на подтверждение соединения: CONN_SYN_ACK.

Если пользователь не присылает пакет CONN_ACK до тайм-аута - он переходит в фазу 1. Если присылает - переходит в фазу 3.

В фазе 3 пользователю периодически посылаются пакеты ALIVE_SYN. Если пользователь в течении тайм-аута не отвечает ALIVE_ACK - он переходит в фазу 2.

Если от пользователя в фазе 3 приходит пакет DISCONN_SYN - он переходит в фазу 4 и ему отсылается запрос подтверждения отключения DISCONN_SYN_ACK. Откуда у него 3 пути: по тайм-ауту в фазу 3, по CONN_SYN в фазу 2 и по DISCONN_ACK в фазу 1.

 

Такова логика работы протокола. Нужно понять в каком месте "зависает" юзер.

Ссылка на сообщение
Поделиться на других сайтах

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

 

 

if (it->second.phase == 2)

{

rz= currTime - it->second.phaseTime;

printfd(__FILE__, "Phase2.user %s curtime-2ndtime %d, udelay %d \n" ,

it->second.user->GetLogin().c_str() , rz.tv_sec , iaSettings.GetUserDelay() );

 

if ( (currTime - it->second.phaseTime) > iaSettings.GetUserDelay()

|| (currTime - it->second.phaseTime) < 0 )

{

 

if ((currTime - it->second.phaseTime) < 0 )

{

printfd(__FILE__, "Phase2. LOWER ZERO VALUE \n" );

}

else

{

printfd(__FILE__, "Phase2. BIGGER THAT ZERO VALUE \n" );

}

 

it->second.phase = 1;

 

т.е. если it->second.phaseTime слишком велик, то мы должны получить отсчет таймаута меньший чем 0 и в старом варианте очень долго достигать значения 15 секунд, а в новом - сразу переходить в фазу 1.

 

Это самое я и пронаблюдал вчера неоднократно:

 

 

inetaccess.cpp > 15:07:08 > Phase2.user Plan curtime-2ndtime 14, udelay 15

inetaccess.cpp > 15:07:08 > Phase2.user Plan curtime-2ndtime -4280, udelay 15

inetaccess.cpp > 15:07:08 > Phase2. LOWER ZERO VALUE

inetaccess.cpp > 15:07:08 > Phase changed from 2 to 1. Reason: timeout

.....

inetaccess.cpp > 18:41:41 > Phase2.user Kukushata curtime-2ndtime 1, udelay 15

inetaccess.cpp > 18:41:41 > Phase2.user Kukushata curtime-2ndtime -4293, udelay 15

inetaccess.cpp > 18:41:41 > Phase2. LOWER ZERO VALUE

inetaccess.cpp > 18:41:41 > Phase changed from 2 to 1. Reason: timeout

.....

inetaccess.cpp > 19:53:15 > Phase2.user FeratX curtime-2ndtime 10, udelay 15

inetaccess.cpp > 19:53:15 > Phase2.user Plan curtime-2ndtime 11, udelay 15

inetaccess.cpp > 19:53:15 > Phase2.user FeratX curtime-2ndtime -4284, udelay 15

inetaccess.cpp > 19:53:15 > Phase2. LOWER ZERO VALUE

inetaccess.cpp > 19:53:15 > Phase changed from 2 to 1. Reason: timeout

inetaccess.cpp > 19:53:15 > Phase2.user Plan curtime-2ndtime -4283, udelay 15

inetaccess.cpp > 19:53:15 > Phase2. LOWER ZERO VALUE

inetaccess.cpp > 19:53:15 > Phase changed from 2 to 1. Reason: timeout

.....

inetaccess.cpp > 21:04:46 > Phase2.user Galas curtime-2ndtime 3, udelay 15

inetaccess.cpp > 21:04:46 > Phase2.user Galas curtime-2ndtime -4291, udelay 15

inetaccess.cpp > 21:04:46 > Phase2. LOWER ZERO VALUE

inetaccess.cpp > 21:04:46 > Phase changed from 2 to 1. Reason: timeout

...

Ссылка на сообщение
Поделиться на других сайтах

насчет include/utime.h

у него размер 3144байт, идет в дистрибутивах, которые я качаю уже не одну версию. Сомневаюсь чтобы мне "достался непофикшенный вариант", хотя...

да вот собственно и он:

# cat utime.h
#ifndef UTIME_H
#define UTIME_H

/*
*    This program is free software; you can redistribute it and/or modify
*    it under the terms of the GNU General Public License as published by
*    the Free Software Foundation; either version 2 of the License, or
*    (at your option) any later version.
*
*    This program is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*    GNU General Public License for more details.
*
*    You should have received a copy of the GNU General Public License
*    along with this program; if not, write to the Free Software
*    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

/*
*    Date: 22.12.2007
*/

/*
*    Author : Boris Mikhailenko <stg34@stargazer.dp.ua>
*/

/*
$Revision: 1.2 $
$Date: 2008/01/05 23:37:58 $
$Author: faust $
*/

#include <sys/time.h>
#include <time.h>

struct UTIME: public timeval
{
   UTIME()
   {
   tv_sec = 0;
   tv_usec = 0;
   }

   UTIME(time_t t)
   {
   tv_sec = t;
   tv_usec = 0;
   }

   UTIME(long long a, long long 
   {
   tv_sec = a;
   tv_usec = b;
   }

   bool operator<(const UTIME & rhs) const
   {
   if (tv_sec < rhs.tv_sec)
       return true;
   else if (tv_sec > rhs.tv_sec)
       return false;
   else if (tv_usec < rhs.tv_usec)
       return true;
   return false;
   }

   bool operator<=(const UTIME & rhs) const
   {
   if (tv_sec < rhs.tv_sec)
       return true;
   else if (tv_sec > rhs.tv_sec)
       return false;
   else if (tv_usec < rhs.tv_usec)
       return true;
   else if (tv_usec > rhs.tv_usec)
       return false;
   return true;
   }

   bool operator>(const UTIME & rhs) const
   {
   if (tv_sec > rhs.tv_sec)
       return true;
   else if (tv_sec < rhs.tv_sec)
       return false;
   else if (tv_usec > rhs.tv_usec)
       return true;
   return false;
   }

   bool operator>=(const UTIME & rhs) const
   {
   if (tv_sec > rhs.tv_sec)
       return true;
   else if (tv_sec < rhs.tv_sec)
       return false;
   else if (tv_usec > rhs.tv_usec)
       return true;
   else if (tv_usec < rhs.tv_usec)
       return false;
   return true;
   }

   bool operator==(const UTIME & rhs) const
   {
   //cout << tv_sec << "." << tv_usec << "  " << rhs.tv_sec << "." <<  rhs.tv_usec << endl;
   //cout << (tv_sec == rhs.tv_sec) << " " << (tv_usec == rhs.tv_usec) << endl;
   return (tv_sec == rhs.tv_sec) && (tv_usec == rhs.tv_usec);
   }

   UTIME operator+(const UTIME & rhs)
   {
   // TODO optimize
   long long a, b;
   a = tv_sec * 1000000 + tv_usec;
   b = rhs.tv_sec * 1000000 + rhs.tv_usec;
   tv_sec = (a +  / 1000000;
   tv_usec = (a +  % 1000000;
   return UTIME((a +  / 1000000, (a +  % 1000000);
   }

   UTIME operator-(const UTIME & rhs)
   {
   // TODO optimize
   long long a, b;
   a = tv_sec * 1000000 + tv_usec;
   b = rhs.tv_sec * 1000000 + rhs.tv_usec;
   return UTIME((a -  / 1000000, (a -  % 1000000);
   }
};


#endif //UTIME_H

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

у нас та же фигня! :)

 

сервер 2.405 с вебадминкой Алферова, ось фря 7.

Ссылка на сообщение
Поделиться на других сайтах

inetaccess.cpp > 15:07:08 > Phase2.user Plan curtime-2ndtime 14, udelay 15
inetaccess.cpp > 15:07:08 > Phase2.user Plan curtime-2ndtime -4280, udelay 15

- почему 2 раза?

 

К стати, вчера товарищ поделился интересным наблюдением: он не смох превысить предел в 890 авторизованных юзеров - остальные "вешались". А у вас сколько?

Ссылка на сообщение
Поделиться на других сайтах

+1 к теме. У нас такой же баг. Написал тут http://local.com.ua/forum/index.php?showtopic=12223 , а потом уже нашел эту тему. Уже замучался перегружать стг...

З.Ы. юзеров онлайн до 60-ти

Ссылка на сообщение
Поделиться на других сайтах
inetaccess.cpp > 15:07:08 > Phase2.user Plan curtime-2ndtime 14, udelay 15
inetaccess.cpp > 15:07:08 > Phase2.user Plan curtime-2ndtime -4280, udelay 15

- почему 2 раза?

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

 

К стати, вчера товарищ поделился интересным наблюдением: он не смох превысить предел в 890 авторизованных юзеров - остальные "вешались". А у вас сколько?
у нас много меньше :)

 

 

за последние несколько дней я так спокойно еще никогда себя не чувствовал :)

простой патч для исправления этого бага - вписать в ...argazer/plugins/authorization/inetaccess/inetaccess.cpp в процедуру ::Timeouter

строчку

 

int AUTH_IA::Timeouter()
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);

map<uint32_t, IA_USER>::iterator it;
it = ip2user.begin();
uint32_t sip;
//UTIME rz;
//printfd(__FILE__, "ip2user.size=%d \n", ip2user.size());

while (it != ip2user.end())
   {
   sip = it->first;

   if (it->second.phase == 0)
       it->second.phase = 1;

   static UTIME currTime;
   gettimeofday(&currTime, NULL);

[b]if (currTime < it->second.phaseTime)
{ it->second.phaseTime=currTime;
       //#ifdef IA_DEBUG
       printfd(__FILE__, "Bad phasetime value - corrected\n");
       //#endif
}[/b]

   if (it->second.phase == 2)

Ссылка на сообщение
Поделиться на других сайтах

за последние несколько дней я так спокойно еще никогда себя не чувствовал :)

простой патч для исправления этого бага - вписать в ...argazer/plugins/authorization/inetaccess/inetaccess.cpp в процедуру ::Timeouter

строчку

 

int AUTH_IA::Timeouter()
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);

map<uint32_t, IA_USER>::iterator it;
it = ip2user.begin();
uint32_t sip;
//UTIME rz;
//printfd(__FILE__, "ip2user.size=%d \n", ip2user.size());

while (it != ip2user.end())
   {
   sip = it->first;

   if (it->second.phase == 0)
       it->second.phase = 1;

   static UTIME currTime;
   gettimeofday(&currTime, NULL);

[b]if (currTime < it->second.phaseTime)
{ it->second.phaseTime=currTime;
       //#ifdef IA_DEBUG
       printfd(__FILE__, "Bad phasetime value - corrected\n");
       //#endif
}[/b]

   if (it->second.phase == 2)

Попробывали. Нам этот способ не помог, висяки остались! :)(((

Ссылка на сообщение
Поделиться на других сайтах

Доброго времени суток!

вопрос к разработчикам в версии 2.405 в changelog-е есть пункт

Исправлена ошибка, приводящая к неправильной работе модуля mod_auth_ia.so

исправляет ли он эту проблему так как на версии 2.404 такая проблема повторяется примерно раз в 2 дня при 250 пользователях в базе и онлайн 15-30 чел

Ссылка на сообщение
Поделиться на других сайтах
Доброго времени суток!

вопрос к разработчикам в версии 2.405 в changelog-е есть пункт

 

исправляет ли он эту проблему так как на версии 2.404 такая проблема повторяется примерно раз в 2 дня при 250 пользователях в базе и онлайн 15-30 чел

 

Именно обсуждаемую проблему - нет, не исправил. Иначе бы мы ее не обсуждали :)

Ссылка на сообщение
Поделиться на других сайтах
Именно обсуждаемую проблему - нет, не исправил. Иначе бы мы ее не обсуждали :)

 

есть вариант как-то временно решить проблемку путем "костыля" например? очень досаждает :)

ставить всем "всегда онлайн" не подходит.

Ссылка на сообщение
Поделиться на других сайтах

Владельцам 405-й версии: попробуйте раскоментировать строки

//#define IA_DEBUG (1)

//#define IA_PHASE_DEBUG (1)

в файле inetaccess.h, пересобрать его, положить в модули и перезапустить стг. После того как будет воспроизведен баг - отошлите мне файлик /var/log/stargazer.log.ia.log на faust@stg.dp.ua

Ссылка на сообщение
Поделиться на других сайтах

после того как я себя пропатчил, а это уже больше 10 дней, проблема встретилась один раз, тогда как ранее это повторялось как минимум раз в 3-4 дня. всё же мой костыль, по моему, решает траблу в большей части. Поживем, посмотрим... Кстати у меня 2.404, мож в этом дело?

Ссылка на сообщение
Поделиться на других сайтах
после того как я себя пропатчил, а это уже больше 10 дней, проблема встретилась один раз, тогда как ранее это повторялось как минимум раз в 3-4 дня. всё же мой костыль, по моему, решает траблу в большей части. Поживем, посмотрим... Кстати у меня 2.404, мож в этом дело?

В 405-й были решены некоторые проблемы с mod_auth_ia, в частности - с отрицательными временными интервалами.

Ссылка на сообщение
Поделиться на других сайтах
  • 2 weeks later...
В 405-й были решены некоторые проблемы с mod_auth_ia, в частности - с отрицательными временными интервалами.

поставили вот эту 405ую - 5 дней, полет нормальный, ни одного висяка пока замечено не было

З.Ы. дебаг описанный выше включили...

Ссылка на сообщение
Поделиться на других сайтах
поставили вот эту 405ую - 5 дней, полет нормальный, ни одного висяка пока замечено не было

З.Ы. дебаг описанный выше включили...

А какова нагрузка на серв? Сколько юзеров и сколько из них онлайн?

Пока косяки замечались в крупных сетях...

Ссылка на сообщение
Поделиться на других сайтах
А какова нагрузка на серв? Сколько юзеров и сколько из них онлайн?

Пока косяки замечались в крупных сетях...

отписал в личку

Ссылка на сообщение
Поделиться на других сайтах

та же фигня, в базе 350 чел, онлайн обычно около 100 чел. Вроде не такая уж и крупная сеть. И некоторые клиенты не могут подключиться ао несколько суток уже, и перезагрузка уже не помогает!

Ссылка на сообщение
Поделиться на других сайтах
та же фигня, в базе 350 чел, онлайн обычно около 100 чел. Вроде не такая уж и крупная сеть. И некоторые клиенты не могут подключиться ао несколько суток уже, и перезагрузка уже не помогает!

ну это уже вероятно другая проблема...

Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.


×
×
  • Создать...