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.

Reply via email to