Thats definitely a problem. I've filed issue 593<http://code.google.com/p/hypertable/issues/detail?id=593> and attached the following patch which should fix this problem. Let me know if it works for you.
-Sanjit On Mon, Mar 28, 2011 at 12:30 PM, Naveen Koorakula <[email protected]>wrote: > Hi Sanjit, > > Working purely with the Future + Result apis doesn't help either. In this > case, Future->get() gives a Result object back, which has an api for > get_cells(Cells). Trying to use this causes the same assert to be triggered. > > --Naveen > founder & ceo, campfire labs. 415 425 5412. We're hiring! > http://www.campfirelabs.com/jobs > > > On Mon, Mar 28, 2011 at 9:46 AM, Sanjit Jhala <[email protected]> wrote: > >> Hi Naveen, >> >> Take a look at the Future API (src/cc/Hypertable/Lib/Future.h) to see how >> it implements the ResultCallback class. It does check for errors, end of >> scan, whether the scan has been cancelled etc. In fact you might want to >> directly use or derive from the Future API instead of implementing your own >> callback from scratch. One caveat is that if you are going to destroy >> asynchronous scanners before the scan finishes, you must call the cancel >> method on the Future object to avoid a deadlock. An example can be found >> in src/cc/Hypertable/Lib/tests/future_abrupt_end_test.cc . >> >> -Sanjit >> >> >> On Sun, Mar 27, 2011 at 10:12 AM, Doug Judd <[email protected]> wrote: >> >>> Hi Naveen, >>> >>> Thanks for the report. We'll look into it on Monday. >>> >>> - Doug >>> >>> >>> On Sat, Mar 26, 2011 at 9:02 PM, Naveen Koorakula < >>> [email protected]> wrote: >>> >>>> Hi guys, >>>> >>>> Just deployed 0.9.5.0.pre with hypernode (our hypertable nodejs >>>> binding), which uses the new C++ async scanner api. I'm seeing an error on >>>> an async read. >>>> >>>> The error looks like: >>>> /usr/local/include/boost/smart_ptr/intrusive_ptr.hpp:166: T* >>>> boost::intrusive_ptr<T>::operator->() const [with T = >>>> Hypertable::CellsBuilder]: Assertion `px != 0' failed. >>>> >>>> This traces back to a class I defined in the binding, that derives from >>>> ResultCallback. >>>> >>>> class ScanCallback: public Hypertable::ResultCallback { >>>> public: >>>> ScanCallback() : m_cells(8) {} >>>> virtual ~ScanCallback() {} >>>> >>>> void >>>> scan_ok (TableScannerAsync *scanner, ScanCellsPtr &cells) { >>>> ScopedLock lock(mutex); >>>> Cells cc; >>>> => cells->get(cc); >>>> for (Hypertable::Cells::iterator ci = cc.begin(), >>>> cend = cc.end(); ci != cend; ci++) { >>>> m_cells.add(*ci); >>>> } >>>> } >>>> ... >>>> } >>>> >>>> The error is happening at the [ cells->get(cc) ] call marked in the code >>>> fragment above. >>>> >>>> The backtrace looks like: >>>> (gdb) bt >>>> #0 0x00007ffff64e3ba5 in raise () from /lib/libc.so.6 >>>> #1 0x00007ffff64e76b0 in abort () from /lib/libc.so.6 >>>> #2 0x00007ffff64dca71 in __assert_fail () from /lib/libc.so.6 >>>> #3 0x00007fffd1b6a3eb in >>>> boost::intrusive_ptr<Hypertable::CellsBuilder>::operator-> (this=0xcaf608) >>>> at /usr/local/include/boost/smart_ptr/intrusive_ptr.hpp:166 >>>> #4 0x00007fffd1b630ca in Hypertable::ScanCells::get (this=0xcaf5a0, >>>> cells=...) at /a/hypertable/current/include/Hypertable/Lib/ScanCells.h:50 >>>> #5 0x00007fffd1b650ac in HyperConn::ScanCallback::scan_ok >>>> (this=0xcede80, scanner=0xc2fb00, cells=...) at ../binding.cc:70 >>>> #6 0x00007fffd186d6d8 in >>>> Hypertable::TableScannerAsync::maybe_callback_ok (this=0xc2fb00, >>>> scanner_id=<value optimized out>, next=<value optimized out>, >>>> do_callback=255, cells=...) at /home/developer/s\ >>>> rc/hypertable/src/cc/Hypertable/Lib/TableScannerAsync.cc:334 >>>> #7 0x00007fffd1871b9a in Hypertable::TableScannerAsync::handle_result >>>> (this=0xc2fb00, scanner_id=0, event=<value optimized out>, is_create=<value >>>> optimized out>) at /home/developer/src/hypertable/src/\ >>>> cc/Hypertable/Lib/TableScannerAsync.cc:267 >>>> #8 0x00007fffd18753b4 in Hypertable::TableScannerHandler::run >>>> (this=0xcac410) at >>>> /home/developer/src/hypertable/src/cc/Hypertable/Lib/TableScannerHandler.cc:40 >>>> #9 0x00007fffd173bfab in operator() (this=0xc96890) at >>>> /home/developer/src/hypertable/src/cc/AsyncComm/ApplicationQueue.h:154 >>>> #10 >>>> boost::detail::thread_data<Hypertable::ApplicationQueue::Worker>::run >>>> (this=0xc96890) at /usr/local/include/boost/thread/detail/thread.hpp:56 >>>> #11 0x00007fffcf33cb70 in thread_proxy () from >>>> /a/hypertable/current/lib/libboost_thread.so.1.40.0 >>>> #12 0x00007ffff683a971 in start_thread () from /lib/libpthread.so.0 >>>> #13 0x00007ffff659692d in clone () from /lib/libc.so.6 >>>> #14 0x0000000000000000 in ?? () >>>> >>>> >>>> Tracing it back, it is happening in Hypertable/Lib/ScanCells.h:50 >>>> >>>> void ScanCells::get(Cells &cells) { m_cells->get(cells); } >>>> >>>> The value contained by the intrusive_ptr m_cells is null at this point. >>>> >>>> (gdb) >>>> #4 0x00007fffd1b630ca in Hypertable::ScanCells::get (this=0xcaf5a0, >>>> cells=...) at /a/hypertable/current/include/Hypertable/Lib/ScanCells.h:50 >>>> (gdb) p m_cells >>>> $1 = {px = 0x0} >>>> >>>> >>>> ---- >>>> >>>> So my question is: what does >>>> >>>> ResultCallback::scan_ok(TableScannerAsync *scanner, ScanCellsPtr >>>> &cells) >>>> >>>> indicate ? Are there any checks that need to be done before we can >>>> attempt to read off the cells contained in the ScanCellsPtr &cells ? >>>> Couldn't find anything obvious in code, hence asking.. >>>> >>>> TIA, >>>> --Naveen >>>> founder & ceo, campfire labs. 415 425 5412. We're hiring! >>>> http://www.campfirelabs.com/jobs >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Hypertable Development" group. >>>> To post to this group, send email to [email protected]. >>>> To unsubscribe from this group, send email to >>>> [email protected]. >>>> For more options, visit this group at >>>> http://groups.google.com/group/hypertable-dev?hl=en. >>>> >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "Hypertable Development" group. >>> To post to this group, send email to [email protected]. >>> To unsubscribe from this group, send email to >>> [email protected]. >>> For more options, visit this group at >>> http://groups.google.com/group/hypertable-dev?hl=en. >>> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Hypertable Development" group. >> To post to this group, send email to [email protected]. >> To unsubscribe from this group, send email to >> [email protected]. >> For more options, visit this group at >> http://groups.google.com/group/hypertable-dev?hl=en. >> > > -- You received this message because you are subscribed to the Google Groups "Hypertable Development" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/hypertable-dev?hl=en.
ScanCells.patch
Description: Binary data
