Theres a minor bug in that patch. I'm working on a more comprehensive patch which augments the regression tests to test for this scenario. I'm running the tests now, and should have it ready soon.
-Sanjit On Mon, Mar 28, 2011 at 2:27 PM, Naveen Koorakula <[email protected]>wrote: > Thanks Sanjit. Will try out the patch and let you know how it goes. > > --Naveen > founder & ceo, campfire labs. 415 425 5412. We're hiring! > http://www.campfirelabs.com/jobs > > > On Mon, Mar 28, 2011 at 12:47 PM, Sanjit Jhala <[email protected]> wrote: > >> 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.
