Address shutdown issues when SimpleIndex::SimpleIndex() throws.
See comments in SimpleIndex::StopIndex() and BlockingQueue<T>::~BlockingQueue().
SimpleIndex::StopIndex() asserts because the index has been started. BlockingQueue<T>::~BlockingQueue() asserts because the queue is not yet in shutdown mode and hasn't finished shutting down.
I've added a call stack for a repro. In this case, SimpleIndex::ConfigureForServing() attempts to load a non-existant ShardDefinition.csv file. This causes an exception which eventually causes Environment to be destroyed before being fully constructed, which causes the ThreadManager to be destructed before starting, which causes std::thread::~thread() to call abort.
BitFunnel.exe!issue_debug_notification(const wchar_t * const message) Line 125 C++
BitFunnel.exe!__acrt_report_runtime_error(const wchar_t * message) Line 142 C++
BitFunnel.exe!abort() Line 61 C++
BitFunnel.exe!terminate() Line 59 C++
BitFunnel.exe!std::thread::~thread() Line 58 C++
BitFunnel.exe!std::thread::`scalar deleting destructor'(unsigned int) C++
BitFunnel.exe!std::allocator<std::thread>::destroy<std::thread>(std::thread * _Ptr) Line 745 C++
BitFunnel.exe!std::allocator_traitsstd::allocator<std::thread >::destroystd::thread(std::allocatorstd::thread & _Al, std::thread * _Ptr) Line 865 C++ BitFunnel.exe!std::_Wrap_allocstd::allocator<std::thread >::destroystd::thread(std::thread * _Ptr) Line 1004 C++ BitFunnel.exe!std::_Destroy_range1std::allocator<std::thread,std::thread * __ptr64>(std::thread * _First, std::thread * _Last, std::_Wrap_allocstd::allocator<std::thread > & _Al, std::integral_constant<bool,0> __formal) Line 1101 C++ BitFunnel.exe!std::_Destroy_rangestd::allocator<std::thread,std::thread * __ptr64>(std::thread * _First, std::thread * _Last, std::_Wrap_allocstd::allocator<std::thread > & _Al) Line 1121 C++ BitFunnel.exe!std::vectorstd::thread,std::allocator<std::thread >::_Destroy(std::thread * _First, std::thread * _Last) Line 1582 C++ BitFunnel.exe!std::vectorstd::thread,std::allocator<std::thread >::_Tidy() Line 1641 C++ BitFunnel.exe!std::vectorstd::thread,std::allocator<std::thread >::~vectorstd::thread,std::allocator<std::thread >() Line 976 C++ BitFunnel.exe!BitFunnel::ThreadManager::~ThreadManager() Line 51 C++ BitFunnel.exe!BitFunnel::ThreadManager::
scalar deleting destructor'(unsigned int) C++ BitFunnel.exe!std::default_delete<BitFunnel::IThreadManager>::operator()(BitFunnel::IThreadManager * _Ptr) Line 1195 C++ BitFunnel.exe!std::unique_ptr<BitFunnel::IThreadManager,std::default_delete<BitFunnel::IThreadManager> >::~unique_ptr<BitFunnel::IThreadManager,std::default_delete<BitFunnel::IThreadManager> >() Line 1398 C++ BitFunnel.exe!BitFunnel::TaskPool::~TaskPool() C++ BitFunnel.exe!BitFunnel::TaskPool::scalar deleting destructor'(unsigned int) C++ BitFunnel.exe!std::default_deleteBitFunnel::TaskPool::operator()(BitFunnel::TaskPool * _Ptr) Line 1195 C++ BitFunnel.exe!std::unique_ptrBitFunnel::TaskPool,std::default_delete<BitFunnel::TaskPool >::~unique_ptrBitFunnel::TaskPool,std::default_delete<BitFunnel::TaskPool >() Line 1398 C++ BitFunnel.exe!BitFunnel::Environment::Environment'::1'::dtor$4() C++ BitFunnel.exe!_CallSettingFrame() Line 50 Unknown BitFunnel.exe!__FrameUnwindToState(unsigned __int64 * pRN, _xDISPATCHER_CONTEXT * pDC, const _s_FuncInfo * pFuncInfo, int targetState) Line 1119 C++ BitFunnel.exe!__FrameUnwindToEmptyState(unsigned __int64 * pRN, _xDISPATCHER_CONTEXT * pDC, const _s_FuncInfo * pFuncInfo) Line 149 C++ BitFunnel.exe!__InternalCxxFrameHandler(EHExceptionRecord * pExcept, unsigned __int64 * pRN, _CONTEXT * pContext, _xDISPATCHER_CONTEXT * pDC, const _s_FuncInfo * pFuncInfo, int CatchDepth, unsigned __int64 * pMarkerRN, unsigned char recursive) Line 396 C++ BitFunnel.exe!__CxxFrameHandler3(EHExceptionRecord * pExcept, unsigned __int64 RN, _CONTEXT * pContext, _xDISPATCHER_CONTEXT * pDC) Line 184 C++ ntdll.dll!00007fff639599ad() Unknown ntdll.dll!00007fff638f906a() Unknown BitFunnel.exe!_UnwindNestedFrames(unsigned __int64 * pFrame, EHExceptionRecord * pExcept, _CONTEXT * pContext, unsigned __int64 * pEstablisher, void * Handler, int TargetUnwindState, const _s_FuncInfo * pFuncInfo, _xDISPATCHER_CONTEXT * pDC, unsigned char recursive) Line 481 C++ BitFunnel.exe!CatchIt(EHExceptionRecord * pExcept, unsigned __int64 * pRN, _CONTEXT * pContext, _xDISPATCHER_CONTEXT * pDC, const _s_FuncInfo * pFuncInfo, const _s_HandlerType * pCatch, const _s_CatchableType * pConv, const _s_TryBlockMapEntry * pEntry, int CatchDepth, unsigned __int64 * pMarkerRN, unsigned char IsRethrow, unsigned char recursive) Line 1268 C++ BitFunnel.exe!FindHandler(EHExceptionRecord * pExcept, unsigned __int64 * pRN, _CONTEXT * pContext, _xDISPATCHER_CONTEXT * pDC, const _s_FuncInfo * pFuncInfo, unsigned char recursive, int CatchDepth, unsigned __int64 * pMarkerRN) Line 694 C++ BitFunnel.exe!__InternalCxxFrameHandler(EHExceptionRecord * pExcept, unsigned __int64 * pRN, _CONTEXT * pContext, _xDISPATCHER_CONTEXT * pDC, const _s_FuncInfo * pFuncInfo, int CatchDepth, unsigned __int64 * pMarkerRN, unsigned char recursive) Line 449 C++ BitFunnel.exe!__CxxFrameHandler3(EHExceptionRecord * pExcept, unsigned __int64 RN, _CONTEXT * pContext, _xDISPATCHER_CONTEXT * pDC) Line 184 C++ BitFunnel.exe!__GSHandlerCheck_EH(_EXCEPTION_RECORD * ExceptionRecord, void * EstablisherFrame, _CONTEXT * ContextRecord, _DISPATCHER_CONTEXT * DispatcherContext) Line 101 C ntdll.dll!00007fff6395992d() Unknown ntdll.dll!00007fff638f86d3() Unknown ntdll.dll!00007fff63958a4a() Unknown KernelBase.dll!00007fff606b7788() Unknown BitFunnel.exe!_CxxThrowException(void * pExceptionObject, const _s__ThrowInfo * pThrowInfo) Line 136 C++ BitFunnel.exe!BitFunnel::FileSystem::OpenForRead(const char * filename, int mode) Line 82 C++ BitFunnel.exe!BitFunnel::ParameterizedFile::OpenForRead(const std::basic_string<char,std::char_traits,std::allocator > & filename) Line 83 C++ BitFunnel.exe!BitFunnel::ParameterizedFile0::OpenForRead() Line 156 C++ BitFunnel.exe!BitFunnel::FileDescriptor0::OpenForRead() Line 180 C++ BitFunnel.exe!BitFunnel::SimpleIndex::ConfigureForServing(const char * directory, unsigned __int64 gramSize, bool generateTermToText) Line 265 C++ BitFunnel.exe!BitFunnel::Environment::Environment(BitFunnel::IFileSystem & fileSystem, const char * directory, unsigned __int64 gramSize, unsigned __int64 threadCount) Line 63 C++ BitFunnel.exe!BitFunnel::REPL::Go(std::basic_istream<char,std::char_traits > & input, std::basic_ostream<char,std::char_traits > & output, const char * directory, unsigned __int64 gramSize, unsigned __int64 threadCount, const char * scriptFile) Line 149 C++ BitFunnel.exe!BitFunnel::REPL::Main(std::basic_istream<char,std::char_traits > & input, std::basic_ostream<char,std::char_traits > & output, int argc, const char * * argv) Line 97 C++ BitFunnel.exe!BitFunnel::BitFunnelTool::Main(std::basic_istream<char,std::char_traits > & input, std::basic_ostream<char,std::char_traits > & output, int argc, const char * * argv) Line 73 C++ BitFunnel.exe!main(int argc, char * * argv) Line 35 C++ BitFunnel.exe!invoke_main() Line 65 C++ BitFunnel.exe!__scrt_common_main_seh() Line 253 C++ BitFunnel.exe!__scrt_common_main() Line 296 C++ BitFunnel.exe!mainCRTStartup() Line 17 C++ kernel32.dll!00007fff63708364() Unknown ntdll.dll!00007fff63915e91() Unknown
Another repro is to start "BitFunnel repl" with a bad "-script" parameter. At present, the most recent commit is 8fffca468b57d8fd949061ebb4f95d188f2e1da2.