Глюк в FB? Потокобезопасность FB API?

Запросы, планы, оптимизация запросов, ...

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

Vit
Сообщения: 19
Зарегистрирован: 05 ноя 2005, 03:22

Глюк в FB? Потокобезопасность FB API?

Сообщение Vit » 11 мар 2008, 04:23

Firebird-2.0.3.12981-1 Windows XP sp2

1. Открываем базу из основного потока приложения

dbName:= 'localhost:MY_BASE'; // TCP/IP MY_BASE в alliases.conf
isc_attach_database(@status, 0, PChar(dbName), @DB_Handle, dpb_length, @dpb_buffer);

2. Стартуем транзакцию из второго потока.

tpb_buffer[0]:= Char(isc_tpb_version3);
tpb_buffer[1]:= Char(isc_tpb_write);
tpb_buffer[2]:= Char(isc_tpb_read_committed);
tpb_buffer[3]:= Char(isc_tpb_no_rec_version);
tpb_buffer[4]:= Char(isc_tpb_wait);
isc_start_transaction(@status, @IBTrans_Handle, 1, @DB_Handle, 5, @tpb_buffer)

3. Из того же потока делаем вызовы
isc_create_blob2(@status, @DB_Handle, @IBTrans_Handle, @blob_handle_wav, @blob_id_wav, 0, nil);

и начинаем вызывать по мере необходимости.
isc_put_segment(@status, @blob_handle_wav, WriteCacheBufferPos, @WriteCacheBuffer);
Переменные IBTrans и blob_handle_wav потоковые.

Создаем еще один поток со своими переменными IBTrans и blob_handle_wav
Пункт 2 и3 повторяем из этого потока и FB лежит.

Симптомы такие isc_start_transaction проходит на ура и возвращает какой-то Handle, похожий на правду.
Если посмотреть netstat, то видно что при этом возникает новое TCP/IP подключение к порту 3050.
После чего isc_create_blob2 возвращает код, что транзакция не стартовала, хотя ему передается полученный Handle. А FB при этом разлетается.

Методом научного тыка было установлено, что проблема устраняется если для каждого потока делать своё подключение к БД при помощи isc_attach_database. В этом случае все работает правильно, однако при помощи описанной последовательности по-моему можно положить любой сервер.

Вот такая панимаиш загогулина (с).

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

Сообщение kdv » 11 мар 2008, 10:08

Методом научного тыка было установлено, что проблема устраняется если для каждого потока делать своё подключение к БД при помощи isc_attach_database.
спасибо за гениальное открытие! Вы помогли всем, кто не читает FAQ!
www.ibase.ru/ibfaq.htm#threads

если серьезно, то этот пункт у меня в FAQ уже лет десять. Правда, не всякое измывательство над клиентом приводит к падению сервера. И не всякой версии.

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

Re: Глюк в FB? Потокобезопасность FB API?

Сообщение hvlad » 11 мар 2008, 10:38

Vit писал(а):Создаем еще один поток со своими переменными IBTrans и blob_handle_wav
Пункт 2 и3 повторяем из этого потока и FB лежит.
Синхронизировать потоки нужно, вокруг вызовов АПИ.
Vit писал(а):Симптомы такие isc_start_transaction проходит на ура и возвращает какой-то Handle, похожий на правду.
Если посмотреть netstat, то видно что при этом возникает новое TCP/IP подключение к порту 3050.
Та ты шо !
Vit писал(а):Методом научного тыка было установлено, что ...
ФАК читать мы не приучены

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

Сообщение kdv » 11 мар 2008, 10:50

тем не менее, основная мысль в посте о том, что сервер падает при таких операциях.

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

Сообщение hvlad » 11 мар 2008, 10:52

kdv писал(а):тем не менее, основная мысль в посте о том, что сервер падает при таких операциях.
Я в этом сильно сомневаюсь. Скорее упал клиент, или даже не упал, а начал выдавать "неожиданные" ошибки.

В любом случае - эта хрень должна уйти в 2.5

kostyl
Сообщения: 47
Зарегистрирован: 06 фев 2008, 10:24

Сообщение kostyl » 11 мар 2008, 16:53

А можно спросить (я читал FAQ): тоесть будет все нормально если я создаю треад у которого есть свой IBDataBase IBTransaction IBSQL, и еще таких же 1000 и работаю из одного клиента ими параллельно на servername:c\........?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 11 мар 2008, 17:10

Да. Но при условии сериализации коннекта к БД, о чём факе и написано.

Vit
Сообщения: 19
Зарегистрирован: 05 ноя 2005, 03:22

Сообщение Vit » 11 мар 2008, 17:16

hvlad писал(а):
kdv писал(а):тем не менее, основная мысль в посте о том, что сервер падает при таких операциях.
Я в этом сильно сомневаюсь. Скорее упал клиент, или даже не упал, а начал выдавать "неожиданные" ошибки.

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

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 11 мар 2008, 17:22

