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  package org.apache.hadoop.hbase.regionserver.compactions;
19  
20  import java.io.IOException;
21  
22  import org.apache.commons.logging.Log;
23  import org.apache.commons.logging.LogFactory;
24  import org.apache.hadoop.conf.Configuration;
25  import org.apache.hadoop.fs.FileSystem;
26  import org.apache.hadoop.fs.Path;
27  import org.apache.hadoop.hbase.classification.InterfaceAudience;
28  import org.apache.hadoop.hbase.regionserver.AbstractMultiFileWriter;
29  import org.apache.hadoop.hbase.regionserver.AbstractMultiFileWriter.WriterFactory;
30  import org.apache.hadoop.hbase.regionserver.InternalScanner;
31  import org.apache.hadoop.hbase.regionserver.ScanType;
32  import org.apache.hadoop.hbase.regionserver.Store;
33  import org.apache.hadoop.hbase.regionserver.StoreFile;
34  import org.apache.hadoop.hbase.regionserver.StoreFile.Writer;
35  import org.apache.hadoop.hbase.regionserver.StoreFileScanner;
36  import org.apache.hadoop.hbase.regionserver.StoreScanner;
37  import org.apache.hadoop.hbase.regionserver.compactions.CompactionThroughputController;
38  import org.apache.hadoop.hbase.security.User;
39  
40  import com.google.common.io.Closeables;
41  
42  /**
43   * Base class for implementing a Compactor which will generate multiple output files after
44   * compaction.
45   */
46  @InterfaceAudience.Private
47  public abstract class AbstractMultiOutputCompactor<T extends AbstractMultiFileWriter>
48      extends Compactor<T> {
49  
50    private static final Log LOG = LogFactory.getLog(AbstractMultiOutputCompactor.class);
51  
52    public AbstractMultiOutputCompactor(Configuration conf, Store store) {
53      super(conf, store);
54    }
55  
56    protected void initMultiWriter(AbstractMultiFileWriter writer, InternalScanner scanner,
57        final FileDetails fd, final boolean shouldDropBehind) {
58      WriterFactory writerFactory = new WriterFactory() {
59        @Override
60        public Writer createWriter() throws IOException {
61          return createTmpWriter(fd, shouldDropBehind);
62        }
63      };
64      // Prepare multi-writer, and perform the compaction using scanner and writer.
65      // It is ok here if storeScanner is null.
66      StoreScanner storeScanner = (scanner instanceof StoreScanner) ? (StoreScanner) scanner : null;
67      writer.init(storeScanner, writerFactory);
68    }
69  
70    @Override
71    protected void abortWriter(T writer) throws IOException {
72      FileSystem fs = store.getFileSystem();
73      for (Path leftoverFile : writer.abortWriters()) {
74        try {
75          fs.delete(leftoverFile, false);
76        } catch (IOException e) {
77          LOG.warn(
78            "Failed to delete the leftover file " + leftoverFile + " after an unfinished compaction.",
79            e);
80        }
81      }
82    }
83  }