-
Notifications
You must be signed in to change notification settings - Fork 42
Description
Using msnodesqlv8 v5.1.3 with sqlserver2022
Super sporadically my application crashes with Unhandled exception thrown: read access violation. this->statements_._Mypair._Myval2._Myval2._Myhead->_Parent was 0xFFFFFFFFFFFFFFE6.
The call stack is
[Inline Frame] sqlserver.node!std::_Tree<std::_Tmap_traits<int,std::shared_ptrmssql::IOdbcStatement,std::less,std::allocator<std::pair<int const ,std::shared_ptrmssql::IOdbcStatement>>,0>>::_Eqrange(const int &) Line 1713
[Inline Frame] sqlserver.node!std::_Tree<std::_Tmap_traits<int,std::shared_ptrmssql::IOdbcStatement,std::less,std::allocator<std::pair<int const ,std::shared_ptrmssql::IOdbcStatement>>,0>>::erase(const int &) Line 1358
sqlserver.node!mssql::OdbcStatementFactory::RemoveStatement(int statementId) Line 54
sqlserver.node!mssql::OdbcConnection::RemoveStatement(int statementId) Line 246
sqlserver.node!mssql::ReleaseWorker::Execute() Line 23
sqlserver.node!Napi::AsyncWorker::OnExecute(Napi::Env __formal) Line 5544
.exe!node::ThreadPoolWork::ScheduleWork::__l2::<lambda_1>::operator()(uv_work_s * req) Line 45
.exe!worker(void * arg) Line 125
.exe!uv__thread_start(void * arg) Line 91
.exe!thread_start<unsigned int (__cdecl*)(void *),1>(void * const parameter) Line 97
kernel32.dll!BaseThreadInitThunk()
ntdll.dll!RtlUserThreadStart()
connectionId_ is 99
statementId is 1
the client code looks like this:
async querySingle(db){
var queryPromise = new Promise((resolve, reject) => {
sql.open(createConnectionString(db), (err, conn) => {
if (err) {
...
} else {
var pm = conn.procedureMgr();
pm.setTimeout(timeout);
pm.getProc(queryName, (err, procedure) => {
if(err) {
conn.close(() => {...});
} else {
var query = procedure.call(args);
query.on('done', () => {
conn.close(() => {...});
});
query.on('error', err => {
conn.close(() => {...});
});
query.on('info', i => {...});
query.on('meta', meta => {...});
query.on('column', (index, data) => {...});
query.on('row', index => {...});
query.on('free', () => {...});
}
}
});
});
return queryPromise;
}
const dbInfos = ["nodedb", "node1db", "node2db", "node3db"];
const results = await Promise.all(dbInfos.map(entry => querySingle(entry)));I couldn't create a simple example which can reproduce the issue or threading. By debugging the code it looks like that it crashes after the callback function of the conn.close was called.
I set up the logging in my client application. It generated 40MB logs so i cut out the part from the connection with id 99 was created until the crash happened in time.