http://git-wip-us.apache.org/repos/asf/hbase-site/blob/670bf1f0/testapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html ---------------------------------------------------------------------- diff --git a/testapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html b/testapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html index e99da02..ffdff4d 100644 --- a/testapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html +++ b/testapidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html @@ -1882,2099 +1882,2102 @@ <span class="sourceLineNo">1874</span> */<a name="line.1874"></a> <span class="sourceLineNo">1875</span> public HTable truncateTable(final TableName tableName, final boolean preserveRegions) throws IOException {<a name="line.1875"></a> <span class="sourceLineNo">1876</span> Admin admin = getHBaseAdmin();<a name="line.1876"></a> -<span class="sourceLineNo">1877</span> admin.truncateTable(tableName, preserveRegions);<a name="line.1877"></a> -<span class="sourceLineNo">1878</span> return (HTable) getConnection().getTable(tableName);<a name="line.1878"></a> -<span class="sourceLineNo">1879</span> }<a name="line.1879"></a> -<span class="sourceLineNo">1880</span><a name="line.1880"></a> -<span class="sourceLineNo">1881</span> /**<a name="line.1881"></a> -<span class="sourceLineNo">1882</span> * Truncate a table using the admin command.<a name="line.1882"></a> -<span class="sourceLineNo">1883</span> * Effectively disables, deletes, and recreates the table.<a name="line.1883"></a> -<span class="sourceLineNo">1884</span> * For previous behavior of issuing row deletes, see<a name="line.1884"></a> -<span class="sourceLineNo">1885</span> * deleteTableData.<a name="line.1885"></a> -<span class="sourceLineNo">1886</span> * Expressly does not preserve regions of existing table.<a name="line.1886"></a> -<span class="sourceLineNo">1887</span> * @param tableName table which must exist.<a name="line.1887"></a> -<span class="sourceLineNo">1888</span> * @return HTable for the new table<a name="line.1888"></a> -<span class="sourceLineNo">1889</span> */<a name="line.1889"></a> -<span class="sourceLineNo">1890</span> public HTable truncateTable(final TableName tableName) throws IOException {<a name="line.1890"></a> -<span class="sourceLineNo">1891</span> return truncateTable(tableName, false);<a name="line.1891"></a> -<span class="sourceLineNo">1892</span> }<a name="line.1892"></a> -<span class="sourceLineNo">1893</span><a name="line.1893"></a> -<span class="sourceLineNo">1894</span> /**<a name="line.1894"></a> -<span class="sourceLineNo">1895</span> * Load table with rows from 'aaa' to 'zzz'.<a name="line.1895"></a> -<span class="sourceLineNo">1896</span> * @param t Table<a name="line.1896"></a> -<span class="sourceLineNo">1897</span> * @param f Family<a name="line.1897"></a> -<span class="sourceLineNo">1898</span> * @return Count of rows loaded.<a name="line.1898"></a> -<span class="sourceLineNo">1899</span> * @throws IOException<a name="line.1899"></a> -<span class="sourceLineNo">1900</span> */<a name="line.1900"></a> -<span class="sourceLineNo">1901</span> public int loadTable(final Table t, final byte[] f) throws IOException {<a name="line.1901"></a> -<span class="sourceLineNo">1902</span> return loadTable(t, new byte[][] {f});<a name="line.1902"></a> -<span class="sourceLineNo">1903</span> }<a name="line.1903"></a> -<span class="sourceLineNo">1904</span><a name="line.1904"></a> -<span class="sourceLineNo">1905</span> /**<a name="line.1905"></a> -<span class="sourceLineNo">1906</span> * Load table with rows from 'aaa' to 'zzz'.<a name="line.1906"></a> -<span class="sourceLineNo">1907</span> * @param t Table<a name="line.1907"></a> -<span class="sourceLineNo">1908</span> * @param f Family<a name="line.1908"></a> -<span class="sourceLineNo">1909</span> * @return Count of rows loaded.<a name="line.1909"></a> -<span class="sourceLineNo">1910</span> * @throws IOException<a name="line.1910"></a> -<span class="sourceLineNo">1911</span> */<a name="line.1911"></a> -<span class="sourceLineNo">1912</span> public int loadTable(final Table t, final byte[] f, boolean writeToWAL) throws IOException {<a name="line.1912"></a> -<span class="sourceLineNo">1913</span> return loadTable(t, new byte[][] {f}, null, writeToWAL);<a name="line.1913"></a> -<span class="sourceLineNo">1914</span> }<a name="line.1914"></a> -<span class="sourceLineNo">1915</span><a name="line.1915"></a> -<span class="sourceLineNo">1916</span> /**<a name="line.1916"></a> -<span class="sourceLineNo">1917</span> * Load table of multiple column families with rows from 'aaa' to 'zzz'.<a name="line.1917"></a> -<span class="sourceLineNo">1918</span> * @param t Table<a name="line.1918"></a> -<span class="sourceLineNo">1919</span> * @param f Array of Families to load<a name="line.1919"></a> -<span class="sourceLineNo">1920</span> * @return Count of rows loaded.<a name="line.1920"></a> -<span class="sourceLineNo">1921</span> * @throws IOException<a name="line.1921"></a> -<span class="sourceLineNo">1922</span> */<a name="line.1922"></a> -<span class="sourceLineNo">1923</span> public int loadTable(final Table t, final byte[][] f) throws IOException {<a name="line.1923"></a> -<span class="sourceLineNo">1924</span> return loadTable(t, f, null);<a name="line.1924"></a> -<span class="sourceLineNo">1925</span> }<a name="line.1925"></a> -<span class="sourceLineNo">1926</span><a name="line.1926"></a> -<span class="sourceLineNo">1927</span> /**<a name="line.1927"></a> -<span class="sourceLineNo">1928</span> * Load table of multiple column families with rows from 'aaa' to 'zzz'.<a name="line.1928"></a> -<span class="sourceLineNo">1929</span> * @param t Table<a name="line.1929"></a> -<span class="sourceLineNo">1930</span> * @param f Array of Families to load<a name="line.1930"></a> -<span class="sourceLineNo">1931</span> * @param value the values of the cells. If null is passed, the row key is used as value<a name="line.1931"></a> -<span class="sourceLineNo">1932</span> * @return Count of rows loaded.<a name="line.1932"></a> -<span class="sourceLineNo">1933</span> * @throws IOException<a name="line.1933"></a> -<span class="sourceLineNo">1934</span> */<a name="line.1934"></a> -<span class="sourceLineNo">1935</span> public int loadTable(final Table t, final byte[][] f, byte[] value) throws IOException {<a name="line.1935"></a> -<span class="sourceLineNo">1936</span> return loadTable(t, f, value, true);<a name="line.1936"></a> -<span class="sourceLineNo">1937</span> }<a name="line.1937"></a> -<span class="sourceLineNo">1938</span><a name="line.1938"></a> -<span class="sourceLineNo">1939</span> /**<a name="line.1939"></a> -<span class="sourceLineNo">1940</span> * Load table of multiple column families with rows from 'aaa' to 'zzz'.<a name="line.1940"></a> -<span class="sourceLineNo">1941</span> * @param t Table<a name="line.1941"></a> -<span class="sourceLineNo">1942</span> * @param f Array of Families to load<a name="line.1942"></a> -<span class="sourceLineNo">1943</span> * @param value the values of the cells. If null is passed, the row key is used as value<a name="line.1943"></a> -<span class="sourceLineNo">1944</span> * @return Count of rows loaded.<a name="line.1944"></a> -<span class="sourceLineNo">1945</span> * @throws IOException<a name="line.1945"></a> -<span class="sourceLineNo">1946</span> */<a name="line.1946"></a> -<span class="sourceLineNo">1947</span> public int loadTable(final Table t, final byte[][] f, byte[] value, boolean writeToWAL) throws IOException {<a name="line.1947"></a> -<span class="sourceLineNo">1948</span> List<Put> puts = new ArrayList<>();<a name="line.1948"></a> -<span class="sourceLineNo">1949</span> for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.1949"></a> -<span class="sourceLineNo">1950</span> Put put = new Put(row);<a name="line.1950"></a> -<span class="sourceLineNo">1951</span> put.setDurability(writeToWAL ? Durability.USE_DEFAULT : Durability.SKIP_WAL);<a name="line.1951"></a> -<span class="sourceLineNo">1952</span> for (int i = 0; i < f.length; i++) {<a name="line.1952"></a> -<span class="sourceLineNo">1953</span> byte[] value1 = value != null ? value : row;<a name="line.1953"></a> -<span class="sourceLineNo">1954</span> put.addColumn(f[i], null, value1);<a name="line.1954"></a> -<span class="sourceLineNo">1955</span> }<a name="line.1955"></a> -<span class="sourceLineNo">1956</span> puts.add(put);<a name="line.1956"></a> -<span class="sourceLineNo">1957</span> }<a name="line.1957"></a> -<span class="sourceLineNo">1958</span> t.put(puts);<a name="line.1958"></a> -<span class="sourceLineNo">1959</span> return puts.size();<a name="line.1959"></a> -<span class="sourceLineNo">1960</span> }<a name="line.1960"></a> -<span class="sourceLineNo">1961</span><a name="line.1961"></a> -<span class="sourceLineNo">1962</span> /** A tracker for tracking and validating table rows<a name="line.1962"></a> -<span class="sourceLineNo">1963</span> * generated with {@link HBaseTestingUtility#loadTable(HTable, byte[])}<a name="line.1963"></a> -<span class="sourceLineNo">1964</span> */<a name="line.1964"></a> -<span class="sourceLineNo">1965</span> public static class SeenRowTracker {<a name="line.1965"></a> -<span class="sourceLineNo">1966</span> int dim = 'z' - 'a' + 1;<a name="line.1966"></a> -<span class="sourceLineNo">1967</span> int[][][] seenRows = new int[dim][dim][dim]; //count of how many times the row is seen<a name="line.1967"></a> -<span class="sourceLineNo">1968</span> byte[] startRow;<a name="line.1968"></a> -<span class="sourceLineNo">1969</span> byte[] stopRow;<a name="line.1969"></a> -<span class="sourceLineNo">1970</span><a name="line.1970"></a> -<span class="sourceLineNo">1971</span> public SeenRowTracker(byte[] startRow, byte[] stopRow) {<a name="line.1971"></a> -<span class="sourceLineNo">1972</span> this.startRow = startRow;<a name="line.1972"></a> -<span class="sourceLineNo">1973</span> this.stopRow = stopRow;<a name="line.1973"></a> -<span class="sourceLineNo">1974</span> }<a name="line.1974"></a> -<span class="sourceLineNo">1975</span><a name="line.1975"></a> -<span class="sourceLineNo">1976</span> void reset() {<a name="line.1976"></a> -<span class="sourceLineNo">1977</span> for (byte[] row : ROWS) {<a name="line.1977"></a> -<span class="sourceLineNo">1978</span> seenRows[i(row[0])][i(row[1])][i(row[2])] = 0;<a name="line.1978"></a> -<span class="sourceLineNo">1979</span> }<a name="line.1979"></a> -<span class="sourceLineNo">1980</span> }<a name="line.1980"></a> -<span class="sourceLineNo">1981</span><a name="line.1981"></a> -<span class="sourceLineNo">1982</span> int i(byte b) {<a name="line.1982"></a> -<span class="sourceLineNo">1983</span> return b - 'a';<a name="line.1983"></a> -<span class="sourceLineNo">1984</span> }<a name="line.1984"></a> -<span class="sourceLineNo">1985</span><a name="line.1985"></a> -<span class="sourceLineNo">1986</span> public void addRow(byte[] row) {<a name="line.1986"></a> -<span class="sourceLineNo">1987</span> seenRows[i(row[0])][i(row[1])][i(row[2])]++;<a name="line.1987"></a> -<span class="sourceLineNo">1988</span> }<a name="line.1988"></a> -<span class="sourceLineNo">1989</span><a name="line.1989"></a> -<span class="sourceLineNo">1990</span> /** Validate that all the rows between startRow and stopRow are seen exactly once, and<a name="line.1990"></a> -<span class="sourceLineNo">1991</span> * all other rows none<a name="line.1991"></a> -<span class="sourceLineNo">1992</span> */<a name="line.1992"></a> -<span class="sourceLineNo">1993</span> public void validate() {<a name="line.1993"></a> -<span class="sourceLineNo">1994</span> for (byte b1 = 'a'; b1 <= 'z'; b1++) {<a name="line.1994"></a> -<span class="sourceLineNo">1995</span> for (byte b2 = 'a'; b2 <= 'z'; b2++) {<a name="line.1995"></a> -<span class="sourceLineNo">1996</span> for (byte b3 = 'a'; b3 <= 'z'; b3++) {<a name="line.1996"></a> -<span class="sourceLineNo">1997</span> int count = seenRows[i(b1)][i(b2)][i(b3)];<a name="line.1997"></a> -<span class="sourceLineNo">1998</span> int expectedCount = 0;<a name="line.1998"></a> -<span class="sourceLineNo">1999</span> if (Bytes.compareTo(new byte[] {b1,b2,b3}, startRow) >= 0<a name="line.1999"></a> -<span class="sourceLineNo">2000</span> && Bytes.compareTo(new byte[] {b1,b2,b3}, stopRow) < 0) {<a name="line.2000"></a> -<span class="sourceLineNo">2001</span> expectedCount = 1;<a name="line.2001"></a> -<span class="sourceLineNo">2002</span> }<a name="line.2002"></a> -<span class="sourceLineNo">2003</span> if (count != expectedCount) {<a name="line.2003"></a> -<span class="sourceLineNo">2004</span> String row = new String(new byte[] {b1,b2,b3});<a name="line.2004"></a> -<span class="sourceLineNo">2005</span> throw new RuntimeException("Row:" + row + " has a seen count of " + count + " instead of " + expectedCount);<a name="line.2005"></a> -<span class="sourceLineNo">2006</span> }<a name="line.2006"></a> -<span class="sourceLineNo">2007</span> }<a name="line.2007"></a> -<span class="sourceLineNo">2008</span> }<a name="line.2008"></a> -<span class="sourceLineNo">2009</span> }<a name="line.2009"></a> -<span class="sourceLineNo">2010</span> }<a name="line.2010"></a> -<span class="sourceLineNo">2011</span> }<a name="line.2011"></a> -<span class="sourceLineNo">2012</span><a name="line.2012"></a> -<span class="sourceLineNo">2013</span> public int loadRegion(final HRegion r, final byte[] f) throws IOException {<a name="line.2013"></a> -<span class="sourceLineNo">2014</span> return loadRegion(r, f, false);<a name="line.2014"></a> -<span class="sourceLineNo">2015</span> }<a name="line.2015"></a> -<span class="sourceLineNo">2016</span><a name="line.2016"></a> -<span class="sourceLineNo">2017</span> public int loadRegion(final Region r, final byte[] f) throws IOException {<a name="line.2017"></a> -<span class="sourceLineNo">2018</span> return loadRegion((HRegion)r, f);<a name="line.2018"></a> -<span class="sourceLineNo">2019</span> }<a name="line.2019"></a> -<span class="sourceLineNo">2020</span><a name="line.2020"></a> -<span class="sourceLineNo">2021</span> /**<a name="line.2021"></a> -<span class="sourceLineNo">2022</span> * Load region with rows from 'aaa' to 'zzz'.<a name="line.2022"></a> -<span class="sourceLineNo">2023</span> * @param r Region<a name="line.2023"></a> -<span class="sourceLineNo">2024</span> * @param f Family<a name="line.2024"></a> -<span class="sourceLineNo">2025</span> * @param flush flush the cache if true<a name="line.2025"></a> -<span class="sourceLineNo">2026</span> * @return Count of rows loaded.<a name="line.2026"></a> -<span class="sourceLineNo">2027</span> * @throws IOException<a name="line.2027"></a> -<span class="sourceLineNo">2028</span> */<a name="line.2028"></a> -<span class="sourceLineNo">2029</span> public int loadRegion(final HRegion r, final byte[] f, final boolean flush)<a name="line.2029"></a> -<span class="sourceLineNo">2030</span> throws IOException {<a name="line.2030"></a> -<span class="sourceLineNo">2031</span> byte[] k = new byte[3];<a name="line.2031"></a> -<span class="sourceLineNo">2032</span> int rowCount = 0;<a name="line.2032"></a> -<span class="sourceLineNo">2033</span> for (byte b1 = 'a'; b1 <= 'z'; b1++) {<a name="line.2033"></a> -<span class="sourceLineNo">2034</span> for (byte b2 = 'a'; b2 <= 'z'; b2++) {<a name="line.2034"></a> -<span class="sourceLineNo">2035</span> for (byte b3 = 'a'; b3 <= 'z'; b3++) {<a name="line.2035"></a> -<span class="sourceLineNo">2036</span> k[0] = b1;<a name="line.2036"></a> -<span class="sourceLineNo">2037</span> k[1] = b2;<a name="line.2037"></a> -<span class="sourceLineNo">2038</span> k[2] = b3;<a name="line.2038"></a> -<span class="sourceLineNo">2039</span> Put put = new Put(k);<a name="line.2039"></a> -<span class="sourceLineNo">2040</span> put.setDurability(Durability.SKIP_WAL);<a name="line.2040"></a> -<span class="sourceLineNo">2041</span> put.addColumn(f, null, k);<a name="line.2041"></a> -<span class="sourceLineNo">2042</span> if (r.getWAL() == null) {<a name="line.2042"></a> -<span class="sourceLineNo">2043</span> put.setDurability(Durability.SKIP_WAL);<a name="line.2043"></a> -<span class="sourceLineNo">2044</span> }<a name="line.2044"></a> -<span class="sourceLineNo">2045</span> int preRowCount = rowCount;<a name="line.2045"></a> -<span class="sourceLineNo">2046</span> int pause = 10;<a name="line.2046"></a> -<span class="sourceLineNo">2047</span> int maxPause = 1000;<a name="line.2047"></a> -<span class="sourceLineNo">2048</span> while (rowCount == preRowCount) {<a name="line.2048"></a> -<span class="sourceLineNo">2049</span> try {<a name="line.2049"></a> -<span class="sourceLineNo">2050</span> r.put(put);<a name="line.2050"></a> -<span class="sourceLineNo">2051</span> rowCount++;<a name="line.2051"></a> -<span class="sourceLineNo">2052</span> } catch (RegionTooBusyException e) {<a name="line.2052"></a> -<span class="sourceLineNo">2053</span> pause = (pause * 2 >= maxPause) ? maxPause : pause * 2;<a name="line.2053"></a> -<span class="sourceLineNo">2054</span> Threads.sleep(pause);<a name="line.2054"></a> -<span class="sourceLineNo">2055</span> }<a name="line.2055"></a> -<span class="sourceLineNo">2056</span> }<a name="line.2056"></a> -<span class="sourceLineNo">2057</span> }<a name="line.2057"></a> -<span class="sourceLineNo">2058</span> }<a name="line.2058"></a> -<span class="sourceLineNo">2059</span> if (flush) {<a name="line.2059"></a> -<span class="sourceLineNo">2060</span> r.flush(true);<a name="line.2060"></a> +<span class="sourceLineNo">1877</span> if (!admin.isTableDisabled(tableName)) {<a name="line.1877"></a> +<span class="sourceLineNo">1878</span> admin.disableTable(tableName);<a name="line.1878"></a> +<span class="sourceLineNo">1879</span> }<a name="line.1879"></a> +<span class="sourceLineNo">1880</span> admin.truncateTable(tableName, preserveRegions);<a name="line.1880"></a> +<span class="sourceLineNo">1881</span> return (HTable) getConnection().getTable(tableName);<a name="line.1881"></a> +<span class="sourceLineNo">1882</span> }<a name="line.1882"></a> +<span class="sourceLineNo">1883</span><a name="line.1883"></a> +<span class="sourceLineNo">1884</span> /**<a name="line.1884"></a> +<span class="sourceLineNo">1885</span> * Truncate a table using the admin command.<a name="line.1885"></a> +<span class="sourceLineNo">1886</span> * Effectively disables, deletes, and recreates the table.<a name="line.1886"></a> +<span class="sourceLineNo">1887</span> * For previous behavior of issuing row deletes, see<a name="line.1887"></a> +<span class="sourceLineNo">1888</span> * deleteTableData.<a name="line.1888"></a> +<span class="sourceLineNo">1889</span> * Expressly does not preserve regions of existing table.<a name="line.1889"></a> +<span class="sourceLineNo">1890</span> * @param tableName table which must exist.<a name="line.1890"></a> +<span class="sourceLineNo">1891</span> * @return HTable for the new table<a name="line.1891"></a> +<span class="sourceLineNo">1892</span> */<a name="line.1892"></a> +<span class="sourceLineNo">1893</span> public HTable truncateTable(final TableName tableName) throws IOException {<a name="line.1893"></a> +<span class="sourceLineNo">1894</span> return truncateTable(tableName, false);<a name="line.1894"></a> +<span class="sourceLineNo">1895</span> }<a name="line.1895"></a> +<span class="sourceLineNo">1896</span><a name="line.1896"></a> +<span class="sourceLineNo">1897</span> /**<a name="line.1897"></a> +<span class="sourceLineNo">1898</span> * Load table with rows from 'aaa' to 'zzz'.<a name="line.1898"></a> +<span class="sourceLineNo">1899</span> * @param t Table<a name="line.1899"></a> +<span class="sourceLineNo">1900</span> * @param f Family<a name="line.1900"></a> +<span class="sourceLineNo">1901</span> * @return Count of rows loaded.<a name="line.1901"></a> +<span class="sourceLineNo">1902</span> * @throws IOException<a name="line.1902"></a> +<span class="sourceLineNo">1903</span> */<a name="line.1903"></a> +<span class="sourceLineNo">1904</span> public int loadTable(final Table t, final byte[] f) throws IOException {<a name="line.1904"></a> +<span class="sourceLineNo">1905</span> return loadTable(t, new byte[][] {f});<a name="line.1905"></a> +<span class="sourceLineNo">1906</span> }<a name="line.1906"></a> +<span class="sourceLineNo">1907</span><a name="line.1907"></a> +<span class="sourceLineNo">1908</span> /**<a name="line.1908"></a> +<span class="sourceLineNo">1909</span> * Load table with rows from 'aaa' to 'zzz'.<a name="line.1909"></a> +<span class="sourceLineNo">1910</span> * @param t Table<a name="line.1910"></a> +<span class="sourceLineNo">1911</span> * @param f Family<a name="line.1911"></a> +<span class="sourceLineNo">1912</span> * @return Count of rows loaded.<a name="line.1912"></a> +<span class="sourceLineNo">1913</span> * @throws IOException<a name="line.1913"></a> +<span class="sourceLineNo">1914</span> */<a name="line.1914"></a> +<span class="sourceLineNo">1915</span> public int loadTable(final Table t, final byte[] f, boolean writeToWAL) throws IOException {<a name="line.1915"></a> +<span class="sourceLineNo">1916</span> return loadTable(t, new byte[][] {f}, null, writeToWAL);<a name="line.1916"></a> +<span class="sourceLineNo">1917</span> }<a name="line.1917"></a> +<span class="sourceLineNo">1918</span><a name="line.1918"></a> +<span class="sourceLineNo">1919</span> /**<a name="line.1919"></a> +<span class="sourceLineNo">1920</span> * Load table of multiple column families with rows from 'aaa' to 'zzz'.<a name="line.1920"></a> +<span class="sourceLineNo">1921</span> * @param t Table<a name="line.1921"></a> +<span class="sourceLineNo">1922</span> * @param f Array of Families to load<a name="line.1922"></a> +<span class="sourceLineNo">1923</span> * @return Count of rows loaded.<a name="line.1923"></a> +<span class="sourceLineNo">1924</span> * @throws IOException<a name="line.1924"></a> +<span class="sourceLineNo">1925</span> */<a name="line.1925"></a> +<span class="sourceLineNo">1926</span> public int loadTable(final Table t, final byte[][] f) throws IOException {<a name="line.1926"></a> +<span class="sourceLineNo">1927</span> return loadTable(t, f, null);<a name="line.1927"></a> +<span class="sourceLineNo">1928</span> }<a name="line.1928"></a> +<span class="sourceLineNo">1929</span><a name="line.1929"></a> +<span class="sourceLineNo">1930</span> /**<a name="line.1930"></a> +<span class="sourceLineNo">1931</span> * Load table of multiple column families with rows from 'aaa' to 'zzz'.<a name="line.1931"></a> +<span class="sourceLineNo">1932</span> * @param t Table<a name="line.1932"></a> +<span class="sourceLineNo">1933</span> * @param f Array of Families to load<a name="line.1933"></a> +<span class="sourceLineNo">1934</span> * @param value the values of the cells. If null is passed, the row key is used as value<a name="line.1934"></a> +<span class="sourceLineNo">1935</span> * @return Count of rows loaded.<a name="line.1935"></a> +<span class="sourceLineNo">1936</span> * @throws IOException<a name="line.1936"></a> +<span class="sourceLineNo">1937</span> */<a name="line.1937"></a> +<span class="sourceLineNo">1938</span> public int loadTable(final Table t, final byte[][] f, byte[] value) throws IOException {<a name="line.1938"></a> +<span class="sourceLineNo">1939</span> return loadTable(t, f, value, true);<a name="line.1939"></a> +<span class="sourceLineNo">1940</span> }<a name="line.1940"></a> +<span class="sourceLineNo">1941</span><a name="line.1941"></a> +<span class="sourceLineNo">1942</span> /**<a name="line.1942"></a> +<span class="sourceLineNo">1943</span> * Load table of multiple column families with rows from 'aaa' to 'zzz'.<a name="line.1943"></a> +<span class="sourceLineNo">1944</span> * @param t Table<a name="line.1944"></a> +<span class="sourceLineNo">1945</span> * @param f Array of Families to load<a name="line.1945"></a> +<span class="sourceLineNo">1946</span> * @param value the values of the cells. If null is passed, the row key is used as value<a name="line.1946"></a> +<span class="sourceLineNo">1947</span> * @return Count of rows loaded.<a name="line.1947"></a> +<span class="sourceLineNo">1948</span> * @throws IOException<a name="line.1948"></a> +<span class="sourceLineNo">1949</span> */<a name="line.1949"></a> +<span class="sourceLineNo">1950</span> public int loadTable(final Table t, final byte[][] f, byte[] value, boolean writeToWAL) throws IOException {<a name="line.1950"></a> +<span class="sourceLineNo">1951</span> List<Put> puts = new ArrayList<>();<a name="line.1951"></a> +<span class="sourceLineNo">1952</span> for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.1952"></a> +<span class="sourceLineNo">1953</span> Put put = new Put(row);<a name="line.1953"></a> +<span class="sourceLineNo">1954</span> put.setDurability(writeToWAL ? Durability.USE_DEFAULT : Durability.SKIP_WAL);<a name="line.1954"></a> +<span class="sourceLineNo">1955</span> for (int i = 0; i < f.length; i++) {<a name="line.1955"></a> +<span class="sourceLineNo">1956</span> byte[] value1 = value != null ? value : row;<a name="line.1956"></a> +<span class="sourceLineNo">1957</span> put.addColumn(f[i], null, value1);<a name="line.1957"></a> +<span class="sourceLineNo">1958</span> }<a name="line.1958"></a> +<span class="sourceLineNo">1959</span> puts.add(put);<a name="line.1959"></a> +<span class="sourceLineNo">1960</span> }<a name="line.1960"></a> +<span class="sourceLineNo">1961</span> t.put(puts);<a name="line.1961"></a> +<span class="sourceLineNo">1962</span> return puts.size();<a name="line.1962"></a> +<span class="sourceLineNo">1963</span> }<a name="line.1963"></a> +<span class="sourceLineNo">1964</span><a name="line.1964"></a> +<span class="sourceLineNo">1965</span> /** A tracker for tracking and validating table rows<a name="line.1965"></a> +<span class="sourceLineNo">1966</span> * generated with {@link HBaseTestingUtility#loadTable(HTable, byte[])}<a name="line.1966"></a> +<span class="sourceLineNo">1967</span> */<a name="line.1967"></a> +<span class="sourceLineNo">1968</span> public static class SeenRowTracker {<a name="line.1968"></a> +<span class="sourceLineNo">1969</span> int dim = 'z' - 'a' + 1;<a name="line.1969"></a> +<span class="sourceLineNo">1970</span> int[][][] seenRows = new int[dim][dim][dim]; //count of how many times the row is seen<a name="line.1970"></a> +<span class="sourceLineNo">1971</span> byte[] startRow;<a name="line.1971"></a> +<span class="sourceLineNo">1972</span> byte[] stopRow;<a name="line.1972"></a> +<span class="sourceLineNo">1973</span><a name="line.1973"></a> +<span class="sourceLineNo">1974</span> public SeenRowTracker(byte[] startRow, byte[] stopRow) {<a name="line.1974"></a> +<span class="sourceLineNo">1975</span> this.startRow = startRow;<a name="line.1975"></a> +<span class="sourceLineNo">1976</span> this.stopRow = stopRow;<a name="line.1976"></a> +<span class="sourceLineNo">1977</span> }<a name="line.1977"></a> +<span class="sourceLineNo">1978</span><a name="line.1978"></a> +<span class="sourceLineNo">1979</span> void reset() {<a name="line.1979"></a> +<span class="sourceLineNo">1980</span> for (byte[] row : ROWS) {<a name="line.1980"></a> +<span class="sourceLineNo">1981</span> seenRows[i(row[0])][i(row[1])][i(row[2])] = 0;<a name="line.1981"></a> +<span class="sourceLineNo">1982</span> }<a name="line.1982"></a> +<span class="sourceLineNo">1983</span> }<a name="line.1983"></a> +<span class="sourceLineNo">1984</span><a name="line.1984"></a> +<span class="sourceLineNo">1985</span> int i(byte b) {<a name="line.1985"></a> +<span class="sourceLineNo">1986</span> return b - 'a';<a name="line.1986"></a> +<span class="sourceLineNo">1987</span> }<a name="line.1987"></a> +<span class="sourceLineNo">1988</span><a name="line.1988"></a> +<span class="sourceLineNo">1989</span> public void addRow(byte[] row) {<a name="line.1989"></a> +<span class="sourceLineNo">1990</span> seenRows[i(row[0])][i(row[1])][i(row[2])]++;<a name="line.1990"></a> +<span class="sourceLineNo">1991</span> }<a name="line.1991"></a> +<span class="sourceLineNo">1992</span><a name="line.1992"></a> +<span class="sourceLineNo">1993</span> /** Validate that all the rows between startRow and stopRow are seen exactly once, and<a name="line.1993"></a> +<span class="sourceLineNo">1994</span> * all other rows none<a name="line.1994"></a> +<span class="sourceLineNo">1995</span> */<a name="line.1995"></a> +<span class="sourceLineNo">1996</span> public void validate() {<a name="line.1996"></a> +<span class="sourceLineNo">1997</span> for (byte b1 = 'a'; b1 <= 'z'; b1++) {<a name="line.1997"></a> +<span class="sourceLineNo">1998</span> for (byte b2 = 'a'; b2 <= 'z'; b2++) {<a name="line.1998"></a> +<span class="sourceLineNo">1999</span> for (byte b3 = 'a'; b3 <= 'z'; b3++) {<a name="line.1999"></a> +<span class="sourceLineNo">2000</span> int count = seenRows[i(b1)][i(b2)][i(b3)];<a name="line.2000"></a> +<span class="sourceLineNo">2001</span> int expectedCount = 0;<a name="line.2001"></a> +<span class="sourceLineNo">2002</span> if (Bytes.compareTo(new byte[] {b1,b2,b3}, startRow) >= 0<a name="line.2002"></a> +<span class="sourceLineNo">2003</span> && Bytes.compareTo(new byte[] {b1,b2,b3}, stopRow) < 0) {<a name="line.2003"></a> +<span class="sourceLineNo">2004</span> expectedCount = 1;<a name="line.2004"></a> +<span class="sourceLineNo">2005</span> }<a name="line.2005"></a> +<span class="sourceLineNo">2006</span> if (count != expectedCount) {<a name="line.2006"></a> +<span class="sourceLineNo">2007</span> String row = new String(new byte[] {b1,b2,b3});<a name="line.2007"></a> +<span class="sourceLineNo">2008</span> throw new RuntimeException("Row:" + row + " has a seen count of " + count + " instead of " + expectedCount);<a name="line.2008"></a> +<span class="sourceLineNo">2009</span> }<a name="line.2009"></a> +<span class="sourceLineNo">2010</span> }<a name="line.2010"></a> +<span class="sourceLineNo">2011</span> }<a name="line.2011"></a> +<span class="sourceLineNo">2012</span> }<a name="line.2012"></a> +<span class="sourceLineNo">2013</span> }<a name="line.2013"></a> +<span class="sourceLineNo">2014</span> }<a name="line.2014"></a> +<span class="sourceLineNo">2015</span><a name="line.2015"></a> +<span class="sourceLineNo">2016</span> public int loadRegion(final HRegion r, final byte[] f) throws IOException {<a name="line.2016"></a> +<span class="sourceLineNo">2017</span> return loadRegion(r, f, false);<a name="line.2017"></a> +<span class="sourceLineNo">2018</span> }<a name="line.2018"></a> +<span class="sourceLineNo">2019</span><a name="line.2019"></a> +<span class="sourceLineNo">2020</span> public int loadRegion(final Region r, final byte[] f) throws IOException {<a name="line.2020"></a> +<span class="sourceLineNo">2021</span> return loadRegion((HRegion)r, f);<a name="line.2021"></a> +<span class="sourceLineNo">2022</span> }<a name="line.2022"></a> +<span class="sourceLineNo">2023</span><a name="line.2023"></a> +<span class="sourceLineNo">2024</span> /**<a name="line.2024"></a> +<span class="sourceLineNo">2025</span> * Load region with rows from 'aaa' to 'zzz'.<a name="line.2025"></a> +<span class="sourceLineNo">2026</span> * @param r Region<a name="line.2026"></a> +<span class="sourceLineNo">2027</span> * @param f Family<a name="line.2027"></a> +<span class="sourceLineNo">2028</span> * @param flush flush the cache if true<a name="line.2028"></a> +<span class="sourceLineNo">2029</span> * @return Count of rows loaded.<a name="line.2029"></a> +<span class="sourceLineNo">2030</span> * @throws IOException<a name="line.2030"></a> +<span class="sourceLineNo">2031</span> */<a name="line.2031"></a> +<span class="sourceLineNo">2032</span> public int loadRegion(final HRegion r, final byte[] f, final boolean flush)<a name="line.2032"></a> +<span class="sourceLineNo">2033</span> throws IOException {<a name="line.2033"></a> +<span class="sourceLineNo">2034</span> byte[] k = new byte[3];<a name="line.2034"></a> +<span class="sourceLineNo">2035</span> int rowCount = 0;<a name="line.2035"></a> +<span class="sourceLineNo">2036</span> for (byte b1 = 'a'; b1 <= 'z'; b1++) {<a name="line.2036"></a> +<span class="sourceLineNo">2037</span> for (byte b2 = 'a'; b2 <= 'z'; b2++) {<a name="line.2037"></a> +<span class="sourceLineNo">2038</span> for (byte b3 = 'a'; b3 <= 'z'; b3++) {<a name="line.2038"></a> +<span class="sourceLineNo">2039</span> k[0] = b1;<a name="line.2039"></a> +<span class="sourceLineNo">2040</span> k[1] = b2;<a name="line.2040"></a> +<span class="sourceLineNo">2041</span> k[2] = b3;<a name="line.2041"></a> +<span class="sourceLineNo">2042</span> Put put = new Put(k);<a name="line.2042"></a> +<span class="sourceLineNo">2043</span> put.setDurability(Durability.SKIP_WAL);<a name="line.2043"></a> +<span class="sourceLineNo">2044</span> put.addColumn(f, null, k);<a name="line.2044"></a> +<span class="sourceLineNo">2045</span> if (r.getWAL() == null) {<a name="line.2045"></a> +<span class="sourceLineNo">2046</span> put.setDurability(Durability.SKIP_WAL);<a name="line.2046"></a> +<span class="sourceLineNo">2047</span> }<a name="line.2047"></a> +<span class="sourceLineNo">2048</span> int preRowCount = rowCount;<a name="line.2048"></a> +<span class="sourceLineNo">2049</span> int pause = 10;<a name="line.2049"></a> +<span class="sourceLineNo">2050</span> int maxPause = 1000;<a name="line.2050"></a> +<span class="sourceLineNo">2051</span> while (rowCount == preRowCount) {<a name="line.2051"></a> +<span class="sourceLineNo">2052</span> try {<a name="line.2052"></a> +<span class="sourceLineNo">2053</span> r.put(put);<a name="line.2053"></a> +<span class="sourceLineNo">2054</span> rowCount++;<a name="line.2054"></a> +<span class="sourceLineNo">2055</span> } catch (RegionTooBusyException e) {<a name="line.2055"></a> +<span class="sourceLineNo">2056</span> pause = (pause * 2 >= maxPause) ? maxPause : pause * 2;<a name="line.2056"></a> +<span class="sourceLineNo">2057</span> Threads.sleep(pause);<a name="line.2057"></a> +<span class="sourceLineNo">2058</span> }<a name="line.2058"></a> +<span class="sourceLineNo">2059</span> }<a name="line.2059"></a> +<span class="sourceLineNo">2060</span> }<a name="line.2060"></a> <span class="sourceLineNo">2061</span> }<a name="line.2061"></a> -<span class="sourceLineNo">2062</span> }<a name="line.2062"></a> -<span class="sourceLineNo">2063</span> return rowCount;<a name="line.2063"></a> -<span class="sourceLineNo">2064</span> }<a name="line.2064"></a> -<span class="sourceLineNo">2065</span><a name="line.2065"></a> -<span class="sourceLineNo">2066</span> public void loadNumericRows(final Table t, final byte[] f, int startRow, int endRow)<a name="line.2066"></a> -<span class="sourceLineNo">2067</span> throws IOException {<a name="line.2067"></a> -<span class="sourceLineNo">2068</span> for (int i = startRow; i < endRow; i++) {<a name="line.2068"></a> -<span class="sourceLineNo">2069</span> byte[] data = Bytes.toBytes(String.valueOf(i));<a name="line.2069"></a> -<span class="sourceLineNo">2070</span> Put put = new Put(data);<a name="line.2070"></a> -<span class="sourceLineNo">2071</span> put.addColumn(f, null, data);<a name="line.2071"></a> -<span class="sourceLineNo">2072</span> t.put(put);<a name="line.2072"></a> -<span class="sourceLineNo">2073</span> }<a name="line.2073"></a> -<span class="sourceLineNo">2074</span> }<a name="line.2074"></a> -<span class="sourceLineNo">2075</span><a name="line.2075"></a> -<span class="sourceLineNo">2076</span> public void verifyNumericRows(Table table, final byte[] f, int startRow, int endRow,<a name="line.2076"></a> -<span class="sourceLineNo">2077</span> int replicaId)<a name="line.2077"></a> -<span class="sourceLineNo">2078</span> throws IOException {<a name="line.2078"></a> -<span class="sourceLineNo">2079</span> for (int i = startRow; i < endRow; i++) {<a name="line.2079"></a> -<span class="sourceLineNo">2080</span> String failMsg = "Failed verification of row :" + i;<a name="line.2080"></a> -<span class="sourceLineNo">2081</span> byte[] data = Bytes.toBytes(String.valueOf(i));<a name="line.2081"></a> -<span class="sourceLineNo">2082</span> Get get = new Get(data);<a name="line.2082"></a> -<span class="sourceLineNo">2083</span> get.setReplicaId(replicaId);<a name="line.2083"></a> -<span class="sourceLineNo">2084</span> get.setConsistency(Consistency.TIMELINE);<a name="line.2084"></a> -<span class="sourceLineNo">2085</span> Result result = table.get(get);<a name="line.2085"></a> -<span class="sourceLineNo">2086</span> assertTrue(failMsg, result.containsColumn(f, null));<a name="line.2086"></a> -<span class="sourceLineNo">2087</span> assertEquals(failMsg, result.getColumnCells(f, null).size(), 1);<a name="line.2087"></a> -<span class="sourceLineNo">2088</span> Cell cell = result.getColumnLatestCell(f, null);<a name="line.2088"></a> -<span class="sourceLineNo">2089</span> assertTrue(failMsg,<a name="line.2089"></a> -<span class="sourceLineNo">2090</span> Bytes.equals(data, 0, data.length, cell.getValueArray(), cell.getValueOffset(),<a name="line.2090"></a> -<span class="sourceLineNo">2091</span> cell.getValueLength()));<a name="line.2091"></a> -<span class="sourceLineNo">2092</span> }<a name="line.2092"></a> -<span class="sourceLineNo">2093</span> }<a name="line.2093"></a> -<span class="sourceLineNo">2094</span><a name="line.2094"></a> -<span class="sourceLineNo">2095</span> public void verifyNumericRows(Region region, final byte[] f, int startRow, int endRow)<a name="line.2095"></a> -<span class="sourceLineNo">2096</span> throws IOException {<a name="line.2096"></a> -<span class="sourceLineNo">2097</span> verifyNumericRows((HRegion)region, f, startRow, endRow);<a name="line.2097"></a> -<span class="sourceLineNo">2098</span> }<a name="line.2098"></a> -<span class="sourceLineNo">2099</span><a name="line.2099"></a> -<span class="sourceLineNo">2100</span> public void verifyNumericRows(HRegion region, final byte[] f, int startRow, int endRow)<a name="line.2100"></a> -<span class="sourceLineNo">2101</span> throws IOException {<a name="line.2101"></a> -<span class="sourceLineNo">2102</span> verifyNumericRows(region, f, startRow, endRow, true);<a name="line.2102"></a> -<span class="sourceLineNo">2103</span> }<a name="line.2103"></a> -<span class="sourceLineNo">2104</span><a name="line.2104"></a> -<span class="sourceLineNo">2105</span> public void verifyNumericRows(Region region, final byte[] f, int startRow, int endRow,<a name="line.2105"></a> -<span class="sourceLineNo">2106</span> final boolean present) throws IOException {<a name="line.2106"></a> -<span class="sourceLineNo">2107</span> verifyNumericRows((HRegion)region, f, startRow, endRow, present);<a name="line.2107"></a> -<span class="sourceLineNo">2108</span> }<a name="line.2108"></a> -<span class="sourceLineNo">2109</span><a name="line.2109"></a> -<span class="sourceLineNo">2110</span> public void verifyNumericRows(HRegion region, final byte[] f, int startRow, int endRow,<a name="line.2110"></a> -<span class="sourceLineNo">2111</span> final boolean present) throws IOException {<a name="line.2111"></a> -<span class="sourceLineNo">2112</span> for (int i = startRow; i < endRow; i++) {<a name="line.2112"></a> -<span class="sourceLineNo">2113</span> String failMsg = "Failed verification of row :" + i;<a name="line.2113"></a> -<span class="sourceLineNo">2114</span> byte[] data = Bytes.toBytes(String.valueOf(i));<a name="line.2114"></a> -<span class="sourceLineNo">2115</span> Result result = region.get(new Get(data));<a name="line.2115"></a> -<span class="sourceLineNo">2116</span><a name="line.2116"></a> -<span class="sourceLineNo">2117</span> boolean hasResult = result != null && !result.isEmpty();<a name="line.2117"></a> -<span class="sourceLineNo">2118</span> assertEquals(failMsg + result, present, hasResult);<a name="line.2118"></a> -<span class="sourceLineNo">2119</span> if (!present) continue;<a name="line.2119"></a> -<span class="sourceLineNo">2120</span><a name="line.2120"></a> -<span class="sourceLineNo">2121</span> assertTrue(failMsg, result.containsColumn(f, null));<a name="line.2121"></a> -<span class="sourceLineNo">2122</span> assertEquals(failMsg, result.getColumnCells(f, null).size(), 1);<a name="line.2122"></a> -<span class="sourceLineNo">2123</span> Cell cell = result.getColumnLatestCell(f, null);<a name="line.2123"></a> -<span class="sourceLineNo">2124</span> assertTrue(failMsg,<a name="line.2124"></a> -<span class="sourceLineNo">2125</span> Bytes.equals(data, 0, data.length, cell.getValueArray(), cell.getValueOffset(),<a name="line.2125"></a> -<span class="sourceLineNo">2126</span> cell.getValueLength()));<a name="line.2126"></a> -<span class="sourceLineNo">2127</span> }<a name="line.2127"></a> -<span class="sourceLineNo">2128</span> }<a name="line.2128"></a> -<span class="sourceLineNo">2129</span><a name="line.2129"></a> -<span class="sourceLineNo">2130</span> public void deleteNumericRows(final Table t, final byte[] f, int startRow, int endRow)<a name="line.2130"></a> -<span class="sourceLineNo">2131</span> throws IOException {<a name="line.2131"></a> -<span class="sourceLineNo">2132</span> for (int i = startRow; i < endRow; i++) {<a name="line.2132"></a> -<span class="sourceLineNo">2133</span> byte[] data = Bytes.toBytes(String.valueOf(i));<a name="line.2133"></a> -<span class="sourceLineNo">2134</span> Delete delete = new Delete(data);<a name="line.2134"></a> -<span class="sourceLineNo">2135</span> delete.addFamily(f);<a name="line.2135"></a> -<span class="sourceLineNo">2136</span> t.delete(delete);<a name="line.2136"></a> -<span class="sourceLineNo">2137</span> }<a name="line.2137"></a> -<span class="sourceLineNo">2138</span> }<a name="line.2138"></a> -<span class="sourceLineNo">2139</span><a name="line.2139"></a> -<span class="sourceLineNo">2140</span> /**<a name="line.2140"></a> -<span class="sourceLineNo">2141</span> * Return the number of rows in the given table.<a name="line.2141"></a> -<span class="sourceLineNo">2142</span> */<a name="line.2142"></a> -<span class="sourceLineNo">2143</span> public int countRows(final Table table) throws IOException {<a name="line.2143"></a> -<span class="sourceLineNo">2144</span> return countRows(table, new Scan());<a name="line.2144"></a> -<span class="sourceLineNo">2145</span> }<a name="line.2145"></a> -<span class="sourceLineNo">2146</span><a name="line.2146"></a> -<span class="sourceLineNo">2147</span> public int countRows(final Table table, final Scan scan) throws IOException {<a name="line.2147"></a> -<span class="sourceLineNo">2148</span> ResultScanner results = table.getScanner(scan);<a name="line.2148"></a> -<span class="sourceLineNo">2149</span> int count = 0;<a name="line.2149"></a> -<span class="sourceLineNo">2150</span> for (@SuppressWarnings("unused") Result res : results) {<a name="line.2150"></a> -<span class="sourceLineNo">2151</span> count++;<a name="line.2151"></a> -<span class="sourceLineNo">2152</span> }<a name="line.2152"></a> -<span class="sourceLineNo">2153</span> results.close();<a name="line.2153"></a> -<span class="sourceLineNo">2154</span> return count;<a name="line.2154"></a> -<span class="sourceLineNo">2155</span> }<a name="line.2155"></a> -<span class="sourceLineNo">2156</span><a name="line.2156"></a> -<span class="sourceLineNo">2157</span> public int countRows(final Table table, final byte[]... families) throws IOException {<a name="line.2157"></a> -<span class="sourceLineNo">2158</span> Scan scan = new Scan();<a name="line.2158"></a> -<span class="sourceLineNo">2159</span> for (byte[] family: families) {<a name="line.2159"></a> -<span class="sourceLineNo">2160</span> scan.addFamily(family);<a name="line.2160"></a> -<span class="sourceLineNo">2161</span> }<a name="line.2161"></a> -<span class="sourceLineNo">2162</span> ResultScanner results = table.getScanner(scan);<a name="line.2162"></a> -<span class="sourceLineNo">2163</span> int count = 0;<a name="line.2163"></a> -<span class="sourceLineNo">2164</span> for (@SuppressWarnings("unused") Result res : results) {<a name="line.2164"></a> -<span class="sourceLineNo">2165</span> count++;<a name="line.2165"></a> -<span class="sourceLineNo">2166</span> }<a name="line.2166"></a> -<span class="sourceLineNo">2167</span> results.close();<a name="line.2167"></a> -<span class="sourceLineNo">2168</span> return count;<a name="line.2168"></a> -<span class="sourceLineNo">2169</span> }<a name="line.2169"></a> -<span class="sourceLineNo">2170</span><a name="line.2170"></a> -<span class="sourceLineNo">2171</span> /**<a name="line.2171"></a> -<span class="sourceLineNo">2172</span> * Return the number of rows in the given table.<a name="line.2172"></a> -<span class="sourceLineNo">2173</span> */<a name="line.2173"></a> -<span class="sourceLineNo">2174</span> public int countRows(final TableName tableName) throws IOException {<a name="line.2174"></a> -<span class="sourceLineNo">2175</span> Table table = getConnection().getTable(tableName);<a name="line.2175"></a> -<span class="sourceLineNo">2176</span> try {<a name="line.2176"></a> -<span class="sourceLineNo">2177</span> return countRows(table);<a name="line.2177"></a> -<span class="sourceLineNo">2178</span> } finally {<a name="line.2178"></a> -<span class="sourceLineNo">2179</span> table.close();<a name="line.2179"></a> -<span class="sourceLineNo">2180</span> }<a name="line.2180"></a> -<span class="sourceLineNo">2181</span> }<a name="line.2181"></a> -<span class="sourceLineNo">2182</span><a name="line.2182"></a> -<span class="sourceLineNo">2183</span> /**<a name="line.2183"></a> -<span class="sourceLineNo">2184</span> * Return an md5 digest of the entire contents of a table.<a name="line.2184"></a> -<span class="sourceLineNo">2185</span> */<a name="line.2185"></a> -<span class="sourceLineNo">2186</span> public String checksumRows(final Table table) throws Exception {<a name="line.2186"></a> -<span class="sourceLineNo">2187</span><a name="line.2187"></a> -<span class="sourceLineNo">2188</span> Scan scan = new Scan();<a name="line.2188"></a> -<span class="sourceLineNo">2189</span> ResultScanner results = table.getScanner(scan);<a name="line.2189"></a> -<span class="sourceLineNo">2190</span> MessageDigest digest = MessageDigest.getInstance("MD5");<a name="line.2190"></a> -<span class="sourceLineNo">2191</span> for (Result res : results) {<a name="line.2191"></a> -<span class="sourceLineNo">2192</span> digest.update(res.getRow());<a name="line.2192"></a> -<span class="sourceLineNo">2193</span> }<a name="line.2193"></a> -<span class="sourceLineNo">2194</span> results.close();<a name="line.2194"></a> -<span class="sourceLineNo">2195</span> return digest.toString();<a name="line.2195"></a> -<span class="sourceLineNo">2196</span> }<a name="line.2196"></a> -<span class="sourceLineNo">2197</span><a name="line.2197"></a> -<span class="sourceLineNo">2198</span> /** All the row values for the data loaded by {@link #loadTable(HTable, byte[])} */<a name="line.2198"></a> -<span class="sourceLineNo">2199</span> public static final byte[][] ROWS = new byte[(int) Math.pow('z' - 'a' + 1, 3)][3]; // ~52KB<a name="line.2199"></a> -<span class="sourceLineNo">2200</span> static {<a name="line.2200"></a> -<span class="sourceLineNo">2201</span> int i = 0;<a name="line.2201"></a> -<span class="sourceLineNo">2202</span> for (byte b1 = 'a'; b1 <= 'z'; b1++) {<a name="line.2202"></a> -<span class="sourceLineNo">2203</span> for (byte b2 = 'a'; b2 <= 'z'; b2++) {<a name="line.2203"></a> -<span class="sourceLineNo">2204</span> for (byte b3 = 'a'; b3 <= 'z'; b3++) {<a name="line.2204"></a> -<span class="sourceLineNo">2205</span> ROWS[i][0] = b1;<a name="line.2205"></a> -<span class="sourceLineNo">2206</span> ROWS[i][1] = b2;<a name="line.2206"></a> -<span class="sourceLineNo">2207</span> ROWS[i][2] = b3;<a name="line.2207"></a> -<span class="sourceLineNo">2208</span> i++;<a name="line.2208"></a> -<span class="sourceLineNo">2209</span> }<a name="line.2209"></a> -<span class="sourceLineNo">2210</span> }<a name="line.2210"></a> -<span class="sourceLineNo">2211</span> }<a name="line.2211"></a> -<span class="sourceLineNo">2212</span> }<a name="line.2212"></a> -<span class="sourceLineNo">2213</span><a name="line.2213"></a> -<span class="sourceLineNo">2214</span> public static final byte[][] KEYS = {<a name="line.2214"></a> -<span class="sourceLineNo">2215</span> HConstants.EMPTY_BYTE_ARRAY, Bytes.toBytes("bbb"),<a name="line.2215"></a> -<span class="sourceLineNo">2216</span> Bytes.toBytes("ccc"), Bytes.toBytes("ddd"), Bytes.toBytes("eee"),<a name="line.2216"></a> -<span class="sourceLineNo">2217</span> Bytes.toBytes("fff"), Bytes.toBytes("ggg"), Bytes.toBytes("hhh"),<a name="line.2217"></a> -<span class="sourceLineNo">2218</span> Bytes.toBytes("iii"), Bytes.toBytes("jjj"), Bytes.toBytes("kkk"),<a name="line.2218"></a> -<span class="sourceLineNo">2219</span> Bytes.toBytes("lll"), Bytes.toBytes("mmm"), Bytes.toBytes("nnn"),<a name="line.2219"></a> -<span class="sourceLineNo">2220</span> Bytes.toBytes("ooo"), Bytes.toBytes("ppp"), Bytes.toBytes("qqq"),<a name="line.2220"></a> -<span class="sourceLineNo">2221</span> Bytes.toBytes("rrr"), Bytes.toBytes("sss"), Bytes.toBytes("ttt"),<a name="line.2221"></a> -<span class="sourceLineNo">2222</span> Bytes.toBytes("uuu"), Bytes.toBytes("vvv"), Bytes.toBytes("www"),<a name="line.2222"></a> -<span class="sourceLineNo">2223</span> Bytes.toBytes("xxx"), Bytes.toBytes("yyy")<a name="line.2223"></a> -<span class="sourceLineNo">2224</span> };<a name="line.2224"></a> -<span class="sourceLineNo">2225</span><a name="line.2225"></a> -<span class="sourceLineNo">2226</span> public static final byte[][] KEYS_FOR_HBA_CREATE_TABLE = {<a name="line.2226"></a> -<span class="sourceLineNo">2227</span> Bytes.toBytes("bbb"),<a name="line.2227"></a> -<span class="sourceLineNo">2228</span> Bytes.toBytes("ccc"), Bytes.toBytes("ddd"), Bytes.toBytes("eee"),<a name="line.2228"></a> -<span class="sourceLineNo">2229</span> Bytes.toBytes("fff"), Bytes.toBytes("ggg"), Bytes.toBytes("hhh"),<a name="line.2229"></a> -<span class="sourceLineNo">2230</span> Bytes.toBytes("iii"), Bytes.toBytes("jjj"), Bytes.toBytes("kkk"),<a name="line.2230"></a> -<span class="sourceLineNo">2231</span> Bytes.toBytes("lll"), Bytes.toBytes("mmm"), Bytes.toBytes("nnn"),<a name="line.2231"></a> -<span class="sourceLineNo">2232</span> Bytes.toBytes("ooo"), Bytes.toBytes("ppp"), Bytes.toBytes("qqq"),<a name="line.2232"></a> -<span class="sourceLineNo">2233</span> Bytes.toBytes("rrr"), Bytes.toBytes("sss"), Bytes.toBytes("ttt"),<a name="line.2233"></a> -<span class="sourceLineNo">2234</span> Bytes.toBytes("uuu"), Bytes.toBytes("vvv"), Bytes.toBytes("www"),<a name="line.2234"></a> -<span class="sourceLineNo">2235</span> Bytes.toBytes("xxx"), Bytes.toBytes("yyy"), Bytes.toBytes("zzz")<a name="line.2235"></a> -<span class="sourceLineNo">2236</span> };<a name="line.2236"></a> -<span class="sourceLineNo">2237</span><a name="line.2237"></a> -<span class="sourceLineNo">2238</span> /**<a name="line.2238"></a> -<span class="sourceLineNo">2239</span> * Create rows in hbase:meta for regions of the specified table with the specified<a name="line.2239"></a> -<span class="sourceLineNo">2240</span> * start keys. The first startKey should be a 0 length byte array if you<a name="line.2240"></a> -<span class="sourceLineNo">2241</span> * want to form a proper range of regions.<a name="line.2241"></a> -<span class="sourceLineNo">2242</span> * @param conf<a name="line.2242"></a> -<span class="sourceLineNo">2243</span> * @param htd<a name="line.2243"></a> -<span class="sourceLineNo">2244</span> * @param startKeys<a name="line.2244"></a> -<span class="sourceLineNo">2245</span> * @return list of region info for regions added to meta<a name="line.2245"></a> -<span class="sourceLineNo">2246</span> * @throws IOException<a name="line.2246"></a> -<span class="sourceLineNo">2247</span> */<a name="line.2247"></a> -<span class="sourceLineNo">2248</span> public List<HRegionInfo> createMultiRegionsInMeta(final Configuration conf,<a name="line.2248"></a> -<span class="sourceLineNo">2249</span> final HTableDescriptor htd, byte [][] startKeys)<a name="line.2249"></a> -<span class="sourceLineNo">2250</span> throws IOException {<a name="line.2250"></a> -<span class="sourceLineNo">2251</span> Table meta = getConnection().getTable(TableName.META_TABLE_NAME);<a name="line.2251"></a> -<span class="sourceLineNo">2252</span> Arrays.sort(startKeys, Bytes.BYTES_COMPARATOR);<a name="line.2252"></a> -<span class="sourceLineNo">2253</span> List<HRegionInfo> newRegions = new ArrayList<HRegionInfo>(startKeys.length);<a name="line.2253"></a> -<span class="sourceLineNo">2254</span> MetaTableAccessor<a name="line.2254"></a> -<span class="sourceLineNo">2255</span> .updateTableState(getConnection(), htd.getTableName(), TableState.State.ENABLED);<a name="line.2255"></a> -<span class="sourceLineNo">2256</span> // add custom ones<a name="line.2256"></a> -<span class="sourceLineNo">2257</span> for (int i = 0; i < startKeys.length; i++) {<a name="line.2257"></a> -<span class="sourceLineNo">2258</span> int j = (i + 1) % startKeys.length;<a name="line.2258"></a> -<span class="sourceLineNo">2259</span> HRegionInfo hri = new HRegionInfo(htd.getTableName(), startKeys[i],<a name="line.2259"></a> -<span class="sourceLineNo">2260</span> startKeys[j]);<a name="line.2260"></a> -<span class="sourceLineNo">2261</span> MetaTableAccessor.addRegionToMeta(meta, hri);<a name="line.2261"></a> -<span class="sourceLineNo">2262</span> newRegions.add(hri);<a name="line.2262"></a> -<span class="sourceLineNo">2263</span> }<a name="line.2263"></a> -<span class="sourceLineNo">2264</span><a name="line.2264"></a> -<span class="sourceLineNo">2265</span> meta.close();<a name="line.2265"></a> -<span class="sourceLineNo">2266</span> return newRegions;<a name="line.2266"></a> -<span class="sourceLineNo">2267</span> }<a name="line.2267"></a> -<span class="sourceLineNo">2268</span><a name="line.2268"></a> -<span class="sourceLineNo">2269</span> /**<a name="line.2269"></a> -<span class="sourceLineNo">2270</span> * Create an unmanaged WAL. Be sure to close it when you're through.<a name="line.2270"></a> -<span class="sourceLineNo">2271</span> */<a name="line.2271"></a> -<span class="sourceLineNo">2272</span> public static WAL createWal(final Configuration conf, final Path rootDir, final HRegionInfo hri)<a name="line.2272"></a> -<span class="sourceLineNo">2273</span> throws IOException {<a name="line.2273"></a> -<span class="sourceLineNo">2274</span> // The WAL subsystem will use the default rootDir rather than the passed in rootDir<a name="line.2274"></a> -<span class="sourceLineNo">2275</span> // unless I pass along via the conf.<a name="line.2275"></a> -<span class="sourceLineNo">2276</span> Configuration confForWAL = new Configuration(conf);<a name="line.2276"></a> -<span class="sourceLineNo">2277</span> confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.2277"></a> -<span class="sourceLineNo">2278</span> return (new WALFactory(confForWAL,<a name="line.2278"></a> -<span class="sourceLineNo">2279</span> Collections.<WALActionsListener>singletonList(new MetricsWAL()),<a name="line.2279"></a> -<span class="sourceLineNo">2280</span> "hregion-" + RandomStringUtils.randomNumeric(8))).<a name="line.2280"></a> -<span class="sourceLineNo">2281</span> getWAL(hri.getEncodedNameAsBytes(), hri.getTable().getNamespace());<a name="line.2281"></a> -<span class="sourceLineNo">2282</span> }<a name="line.2282"></a> -<span class="sourceLineNo">2283</span><a name="line.2283"></a> -<span class="sourceLineNo">2284</span> /**<a name="line.2284"></a> -<span class="sourceLineNo">2285</span> * Create a region with it's own WAL. Be sure to call<a name="line.2285"></a> -<span class="sourceLineNo">2286</span> * {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} to clean up all resources.<a name="line.2286"></a> -<span class="sourceLineNo">2287</span> */<a name="line.2287"></a> -<span class="sourceLineNo">2288</span> public static HRegion createRegionAndWAL(final HRegionInfo info, final Path rootDir,<a name="line.2288"></a> -<span class="sourceLineNo">2289</span> final Configuration conf, final HTableDescriptor htd) throws IOException {<a name="line.2289"></a> -<span class="sourceLineNo">2290</span> return createRegionAndWAL(info, rootDir, conf, htd, true);<a name="line.2290"></a> -<span class="sourceLineNo">2291</span> }<a name="line.2291"></a> -<span class="sourceLineNo">2292</span><a name="line.2292"></a> -<span class="sourceLineNo">2293</span> /**<a name="line.2293"></a> -<span class="sourceLineNo">2294</span> * Create a region with it's own WAL. Be sure to call<a name="line.2294"></a> -<span class="sourceLineNo">2295</span> * {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} to clean up all resources.<a name="line.2295"></a> -<span class="sourceLineNo">2296</span> */<a name="line.2296"></a> -<span class="sourceLineNo">2297</span> public static HRegion createRegionAndWAL(final HRegionInfo info, final Path rootDir,<a name="line.2297"></a> -<span class="sourceLineNo">2298</span> final Configuration conf, final HTableDescriptor htd, boolean initialize)<a name="line.2298"></a> -<span class="sourceLineNo">2299</span> throws IOException {<a name="line.2299"></a> -<span class="sourceLineNo">2300</span> WAL wal = createWal(conf, rootDir, info);<a name="line.2300"></a> -<span class="sourceLineNo">2301</span> return HRegion.createHRegion(info, rootDir, conf, htd, wal, initialize);<a name="line.2301"></a> -<span class="sourceLineNo">2302</span> }<a name="line.2302"></a> -<span class="sourceLineNo">2303</span><a name="line.2303"></a> -<span class="sourceLineNo">2304</span> /**<a name="line.2304"></a> -<span class="sourceLineNo">2305</span> * Returns all rows from the hbase:meta table.<a name="line.2305"></a> -<span class="sourceLineNo">2306</span> *<a name="line.2306"></a> -<span class="sourceLineNo">2307</span> * @throws IOException When reading the rows fails.<a name="line.2307"></a> -<span class="sourceLineNo">2308</span> */<a name="line.2308"></a> -<span class="sourceLineNo">2309</span> public List<byte[]> getMetaTableRows() throws IOException {<a name="line.2309"></a> -<span class="sourceLineNo">2310</span> // TODO: Redo using MetaTableAccessor class<a name="line.2310"></a> -<span class="sourceLineNo">2311</span> Table t = getConnection().getTable(TableName.META_TABLE_NAME);<a name="line.2311"></a> -<span class="sourceLineNo">2312</span> List<byte[]> rows = new ArrayList<byte[]>();<a name="line.2312"></a> -<span class="sourceLineNo">2313</span> ResultScanner s = t.getScanner(new Scan());<a name="line.2313"></a> -<span class="sourceLineNo">2314</span> for (Result result : s) {<a name="line.2314"></a> -<span class="sourceLineNo">2315</span> LOG.info("getMetaTableRows: row -> " +<a name="line.2315"></a> -<span class="sourceLineNo">2316</span> Bytes.toStringBinary(result.getRow()));<a name="line.2316"></a> -<span class="sourceLineNo">2317</span> rows.add(result.getRow());<a name="line.2317"></a> -<span class="sourceLineNo">2318</span> }<a name="line.2318"></a> -<span class="sourceLineNo">2319</span> s.close();<a name="line.2319"></a> -<span class="sourceLineNo">2320</span> t.close();<a name="line.2320"></a> -<span class="sourceLineNo">2321</span> return rows;<a name="line.2321"></a> -<span class="sourceLineNo">2322</span> }<a name="line.2322"></a> -<span class="sourceLineNo">2323</span><a name="line.2323"></a> -<span class="sourceLineNo">2324</span> /**<a name="line.2324"></a> -<span class="sourceLineNo">2325</span> * Returns all rows from the hbase:meta table for a given user table<a name="line.2325"></a> -<span class="sourceLineNo">2326</span> *<a name="line.2326"></a> -<span class="sourceLineNo">2327</span> * @throws IOException When reading the rows fails.<a name="line.2327"></a> -<span class="sourceLineNo">2328</span> */<a name="line.2328"></a> -<span class="sourceLineNo">2329</span> public List<byte[]> getMetaTableRows(TableName tableName) throws IOException {<a name="line.2329"></a> -<span class="sourceLineNo">2330</span> // TODO: Redo using MetaTableAccessor.<a name="line.2330"></a> -<span class="sourceLineNo">2331</span> Table t = getConnection().getTable(TableName.META_TABLE_NAME);<a name="line.2331"></a> -<span class="sourceLineNo">2332</span> List<byte[]> rows = new ArrayList<byte[]>();<a name="line.2332"></a> -<span class="sourceLineNo">2333</span> ResultScanner s = t.getScanner(new Scan());<a name="line.2333"></a> -<span class="sourceLineNo">2334</span> for (Result result : s) {<a name="line.2334"></a> -<span class="sourceLineNo">2335</span> HRegionInfo info = MetaTableAccessor.getHRegionInfo(result);<a name="line.2335"></a> -<span class="sourceLineNo">2336</span> if (info == null) {<a name="line.2336"></a> -<span class="sourceLineNo">2337</span> LOG.error("No region info for row " + Bytes.toString(result.getRow()));<a name="line.2337"></a> -<span class="sourceLineNo">2338</span> // TODO figure out what to do for this new hosed case.<a name="line.2338"></a> -<span class="sourceLineNo">2339</span> continue;<a name="line.2339"></a> -<span class="sourceLineNo">2340</span> }<a name="line.2340"></a> -<span class="sourceLineNo">2341</span><a name="line.2341"></a> -<span class="sourceLineNo">2342</span> if (info.getTable().equals(tableName)) {<a name="line.2342"></a> -<span class="sourceLineNo">2343</span> LOG.info("getMetaTableRows: row -> " +<a name="line.2343"></a> -<span class="sourceLineNo">2344</span> Bytes.toStringBinary(result.getRow()) + info);<a name="line.2344"></a> -<span class="sourceLineNo">2345</span> rows.add(result.getRow());<a name="line.2345"></a> -<span class="sourceLineNo">2346</span> }<a name="line.2346"></a> -<span class="sourceLineNo">2347</span> }<a name="line.2347"></a> -<span class="sourceLineNo">2348</span> s.close();<a name="line.2348"></a> -<span class="sourceLineNo">2349</span> t.close();<a name="line.2349"></a> -<span class="sourceLineNo">2350</span> return rows;<a name="line.2350"></a> -<span class="sourceLineNo">2351</span> }<a name="line.2351"></a> -<span class="sourceLineNo">2352</span><a name="line.2352"></a> -<span class="sourceLineNo">2353</span> /**<a name="line.2353"></a> -<span class="sourceLineNo">2354</span> * Tool to get the reference to the region server object that holds the<a name="line.2354"></a> -<span class="sourceLineNo">2355</span> * region of the specified user table.<a name="line.2355"></a> -<span class="sourceLineNo">2356</span> * It first searches for the meta rows that contain the region of the<a name="line.2356"></a> -<span class="sourceLineNo">2357</span> * specified table, then gets the index of that RS, and finally retrieves<a name="line.2357"></a> -<span class="sourceLineNo">2358</span> * the RS's reference.<a name="line.2358"></a> -<span class="sourceLineNo">2359</span> * @param tableName user table to lookup in hbase:meta<a name="line.2359"></a> -<span class="sourceLineNo">2360</span> * @return region server that holds it, null if the row doesn't exist<a name="line.2360"></a> -<span class="sourceLineNo">2361</span> * @throws IOException<a name="line.2361"></a> -<span class="sourceLineNo">2362</span> * @throws InterruptedException<a name="line.2362"></a> -<span class="sourceLineNo">2363</span> */<a name="line.2363"></a> -<span class="sourceLineNo">2364</span> public HRegionServer getRSForFirstRegionInTable(TableName tableName)<a name="line.2364"></a> -<span class="sourceLineNo">2365</span> throws IOException, InterruptedException {<a name="line.2365"></a> -<span class="sourceLineNo">2366</span> List<byte[]> metaRows = getMetaTableRows(tableName);<a name="line.2366"></a> -<span class="sourceLineNo">2367</span> if (metaRows == null || metaRows.isEmpty()) {<a name="line.2367"></a> -<span class="sourceLineNo">2368</span> return null;<a name="line.2368"></a> -<span class="sourceLineNo">2369</span> }<a name="line.2369"></a> -<span class="sourceLineNo">2370</span> LOG.debug("Found " + metaRows.size() + " rows for table " +<a name="line.2370"></a> -<span class="sourceLineNo">2371</span> tableName);<a name="line.2371"></a> -<span class="sourceLineNo">2372</span> byte [] firstrow = metaRows.get(0);<a name="line.2372"></a> -<span class="sourceLineNo">2373</span> LOG.debug("FirstRow=" + Bytes.toString(firstrow));<a name="line.2373"></a> -<span class="sourceLineNo">2374</span> long pause = getConfiguration().getLong(HConstants.HBASE_CLIENT_PAUSE,<a name="line.2374"></a> -<span class="sourceLineNo">2375</span> HConstants.DEFAULT_HBASE_CLIENT_PAUSE);<a name="line.2375"></a> -<span class="sourceLineNo">2376</span> int numRetries = getConfiguration().getInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER,<a name="line.2376"></a> -<span class="sourceLineNo">2377</span> HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER);<a name="line.2377"></a> -<span class="sourceLineNo">2378</span> RetryCounter retrier = new RetryCounter(numRetries+1, (int)pause, TimeUnit.MICROSECONDS);<a name="line.2378"></a> -<span class="sourceLineNo">2379</span> while(retrier.shouldRetry()) {<a name="line.2379"></a> -<span class="sourceLineNo">2380</span> int index = getMiniHBaseCluster().getServerWith(firstrow);<a name="line.2380"></a> -<span class="sourceLineNo">2381</span> if (index != -1) {<a name="line.2381"></a> -<span class="sourceLineNo">2382</span> return getMiniHBaseCluster().getRegionServerThreads().get(index).getRegionServer();<a name="line.2382"></a> -<span class="sourceLineNo">2383</span> }<a name="line.2383"></a> -<span class="sourceLineNo">2384</span> // Came back -1. Region may not be online yet. Sleep a while.<a name="line.2384"></a> -<span class="sourceLineNo">2385</span> retrier.sleepUntilNextRetry();<a name="line.2385"></a> -<span class="sourceLineNo">2386</span> }<a name="line.2386"></a> -<span class="sourceLineNo">2387</span> return null;<a name="line.2387"></a> -<span class="sourceLineNo">2388</span> }<a name="line.2388"></a> -<span class="sourceLineNo">2389</span><a name="line.2389"></a> -<span class="sourceLineNo">2390</span> /**<a name="line.2390"></a> -<span class="sourceLineNo">2391</span> * Starts a <code>MiniMRCluster</code> with a default number of<a name="line.2391"></a> -<span class="sourceLineNo">2392</span> * <code>TaskTracker</code>'s.<a name="line.2392"></a> -<span class="sourceLineNo">2393</span> *<a name="line.2393"></a> -<span class="sourceLineNo">2394</span> * @throws IOException When starting the cluster fails.<a name="line.2394"></a> -<span class="sourceLineNo">2395</span> */<a name="line.2395"></a> -<span class="sourceLineNo">2396</span> public MiniMRCluster startMiniMapReduceCluster() throws IOException {<a name="line.2396"></a> -<span class="sourceLineNo">2397</span> startMiniMapReduceCluster(2);<a name="line.2397"></a> -<span class="sourceLineNo">2398</span> return mrCluster;<a name="line.2398"></a> -<span class="sourceLineNo">2399</span> }<a name="line.2399"></a> -<span class="sourceLineNo">2400</span><a name="line.2400"></a> -<span class="sourceLineNo">2401</span> /**<a name="line.2401"></a> -<span class="sourceLineNo">2402</span> * Tasktracker has a bug where changing the hadoop.log.dir system property<a name="line.2402"></a> -<span class="sourceLineNo">2403</span> * will not change its internal static LOG_DIR variable.<a name="line.2403"></a> -<span class="sourceLineNo">2404</span> */<a name="line.2404"></a> -<span class="sourceLineNo">2405</span> private void forceChangeTaskLogDir() {<a name="line.2405"></a> -<span class="sourceLineNo">2406</span> Field logDirField;<a name="line.2406"></a> -<span class="sourceLineNo">2407</span> try {<a name="line.2407"></a> -<span class="sourceLineNo">2408</span> logDirField = TaskLog.class.getDeclaredField("LOG_DIR");<a name="line.2408"></a> -<span class="sourceLineNo">2409</span> logDirField.setAccessible(true);<a name="line.2409"></a> -<span class="sourceLineNo">2410</span><a name="line.2410"></a> -<span class="sourceLineNo">2411</span> Field modifiersField = Field.class.getDeclaredField("modifiers");<a name="line.2411"></a> -<span class="sourceLineNo">2412</span> modifiersField.setAccessible(true);<a name="line.2412"></a> -<span class="sourceLineNo">2413</span> modifiersField.setInt(logDirField, logDirField.getModifiers() & ~Modifier.FINAL);<a name="line.2413"></a> -<span class="sourceLineNo">2414</span><a name="line.2414"></a> -<span class="sourceLineNo">2415</span> logDirField.set(null, new File(hadoopLogDir, "userlogs"));<a name="line.2415"></a> -<span class="sourceLineNo">2416</span> } catch (SecurityException e) {<a name="line.2416"></a> -<span class="sourceLineNo">2417</span> throw new RuntimeException(e);<a name="line.2417"></a> -<span class="sourceLineNo">2418</span> } catch (NoSuchFieldException e) {<a name="line.2418"></a> -<span class="sourceLineNo">2419</span> // TODO Auto-generated catch block<a name="line.2419"></a> +<span class="sourceLineNo">2062</span> if (flush) {<a name="line.2062"></a> +<span class="sourceLineNo">2063</span> r.flush(true);<a name="line.2063"></a> +<span class="sourceLineNo">2064</span> }<a name="line.2064"></a> +<span class="sourceLineNo">2065</span> }<a name="line.2065"></a> +<span class="sourceLineNo">2066</span> return rowCount;<a name="line.2066"></a> +<span class="sourceLineNo">2067</span> }<a name="line.2067"></a> +<span class="sourceLineNo">2068</span><a name="line.2068"></a> +<span class="sourceLineNo">2069</span> public void loadNumericRows(final Table t, final byte[] f, int startRow, int endRow)<a name="line.2069"></a> +<span class="sourceLineNo">2070</span> throws IOException {<a name="line.2070"></a> +<span class="sourceLineNo">2071</span> for (int i = startRow; i < endRow; i++) {<a name="line.2071"></a> +<span class="sourceLineNo">2072</span> byte[] data = Bytes.toBytes(String.valueOf(i));<a name="line.2072"></a> +<span class="sourceLineNo">2073</span> Put put = new Put(data);<a name="line.2073"></a> +<span class="sourceLineNo">2074</span> put.addColumn(f, null, data);<a name="line.2074"></a> +<span class="sourceLineNo">2075</span> t.put(put);<a name="line.2075"></a> +<span class="sourceLineNo">2076</span> }<a name="line.2076"></a> +<span class="sourceLineNo">2077</span> }<a name="line.2077"></a> +<span class="sourceLineNo">2078</span><a name="line.2078"></a> +<span class="sourceLineNo">2079</span> public void verifyNumericRows(Table table, final byte[] f, int startRow, int endRow,<a name="line.2079"></a> +<span class="sourceLineNo">2080</span> int replicaId)<a name="line.2080"></a> +<span class="sourceLineNo">2081</span> throws IOException {<a name="line.2081"></a> +<span class="sourceLineNo">2082</span> for (int i = startRow; i < endRow; i++) {<a name="line.2082"></a> +<span class="sourceLineNo">2083</span> String failMsg = "Failed verification of row :" + i;<a name="line.2083"></a> +<span class="sourceLineNo">2084</span> byte[] data = Bytes.toBytes(String.valueOf(i));<a name="line.2084"></a> +<span class="sourceLineNo">2085</span> Get get = new Get(data);<a name="line.2085"></a> +<span class="sourceLineNo">2086</span> get.setReplicaId(replicaId);<a name="line.2086"></a> +<span class="sourceLineNo">2087</span> get.setConsistency(Consistency.TIMELINE);<a name="line.2087"></a> +<span class="sourceLineNo">2088</span> Result result = table.get(get);<a name="line.2088"></a> +<span class="sourceLineNo">2089</span> assertTrue(failMsg, result.containsColumn(f, null));<a name="line.2089"></a> +<span class="sourceLineNo">2090</span> assertEquals(failMsg, result.getColumnCells(f, null).size(), 1);<a name="line.2090"></a> +<span class="sourceLineNo">2091</span> Cell cell = result.getColumnLatestCell(f, null);<a name="line.2091"></a> +<span class="sourceLineNo">2092</span> assertTrue(failMsg,<a name="line.2092"></a> +<span class="sourceLineNo">2093</span> Bytes.equals(data, 0, data.length, cell.getValueArray(), cell.getValueOffset(),<a name="line.2093"></a> +<span class="sourceLineNo">2094</span> cell.getValueLength()));<a name="line.2094"></a> +<span class="sourceLineNo">2095</span> }<a name="line.2095"></a> +<span class="sourceLineNo">2096</span> }<a name="line.2096"></a> +<span class="sourceLineNo">2097</span><a name="line.2097"></a> +<span class="sourceLineNo">2098</span> public void verifyNumericRows(Region region, final byte[] f, int startRow, int endRow)<a name="line.2098"></a> +<span class="sourceLineNo">2099</span> throws IOException {<a name="line.2099"></a> +<span class="sourceLineNo">2100</span> verifyNumericRows((HRegion)region, f, startRow, endRow);<a name="line.2100"></a> +<span class="sourceLineNo">2101</span> }<a name="line.2101"></a> +<span class="sourceLineNo">2102</span><a name="line.2102"></a> +<span class="sourceLineNo">2103</span> public void verifyNumericRows(HRegion region, final byte[] f, int startRow, int endRow)<a name="line.2103"></a> +<span class="sourceLineNo">2104</span> throws IOException {<a name="line.2104"></a> +<span class="sourceLineNo">2105</span> verifyNumericRows(region, f, startRow, endRow, true);<a name="line.2105"></a> +<span class="sourceLineNo">2106</span> }<a name="line.2106"></a> +<span class="sourceLineNo">2107</span><a name="line.2107"></a> +<span class="sourceLineNo">2108</span> public void verifyNumericRows(Region region, final byte[] f, int startRow, int endRow,<a name="line.2108"></a> +<span class="sourceLineNo">2109</span> final boolean present) throws IOException {<a name="line.2109"></a> +<span class="sourceLineNo">2110</span> verifyNumericRows((HRegion)region, f, startRow, endRow, present);<a name="line.2110"></a> +<span class="sourceLineNo">2111</span> }<a name="line.2111"></a> +<span class="sourceLineNo">2112</span><a name="line.2112"></a> +<span class="sourceLineNo">2113</span> public void verifyNumericRows(HRegion region, final byte[] f, int startRow, int endRow,<a name="line.2113"></a> +<span class="sourceLineNo">2114</span> final boolean present) throws IOException {<a name="line.2114"></a> +<span class="sourceLineNo">2115</span> for (int i = startRow; i < endRow; i++) {<a name="line.2115"></a> +<span class="sourceLineNo">2116</span> String failMsg = "Failed verification of row :" + i;<a name="line.2116"></a> +<span class="sourceLineNo">2117</span> byte[] data = Bytes.toBytes(String.valueOf(i));<a name="line.2117"></a> +<span class="sourceLineNo">2118</span> Result result = region.get(new Get(data));<a name="line.2118"></a> +<span class="sourceLineNo">2119</span><a name="line.2119"></a> +<span class="sourceLineNo">2120</span> boolean hasResult = result != null && !result.isEmpty();<a name="line.2120"></a> +<span class="sourceLineNo">2121</span> assertEquals(failMsg + result, present, hasResult);<a name="line.2121"></a> +<span class="sourceLineNo">2122</span> if (!present) continue;<a name="line.2122"></a> +<span class="sourceLineNo">2123</span><a name="line.2123"></a> +<span class="sourceLineNo">2124</span> assertTrue(failMsg, result.containsColumn(f, null));<a name="line.2124"></a> +<span class="sourceLineNo">2125</span> assertEquals(failMsg, result.getColumnCells(f, null).size(), 1);<a name="line.2125"></a> +<span class="sourceLineNo">2126</span> Cell cell = result.getColumnLatestCell(f, null);<a name="line.2126"></a> +<span class="sourceLineNo">2127</span> assertTrue(failMsg,<a name="line.2127"></a> +<span class="sourceLineNo">2128</span> Bytes.equals(data, 0, data.length, cell.getValueArray(), cell.getValueOffset(),<a name="line.2128"></a> +<span class="sourceLineNo">2129</span> cell.getValueLength()));<a name="line.2129"></a> +<span class="sourceLineNo">2130</span> }<a name="line.2130"></a> +<span class="sourceLineNo">2131</span> }<a name="line.2131"></a> +<span class="sourceLineNo">2132</span><a name="line.2132"></a> +<span class="sourceLineNo">2133</span> public void deleteNumericRows(final Table t, final byte[] f, int startRow, int endRow)<a name="line.2133"></a> +<span class="sourceLineNo">2134</span> throws IOException {<a name="line.2134"></a> +<span class="sourceLineNo">2135</span> for (int i = startRow; i < endRow; i++) {<a name="line.2135"></a> +<span class="sourceLineNo">2136</span> byte[] data = Bytes.toBytes(String.valueOf(i));<a name="line.2136"></a> +<span class="sourceLineNo">2137</span> Delete delete = new Delete(data);<a name="line.2137"></a> +<span class="sourceLineNo">2138</span> delete.addFamily(f);<a name="line.2138"></a> +<span class="sourceLineNo">2139</span> t.delete(delete);<a name="line.2139"></a> +<span class="sourceLineNo">2140</span> }<a name="line.2140"></a> +<span class="sourceLineNo">2141</span> }<a name="line.2141"></a> +<span class="sourceLineNo">2142</span><a name="line.2142"></a> +<span class="sourceLineNo">2143</span> /**<a name="line.2143"></a> +<span class="sourceLineNo">2144</span> * Return the number of rows in the given table.<a name="line.2144"></a> +<span class="sourceLineNo">2145</span> */<a name="line.2145"></a> +<span class="sourceLineNo">2146</span> public int countRows(final Table table) throws IOException {<a name="line.2146"></a> +<span class="sourceLineNo">2147</span> return countRows(table, new Scan());<a name="line.2147"></a> +<span class="sourceLineNo">2148</span> }<a name="line.2148"></a> +<span class="sourceLineNo">2149</span><a name="line.2149"></a> +<span class="sourceLineNo">2150</span> public int countRows(final Table table, final Scan scan) throws IOException {<a name="line.2150"></a> +<span class="sourceLineNo">2151</span> ResultScanner results = table.getScanner(scan);<a name="line.2151"></a> +<span class="sourceLineNo">2152</span> int count = 0;<a name="line.2152"></a> +<span class="sourceLineNo">2153</span> for (@SuppressWarnings("unused") Result res : results) {<a name="line.2153"></a> +<span class="sourceLineNo">2154</span> count++;<a name="line.2154"></a> +<span class="sourceLineNo">2155</span> }<a name="line.2155"></a> +<span class="sourceLineNo">2156</span> results.close();<a name="line.2156"></a> +<span class="sourceLineNo">2157</span> return count;<a name="line.2157"></a> +<span class="sourceLineNo">2158</span> }<a name="line.2158"></a> +<span class="sourceLineNo">2159</span><a name="line.2159"></a> +<span class="sourceLineNo">2160</span> public int countRows(final Table table, final byte[]... families) throws IOException {<a name="line.2160"></a> +<span class="sourceLineNo">2161</span> Scan scan = new Scan();<a name="line.2161"></a> +<span class="sourceLineNo">2162</span> for (byte[] family: families) {<a name="line.2162"></a> +<span class="sourceLineNo">2163</span> scan.addFamily(family);<a name="line.2163"></a> +<span class="sourceLineNo">2164</span> }<a name="line.2164"></a> +<span class="sourceLineNo">2165</span> ResultScanner results = table.getScanner(scan);<a name="line.2165"></a> +<span class="sourceLineNo">2166</span> int count = 0;<a name="line.2166"></a> +<span class="sourceLineNo">2167</span> for (@SuppressWarnings("unused") Result res : results) {<a name="line.2167"></a> +<span class="sourceLineNo">2168</span> count++;<a name="line.2168"></a> +<span class="sourceLineNo">2169</span> }<a name="line.2169"></a> +<span class="sourceLineNo">2170</span> results.close();<a name="line.2170"></a> +<span class="sourceLineNo">2171</span> return count;<a name="line.2171"></a> +<span class="sourceLineNo">2172</span> }<a name="line.2172"></a> +<span class="sourceLineNo">2173</span><a name="line.2173"></a> +<span class="sourceLineNo">2174</span> /**<a name="line.2174"></a> +<span class="sourceLineNo">2175</span> * Return the number of rows in the given table.<a name="line.2175"></a> +<span class="sourceLineNo">2176</span> */<a name="line.2176"></a> +<span class="sourceLineNo">2177</span> public int countRows(final TableName tableName) throws IOException {<a name="line.2177"></a> +<span class="sourceLineNo">2178</span> Table table = getConnection().getTable(tableName);<a name="line.2178"></a> +<span class="sourceLineNo">2179</span> try {<a name="line.2179"></a> +<span class="sourceLineNo">2180</span> return countRows(table);<a name="line.2180"></a> +<span class="sourceLineNo">2181</span> } finally {<a name="line.2181"></a> +<span class="sourceLineNo">2182</span> table.close();<a name="line.2182"></a> +<span class="sourceLineNo">2183</span> }<a name="line.2183"></a> +<span class="sourceLineNo">2184</span> }<a name="line.2184"></a> +<span class="sourceLineNo">2185</span><a name="line.2185"></a> +<span class="sourceLineNo">2186</span> /**<a name="line.2186"></a> +<span class="sourceLineNo">2187</span> * Return an md5 digest of the entire contents of a table.<a name="line.2187"></a> +<span class="sourceLineNo">2188</span> */<a name="line.2188"></a> +<span class="sourceLineNo">2189</span> public String checksumRows(final Table table) throws Exception {<a name="line.2189"></a> +<span class="sourceLineNo">2190</span><a name="line.2190"></a> +<span class="sourceLineNo">2191</span> Scan scan = new Scan();<a name="line.2191"></a> +<span class="sourceLineNo">2192</span> ResultScanner results = table.getScanner(scan);<a name="line.2192"></a> +<span class="sourceLineNo">2193</span> MessageDigest digest = MessageDigest.getInstance("MD5");<a name="line.2193"></a> +<span class="sourceLineNo">2194</span> for (Result res : results) {<a name="line.2194"></a> +<span class="sourceLineNo">2195</span> digest.update(res.getRow());<a name="line.2195"></a> +<span class="sourceLineNo">2196</span> }<a name="line.2196"></a> +<span class="sourceLineNo">2197</span> results.close();<a name="line.2197"></a> +<span class="sourceLineNo">2198</span> return digest.toString();<a name="line.2198"></a> +<span class="sourceLineNo">2199</span> }<a name="line.2199"></a> +<span class="sourceLineNo">2200</span><a name="line.2200"></a> +<span class="sourceLineNo">2201</span> /** All the row values for the data loaded by {@link #loadTable(HTable, byte[])} */<a name="line.2201"></a> +<span class="sourceLineNo">2202</span> public static final byte[][] ROWS = new byte[(int) Math.pow('z' - 'a' + 1, 3)][3]; // ~52KB<a name="line.2202"></a> +<span class="sourceLineNo">2203</span> static {<a name="line.2203"></a> +<span class="sourceLineNo">2204</span> int i = 0;<a name="line.2204"></a> +<span class="sourceLineNo">2205</span> for (byte b1 = 'a'; b1 <= 'z'; b1++) {<a name="line.2205"></a> +<span class="sourceLineNo">2206</span> for (byte b2 = 'a'; b2 <= 'z'; b2++) {<a name="line.2206"></a> +<span class="sourceLineNo">2207</span> for (byte b3 = 'a'; b3 <= 'z'; b3++) {<a name="line.2207"></a> +<span class="sourceLineNo">2208</span> ROWS[i][0] = b1;<a name="line.2208"></a> +<span class="sourceLineNo">2209</span> ROWS[i][1] = b2;<a name="line.2209"></a> +<span class="sourceLineNo">2210</span> ROWS[i][2] = b3;<a name="line.2210"></a> +<span class="sourceLineNo">2211</span> i++;<a name="line.2211"></a> +<span class="sourceLineNo">2212</span> }<a name="line.2212"></a> +<span class="sourceLineNo">2213</span> }<a name="line.2213"></a> +<span class="sourceLineNo">2214</span> }<a name="line.2214"></a> +<span class="sourceLineNo">2215</span> }<a name="line.2215"></a> +<span class="sourceLineNo">2216</span><a name="line.2216"></a> +<span class="sourceLineNo">2217</span> public static final byte[][] KEYS = {<a name="line.2217"></a> +<span class="sourceLineNo">2218</span> HConstants.EMPTY_BYTE_ARRAY, Bytes.toBytes("bbb"),<a name="line.2218"></a> +<span class="sourceLineNo">2219</span> Bytes.toBytes("ccc"), Bytes.toBytes("ddd"), Bytes.toBytes("eee"),<a name="line.2219"></a> +<span class="sourceLineNo">2220</span> Bytes.toBytes("fff"), Bytes.toBytes("ggg"), Bytes.toBytes("hhh"),<a name="line.2220"></a> +<span class="sourceLineNo">2221</span> Bytes.toBytes("iii"), Bytes.toBytes("jjj"), Bytes.toBytes("kkk"),<a name="line.2221"></a> +<span class="sourceLineNo">2222</span> Bytes.toBytes("lll"), Bytes.toBytes("mmm"), Bytes.toBytes("nnn"),<a name="line.2222"></a> +<span class="sourceLineNo">2223</span> Bytes.toBytes("ooo"), Bytes.toBytes("ppp"), Bytes.toBytes("qqq"),<a name="line.2223"></a> +<span class="sourceLineNo">2224</span> Bytes.toBytes("rrr"), Bytes.toBytes("sss"), Bytes.toBytes("ttt"),<a name="line.2224"></a> +<span class="sourceLineNo">2225</span> Bytes.toBytes("uuu"), Bytes.toBytes("vvv"), Bytes.toBytes("www"),<a name="line.2225"></a> +<span class="sourceLineNo">2226</span> Bytes.toBytes("xxx"), Bytes.toBytes("yyy")<a name="line.2226"></a> +<span class="sourceLineNo">2227</span> };<a name="line.2227"></a> +<span class="sourceLineNo">2228</span><a name="line.2228"></a> +<span class="sourceLineNo">2229</span> public static final byte[][] KEYS_FOR_HBA_CREATE_TABLE = {<a name="line.2229"></a> +<span class="sourceLineNo">2230</span> Bytes.toBytes("bbb"),<a name="line.2230"></a> +<span class="sourceLineNo">2231</span> Bytes.toBytes("ccc"), Bytes.toBytes("ddd"), Bytes.toBytes("eee"),<a name="line.2231"></a> +<span class="sourceLineNo">2232</span> Bytes.toBytes("fff"), Bytes.toBytes("ggg"), Bytes.toBytes("hhh"),<a name="line.2232"></a> +<span class="sourceLineNo">2233</span> Bytes.toBytes("iii"), Bytes.toBytes("jjj"), Bytes.toBytes("kkk"),<a name="line.2233"></a> +<span class="sourceLineNo">2234</span> Bytes.toBytes("lll"), Bytes.toBytes("mmm"), Bytes.toBytes("nnn"),<a name="line.2234"></a> +<span class="sourceLineNo">2235</span> Bytes.toBytes("ooo"), Bytes.toBytes("ppp"), Bytes.toBytes("qqq"),<a name="line.2235"></a> +<span class="sourceLineNo">2236</span> Bytes.toBytes("rrr"), Bytes.toBytes("sss"), Bytes.toBytes("ttt"),<a name="line.2236"></a> +<span class="sourceLineNo">2237</span> Bytes.toBytes("uuu"), Bytes.toBytes("vvv"), Bytes.toBytes("www"),<a name="line.2237"></a> +<span class="sourceLineNo">2238</span> Bytes.toBytes("xxx"), Bytes.toBytes("yyy"), Bytes.toBytes("zzz")<a name="line.2238"></a> +<span class="sourceLineNo">2239</span> };<a name="line.2239"></a> +<span class="sourceLineNo">2240</span><a name="line.2240"></a> +<span class="sourceLineNo">2241</span> /**<a name="line.2241"></a> +<span class="sourceLineNo">2242</span> * Create r
<TRUNCATED>