powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / нужна помощь: op_fetch_response & op_response
21 сообщений из 21, страница 1 из 1
нужна помощь: op_fetch_response & op_response
    #39813310
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Колупаю Go-шный драйвер для FB
Есть проблема с некорректным разбором ответа сервера, если был exception в селективной процедуре.

Логика разбора ответа op_fetch следующая:
- пропускаются все op_dummy
- парсится op_response если счетчик lazyResponseCount > 0
- далее ожидается op_fetch_response
тут и проблема, т.к. прилетает op_response с ошибкой

Понятно, что этот op_response надо обработать, в связи с этим несколько вопросов:
1. op_response всегда будет содержать ошибку?
2. может ли быть еще что-то кроме op_fetch_response и op_response?
3. нужно ли после op_response отправлять op_free_statement с DSQL_close?
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39813322
Коваленко Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,

Хорошие вопросы :)

Посмотри в архиве, может на часть вопросов найдешь ответы.
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39813435
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коваленко Дмитрий,

с с++ я чуть меньше чем никак ((

по первому пункту понял что всегда exception
по второму если не op_fetch_response и не op_response - exception
по третьему чет не узрел
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39813466
Коваленко Дмитрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев ЕвгенийКоваленко Дмитрий,

с с++ я чуть меньше чем никак ((

Не переживай, я тоже.

Дегтярев Евгенийпо третьему чет не узрел

op_free_statement с DSQL_close - это другая операция. К "выборке данных из курсора" отношения не имеет.

Поэтому ёё лучше рассматривать отдельно.

Она зависит от "режима протокола" (protocol mode). Если я правильно выражаюсь.

В lazy_send (режиме) эта операция работает иначе чем в других режимах.

Кстати, fetch тоже от режима протокола зависит. Так что "все сложно".

Ну, вообщем, покопайся в архиве :)
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39813526
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коваленко Дмитрий,
> op_free_statement с DSQL_close - это другая операция. К "выборке данных из курсора" отношения не имеет.
понятно, меня интересует, если я в ответ на op_fetch получил op_response курсор на стороне сервера еще жив или нет?
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39813797
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгенийесли я в ответ на op_fetch получил op_response курсор на стороне сервера еще жив или нет?Жив, насколько я помню
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39813982
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad, Коваленко Дмитрий
спасибо
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39930562
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторКолупаю Go-шный драйвер для FB

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

Правильно ли будет игнорировать такие ошибки?

В текущей реализации отложенные op_response ожидаются для op_allocate_statement=62, op_free_statement=67 и op_close_blob=39. Для op_allocate_statement даже отложенный op_response будет обработан в том же методе (т.к. нужно вытащить statement handle). В пропуске ошибок для op_free_statement и op_close_blob криминала вроде нет. Или есть?

Есть ли еще запросы кроме этих, после которых может прилететь отложенный op_response?

Хочу так же прояснить вопрос с op_dummy.
Как часто сервер присылает op_dummy и в каких местах его можно ожидать?
По текущей реализации логика мне не ясна, где-то есть проверки, где-то нет. Может надо проверять при чтении любого опкода от сервера?
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39930566
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"папа, а ты с кем щас разговаривал?" (С)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39930608
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мимопроходящий,

а что делать...
вдруг кто мимо проходить будет да подскажет
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39930872
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подглядел реализацию в jaybird
вопрос про игнор ошибок в отложенных op_response отпал - игнор
https://github.com/FirebirdSQL/jaybird/blob/master/src/main/org/firebirdsql/gds/ng/wire/version11/V11WireOperations.java#L57

вопросы про op_dummy отпали - проверяем при чтении каждого опкода
https://github.com/FirebirdSQL/jaybird/blob/master/src/main/org/firebirdsql/gds/ng/wire/WireConnection.java#L463

остался один вопрос
Есть ли еще запросы, кроме op_allocate_statement=62, op_free_statement=67 и op_close_blob=39, после которых может прилететь отложенный op_response?
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39931025
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,

отложенный ответ может "прилететь", только если ты сам (т.е. клиент) его "отложил".

"Старый" способ работы клиента
send - receive
send - receive

"Новый" способ работы
send, send, send, ...
receive, receive, receive, ...

Только клиент знает, что они там себе "отложил".

Это, конечно, упрощённый взгляд, но суть тут должна быть понятна
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39931052
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
т.е. сервер в любом случае отправит ответ?

я думал что сервер тоже может придержаь ответ. Меня смутило различие в реализациях протокола в jaybbird. Если это чисто клиентская фишка то почему в реализации протокола в v10 этого нет, а в v11 есть. Плюс реализация с которой я работаю, флаг, который управляет откладывать разбор ответа на потом или нет, читает из ответа сервера на op_attach?
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39931089
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,

заставил меня таки лезть в код и вспоминать эту кухню :)

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

Сервер отвечает на каждый полученный от клиента пакет.
Обычно, в том же порядке, в котором он их получил.

Могут задержаться ответы на op_allocate_statement, op_execute, op_release, op_free_statement.

Ответы на op_execute задерживаются только если ожидается op_fetch, т.е. речь о курсоре.
Вот тут решает сервер: если он во время op_prepare вернул в поле p_resp_object ответа флаг STMT_DEFER_EXECUTE (4), то ответ на op_execute будет задержан.

Ответы на op_close_blob не задерживается, не знаю, откуда ты это взял.

fbclient может задержать отсылку op_close_blob и op_cancel_blob, но сервер отвечает на эти пакеты сразу.
Тут осталось место для оптимизации, да.
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39931228
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad
заставил меня таки лезть в код и вспоминать эту кухню :)

ну это же то что надо, огромное спасибо за ответ

авторМогут задержаться ответы на op_allocate_statement, op_execute, op_release, op_free_statement.

Ответы на op_execute задерживаются только если ожидается op_fetch, т.е. речь о курсоре.
Вот тут решает сервер: если он во время op_prepare вернул в поле p_resp_object ответа флаг STMT_DEFER_EXECUTE (4), то ответ на op_execute будет задержан.

op_allocate_statement: в случае отложенного ответа что отправлять в качестве statement handle?
эта реализация использует -1 (0xFFFFFFFF), jaybird 0xFFFF, если не ошибаюсь.

За подробности про op_execute спасибо, надо только разобраться где искать p_resp_object в op_prepare.
- 4 байта Object handle
- 8 байт Object ID
- 4 байта длина + буфер с длиной выровненой до 4 (его назначение мне пока не ясно)
- дальше разбор статус вектора
Object ID это оно?

с op_release не сталкивался, с op_free_statement вроде все ок.

авторОтветы на op_close_blob не задерживается, не знаю, откуда ты это взял.
видел отложенную обработку ответов op_close_blob и op_cancel_blob в jaybird
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39931289
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений
За подробности про op_execute спасибо, надо только разобраться где искать p_resp_object в op_prepare.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
// Generic Response block

typedef struct p_resp
{
	OBJCT		p_resp_object;		// Object id
	SQUAD		p_resp_blob_id;		// Blob id
	CSTRING		p_resp_data;		// Data
	Firebird::DynamicStatusVector* p_resp_status_vector;
} P_RESP;
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39931294
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо
и еще одино момент - при каких условиях сервер возвращает STMT_DEFER_EXECUTE? как это воспроизвести чтобы протестировать
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39931296
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,

когда SELECT препарируешь
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39931697
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

Вопрос именно в том как заставить сервер вернуть флаг STMT_DEFER_EXECUTE и отложить ответ на op_execute?
Судя по тому что сейчас нет обработки такого случая и это работает без зависаний, на такое пока не нарывались. Сервисы с этим драйвером работают на бою и давно.
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39931755
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений,

сервер возвращает флаг в ответ на препарирование SELECT, как я и говорил выше.

А вот при обработке op_execute\op_execute2 сервер откладывает ответ только в том случае, когда он знает, что в очереди на обработку есть что-то ещё.
Т.е. если клиент отослал только op_execute\op_execute2, то и ответ сервера отложен не будет.
Если же клиент отослал op_execute\op_execute2 и op_fetch, то сервер ответит на оба этих пакета.
...
Рейтинг: 0 / 0
нужна помощь: op_fetch_response & op_response
    #39931880
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очередное спасибо за разъяснение нюансов

hvlad
Если же клиент отослал op_execute\op_execute2 и op_fetch, то сервер ответит на оба этих пакета.

теперь понятно, драйвер всегда читает ответ после выполнения, потому и не столкнулись с этим кейсом
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / нужна помощь: op_fetch_response & op_response
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]