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.replication;
20
21 import java.util.ArrayList;
22 import java.util.NavigableMap;
23
24 import org.apache.hadoop.hbase.classification.InterfaceAudience;
25 import org.apache.hadoop.hbase.Cell;
26 import org.apache.hadoop.hbase.HConstants;
27 import org.apache.hadoop.hbase.wal.WAL.Entry;
28
29 /**
30 * Keeps KVs that are scoped other than local
31 */
32 @InterfaceAudience.Private
33 public class ScopeWALEntryFilter implements WALEntryFilter {
34
35 @Override
36 public Entry filter(Entry entry) {
37 NavigableMap<byte[], Integer> scopes = entry.getKey().getScopes();
38 if (scopes == null || scopes.isEmpty()) {
39 return null;
40 }
41 ArrayList<Cell> cells = entry.getEdit().getCells();
42 int size = cells.size();
43 for (int i = size - 1; i >= 0; i--) {
44 Cell cell = cells.get(i);
45 // The scope will be null or empty if
46 // there's nothing to replicate in that WALEdit
47 if (!scopes.containsKey(cell.getFamily())
48 || scopes.get(cell.getFamily()) == HConstants.REPLICATION_SCOPE_LOCAL) {
49 cells.remove(i);
50 }
51 }
52 if (cells.size() < size / 2) {
53 cells.trimToSize();
54 }
55 return entry;
56 }
57
58 }