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;
19  
20  import java.util.List;
21  
22  import org.apache.hadoop.hbase.classification.InterfaceAudience;
23  import org.apache.hadoop.hbase.Cell;
24  import org.apache.hadoop.hbase.io.HeapSize;
25  
26  /**
27   * The MemStore holds in-memory modifications to the Store. Modifications are {@link Cell}s.
28   * <p>
29   * The MemStore functions should not be called in parallel. Callers should hold write and read
30   * locks. This is done in {@link HStore}.
31   * </p>
32   */
33  @InterfaceAudience.Private
34  public interface MemStore extends HeapSize {
35  
36    /**
37     * Creates a snapshot of the current memstore. Snapshot must be cleared by call to
38     * {@link #clearSnapshot(long)}.
39     * @return {@link MemStoreSnapshot}
40     */
41    MemStoreSnapshot snapshot();
42  
43    /**
44     * Clears the current snapshot of the Memstore.
45     * @param id
46     * @throws UnexpectedStateException
47     * @see #snapshot()
48     */
49    void clearSnapshot(long id) throws UnexpectedStateException;
50  
51    /**
52     * On flush, how much memory we will clear.
53     * Flush will first clear out the data in snapshot if any (It will take a second flush
54     * invocation to clear the current Cell set). If snapshot is empty, current
55     * Cell set will be flushed.
56     *
57     * @return size of data that is going to be flushed
58     */
59    long getFlushableSize();
60  
61    /**
62     * Return the size of the snapshot(s) if any
63     * @return size of the memstore snapshot
64     */
65    long getSnapshotSize();
66  
67    /**
68     * Write an update
69     * @param cell
70     * @return approximate size of the passed cell.
71     */
72    long add(final Cell cell);
73  
74    /**
75     * @return Oldest timestamp of all the Cells in the MemStore
76     */
77    long timeOfOldestEdit();
78  
79    /**
80     * Remove n key from the memstore. Only kvs that have the same key and the same memstoreTS are
81     * removed. It is ok to not update timeRangeTracker in this call.
82     * @param cell
83     */
84    void rollback(final Cell cell);
85  
86    /**
87     * Write a delete
88     * @param deleteCell
89     * @return approximate size of the passed key and value.
90     */
91    long delete(final Cell deleteCell);
92  
93    /**
94     * Find the key that matches <i>row</i> exactly, or the one that immediately precedes it. The
95     * target row key is set in state.
96     * @param state column/delete tracking state
97     */
98    void getRowKeyAtOrBefore(final GetClosestRowBeforeTracker state);
99  
100   /**
101    * Given the specs of a column, update it, first by inserting a new record,
102    * then removing the old one.  Since there is only 1 KeyValue involved, the memstoreTS
103    * will be set to 0, thus ensuring that they instantly appear to anyone. The underlying
104    * store will ensure that the insert/delete each are atomic. A scanner/reader will either
105    * get the new value, or the old value and all readers will eventually only see the new
106    * value after the old was removed.
107    *
108    * @param row
109    * @param family
110    * @param qualifier
111    * @param newValue
112    * @param now
113    * @return Timestamp
114    */
115   long updateColumnValue(byte[] row, byte[] family, byte[] qualifier, long newValue, long now);
116 
117   /**
118    * Update or insert the specified cells.
119    * <p>
120    * For each Cell, insert into MemStore. This will atomically upsert the value for that
121    * row/family/qualifier. If a Cell did already exist, it will then be removed.
122    * <p>
123    * Currently the memstoreTS is kept at 0 so as each insert happens, it will be immediately
124    * visible. May want to change this so it is atomic across all KeyValues.
125    * <p>
126    * This is called under row lock, so Get operations will still see updates atomically. Scans will
127    * only see each KeyValue update as atomic.
128    * @param cells
129    * @param readpoint readpoint below which we can safely remove duplicate Cells.
130    * @return change in memstore size
131    */
132   long upsert(Iterable<Cell> cells, long readpoint);
133 
134   /**
135    * @return scanner over the memstore. This might include scanner over the snapshot when one is
136    * present.
137    */
138   List<KeyValueScanner> getScanners(long readPt);
139 
140   /**
141    * @return Total memory occupied by this MemStore.
142    */
143   long size();
144 }