TimeOut

Вопросы стыковки визуальных компонент (DataControls, EhGrid, VirtualTreeView, DevExpress и т.п.) с данными из БД.

Модераторы: kdv, CyberMax

Ответить
zdm77
Сообщения: 12
Зарегистрирован: 20 мар 2009, 15:37

TimeOut

Сообщение zdm77 » 10 апр 2009, 10:40

FireBird 2.1, Delphi 2009, FIBPlus
При попытке соединения на остановленный или недоступный сервер, необходимо через скажем 5 секунд выдать сообщение. В FibPlus есть свойство Timer но не помогает что-то или я не так понял его значения. Пробую стандартный TTimer .. перед попыткой соединения запускаю его, все равно приложение висит пока не выдаст сообщение сообщение исключение..

zdm77
Сообщения: 12
Зарегистрирован: 20 мар 2009, 15:37

Re: TimeOut

Сообщение zdm77 » 10 апр 2009, 10:44

....не создавать же отдельный поток для таймера... можно, но может есть путь попроще?

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Re: TimeOut

Сообщение Attid » 10 апр 2009, 16:24

если мне не изменяет память то пока система не отпустит то приложение об этом не узнает. так что это настройка системы. лучше выводи красивое окошко : "пробуем подключится к БД" и пусть ждут.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: TimeOut

Сообщение kdv » 10 апр 2009, 19:11

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

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

Кузнецов Евгений
Сообщения: 144
Зарегистрирован: 16 фев 2006, 22:36

Re: TimeOut

Сообщение Кузнецов Евгений » 10 апр 2009, 21:48

Доброго времени суток!
kdv писал(а):невозможно это никак. Например, ты в браузере лезешь на сайт. А он недоступен. Происходит пауза, а потом сообщение об ошибке. Так вот, длительностью паузы ты управлять не можешь, и во время паузы с браузером тоже делать ничего не можешь. Здесь то же самое -
пока сокет операционки не скажет, что на том конце никого нет - твое приложение будет висеть.
Собственно, это не то же самое, это просто одно и то же.
Теоретически, в firebird.conf есть параметр ConnectionTimeout, который за это и отвечает. Правда, для соединений на localhost мне не удалось добиться никакого видимого эффекта его изменениями (isql, 2.1.1).

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: TimeOut

Сообщение kdv » 11 апр 2009, 17:07

он отвечает не за это, а за проверку состояния соединения клиента. СonnectionTimeout - именно так с английского и переводится. Да и в конфиге написано.
Если соединенный (!) с сервером клиент перестал отвечать на dummy packets, то сервер рвет соединение с клиентом через интервал, заданный connectiontimeout.

Кузнецов Евгений
Сообщения: 144
Зарегистрирован: 16 фев 2006, 22:36

Re: TimeOut

Сообщение Кузнецов Евгений » 11 апр 2009, 17:52

Доброго времени суток!
kdv писал(а):он отвечает не за это, а за проверку состояния соединения клиента. СonnectionTimeout - именно так с английского и переводится. Да и в конфиге написано.
Если соединенный (!) с сервером клиент перестал отвечать на dummy packets, то сервер рвет соединение с клиентом через интервал, заданный connectiontimeout.
Гм, но в конфиге ведь другое написано - "Seconds to wait before concluding an attempt to connect has failed." - т.е. речь идет именно о попытке соединения. Да и разработчики на gmane вроде об этом писали.
--
С уважением, Евгений

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: TimeOut

Сообщение hvlad » 11 апр 2009, 22:23

kdv писал(а):он отвечает не за это, а за проверку состояния соединения клиента. СonnectionTimeout - именно так с английского и переводится. Да и в конфиге написано.
Если соединенный (!) с сервером клиент перестал отвечать на dummy packets, то сервер рвет соединение с клиентом через интервал, заданный connectiontimeout.
Путаешь ConnectionTimeout с DummyPacketInterval

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: TimeOut

Сообщение kdv » 12 апр 2009, 04:28

Гм, но в конфиге ведь другое написано - "Seconds to wait before concluding an attempt to connect has failed." - т.е. речь идет именно о попытке соединения.
на заборе тоже бывает разное написано. Эта запись где? В конфиге сервера. Какое отношение она имеет к клиенту, который стучится к выключенному серверу?
Почему, например, у меня при попытке коннекта к нестартованному серверу (или к роутеру, где ФБ нет) IBExpert показывает ошибку через 5 секунд, а не через 180? Почему если пытаться законнектиться к ФБ наружу в инет например к http://www.ibase.ru таймаут наступает через 40-60 секунд?

