View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *     http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   */
18  
19  package org.apache.hadoop.hbase.codec.prefixtree.encode;
20  
21  import java.io.OutputStream;
22  
23  import org.apache.hadoop.classification.InterfaceAudience;
24  
25  
26  /**
27   * Pool to enable reusing the Encoder objects which can consist of thousands of smaller objects and
28   * would be more garbage than the data in the block.  A new encoder is needed for each block in
29   * a flush, compaction, RPC response, etc.
30   *
31   * It is not a pool in the traditional sense, but implements the semantics of a traditional pool
32   * via ThreadLocals to avoid sharing between threads.  Sharing between threads would not be
33   * very expensive given that it's accessed per-block, but this is just as easy.
34   *
35   * This pool implementation assumes there is a one-to-one mapping between a single thread and a
36   * single flush or compaction.
37   */
38  @InterfaceAudience.Private
39  public class ThreadLocalEncoderPool implements EncoderPool{
40  
41    private static final ThreadLocal<PrefixTreeEncoder> ENCODER
42        = new ThreadLocal<PrefixTreeEncoder>();
43  
44    /**
45     * Get the encoder attached to the current ThreadLocal, or create a new one and attach it to the
46     * current thread.
47     */
48    @Override
49    public PrefixTreeEncoder checkOut(OutputStream os, boolean includeMvccVersion) {
50      PrefixTreeEncoder builder = ENCODER.get();
51      builder = EncoderFactory.prepareEncoder(builder, os, includeMvccVersion);
52      ENCODER.set(builder);
53      return builder;
54    }
55  
56    @Override
57    public void checkIn(PrefixTreeEncoder encoder) {
58      // attached to thread on checkOut, so shouldn't need to do anything here
59  
60      // do we need to worry about detaching encoders from compaction threads or are the same threads
61      // used over and over
62    }
63  
64  }