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

Sakthi commented on HBASE-21225:
--------------------------------

My observation:
{code:java}
    ....
    QuotaSettings newQuota = QuotaSettings.buildFromProto(req);
    GlobalQuotaSettingsImpl mergedQuota = currentQuota.merge(newQuota);
    if (mergedQuota == null) {
      quotaOps.delete();
    } else {
      quotaOps.update(mergedQuota);
    }
    ....
{code}
The way to delete a quota is merging the new "delete" quota request with 
whatever the current quotasettings the entity has and creating a new 
GlobalQuotaSettingsImpl. While writing out data to the hbase:quota, 
GlobalQuotaSettingsImpl.toQuotas() is called to create a Quotas object which is 
converted to a byte array to update in the hbase:quota. 

 

Few ways to handle the situation:
 * As the "mergedQuota" is of type GlobalQuotaSettingsImpl and it's constructor 
takes in Throttle.Builder & SpaceQuota.Builder as parameter, we can pass in 
null values to both these parameters as and when required (whenever "remove" is 
set?)
 * Or, pass remove objects(i.e. spaceBuilder with only remove set to true) to 
the constructor
 ## In the constructor of GlobalQuotaSettingsImpl, we can handle as to not set 
"QuotaProtos.SpaceQuota spaceProto"data member, if "remove" objects are passed.
 ## Or, let the GlobalQuotaSettingsImpl be initialized with those objects. We 
can later handle the case when we are trying to write out the data using 
GlobalQuotaSettingsImpl.toQuotas().
{code:java}
  protected Quotas toQuotas() {
    QuotaProtos.Quotas.Builder builder = QuotaProtos.Quotas.newBuilder();
    if (getThrottleProto() != null) {
      builder.setThrottle(getThrottleProto());
    }
    ....
    if (getSpaceProto() != null) {
      builder.setSpace(getSpaceProto());
    }
    return builder.build();
  }
{code}
Here, along with the null checking we can also put the "remove set?" check as 
well.

 * Or, are we planning to wait little bit more till the end point where we are 
actually writing the data? In that case, I wasn't able to figure out how would 
we do that because I could see that we are using ".writeTo" of protobuf to 
convert quotas into byte arrays. As here:
{code:java}
  protected static byte[] quotasToData(final Quotas data) throws IOException {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    stream.write(ProtobufMagic.PB_MAGIC);
    data.writeTo(stream);
    return stream.toByteArray();
  }{code}

I prefer the first one, that way all the checking is contained in the merge 
logic.

[~elserj], your thoughts, please?

> Having RPC & Space quota on a table/Namespace doesn't allow space quota to be 
> removed using 'NONE'
> --------------------------------------------------------------------------------------------------
>
>                 Key: HBASE-21225
>                 URL: https://issues.apache.org/jira/browse/HBASE-21225
>             Project: HBase
>          Issue Type: Bug
>            Reporter: Sakthi
>            Assignee: Sakthi
>            Priority: Major
>         Attachments: hbase-21225.master.001.patch
>
>
> A part of HBASE-20705 is still unresolved. In that Jira it was assumed that 
> problem is: when table having both rpc & space quotas is dropped (with 
> hbase.quota.remove.on.table.delete set as true), the rpc quota is not set to 
> be dropped along with table-drops, and space quota was not being able to be 
> removed completely because of the "EMPTY" row that rpc quota left even after 
> removing. 
> The proposed solution for that was to make sure that rpc quota didn't leave 
> empty rows after removal of quota. And setting automatic removal of rpc quota 
> with table drops. That made sure that space quotas can be recreated/removed.
> But all this was under the assumption that hbase.quota.remove.on.table.delete 
> is set as true. When it is set as false, the same issue can reproduced. Also 
> the below shown steps can used to reproduce the issue without table-drops.
> {noformat}
> hbase(main):005:0> create 't2','cf'
> Created table t2
> Took 0.7619 seconds
> => Hbase::Table - t2
> hbase(main):006:0> set_quota TYPE => THROTTLE, TABLE => 't2', LIMIT => 
> '10M/sec'
> Took 0.0514 seconds
> hbase(main):007:0> set_quota TYPE => SPACE, TABLE => 't2', LIMIT => '1G', 
> POLICY => NO_WRITES
> Took 0.0162 seconds
> hbase(main):008:0> list_quotas
> OWNER                      QUOTAS
>  TABLE => t2               TYPE => THROTTLE, THROTTLE_TYPE => REQUEST_SIZE, 
> LIMIT => 10M/sec, SCOPE =>
>                            MACHINE
>  TABLE => t2               TYPE => SPACE, TABLE => t2, LIMIT => 1073741824, 
> VIOLATION_POLICY => NO_WRIT
>                            ES
> 2 row(s)
> Took 0.0716 seconds
> hbase(main):009:0> set_quota TYPE => SPACE, TABLE => 't2', LIMIT => NONE
> Took 0.0082 seconds
> hbase(main):010:0> list_quotas
> OWNER                           QUOTAS
>  TABLE => t2                    TYPE => THROTTLE, THROTTLE_TYPE => 
> REQUEST_SIZE, LIMIT => 10M/sec, SCOPE => MACHINE
>  TABLE => t2                    TYPE => SPACE, TABLE => t2, REMOVE => true
> 2 row(s)
> Took 0.0254 seconds
> hbase(main):011:0> set_quota TYPE => SPACE, TABLE => 't2', LIMIT => '1G', 
> POLICY => NO_WRITES
> Took 0.0082 seconds
> hbase(main):012:0> list_quotas
> OWNER                           QUOTAS
>  TABLE => t2                    TYPE => THROTTLE, THROTTLE_TYPE => 
> REQUEST_SIZE, LIMIT => 10M/sec, SCOPE => MACHINE
>  TABLE => t2                    TYPE => SPACE, TABLE => t2, REMOVE => true
> 2 row(s)
> Took 0.0411 seconds
> {noformat}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to