powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Deadlock при выпонении select
16 сообщений из 16, страница 1 из 1
Deadlock при выпонении select
    #39409809
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прислали лог самодельного репликатора (на самом деле это не просто репликатор, а целый сервер, также обслуживает центральную базу, координирует базы "филиалов", и т.п.). Сказали, что ночью случилась ошибка которую никогда до этого не видели и данные перестали поступать из "филиалов". По логу удалось восстановить следующее:

1. Ночью запустился ежесуточный перерасчёт статистики индексов.
2. При пересчёте статистики индекса таблицы A, который автоматом создаётся для PK произошёл дэдлок. Транзакция откатилась.
3. Параллельно с этим при select-е из таблицы А произошёл дэдлок. Транзакция откатилась.
4. Теперь при любом select-е к таблице А происходит дэдлок. Причём это проявляется не только в репликаторе, но на всех клиентах, которые работают с центральной базой.

Как вообще такое могло произойти? У меня в голове дедлок вообще никак не вяжется с select.
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39409815
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenТеперь при любом select-е к таблице А происходит дэдлок.Вот так вот - пустой дедлок, без подробностей ? Он обычно не ходит один
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39409843
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению, подробностей нету. Ибо:
[02:27:07] (tr4788) INDEX_STAT/ERROR: Error text = deadlock
can't format message 13:87 -- message file D:\firebird.msg not found, error code = -913

[02:27:09] (tr2864) SERVER/ERROR: Exception during processing of incoming data: deadlock
can't format message 13:87 -- message file D:\firebird.msg not found


:(

Мой косяк. Зачем я fbclient.dll в дистрибутив засунул... Так что из подробностей, только наличие факта дэдока + тексты sql запросов, которые вызвали ошибки.
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39409847
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И кстати, почему нельзя сделать так, чтобы даже без firebird.msg текст ошибки был более осмысленным?
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39409851
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenИ кстати, почему нельзя сделать так, чтобы даже без firebird.msg текст ошибки был более осмысленным?Каким образом ? Придумать его ?

13:87 - это сообщение SQLERR, не самого движка. Означает deadlock.
Возможный твой косяк в том, что нужно весь статус парсить, или ты так и делаешь ?
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39409858
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Смутно понимаю, что имеется ввиду. В самописной либе для работы с FB исключения генерируются таким образом:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
static void check_status_vector(
	FbClient          &client,
	const ISC_STATUS  *status_vect,
	ErrorStatus       error_status,
	const std::string *sql = nullptr)
{
	if (is_status_vector_ok(status_vect)) return;

	char fb_msg[1024] = { 0 };
	const ISC_STATUS *status_vector_to_call = status_vect;
	client.fb_interpret(fb_msg, sizeof(fb_msg), &status_vector_to_call);

	ISC_LONG sql_code = client.isc_sqlcode(status_vect);
	char sql_msg[2048] = { 0 };
	client.isc_sql_interprete((ISC_SHORT)sql_code, sql_msg, sizeof(sql_msg));

	std::string whole_error_text;
	whole_error_text.append(fb_msg);
	whole_error_text.append("\n");
	whole_error_text.append(sql_msg);

	if ((error_status != ErrorStatus::Sql) && sql)
	{
		whole_error_text.append("\nsql=\n");
		whole_error_text.append(*sql);
	}

	switch (error_status)
	{
	case ErrorStatus::Internal:
		throw InternalException(whole_error_text, sql_code, -1);
		break;

	case ErrorStatus::Transaction:
		throw TransactionException(whole_error_text, sql_code, -1);
		break;

	case ErrorStatus::Sql:
		if (sql)
			throw SqlException(whole_error_text, *sql, sql_code, -1);
		else
			throw Exception(whole_error_text, sql_code, -1);
		break;

	case ErrorStatus::Normal:
	default:
		throw Exception(whole_error_text, sql_code, -1);
		break;
	}
}
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39409860
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen,

fb_interpret нужно вызывать в цикле, пока он не вернёт нулл.
Ты читаешь только первый код ошибки в статусе.
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39409864
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hvlad,

Это исправлю. Что насчёт deadlock? Есть идеи насчёт того, почему он мог там возникнуть?
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39409867
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen,

что-то пошло не так при обновлении статистики и повлияло на кеш метаданных.
Это только предположение.
После полного дисконнекта это должно пройти.
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39409872
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, после того, как репликатор остановили, select от других клиентов стал проходить без ошибок.

По поводу вытаскивания текста ошибки так нормально:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	std::string whole_error_text;

	char fb_msg[1024] = { 0 };
	const ISC_STATUS *status_vector_to_call = status_vect;

	for (;;)
	{
		client.fb_interpret(fb_msg, sizeof(fb_msg), &status_vector_to_call);
		whole_error_text.append(fb_msg);
		whole_error_text.append("\n");
		if (!status_vector_to_call) break;
	}


?
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39409876
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenтак нормально
Нет. Условие выхода из цикла неправильное.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39409877
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenПо поводу вытаскивания текста ошибки так нормально:Вроде да

Укажи точную версию FB
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39409911
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
А как правильно?

hvlad,
Версию запрошу. Я этот проект давно уже не поддерживаю. Со мной связались только потому, что основной разработчик ночью на телефонные звонки не отвечал :)
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39409932
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDenА как правильно?
Код: plaintext
1.
2.
3.
4.
5.
while (client.fb_interpret(fb_msg, sizeof(fb_msg), &status_vector_to_call))
{
	whole_error_text.append(fb_msg);
	whole_error_text.append("\n");
}


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39411640
ArtDen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запросил версию сервера. Ответили
2.5.4.26856_0_Win32
Почему Win32 не спрашивайте. Не знаю. При мне туда ставили 64-битный вариант SS + добавили кучу памяти на сервер (ну и FB настроили на бОльшую производительность, т.к. база ожидалась огромной). Видимо успели переустановить :)
...
Рейтинг: 0 / 0
Deadlock при выпонении select
    #39411702
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtDen,

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


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