You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "Nicolas Liochon (JIRA)" <ji...@apache.org> on 2013/09/12 11:25:52 UTC

[jira] [Created] (HBASE-9521) clean clearBufferOnFail behavior and deprecate it

Nicolas Liochon created HBASE-9521:
--------------------------------------

             Summary: clean clearBufferOnFail behavior and deprecate it
                 Key: HBASE-9521
                 URL: https://issues.apache.org/jira/browse/HBASE-9521
             Project: HBase
          Issue Type: Bug
          Components: Client
    Affects Versions: 0.98.0, 0.96.0
            Reporter: Nicolas Liochon
            Assignee: Nicolas Liochon
            Priority: Critical
             Fix For: 0.98.0, 0.96.0


The behavior with clearBufferOnFail is very fishy.

{code}
 /**
   * When you turn {@link #autoFlush} off, you should also consider the
   * {@link #clearBufferOnFail} option. By default, asynchronous {@link Put}
   * requests will be retried on failure until successful. However, this can
   * pollute the writeBuffer and slow down batching performance. Additionally,
   * you may want to issue a number of Put requests and call
   * {@link #flushCommits()} as a barrier. In both use cases, consider setting
   * clearBufferOnFail to true to erase the buffer after {@link #flushCommits()}
   * has been called, regardless of success.
   *
   * @param autoFlush
   *          Whether or not to enable 'auto-flush'.
   * @param clearBufferOnFail
   *          Whether to keep Put failures in the writeBuffer
   * @see #flushCommits
   */
  public void setAutoFlush(boolean autoFlush, boolean clearBufferOnFail) {
    this.autoFlush = autoFlush;
    this.clearBufferOnFail = autoFlush || clearBufferOnFail;  <============ yo man
  }
{code}

{code}
  public void setAutoFlush(boolean autoFlush) {
    setAutoFlush(autoFlush, autoFlush); <============ more yo
  }
{code}

So by default, a HTable has
- autoflush == true
- clearBufferOnFail == true

BUT, if you call setAutoFlush(false), you have
- autoflush == false
- clearBufferOnFail == false

So:
 - you're setting two parameters instead of only one.
 - the javadoc about writeBuffer beeing involved in the retry process was may be true 5 years ago, but now it's wrong

I'm pretty sure that most people don't know this. You need to go to the implementation to learn it, as the javadoc says the opposite.

a side effect is that failed operations will be tried twice:
 - one in the standard process
 - one in the table close, as we're flushing the buffer again

I would like to:
 - deprecate clearBufferOnFail.
 - change setAutoFlush(boolean) to make it change only the autoFlush, w/o activating clearBufferOnFail

It won't change the interface; but would change the behavior. I would like to put this into the next 0.96 release.




--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira