[ 
https://issues.apache.org/jira/browse/HBASE-15965?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15358223#comment-15358223
 ] 

Junegunn Choi commented on HBASE-15965:
---------------------------------------

[~Appy]
I was reminded of the same xkcd strip when I first ran into this :)

bq. You should be able to get the return value using -n (non-interactive) flag.

Yes, but it's quite useful to be able to *incrementally explore* the data 
interactively on the REPL. Internally, we've been using a customized version of 
the shell with a few extra commands that allow us to explore the status of the 
cluster without having to write verbose Java code with Admin API. One such 
command is {{regions}}, and this is an example of what we do when things happen.

{code}
# See the number of regions
regions.count

# See the number of regions whose localities are below 50%
regions.select { |r| r[:locality] < 50 }

# Pretty-print those regions grouped by their tables
require 'pp'
pp regions.select { |r| r[:locality] < 50 }.group_by { |r| r[:table] }

# Flush and major compact regions that match the criteria
regions.select { |r| r[:locality] < 50 && r[:files] > 2 }.each { |r| flush 
r[:name]; major_compact r[:name] }
{code}

If I had to use {{-n}} flag, I'll have to re-run hbase shell multiple times. 
There's nothing wrong with harnessing the power of REPL.

bq. Changing return value to contain more information will break someone else's 
workflow

Yes, the concern led me to the idea of introducing new commands instead of 
changing the return values of the existing ones.

bq. That approach requires duplicating classes and we over 100 commands

I think we have a misunderstanding here. I was not suggesting that we should 
replicate every one of the commands, but to add just a handful of new ones 
(tables, snapshots, regions, servers, etc.) under a new command group named 
something like QUERY or INSPECTION whose members are supposed to return values 
with clear semantics. They aren't for side-effects, they are not responsible 
for formatting and printing the output, they should just return values that can 
be used by the user programmatically even in "interactive" mode. I don't 
disagree with suppressing the return values of the commands in other groups for 
cleaner output, but the commands in this group are solely for their return 
values, so we make an exception. What do you think?

> Shell test changes. Use @shell.command instead directly calling functions in 
> admin.rb and other libraries.
> ----------------------------------------------------------------------------------------------------------
>
>                 Key: HBASE-15965
>                 URL: https://issues.apache.org/jira/browse/HBASE-15965
>             Project: HBase
>          Issue Type: Bug
>            Reporter: Appy
>            Assignee: Appy
>             Fix For: 2.0.0
>
>         Attachments: HBASE-15965.master.001.patch, 
> HBASE-15965.master.002.patch, HBASE-15965.master.003.patch
>
>
> Testing by executing a command will cover the exact path users will trigger, 
> so its better then directly calling library functions in tests. Changing the 
> tests to use @shell.command(:<command>, args) to execute them like it's a 
> command coming from shell.
> Norm change:
> Commands should print the output user would like to see, but in the end, 
> should also return the relevant value. This way:
> - Tests can use returned value to check that functionality works
> - Tests can capture stdout to assert particular kind of output user should 
> see.
> - We do not print the return value in interactive mode and keep the output 
> clean. See Shell.command() function.
> Bugs found due to this change:
> - Uncovered bug in major_compact.rb with this approach. It was calling 
> admin.majorCompact() which doesn't exist but our tests didn't catch it since 
> they directly tested admin.major_compact()
> - Enabled TestReplicationShell. If it's bad, flaky infra will take care of it.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to