[
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)