001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.io.asyncfs;
019
020import org.apache.yetus.audience.InterfaceAudience;
021
022/**
023 * Used to predict the next send buffer size.
024 */
025@InterfaceAudience.Private
026class SendBufSizePredictor {
027
028  // LIMIT is 128MB
029  private static final int LIMIT = 128 * 1024 * 1024;
030
031  // buf's initial capacity - 4KB
032  private int capacity = 4 * 1024;
033
034  int initialSize() {
035    return capacity;
036  }
037
038  int guess(int bytesWritten) {
039    // if the bytesWritten is greater than the current capacity
040    // always increase the capacity in powers of 2.
041    if (bytesWritten > this.capacity) {
042      // Ensure we don't cross the LIMIT
043      if ((this.capacity << 1) <= LIMIT) {
044        // increase the capacity in the range of power of 2
045        this.capacity = this.capacity << 1;
046      }
047    } else {
048      // if we see that the bytesWritten is lesser we could again decrease
049      // the capacity by dividing it by 2 if the bytesWritten is satisfied by
050      // that reduction
051      if ((this.capacity >> 1) >= bytesWritten) {
052        this.capacity = this.capacity >> 1;
053      }
054    }
055    return this.capacity;
056  }
057}