CREATE TABLE и утечка памяти

Access Violation, некорректное выполнение запросов или вызовов API, ошибки утилит командной строки, в общем все, что вам мешает работать

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

Ответить
Frattello
Сообщения: 10
Зарегистрирован: 31 авг 2012, 06:12

CREATE TABLE и утечка памяти

Сообщение Frattello » 07 сен 2012, 10:55

Сервер Classic 2.5.0
ОС Windows 2008 R2

Один нуб написал код, в котором выполняется запрос создания таблицы в цикле (кроме собственно записи данных в эту таблицу, перестраховался хехе)
Код создания таблицы приведен внизу. Разумеется каждую итерацию цикла возникала ошибка "Unsuccessful metadata update, table already exists".
Но важно другое, каждую итерацию на стороне сервера утекало ~40-80 Kb памяти. Были проверены различные таблицы администрирования, все транзакции, стэйтменты работают отлично, память накапливается в контексте Attachment (или session, кому как удобнее). Проблема некритическая, но некрасивая :) Есть ли у кого нибудь мысли по данному вопросу?

В коде ошибка "таблица уже существует" обрабатывается отдельно от других. Вне зависимости от того, что я там делают Commit, Commit_Retaining, Rollback или ничего, память все равно утекает.

int FBSession::DBNewTable(AnsiString TableName, char* TableParams)
{
AnsiString temp;

temp = "CREATE TABLE " + TableName + " " + AnsiString(TableParams);

DWORD dwWaitResult;

if(hDB==NULL)
if(DBConnect())
return -256;

dwWaitResult = WaitForSingleObject(hMutex, 5000L); // 5 секунд на таймаут освобождения мьютекса
if (dwWaitResult == WAIT_TIMEOUT) // Таймаут. Мьютекс за это время не освободился.
{this->WriteLOG("DBExecuteNoParamsSQL Mutex timed out"); return -255;}

if(hOutTransaction==NULL)
if(isc_start_transaction(status, &this->hOutTransaction, 1, &hDB, 0, NULL))
{EmergencyExit(NULL,NULL);return -254;}

if (isc_dsql_execute_immediate(status, &hDB, &hOutTransaction, 0, temp.c_str(), 1, NULL))
{
if(status[1]!=335544351) // ошибка "таблица уже существует" некритическая
{EmergencyExit(&hOutTransaction,NULL);return -1;}
else
{
ISC_STATUS_ARRAY temp_status;
if(hOutTransaction!=NULL)
{isc_commit_transaction(temp_status, &hOutTransaction);hOutTransaction = NULL;}
ReleaseMutex(hMutex); // Освобождаем мьютекс.
return 0;
}
}

this->UncommittedTransactions++;
AutoCommitTimer->Enabled=false;
AutoCommitTimer->Enabled=true;

ReleaseMutex(hMutex); // Освобождаем мьютекс.

if(this->UncommittedTransactions>this->MaxUncommittedOutTransactions)
if(CommitRetainingOutTransaction(NULL))
return -2;

return 0;
}

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

Re: CREATE TABLE и утечка памяти

Сообщение hvlad » 07 сен 2012, 12:52

Очистить код от ненужных подробностей (мьютексы и прочего) и запостить в трекер.
Лучше, если удастся воспроизвести просто скриптом с isql.
Сразу скажу - приоритет будет не высоким, но исправить всё равно нужно (если есть что исправлять).

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

Re: CREATE TABLE и утечка памяти

Сообщение kdv » 07 сен 2012, 14:39

и проверять не на 2.5.0, а на 2.5.1 или последнем снапшоте 2.5.2.

Ответить