I agree.. :-)

Wish Java had something like a ReadOnlyIterator or ImmutableIterator, so users 
could immediately understand that one can't use the iterator to modify the 
iterable.

-jp


-----Original Message-----
From: Jonathan Gray [mailto:[email protected]] 
Sent: Thursday, March 25, 2010 9:45 AM
To: [email protected]
Subject: RE: Is it safe to delete a row inside a scanner loop?

Good thing it throws that exception.  It definitely would not perform any 
server-side actions as Ryan said.

> -----Original Message-----
> From: Jeyendran Balakrishnan [mailto:[email protected]]
> Sent: Thursday, March 25, 2010 9:34 AM
> To: [email protected]
> Subject: RE: Is it safe to delete a row inside a scanner loop?
> 
> Thanks a lot, Ryan.
> 
> In my application, I just need to delete a row after it is returned to
> my client code via Scanner.next(), so thankfully I don't have to worry
> about later rows in the scanner's cache.
> 
> Also, I noticed that HTable.ClientScanner.iterator returns an
> Iterator<RowResult> that returns UnsupportedOperationException for the
> Iterator.remove() method, so I guess this approach is not feasible
> currently.
> I'll use HTable.deleteAll(rowResult.getRow()) instead.
> 
> -jp
> 
> 
> -----Original Message-----
> From: Ryan Rawson [mailto:[email protected]]
> Sent: Thursday, March 25, 2010 12:44 AM
> To: [email protected]
> Subject: Re: Is it safe to delete a row inside a scanner loop?
> 
> You'll see the rows then.  If this is a serious requirement, you might
> have to set scanner caching = 1 or do something else client side in
> your own app code.
> 
> -ryan
> 
> On Thu, Mar 25, 2010 at 12:40 AM, Angus He <[email protected]> wrote:
> > Hi Ryan,
> >
> > What if the rows to be deleted have been already in the client
> scanner cache?
> >
> >
> >
> > On Thu, Mar 25, 2010 at 2:07 PM, Ryan Rawson <[email protected]>
> wrote:
> >> Hey,
> >>
> >> I'm pretty sure that Iterator.remove() will be local only and not
> >> actually affect HBase.
> >>
> >> But yes it is safe.  If you delete a row you just scanned, since the
> >> scanner will be past the row in question, thus it is safe to delete
> >> it.  And even if you deleted a row you were just about to see, you'd
> >> just end up skipping that row.
> >>
> >> -ryan
> >>
> >> On Wed, Mar 24, 2010 at 10:12 AM, Jeyendran Balakrishnan
> >> <[email protected]> wrote:
> >>> Hi,
> >>>
> >>> I am running a scanner on a HBase table.
> >>> After getting each row, and using the data, I want to delete the
> row.
> >>> Is it safe to do so from inside the scanner loop?
> >>>
> >>> And if so, what is the best way to delete the row?:
> >>> * Using HTable.deleteAll()
> >>> or
> >>> * Using Iterator.remove()
> >>>
> >>> My use case is something like this [I am using HBase 19.3, please
> don't
> >>> kill me :-)]:
> >>>
> >>> HTable table = ...;
> >>> Scanner scanner = table.getScanner(...);
> >>>
> >>> try
> >>> {
> >>>        Iterable<RowResult> I = scanner.iterator();
> >>>        while (I.hasNext())
> >>>        {
> >>>                RowResult result = I.next();
> >>>
> >>>                //      Do something with result:
> >>>                // ....
> >>>
> >>>                //      Now delete the row
> >>>
> >>>                //      HTable approach
> >>>                byte[] rowKeyBytes = result.getRow();
> >>>                table.deleteAll(rowKeyBytes);
> >>>
> >>>                //      OR Iterator.remove() approach:
> >>>                //I.remove();
> >>>        }
> >>> }
> >>> finally
> >>> {
> >>>        if (scanner != null)
> >>>                scanner.close();
> >>> }
> >>>
> >>> Thanks a lot,
> >>> jp
> >>>
> >>>
> >>
> >
> >
> >
> > --
> > Regards
> > Angus
> >

Reply via email to