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.

Attachment: ScanCells.patch
Description: Binary data

Reply via email to