Почему в исходниках на самом деле эта переменная называется port_connect_timeout?
Почему там написано
/* Implement an error-detection protocol to ensure that the client
is still there. Use the select() call with a timeout to wait on
the connection for an incoming packet
. If none comes within a
suitable time interval, write a dummy packet on the connection.
If the client is not there, an error will be returned on the write.

Почему вообще этот самый пресловутый таймаут используется в единственном месте inet.cpp

Код: Выделить всё

		timeout.tv_sec = port->port_connect_timeout;
		time_ptr = &timeout;

...

#if (defined WIN_NT)
				slct_count = select(FD_SETSIZE, &slct_fdset, NULL, NULL, time_ptr);
#else
				slct_count = select((SOCKET) port->port_handle + 1, &slct_fdset, 
					NULL, NULL, time_ptr);
?
hvlad писал(а):Путаешь ConnectionTimeout с DummyPacketInterval
ок, путаю.
ConnectionTimeout - допустимое время неответа в существующем (!) коннекте.
DummyPacket - если произошла ошибка по ConnectionTimeout, то клиенту шлется пустой пакет, и если через DummyPacketInterval сервер не получил ответа от клиента, клиент считается отрубившимся. Так?

Ну и наконец. В том же inet.cpp есть функция inet_try_connect. Если я правильно понимаю, то это и есть попытка коннекта к серверу. Если да, то где в ней указание таймаута? Да хоть бы и в inet_connect.
port = inet_try_connect(packet, rdb, file_name, node_name, status_vector, dpb);
(про isc_dpb_connect_timeout я пока промолчу).

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: TimeOut

Сообщение hvlad » 12 апр 2009, 11:24

kdv писал(а):
Гм, но в конфиге ведь другое написано - "Seconds to wait before concluding an attempt to connect has failed." - т.е. речь идет именно о попытке соединения.
на заборе тоже бывает разное написано.
Т.е. наш конфиг списан с забора ? Спасибо за сравнение.
kdv писал(а):Эта запись где? В конфиге сервера. Какое отношение она имеет к клиенту, который стучится к выключенному серверу?
У клиента тоже есть конфиг, представь себе. И умолчательные значения вполне имеют силу.
kdv писал(а):Почему, например, у меня при попытке коннекта к нестартованному серверу (или к роутеру, где ФБ нет) IBExpert показывает ошибку через 5 секунд, а не через 180? Почему если пытаться законнектиться к ФБ наружу в инет например к http://www.ibase.ru таймаут наступает через 40-60 секунд?
Потому что в этом случае до физ. коннекта даже не доходит дело, я так подозреваю. Хочешь узнать точнее - трассируй в отладчике какой из вызовов возвращает ошибку.
kdv писал(а):Почему в исходниках на самом деле эта переменная называется port_connect_timeout?
Спроси у борландов. Но вообще-то там написано :

Код: Выделить всё

	SLONG			port_connect_timeout;   /* Connection timeout value */
	SLONG			port_dummy_packet_interval; /* keep alive dummy packet interval */
	SLONG			port_dummy_timeout;	/* time remaining until keepalive packet */
kdv писал(а):Почему там написано
/* Implement an error-detection protocol to ensure that the client
is still there. Use the select() call with a timeout to wait on
the connection for an incoming packet
. If none comes within a
suitable time interval, write a dummy packet on the connection.
If the client is not there, an error will be returned on the write.
А чем тебе это не нравится ?
kdv писал(а):Почему вообще этот самый пресловутый таймаут используется в единственном месте inet.cpp

Код: Выделить всё

		timeout.tv_sec = port->port_connect_timeout;
		time_ptr = &timeout;

...

#if (defined WIN_NT)
				slct_count = select(FD_SETSIZE, &slct_fdset, NULL, NULL, time_ptr);
#else
				slct_count = select((SOCKET) port->port_handle + 1, &slct_fdset, 
					NULL, NULL, time_ptr);
?
Потому что это единственный вызов в котором можно указать хоть какой-нибудь таймаут.
kdv писал(а):
hvlad писал(а):Путаешь ConnectionTimeout с DummyPacketInterval
ок, путаю.
ConnectionTimeout - допустимое время неответа в существующем (!) коннекте.
Коннет != сокет
kdv писал(а):DummyPacket - если произошла ошибка по ConnectionTimeout, то клиенту шлется пустой пакет, и если через DummyPacketInterval сервер не получил ответа от клиента, клиент считается отрубившимся. Так?
Почти так. Пакетов шлётся несколько.
kdv писал(а):Ну и наконец. В том же inet.cpp есть функция inet_try_connect. Если я правильно понимаю, то это и есть попытка коннекта к серверу. Если да, то где в ней указание таймаута? Да хоть бы и в inet_connect.
port = inet_try_connect(packet, rdb, file_name, node_name, status_vector, dpb);
inet_try_connect вызывает port->receive, которая вызывает select с таймаутом.

Дима, никто не спорит, что ConnectionTimeout реализован криво. Но не нужно говорить, что его нет вообще и не нужно его путать с DummyPacketInterval. До 2.5 классик был однопоточным приложением, со всеми вытекающими.
Когда будем переделывать сетевой слой, переделаем и таймауты, добавим query timeout и т.п.

kdv писал(а):(про isc_dpb_connect_timeout я пока промолчу).
Угу, и это правильно :)

Код: Выделить всё

void REMOTE_get_timeout_params(rem_port* port, Firebird::ClumpletReader* pb)
{
/**************************************
 *
 *	R E M O T E _ g e t _ t i m e o u t _ p a r a m s
 *
 **************************************
 *
 * Functional description
 *	Determine the connection timeout parameter values for this newly created
 *	port.  If the client did a specification in the DPB, use those values.
 *	Otherwise, see if there is anything in the configuration file.  The
 *	configuration file management code will set the default values if there
 *	is no other specification.
 *
 **************************************/
	//bool got_dpb_connect_timeout = false;

	fb_assert(isc_dpb_connect_timeout == isc_spb_connect_timeout);

	port->port_connect_timeout =
		pb && pb->find(isc_dpb_connect_timeout) ? pb->getInt() : Config::getConnectionTimeout();

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Re: TimeOut

Сообщение kdv » 12 апр 2009, 16:57

ок. собственно, вся моя речь сводилась к одному - параметр connectiontimeout не имеет отношения к паузе от вызова isc_attach_database до получения сообщения что "сервера на том конце нет". Или если даже и имеет, то весьма частичное.

Ответить