Vit писал(а):Нет упал как раз сервер
И как ты это увидел? Что в логе сервера написано?

Vit
Сообщения: 19
Зарегистрирован: 05 ноя 2005, 03:22

Сообщение Vit » 11 мар 2008, 17:54

WildSery писал(а):
Vit писал(а):Нет упал как раз сервер
И как ты это увидел? Что в логе сервера написано?
В списке процессов отсутствовал fbserver.exe.
Приходилось стартовать сервис руками. (Автоматический перезапуск у меня отключен и гвардеец тоже).

В логе действительно были ошибки клиента (много), но чем мне это поможет, сервер же таки лежал?

Vit
Сообщения: 19
Зарегистрирован: 05 ноя 2005, 03:22

Сообщение Vit » 11 мар 2008, 18:16

kdv писал(а):спасибо за гениальное открытие! Вы помогли всем, кто не читает FAQ!
www.ibase.ru/ibfaq.htm#threads

если серьезно, то этот пункт у меня в FAQ уже лет десять. Правда, не всякое измывательство над клиентом приводит к падению сервера. И не всякой версии.
Упрек не по адресу. FAQ я читал.
Я полагал что проблема в IBX, а не в самом FB API.
Например VCL непотокобезопасный, а вот Windows API ,безопасный (за совсем редкими и экзотическими исключениями).

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

Сообщение kdv » 11 мар 2008, 18:28

это ясно, только вот сокет, если я смыслю в колбасных обрезках, невозможно использовать из параллельных тредов. нужна сериализация. А сериализация убьет смысл тредовости.
над разными сокетами, операции, разумеется, потокобезопасны.

kostyl
Сообщения: 47
Зарегистрирован: 06 фев 2008, 10:24

Сообщение kostyl » 12 мар 2008, 13:23

kostyl писал(а):А можно спросить (я читал FAQ): тоесть будет все нормально если я создаю треад у которого есть свой IBDataBase IBTransaction IBSQL, и еще таких же 1000 и работаю из одного клиента ими параллельно на servername:c\........?
Или 10000. Будут ли какието проблемы с таким количеством коннектов?

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

Сообщение kdv » 12 мар 2008, 15:35

конечно будут. операционная система не резиновая же. Сколько сможет сокетов открыть, столько и даст. Например RedHat Linux без изменения конфигов и перекомпиляции ядра дает около 600 коннектов.
Под виндой, суперсервер - около 5000. Да ты и сам можешь проверить - в цикле создавай IBDatabase, и выводи +1.

Только вот вопрос - нафига это?

kostyl
Сообщения: 47
Зарегистрирован: 06 фев 2008, 10:24

Сообщение kostyl » 12 мар 2008, 16:51

kdv писал(а):Только вот вопрос - нафига это?
Да вот и сам щас так думаю - нафига. Псевдомногозадачность? Всё равно ждать нодо, например, если добавлять несколько записей из потоков))

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

Сообщение kdv » 12 мар 2008, 22:04

я имел в виду 10 тысяч потоков и соединений. куда это? Клиент-сервер такое кол-во соединений не осилит, из-за ограничений операционки или железа. Да и даже на гигабитной сети такое число соединений потребует сильно дорогого сетевого железа.
В трехзвенке, опять же, такое количество соединений с СУБД избыточно на пару порядков.

Вообще этот вопрос из разряда "как мне обеспечить вставку миллиона записей в секунду" или "как работать с 10 терабайтной БД" - люди, перед которыми стоит такая задача в реале, уже обладают достаточным опытом и не задают подобных вопросов. А кто задает - не обладает достаточными знаниями для решений даже близко стоящих задач, однозначно.

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 12 мар 2008, 23:20

kdv писал(а):Под виндой, суперсервер - около 5000
вообще-то, в пять раз меньше... :-)

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 12 мар 2008, 23:48

dimitr писал(а):
kdv писал(а):Под виндой, суперсервер - около 5000
вообще-то, в пять раз меньше... :-)
В военное время и синус может достигать значения 5 :wink:

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

Сообщение kdv » 12 мар 2008, 23:52

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

брутальный ответ - нефиг спрашивать, проверить самостоятельно проще и быстрее.

kostyl
Сообщения: 47
Зарегистрирован: 06 фев 2008, 10:24

Сообщение kostyl » 13 мар 2008, 09:08

Спасибо за ответы. Я подумаю действительно ли мне это надо.
kdv писал(а):люди, перед которыми стоит такая задача в реале, уже обладают достаточным опытом и не задают подобных вопросов. А кто задает - не обладает достаточными знаниями для решений даже близко стоящих задач, однозначно.
PS:Так, что теперь прикажете не рашать? Я не пойму зачем это всё писать? Люди то, люди это... Это же форум. Тут люди задают вопросы, а, обладающие достаточным опытом, отвечают. Если я спрашиваю - я не знаю, "однозначно".

Ответить