Сервер 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;
}
CREATE TABLE и утечка памяти
Re: CREATE TABLE и утечка памяти
Очистить код от ненужных подробностей (мьютексы и прочего) и запостить в трекер.
Лучше, если удастся воспроизвести просто скриптом с isql.
Сразу скажу - приоритет будет не высоким, но исправить всё равно нужно (если есть что исправлять).
Лучше, если удастся воспроизвести просто скриптом с isql.
Сразу скажу - приоритет будет не высоким, но исправить всё равно нужно (если есть что исправлять).
Re: CREATE TABLE и утечка памяти
и проверять не на 2.5.0, а на 2.5.1 или последнем снапшоте 2.5.2.