Страница 1 из 2
Глюк в FB? Потокобезопасность FB API?
Добавлено: 11 мар 2008, 04:23
Vit
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. В этом случае все работает правильно, однако при помощи описанной последовательности по-моему можно положить любой сервер.
Вот такая панимаиш загогулина (с).
Добавлено: 11 мар 2008, 10:08
kdv
Методом научного тыка было установлено, что проблема устраняется если для каждого потока делать своё подключение к БД при помощи isc_attach_database.
спасибо за гениальное открытие! Вы помогли всем, кто не читает FAQ!
www.ibase.ru/ibfaq.htm#threads
если серьезно, то этот пункт у меня в FAQ уже лет десять. Правда, не всякое измывательство над клиентом приводит к падению сервера. И не всякой версии.
Re: Глюк в FB? Потокобезопасность FB API?
Добавлено: 11 мар 2008, 10:38
hvlad
Vit писал(а):Создаем еще один поток со своими переменными IBTrans и blob_handle_wav
Пункт 2 и3 повторяем из этого потока и FB лежит.
Синхронизировать потоки нужно, вокруг вызовов АПИ.
Vit писал(а):Симптомы такие isc_start_transaction проходит на ура и возвращает какой-то Handle, похожий на правду.
Если посмотреть netstat, то видно что при этом возникает новое TCP/IP подключение к порту 3050.
Та ты шо !
Vit писал(а):Методом научного тыка было установлено, что ...
ФАК читать мы не приучены
Добавлено: 11 мар 2008, 10:50
kdv
тем не менее, основная мысль в посте о том, что сервер падает при таких операциях.
Добавлено: 11 мар 2008, 10:52
hvlad
kdv писал(а):тем не менее, основная мысль в посте о том, что сервер падает при таких операциях.
Я в этом сильно сомневаюсь. Скорее упал клиент, или даже не упал, а начал выдавать "неожиданные" ошибки.
В любом случае - эта хрень должна уйти в 2.5
Добавлено: 11 мар 2008, 16:53
kostyl
А можно спросить (я читал FAQ): тоесть будет все нормально если я создаю треад у которого есть свой IBDataBase IBTransaction IBSQL, и еще таких же 1000 и работаю из одного клиента ими параллельно на servername:c\........?
Добавлено: 11 мар 2008, 17:10
WildSery
Да. Но при условии сериализации коннекта к БД, о чём факе и написано.
Добавлено: 11 мар 2008, 17:16
Vit
hvlad писал(а):kdv писал(а):тем не менее, основная мысль в посте о том, что сервер падает при таких операциях.
Я в этом сильно сомневаюсь. Скорее упал клиент, или даже не упал, а начал выдавать "неожиданные" ошибки.
В любом случае - эта хрень должна уйти в 2.5
Нет упал как раз сервер, вот в чем основная мысль, как верно заметил kdv. По-моему это не есть гуд, когда любой жлоб при помощи специально написанного кривого клиента легко кладет сервер. Если бы сервер прибивал такого клиента то все было бы логично.
Добавлено: 11 мар 2008, 17:22
WildSery
Vit писал(а):Нет упал как раз сервер
И как ты это увидел? Что в логе сервера написано?
Добавлено: 11 мар 2008, 17:54
Vit
WildSery писал(а):Vit писал(а):Нет упал как раз сервер
И как ты это увидел? Что в логе сервера написано?
В списке процессов отсутствовал fbserver.exe.
Приходилось стартовать сервис руками. (Автоматический перезапуск у меня отключен и гвардеец тоже).
В логе действительно были ошибки клиента (много), но чем мне это поможет, сервер же таки лежал?
Добавлено: 11 мар 2008, 18:16
Vit
kdv писал(а):спасибо за гениальное открытие! Вы помогли всем, кто не читает FAQ!
www.ibase.ru/ibfaq.htm#threads
если серьезно, то этот пункт у меня в FAQ уже лет десять. Правда, не всякое измывательство над клиентом приводит к падению сервера. И не всякой версии.
Упрек не по адресу. FAQ я читал.
Я полагал что проблема в IBX, а не в самом FB API.
Например VCL непотокобезопасный, а вот Windows API ,безопасный (за совсем редкими и экзотическими исключениями).
Добавлено: 11 мар 2008, 18:28
kdv
это ясно, только вот сокет, если я смыслю в колбасных обрезках, невозможно использовать из параллельных тредов. нужна сериализация. А сериализация убьет смысл тредовости.
над разными сокетами, операции, разумеется, потокобезопасны.
Добавлено: 12 мар 2008, 13:23
kostyl
kostyl писал(а):А можно спросить (я читал FAQ): тоесть будет все нормально если я создаю треад у которого есть свой IBDataBase IBTransaction IBSQL, и еще таких же 1000 и работаю из одного клиента ими параллельно на servername:c\........?
Или 10000. Будут ли какието проблемы с таким количеством коннектов?
Добавлено: 12 мар 2008, 15:35
kdv
конечно будут. операционная система не резиновая же. Сколько сможет сокетов открыть, столько и даст. Например RedHat Linux без изменения конфигов и перекомпиляции ядра дает около 600 коннектов.
Под виндой, суперсервер - около 5000. Да ты и сам можешь проверить - в цикле создавай IBDatabase, и выводи +1.
Только вот вопрос - нафига это?
Добавлено: 12 мар 2008, 16:51
kostyl
kdv писал(а):Только вот вопрос - нафига это?
Да вот и сам щас так думаю - нафига. Псевдомногозадачность? Всё равно ждать нодо, например, если добавлять несколько записей из потоков))
Добавлено: 12 мар 2008, 22:04
kdv
я имел в виду 10 тысяч потоков и соединений. куда это? Клиент-сервер такое кол-во соединений не осилит, из-за ограничений операционки или железа. Да и даже на гигабитной сети такое число соединений потребует сильно дорогого сетевого железа.
В трехзвенке, опять же, такое количество соединений с СУБД избыточно на пару порядков.
Вообще этот вопрос из разряда "как мне обеспечить вставку миллиона записей в секунду" или "как работать с 10 терабайтной БД" - люди, перед которыми стоит такая задача в реале, уже обладают достаточным опытом и не задают подобных вопросов. А кто задает - не обладает достаточными знаниями для решений даже близко стоящих задач, однозначно.
Добавлено: 12 мар 2008, 23:20
dimitr
kdv писал(а):Под виндой, суперсервер - около 5000
вообще-то, в пять раз меньше... :-)
Добавлено: 12 мар 2008, 23:48
Merlin
dimitr писал(а):kdv писал(а):Под виндой, суперсервер - около 5000
вообще-то, в пять раз меньше...

В военное время и синус может достигать значения 5

Добавлено: 12 мар 2008, 23:52
kdv
могу неправильно помнить, но при тестах 500 было вроде для классика. хотя, возможно, я путаю с 5000 одновременно стартоваными IBTransaction, когда кто-то спрашивал аналогичное.
брутальный ответ - нефиг спрашивать, проверить самостоятельно проще и быстрее.
Добавлено: 13 мар 2008, 09:08
kostyl
Спасибо за ответы. Я подумаю действительно ли мне это надо.
kdv писал(а):люди, перед которыми стоит такая задача в реале, уже обладают достаточным опытом и не задают подобных вопросов. А кто задает - не обладает достаточными знаниями для решений даже близко стоящих задач, однозначно.
PS:Так, что теперь прикажете не рашать? Я не пойму зачем это всё писать? Люди то, люди это... Это же форум. Тут люди задают вопросы, а, обладающие достаточным опытом, отвечают. Если я спрашиваю - я не знаю, "однозначно".