http://git-wip-us.apache.org/repos/asf/hbase-site/blob/425db230/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html ---------------------------------------------------------------------- diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html index ed3db7a..156dabb 100644 --- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html +++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html @@ -5542,785 +5542,825 @@ <span class="sourceLineNo">5534</span> }<a name="line.5534"></a> <span class="sourceLineNo">5535</span><a name="line.5535"></a> <span class="sourceLineNo">5536</span> @Test<a name="line.5536"></a> -<span class="sourceLineNo">5537</span> public void testWriteRequestsCounter() throws IOException {<a name="line.5537"></a> -<span class="sourceLineNo">5538</span> byte[] fam = Bytes.toBytes("info");<a name="line.5538"></a> -<span class="sourceLineNo">5539</span> byte[][] families = { fam };<a name="line.5539"></a> -<span class="sourceLineNo">5540</span> this.region = initHRegion(tableName, method, CONF, families);<a name="line.5540"></a> +<span class="sourceLineNo">5537</span> public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5537"></a> +<span class="sourceLineNo">5538</span> byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5538"></a> +<span class="sourceLineNo">5539</span> byte[][] families = { cf1 };<a name="line.5539"></a> +<span class="sourceLineNo">5540</span> byte[] col = Bytes.toBytes("C");<a name="line.5540"></a> <span class="sourceLineNo">5541</span><a name="line.5541"></a> -<span class="sourceLineNo">5542</span> Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5542"></a> -<span class="sourceLineNo">5543</span><a name="line.5543"></a> -<span class="sourceLineNo">5544</span> Put put = new Put(row);<a name="line.5544"></a> -<span class="sourceLineNo">5545</span> put.addColumn(fam, fam, fam);<a name="line.5545"></a> -<span class="sourceLineNo">5546</span><a name="line.5546"></a> -<span class="sourceLineNo">5547</span> Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5547"></a> -<span class="sourceLineNo">5548</span> region.put(put);<a name="line.5548"></a> -<span class="sourceLineNo">5549</span> Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5549"></a> -<span class="sourceLineNo">5550</span> region.put(put);<a name="line.5550"></a> -<span class="sourceLineNo">5551</span> Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5551"></a> -<span class="sourceLineNo">5552</span> region.put(put);<a name="line.5552"></a> -<span class="sourceLineNo">5553</span> Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5553"></a> -<span class="sourceLineNo">5554</span><a name="line.5554"></a> -<span class="sourceLineNo">5555</span> region.delete(new Delete(row));<a name="line.5555"></a> -<span class="sourceLineNo">5556</span> Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5556"></a> -<span class="sourceLineNo">5557</span> }<a name="line.5557"></a> -<span class="sourceLineNo">5558</span><a name="line.5558"></a> -<span class="sourceLineNo">5559</span> @Test<a name="line.5559"></a> -<span class="sourceLineNo">5560</span> public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5560"></a> -<span class="sourceLineNo">5561</span> final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5561"></a> -<span class="sourceLineNo">5562</span> final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5562"></a> -<span class="sourceLineNo">5563</span><a name="line.5563"></a> -<span class="sourceLineNo">5564</span> HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5564"></a> -<span class="sourceLineNo">5565</span> htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5565"></a> -<span class="sourceLineNo">5566</span> htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5566"></a> -<span class="sourceLineNo">5567</span><a name="line.5567"></a> -<span class="sourceLineNo">5568</span> HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5568"></a> -<span class="sourceLineNo">5569</span> HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5569"></a> -<span class="sourceLineNo">5570</span><a name="line.5570"></a> -<span class="sourceLineNo">5571</span> // open the region w/o rss and wal and flush some files<a name="line.5571"></a> -<span class="sourceLineNo">5572</span> region =<a name="line.5572"></a> -<span class="sourceLineNo">5573</span> HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5573"></a> -<span class="sourceLineNo">5574</span> .getConfiguration(), htd);<a name="line.5574"></a> -<span class="sourceLineNo">5575</span> assertNotNull(region);<a name="line.5575"></a> -<span class="sourceLineNo">5576</span><a name="line.5576"></a> -<span class="sourceLineNo">5577</span> // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5577"></a> -<span class="sourceLineNo">5578</span> region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5578"></a> -<span class="sourceLineNo">5579</span> region.flush(true);<a name="line.5579"></a> -<span class="sourceLineNo">5580</span> HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5580"></a> +<span class="sourceLineNo">5542</span> HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5542"></a> +<span class="sourceLineNo">5543</span> this.region = initHRegion(tableName, method, conf, families);<a name="line.5543"></a> +<span class="sourceLineNo">5544</span><a name="line.5544"></a> +<span class="sourceLineNo">5545</span> Put put = new Put(Bytes.toBytes("199996"));<a name="line.5545"></a> +<span class="sourceLineNo">5546</span> put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5546"></a> +<span class="sourceLineNo">5547</span> region.put(put);<a name="line.5547"></a> +<span class="sourceLineNo">5548</span> Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5548"></a> +<span class="sourceLineNo">5549</span> put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5549"></a> +<span class="sourceLineNo">5550</span> region.put(put2);<a name="line.5550"></a> +<span class="sourceLineNo">5551</span><a name="line.5551"></a> +<span class="sourceLineNo">5552</span> // Create a reverse scan<a name="line.5552"></a> +<span class="sourceLineNo">5553</span> Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5553"></a> +<span class="sourceLineNo">5554</span> scan.setReversed(true);<a name="line.5554"></a> +<span class="sourceLineNo">5555</span> RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5555"></a> +<span class="sourceLineNo">5556</span><a name="line.5556"></a> +<span class="sourceLineNo">5557</span> // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5557"></a> +<span class="sourceLineNo">5558</span> for (int i = 100000; i < 200000; i++) {<a name="line.5558"></a> +<span class="sourceLineNo">5559</span> Put p = new Put(Bytes.toBytes("" + i));<a name="line.5559"></a> +<span class="sourceLineNo">5560</span> p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5560"></a> +<span class="sourceLineNo">5561</span> region.put(p);<a name="line.5561"></a> +<span class="sourceLineNo">5562</span> }<a name="line.5562"></a> +<span class="sourceLineNo">5563</span> List<Cell> currRow = new ArrayList<>();<a name="line.5563"></a> +<span class="sourceLineNo">5564</span> boolean hasNext;<a name="line.5564"></a> +<span class="sourceLineNo">5565</span> do {<a name="line.5565"></a> +<span class="sourceLineNo">5566</span> hasNext = scanner.next(currRow);<a name="line.5566"></a> +<span class="sourceLineNo">5567</span> } while (hasNext);<a name="line.5567"></a> +<span class="sourceLineNo">5568</span><a name="line.5568"></a> +<span class="sourceLineNo">5569</span> assertEquals(2, currRow.size());<a name="line.5569"></a> +<span class="sourceLineNo">5570</span> assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5570"></a> +<span class="sourceLineNo">5571</span> currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5571"></a> +<span class="sourceLineNo">5572</span> assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5572"></a> +<span class="sourceLineNo">5573</span> currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5573"></a> +<span class="sourceLineNo">5574</span> }<a name="line.5574"></a> +<span class="sourceLineNo">5575</span><a name="line.5575"></a> +<span class="sourceLineNo">5576</span> @Test<a name="line.5576"></a> +<span class="sourceLineNo">5577</span> public void testWriteRequestsCounter() throws IOException {<a name="line.5577"></a> +<span class="sourceLineNo">5578</span> byte[] fam = Bytes.toBytes("info");<a name="line.5578"></a> +<span class="sourceLineNo">5579</span> byte[][] families = { fam };<a name="line.5579"></a> +<span class="sourceLineNo">5580</span> this.region = initHRegion(tableName, method, CONF, families);<a name="line.5580"></a> <span class="sourceLineNo">5581</span><a name="line.5581"></a> -<span class="sourceLineNo">5582</span> ArgumentCaptor<WALEdit> editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5582"></a> +<span class="sourceLineNo">5582</span> Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5582"></a> <span class="sourceLineNo">5583</span><a name="line.5583"></a> -<span class="sourceLineNo">5584</span> // capture append() calls<a name="line.5584"></a> -<span class="sourceLineNo">5585</span> WAL wal = mockWAL();<a name="line.5585"></a> -<span class="sourceLineNo">5586</span> when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5586"></a> -<span class="sourceLineNo">5587</span><a name="line.5587"></a> -<span class="sourceLineNo">5588</span> region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5588"></a> -<span class="sourceLineNo">5589</span> TEST_UTIL.getConfiguration(), rss, null);<a name="line.5589"></a> -<span class="sourceLineNo">5590</span><a name="line.5590"></a> -<span class="sourceLineNo">5591</span> verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5591"></a> -<span class="sourceLineNo">5592</span> , editCaptor.capture(), anyBoolean());<a name="line.5592"></a> -<span class="sourceLineNo">5593</span><a name="line.5593"></a> -<span class="sourceLineNo">5594</span> WALEdit edit = editCaptor.getValue();<a name="line.5594"></a> -<span class="sourceLineNo">5595</span> assertNotNull(edit);<a name="line.5595"></a> -<span class="sourceLineNo">5596</span> assertNotNull(edit.getCells());<a name="line.5596"></a> -<span class="sourceLineNo">5597</span> assertEquals(1, edit.getCells().size());<a name="line.5597"></a> -<span class="sourceLineNo">5598</span> RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5598"></a> -<span class="sourceLineNo">5599</span> assertNotNull(desc);<a name="line.5599"></a> -<span class="sourceLineNo">5600</span><a name="line.5600"></a> -<span class="sourceLineNo">5601</span> LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5601"></a> -<span class="sourceLineNo">5602</span><a name="line.5602"></a> -<span class="sourceLineNo">5603</span> assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5603"></a> -<span class="sourceLineNo">5604</span> assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5604"></a> -<span class="sourceLineNo">5605</span> assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5605"></a> -<span class="sourceLineNo">5606</span> hri.getEncodedNameAsBytes()));<a name="line.5606"></a> -<span class="sourceLineNo">5607</span> assertTrue(desc.getLogSequenceNumber() > 0);<a name="line.5607"></a> -<span class="sourceLineNo">5608</span> assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5608"></a> -<span class="sourceLineNo">5609</span> assertEquals(2, desc.getStoresCount());<a name="line.5609"></a> +<span class="sourceLineNo">5584</span> Put put = new Put(row);<a name="line.5584"></a> +<span class="sourceLineNo">5585</span> put.addColumn(fam, fam, fam);<a name="line.5585"></a> +<span class="sourceLineNo">5586</span><a name="line.5586"></a> +<span class="sourceLineNo">5587</span> Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5587"></a> +<span class="sourceLineNo">5588</span> region.put(put);<a name="line.5588"></a> +<span class="sourceLineNo">5589</span> Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5589"></a> +<span class="sourceLineNo">5590</span> region.put(put);<a name="line.5590"></a> +<span class="sourceLineNo">5591</span> Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5591"></a> +<span class="sourceLineNo">5592</span> region.put(put);<a name="line.5592"></a> +<span class="sourceLineNo">5593</span> Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5593"></a> +<span class="sourceLineNo">5594</span><a name="line.5594"></a> +<span class="sourceLineNo">5595</span> region.delete(new Delete(row));<a name="line.5595"></a> +<span class="sourceLineNo">5596</span> Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5596"></a> +<span class="sourceLineNo">5597</span> }<a name="line.5597"></a> +<span class="sourceLineNo">5598</span><a name="line.5598"></a> +<span class="sourceLineNo">5599</span> @Test<a name="line.5599"></a> +<span class="sourceLineNo">5600</span> public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5600"></a> +<span class="sourceLineNo">5601</span> final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5601"></a> +<span class="sourceLineNo">5602</span> final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5602"></a> +<span class="sourceLineNo">5603</span><a name="line.5603"></a> +<span class="sourceLineNo">5604</span> HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5604"></a> +<span class="sourceLineNo">5605</span> htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5605"></a> +<span class="sourceLineNo">5606</span> htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5606"></a> +<span class="sourceLineNo">5607</span><a name="line.5607"></a> +<span class="sourceLineNo">5608</span> HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5608"></a> +<span class="sourceLineNo">5609</span> HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5609"></a> <span class="sourceLineNo">5610</span><a name="line.5610"></a> -<span class="sourceLineNo">5611</span> StoreDescriptor store = desc.getStores(0);<a name="line.5611"></a> -<span class="sourceLineNo">5612</span> assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5612"></a> -<span class="sourceLineNo">5613</span> assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5613"></a> -<span class="sourceLineNo">5614</span> assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5614"></a> -<span class="sourceLineNo">5615</span> assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5615"></a> +<span class="sourceLineNo">5611</span> // open the region w/o rss and wal and flush some files<a name="line.5611"></a> +<span class="sourceLineNo">5612</span> region =<a name="line.5612"></a> +<span class="sourceLineNo">5613</span> HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5613"></a> +<span class="sourceLineNo">5614</span> .getConfiguration(), htd);<a name="line.5614"></a> +<span class="sourceLineNo">5615</span> assertNotNull(region);<a name="line.5615"></a> <span class="sourceLineNo">5616</span><a name="line.5616"></a> -<span class="sourceLineNo">5617</span> store = desc.getStores(1);<a name="line.5617"></a> -<span class="sourceLineNo">5618</span> assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5618"></a> -<span class="sourceLineNo">5619</span> assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5619"></a> -<span class="sourceLineNo">5620</span> assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5620"></a> -<span class="sourceLineNo">5621</span> }<a name="line.5621"></a> -<span class="sourceLineNo">5622</span><a name="line.5622"></a> -<span class="sourceLineNo">5623</span> // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5623"></a> -<span class="sourceLineNo">5624</span> static class HRegionWithSeqId extends HRegion {<a name="line.5624"></a> -<span class="sourceLineNo">5625</span> public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5625"></a> -<span class="sourceLineNo">5626</span> final Configuration confParam, final RegionInfo regionInfo,<a name="line.5626"></a> -<span class="sourceLineNo">5627</span> final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5627"></a> -<span class="sourceLineNo">5628</span> super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5628"></a> -<span class="sourceLineNo">5629</span> }<a name="line.5629"></a> -<span class="sourceLineNo">5630</span> @Override<a name="line.5630"></a> -<span class="sourceLineNo">5631</span> protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5631"></a> -<span class="sourceLineNo">5632</span> return 42;<a name="line.5632"></a> -<span class="sourceLineNo">5633</span> }<a name="line.5633"></a> -<span class="sourceLineNo">5634</span> }<a name="line.5634"></a> -<span class="sourceLineNo">5635</span><a name="line.5635"></a> -<span class="sourceLineNo">5636</span> @Test<a name="line.5636"></a> -<span class="sourceLineNo">5637</span> public void testFlushedFileWithNoTags() throws Exception {<a name="line.5637"></a> -<span class="sourceLineNo">5638</span> final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5638"></a> -<span class="sourceLineNo">5639</span> HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5639"></a> -<span class="sourceLineNo">5640</span> htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5640"></a> -<span class="sourceLineNo">5641</span> HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5641"></a> -<span class="sourceLineNo">5642</span> Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5642"></a> -<span class="sourceLineNo">5643</span> region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5643"></a> -<span class="sourceLineNo">5644</span> Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5644"></a> -<span class="sourceLineNo">5645</span> put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5645"></a> -<span class="sourceLineNo">5646</span> region.put(put);<a name="line.5646"></a> -<span class="sourceLineNo">5647</span> region.flush(true);<a name="line.5647"></a> -<span class="sourceLineNo">5648</span> HStore store = region.getStore(fam1);<a name="line.5648"></a> -<span class="sourceLineNo">5649</span> Collection<HStoreFile> storefiles = store.getStorefiles();<a name="line.5649"></a> -<span class="sourceLineNo">5650</span> for (HStoreFile sf : storefiles) {<a name="line.5650"></a> -<span class="sourceLineNo">5651</span> assertFalse("Tags should not be present "<a name="line.5651"></a> -<span class="sourceLineNo">5652</span> ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5652"></a> -<span class="sourceLineNo">5653</span> }<a name="line.5653"></a> -<span class="sourceLineNo">5654</span> }<a name="line.5654"></a> -<span class="sourceLineNo">5655</span><a name="line.5655"></a> -<span class="sourceLineNo">5656</span> /**<a name="line.5656"></a> -<span class="sourceLineNo">5657</span> * Utility method to setup a WAL mock.<a name="line.5657"></a> -<span class="sourceLineNo">5658</span> * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5658"></a> -<span class="sourceLineNo">5659</span> * @return a mock WAL<a name="line.5659"></a> -<span class="sourceLineNo">5660</span> * @throws IOException<a name="line.5660"></a> -<span class="sourceLineNo">5661</span> */<a name="line.5661"></a> -<span class="sourceLineNo">5662</span> private WAL mockWAL() throws IOException {<a name="line.5662"></a> -<span class="sourceLineNo">5663</span> WAL wal = mock(WAL.class);<a name="line.5663"></a> -<span class="sourceLineNo">5664</span> Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5664"></a> -<span class="sourceLineNo">5665</span> (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5665"></a> -<span class="sourceLineNo">5666</span> thenAnswer(new Answer<Long>() {<a name="line.5666"></a> -<span class="sourceLineNo">5667</span> @Override<a name="line.5667"></a> -<span class="sourceLineNo">5668</span> public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5668"></a> -<span class="sourceLineNo">5669</span> WALKeyImpl key = invocation.getArgument(1);<a name="line.5669"></a> -<span class="sourceLineNo">5670</span> MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5670"></a> -<span class="sourceLineNo">5671</span> key.setWriteEntry(we);<a name="line.5671"></a> -<span class="sourceLineNo">5672</span> return 1L;<a name="line.5672"></a> -<span class="sourceLineNo">5673</span> }<a name="line.5673"></a> -<span class="sourceLineNo">5674</span><a name="line.5674"></a> -<span class="sourceLineNo">5675</span> });<a name="line.5675"></a> -<span class="sourceLineNo">5676</span> return wal;<a name="line.5676"></a> -<span class="sourceLineNo">5677</span> }<a name="line.5677"></a> -<span class="sourceLineNo">5678</span><a name="line.5678"></a> -<span class="sourceLineNo">5679</span> @Test<a name="line.5679"></a> -<span class="sourceLineNo">5680</span> public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5680"></a> -<span class="sourceLineNo">5681</span><a name="line.5681"></a> -<span class="sourceLineNo">5682</span> Path rootDir = new Path(dir + name.getMethodName());<a name="line.5682"></a> -<span class="sourceLineNo">5683</span> FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5683"></a> -<span class="sourceLineNo">5684</span><a name="line.5684"></a> -<span class="sourceLineNo">5685</span> final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5685"></a> -<span class="sourceLineNo">5686</span> final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5686"></a> -<span class="sourceLineNo">5687</span><a name="line.5687"></a> -<span class="sourceLineNo">5688</span> HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5688"></a> -<span class="sourceLineNo">5689</span> htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5689"></a> -<span class="sourceLineNo">5690</span> htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5690"></a> -<span class="sourceLineNo">5691</span><a name="line.5691"></a> -<span class="sourceLineNo">5692</span> final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5692"></a> -<span class="sourceLineNo">5693</span> HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5693"></a> -<span class="sourceLineNo">5694</span><a name="line.5694"></a> -<span class="sourceLineNo">5695</span> ArgumentCaptor<WALEdit> editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5695"></a> -<span class="sourceLineNo">5696</span><a name="line.5696"></a> -<span class="sourceLineNo">5697</span> // capture append() calls<a name="line.5697"></a> -<span class="sourceLineNo">5698</span> WAL wal = mockWAL();<a name="line.5698"></a> -<span class="sourceLineNo">5699</span> when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5699"></a> -<span class="sourceLineNo">5700</span><a name="line.5700"></a> -<span class="sourceLineNo">5701</span><a name="line.5701"></a> -<span class="sourceLineNo">5702</span> // create and then open a region first so that it can be closed later<a name="line.5702"></a> -<span class="sourceLineNo">5703</span> region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5703"></a> -<span class="sourceLineNo">5704</span> region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5704"></a> -<span class="sourceLineNo">5705</span> TEST_UTIL.getConfiguration(), rss, null);<a name="line.5705"></a> -<span class="sourceLineNo">5706</span><a name="line.5706"></a> -<span class="sourceLineNo">5707</span> // close the region<a name="line.5707"></a> -<span class="sourceLineNo">5708</span> region.close(false);<a name="line.5708"></a> -<span class="sourceLineNo">5709</span><a name="line.5709"></a> -<span class="sourceLineNo">5710</span> // 2 times, one for region open, the other close region<a name="line.5710"></a> -<span class="sourceLineNo">5711</span> verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5711"></a> -<span class="sourceLineNo">5712</span> editCaptor.capture(), anyBoolean());<a name="line.5712"></a> -<span class="sourceLineNo">5713</span><a name="line.5713"></a> -<span class="sourceLineNo">5714</span> WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5714"></a> -<span class="sourceLineNo">5715</span> assertNotNull(edit);<a name="line.5715"></a> -<span class="sourceLineNo">5716</span> assertNotNull(edit.getCells());<a name="line.5716"></a> -<span class="sourceLineNo">5717</span> assertEquals(1, edit.getCells().size());<a name="line.5717"></a> -<span class="sourceLineNo">5718</span> RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5718"></a> -<span class="sourceLineNo">5719</span> assertNotNull(desc);<a name="line.5719"></a> -<span class="sourceLineNo">5720</span><a name="line.5720"></a> -<span class="sourceLineNo">5721</span> LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5721"></a> -<span class="sourceLineNo">5722</span><a name="line.5722"></a> -<span class="sourceLineNo">5723</span> assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5723"></a> -<span class="sourceLineNo">5724</span> assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5724"></a> -<span class="sourceLineNo">5725</span> assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5725"></a> -<span class="sourceLineNo">5726</span> hri.getEncodedNameAsBytes()));<a name="line.5726"></a> -<span class="sourceLineNo">5727</span> assertTrue(desc.getLogSequenceNumber() > 0);<a name="line.5727"></a> -<span class="sourceLineNo">5728</span> assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5728"></a> -<span class="sourceLineNo">5729</span> assertEquals(2, desc.getStoresCount());<a name="line.5729"></a> -<span class="sourceLineNo">5730</span><a name="line.5730"></a> -<span class="sourceLineNo">5731</span> StoreDescriptor store = desc.getStores(0);<a name="line.5731"></a> -<span class="sourceLineNo">5732</span> assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5732"></a> -<span class="sourceLineNo">5733</span> assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5733"></a> -<span class="sourceLineNo">5734</span> assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5734"></a> -<span class="sourceLineNo">5735</span><a name="line.5735"></a> -<span class="sourceLineNo">5736</span> store = desc.getStores(1);<a name="line.5736"></a> -<span class="sourceLineNo">5737</span> assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5737"></a> -<span class="sourceLineNo">5738</span> assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5738"></a> -<span class="sourceLineNo">5739</span> assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5739"></a> -<span class="sourceLineNo">5740</span> }<a name="line.5740"></a> +<span class="sourceLineNo">5617</span> // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5617"></a> +<span class="sourceLineNo">5618</span> region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5618"></a> +<span class="sourceLineNo">5619</span> region.flush(true);<a name="line.5619"></a> +<span class="sourceLineNo">5620</span> HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5620"></a> +<span class="sourceLineNo">5621</span><a name="line.5621"></a> +<span class="sourceLineNo">5622</span> ArgumentCaptor<WALEdit> editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5622"></a> +<span class="sourceLineNo">5623</span><a name="line.5623"></a> +<span class="sourceLineNo">5624</span> // capture append() calls<a name="line.5624"></a> +<span class="sourceLineNo">5625</span> WAL wal = mockWAL();<a name="line.5625"></a> +<span class="sourceLineNo">5626</span> when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5626"></a> +<span class="sourceLineNo">5627</span><a name="line.5627"></a> +<span class="sourceLineNo">5628</span> region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5628"></a> +<span class="sourceLineNo">5629</span> TEST_UTIL.getConfiguration(), rss, null);<a name="line.5629"></a> +<span class="sourceLineNo">5630</span><a name="line.5630"></a> +<span class="sourceLineNo">5631</span> verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5631"></a> +<span class="sourceLineNo">5632</span> , editCaptor.capture(), anyBoolean());<a name="line.5632"></a> +<span class="sourceLineNo">5633</span><a name="line.5633"></a> +<span class="sourceLineNo">5634</span> WALEdit edit = editCaptor.getValue();<a name="line.5634"></a> +<span class="sourceLineNo">5635</span> assertNotNull(edit);<a name="line.5635"></a> +<span class="sourceLineNo">5636</span> assertNotNull(edit.getCells());<a name="line.5636"></a> +<span class="sourceLineNo">5637</span> assertEquals(1, edit.getCells().size());<a name="line.5637"></a> +<span class="sourceLineNo">5638</span> RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5638"></a> +<span class="sourceLineNo">5639</span> assertNotNull(desc);<a name="line.5639"></a> +<span class="sourceLineNo">5640</span><a name="line.5640"></a> +<span class="sourceLineNo">5641</span> LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5641"></a> +<span class="sourceLineNo">5642</span><a name="line.5642"></a> +<span class="sourceLineNo">5643</span> assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5643"></a> +<span class="sourceLineNo">5644</span> assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5644"></a> +<span class="sourceLineNo">5645</span> assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5645"></a> +<span class="sourceLineNo">5646</span> hri.getEncodedNameAsBytes()));<a name="line.5646"></a> +<span class="sourceLineNo">5647</span> assertTrue(desc.getLogSequenceNumber() > 0);<a name="line.5647"></a> +<span class="sourceLineNo">5648</span> assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5648"></a> +<span class="sourceLineNo">5649</span> assertEquals(2, desc.getStoresCount());<a name="line.5649"></a> +<span class="sourceLineNo">5650</span><a name="line.5650"></a> +<span class="sourceLineNo">5651</span> StoreDescriptor store = desc.getStores(0);<a name="line.5651"></a> +<span class="sourceLineNo">5652</span> assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5652"></a> +<span class="sourceLineNo">5653</span> assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5653"></a> +<span class="sourceLineNo">5654</span> assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5654"></a> +<span class="sourceLineNo">5655</span> assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5655"></a> +<span class="sourceLineNo">5656</span><a name="line.5656"></a> +<span class="sourceLineNo">5657</span> store = desc.getStores(1);<a name="line.5657"></a> +<span class="sourceLineNo">5658</span> assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5658"></a> +<span class="sourceLineNo">5659</span> assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5659"></a> +<span class="sourceLineNo">5660</span> assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5660"></a> +<span class="sourceLineNo">5661</span> }<a name="line.5661"></a> +<span class="sourceLineNo">5662</span><a name="line.5662"></a> +<span class="sourceLineNo">5663</span> // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5663"></a> +<span class="sourceLineNo">5664</span> static class HRegionWithSeqId extends HRegion {<a name="line.5664"></a> +<span class="sourceLineNo">5665</span> public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5665"></a> +<span class="sourceLineNo">5666</span> final Configuration confParam, final RegionInfo regionInfo,<a name="line.5666"></a> +<span class="sourceLineNo">5667</span> final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5667"></a> +<span class="sourceLineNo">5668</span> super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5668"></a> +<span class="sourceLineNo">5669</span> }<a name="line.5669"></a> +<span class="sourceLineNo">5670</span> @Override<a name="line.5670"></a> +<span class="sourceLineNo">5671</span> protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5671"></a> +<span class="sourceLineNo">5672</span> return 42;<a name="line.5672"></a> +<span class="sourceLineNo">5673</span> }<a name="line.5673"></a> +<span class="sourceLineNo">5674</span> }<a name="line.5674"></a> +<span class="sourceLineNo">5675</span><a name="line.5675"></a> +<span class="sourceLineNo">5676</span> @Test<a name="line.5676"></a> +<span class="sourceLineNo">5677</span> public void testFlushedFileWithNoTags() throws Exception {<a name="line.5677"></a> +<span class="sourceLineNo">5678</span> final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5678"></a> +<span class="sourceLineNo">5679</span> HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5679"></a> +<span class="sourceLineNo">5680</span> htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5680"></a> +<span class="sourceLineNo">5681</span> HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5681"></a> +<span class="sourceLineNo">5682</span> Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5682"></a> +<span class="sourceLineNo">5683</span> region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5683"></a> +<span class="sourceLineNo">5684</span> Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5684"></a> +<span class="sourceLineNo">5685</span> put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5685"></a> +<span class="sourceLineNo">5686</span> region.put(put);<a name="line.5686"></a> +<span class="sourceLineNo">5687</span> region.flush(true);<a name="line.5687"></a> +<span class="sourceLineNo">5688</span> HStore store = region.getStore(fam1);<a name="line.5688"></a> +<span class="sourceLineNo">5689</span> Collection<HStoreFile> storefiles = store.getStorefiles();<a name="line.5689"></a> +<span class="sourceLineNo">5690</span> for (HStoreFile sf : storefiles) {<a name="line.5690"></a> +<span class="sourceLineNo">5691</span> assertFalse("Tags should not be present "<a name="line.5691"></a> +<span class="sourceLineNo">5692</span> ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5692"></a> +<span class="sourceLineNo">5693</span> }<a name="line.5693"></a> +<span class="sourceLineNo">5694</span> }<a name="line.5694"></a> +<span class="sourceLineNo">5695</span><a name="line.5695"></a> +<span class="sourceLineNo">5696</span> /**<a name="line.5696"></a> +<span class="sourceLineNo">5697</span> * Utility method to setup a WAL mock.<a name="line.5697"></a> +<span class="sourceLineNo">5698</span> * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5698"></a> +<span class="sourceLineNo">5699</span> * @return a mock WAL<a name="line.5699"></a> +<span class="sourceLineNo">5700</span> * @throws IOException<a name="line.5700"></a> +<span class="sourceLineNo">5701</span> */<a name="line.5701"></a> +<span class="sourceLineNo">5702</span> private WAL mockWAL() throws IOException {<a name="line.5702"></a> +<span class="sourceLineNo">5703</span> WAL wal = mock(WAL.class);<a name="line.5703"></a> +<span class="sourceLineNo">5704</span> Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5704"></a> +<span class="sourceLineNo">5705</span> (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5705"></a> +<span class="sourceLineNo">5706</span> thenAnswer(new Answer<Long>() {<a name="line.5706"></a> +<span class="sourceLineNo">5707</span> @Override<a name="line.5707"></a> +<span class="sourceLineNo">5708</span> public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5708"></a> +<span class="sourceLineNo">5709</span> WALKeyImpl key = invocation.getArgument(1);<a name="line.5709"></a> +<span class="sourceLineNo">5710</span> MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5710"></a> +<span class="sourceLineNo">5711</span> key.setWriteEntry(we);<a name="line.5711"></a> +<span class="sourceLineNo">5712</span> return 1L;<a name="line.5712"></a> +<span class="sourceLineNo">5713</span> }<a name="line.5713"></a> +<span class="sourceLineNo">5714</span><a name="line.5714"></a> +<span class="sourceLineNo">5715</span> });<a name="line.5715"></a> +<span class="sourceLineNo">5716</span> return wal;<a name="line.5716"></a> +<span class="sourceLineNo">5717</span> }<a name="line.5717"></a> +<span class="sourceLineNo">5718</span><a name="line.5718"></a> +<span class="sourceLineNo">5719</span> @Test<a name="line.5719"></a> +<span class="sourceLineNo">5720</span> public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5720"></a> +<span class="sourceLineNo">5721</span><a name="line.5721"></a> +<span class="sourceLineNo">5722</span> Path rootDir = new Path(dir + name.getMethodName());<a name="line.5722"></a> +<span class="sourceLineNo">5723</span> FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5723"></a> +<span class="sourceLineNo">5724</span><a name="line.5724"></a> +<span class="sourceLineNo">5725</span> final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5725"></a> +<span class="sourceLineNo">5726</span> final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5726"></a> +<span class="sourceLineNo">5727</span><a name="line.5727"></a> +<span class="sourceLineNo">5728</span> HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5728"></a> +<span class="sourceLineNo">5729</span> htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5729"></a> +<span class="sourceLineNo">5730</span> htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5730"></a> +<span class="sourceLineNo">5731</span><a name="line.5731"></a> +<span class="sourceLineNo">5732</span> final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5732"></a> +<span class="sourceLineNo">5733</span> HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5733"></a> +<span class="sourceLineNo">5734</span><a name="line.5734"></a> +<span class="sourceLineNo">5735</span> ArgumentCaptor<WALEdit> editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5735"></a> +<span class="sourceLineNo">5736</span><a name="line.5736"></a> +<span class="sourceLineNo">5737</span> // capture append() calls<a name="line.5737"></a> +<span class="sourceLineNo">5738</span> WAL wal = mockWAL();<a name="line.5738"></a> +<span class="sourceLineNo">5739</span> when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5739"></a> +<span class="sourceLineNo">5740</span><a name="line.5740"></a> <span class="sourceLineNo">5741</span><a name="line.5741"></a> -<span class="sourceLineNo">5742</span> /**<a name="line.5742"></a> -<span class="sourceLineNo">5743</span> * Test RegionTooBusyException thrown when region is busy<a name="line.5743"></a> -<span class="sourceLineNo">5744</span> */<a name="line.5744"></a> -<span class="sourceLineNo">5745</span> @Test<a name="line.5745"></a> -<span class="sourceLineNo">5746</span> public void testRegionTooBusy() throws IOException {<a name="line.5746"></a> -<span class="sourceLineNo">5747</span> byte[] family = Bytes.toBytes("family");<a name="line.5747"></a> -<span class="sourceLineNo">5748</span> long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5748"></a> -<span class="sourceLineNo">5749</span> HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5749"></a> -<span class="sourceLineNo">5750</span> CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5750"></a> -<span class="sourceLineNo">5751</span> region = initHRegion(tableName, method, CONF, family);<a name="line.5751"></a> -<span class="sourceLineNo">5752</span> final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5752"></a> -<span class="sourceLineNo">5753</span> Thread t = new Thread(new Runnable() {<a name="line.5753"></a> -<span class="sourceLineNo">5754</span> @Override<a name="line.5754"></a> -<span class="sourceLineNo">5755</span> public void run() {<a name="line.5755"></a> -<span class="sourceLineNo">5756</span> try {<a name="line.5756"></a> -<span class="sourceLineNo">5757</span> region.lock.writeLock().lock();<a name="line.5757"></a> -<span class="sourceLineNo">5758</span> stopped.set(false);<a name="line.5758"></a> -<span class="sourceLineNo">5759</span> while (!stopped.get()) {<a name="line.5759"></a> -<span class="sourceLineNo">5760</span> Thread.sleep(100);<a name="line.5760"></a> -<span class="sourceLineNo">5761</span> }<a name="line.5761"></a> -<span class="sourceLineNo">5762</span> } catch (InterruptedException ie) {<a name="line.5762"></a> -<span class="sourceLineNo">5763</span> } finally {<a name="line.5763"></a> -<span class="sourceLineNo">5764</span> region.lock.writeLock().unlock();<a name="line.5764"></a> -<span class="sourceLineNo">5765</span> }<a name="line.5765"></a> -<span class="sourceLineNo">5766</span> }<a name="line.5766"></a> -<span class="sourceLineNo">5767</span> });<a name="line.5767"></a> -<span class="sourceLineNo">5768</span> t.start();<a name="line.5768"></a> -<span class="sourceLineNo">5769</span> Get get = new Get(row);<a name="line.5769"></a> -<span class="sourceLineNo">5770</span> try {<a name="line.5770"></a> -<span class="sourceLineNo">5771</span> while (stopped.get()) {<a name="line.5771"></a> -<span class="sourceLineNo">5772</span> Thread.sleep(100);<a name="line.5772"></a> -<span class="sourceLineNo">5773</span> }<a name="line.5773"></a> -<span class="sourceLineNo">5774</span> region.get(get);<a name="line.5774"></a> -<span class="sourceLineNo">5775</span> fail("Should throw RegionTooBusyException");<a name="line.5775"></a> -<span class="sourceLineNo">5776</span> } catch (InterruptedException ie) {<a name="line.5776"></a> -<span class="sourceLineNo">5777</span> fail("test interrupted");<a name="line.5777"></a> -<span class="sourceLineNo">5778</span> } catch (RegionTooBusyException e) {<a name="line.5778"></a> -<span class="sourceLineNo">5779</span> // Good, expected<a name="line.5779"></a> -<span class="sourceLineNo">5780</span> } finally {<a name="line.5780"></a> -<span class="sourceLineNo">5781</span> stopped.set(true);<a name="line.5781"></a> -<span class="sourceLineNo">5782</span> try {<a name="line.5782"></a> -<span class="sourceLineNo">5783</span> t.join();<a name="line.5783"></a> -<span class="sourceLineNo">5784</span> } catch (Throwable e) {<a name="line.5784"></a> -<span class="sourceLineNo">5785</span> }<a name="line.5785"></a> -<span class="sourceLineNo">5786</span><a name="line.5786"></a> -<span class="sourceLineNo">5787</span> HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5787"></a> -<span class="sourceLineNo">5788</span> region = null;<a name="line.5788"></a> -<span class="sourceLineNo">5789</span> CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5789"></a> -<span class="sourceLineNo">5790</span> }<a name="line.5790"></a> -<span class="sourceLineNo">5791</span> }<a name="line.5791"></a> -<span class="sourceLineNo">5792</span><a name="line.5792"></a> -<span class="sourceLineNo">5793</span> @Test<a name="line.5793"></a> -<span class="sourceLineNo">5794</span> public void testCellTTLs() throws IOException {<a name="line.5794"></a> -<span class="sourceLineNo">5795</span> IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5795"></a> -<span class="sourceLineNo">5796</span> EnvironmentEdgeManager.injectEdge(edge);<a name="line.5796"></a> -<span class="sourceLineNo">5797</span><a name="line.5797"></a> -<span class="sourceLineNo">5798</span> final byte[] row = Bytes.toBytes("testRow");<a name="line.5798"></a> -<span class="sourceLineNo">5799</span> final byte[] q1 = Bytes.toBytes("q1");<a name="line.5799"></a> -<span class="sourceLineNo">5800</span> final byte[] q2 = Bytes.toBytes("q2");<a name="line.5800"></a> -<span class="sourceLineNo">5801</span> final byte[] q3 = Bytes.toBytes("q3");<a name="line.5801"></a> -<span class="sourceLineNo">5802</span> final byte[] q4 = Bytes.toBytes("q4");<a name="line.5802"></a> -<span class="sourceLineNo">5803</span><a name="line.5803"></a> -<span class="sourceLineNo">5804</span> HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5804"></a> -<span class="sourceLineNo">5805</span> HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5805"></a> -<span class="sourceLineNo">5806</span> hcd.setTimeToLive(10); // 10 seconds<a name="line.5806"></a> -<span class="sourceLineNo">5807</span> htd.addFamily(hcd);<a name="line.5807"></a> -<span class="sourceLineNo">5808</span><a name="line.5808"></a> -<span class="sourceLineNo">5809</span> Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5809"></a> -<span class="sourceLineNo">5810</span> conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5810"></a> -<span class="sourceLineNo">5811</span><a name="line.5811"></a> -<span class="sourceLineNo">5812</span> region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5812"></a> -<span class="sourceLineNo">5813</span> HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5813"></a> -<span class="sourceLineNo">5814</span> TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5814"></a> -<span class="sourceLineNo">5815</span> assertNotNull(region);<a name="line.5815"></a> -<span class="sourceLineNo">5816</span> long now = EnvironmentEdgeManager.currentTime();<a name="line.5816"></a> -<span class="sourceLineNo">5817</span> // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5817"></a> -<span class="sourceLineNo">5818</span> region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5818"></a> -<span class="sourceLineNo">5819</span> HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5819"></a> -<span class="sourceLineNo">5820</span> // TTL tags specify ts in milliseconds<a name="line.5820"></a> -<span class="sourceLineNo">5821</span> new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5821"></a> -<span class="sourceLineNo">5822</span> // Add a cell that will expire after 10 seconds via family setting<a name="line.5822"></a> -<span class="sourceLineNo">5823</span> region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5823"></a> -<span class="sourceLineNo">5824</span> // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5824"></a> -<span class="sourceLineNo">5825</span> region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5825"></a> -<span class="sourceLineNo">5826</span> HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5826"></a> -<span class="sourceLineNo">5827</span> // TTL tags specify ts in milliseconds<a name="line.5827"></a> -<span class="sourceLineNo">5828</span> new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5828"></a> -<span class="sourceLineNo">5829</span> // Add a cell that will expire in 20 seconds via family setting<a name="line.5829"></a> -<span class="sourceLineNo">5830</span> region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5830"></a> -<span class="sourceLineNo">5831</span><a name="line.5831"></a> -<span class="sourceLineNo">5832</span> // Flush so we are sure store scanning gets this right<a name="line.5832"></a> -<span class="sourceLineNo">5833</span> region.flush(true);<a name="line.5833"></a> -<span class="sourceLineNo">5834</span><a name="line.5834"></a> -<span class="sourceLineNo">5835</span> // A query at time T+0 should return all cells<a name="line.5835"></a> -<span class="sourceLineNo">5836</span> Result r = region.get(new Get(row));<a name="line.5836"></a> -<span class="sourceLineNo">5837</span> assertNotNull(r.getValue(fam1, q1));<a name="line.5837"></a> -<span class="sourceLineNo">5838</span> assertNotNull(r.getValue(fam1, q2));<a name="line.5838"></a> -<span class="sourceLineNo">5839</span> assertNotNull(r.getValue(fam1, q3));<a name="line.5839"></a> -<span class="sourceLineNo">5840</span> assertNotNull(r.getValue(fam1, q4));<a name="line.5840"></a> -<span class="sourceLineNo">5841</span><a name="line.5841"></a> -<span class="sourceLineNo">5842</span> // Increment time to T+5 seconds<a name="line.5842"></a> -<span class="sourceLineNo">5843</span> edge.incrementTime(5000);<a name="line.5843"></a> -<span class="sourceLineNo">5844</span><a name="line.5844"></a> -<span class="sourceLineNo">5845</span> r = region.get(new Get(row));<a name="line.5845"></a> -<span class="sourceLineNo">5846</span> assertNull(r.getValue(fam1, q1));<a name="line.5846"></a> -<span class="sourceLineNo">5847</span> assertNotNull(r.getValue(fam1, q2));<a name="line.5847"></a> -<span class="sourceLineNo">5848</span> assertNotNull(r.getValue(fam1, q3));<a name="line.5848"></a> -<span class="sourceLineNo">5849</span> assertNotNull(r.getValue(fam1, q4));<a name="line.5849"></a> -<span class="sourceLineNo">5850</span><a name="line.5850"></a> -<span class="sourceLineNo">5851</span> // Increment time to T+10 seconds<a name="line.5851"></a> -<span class="sourceLineNo">5852</span> edge.incrementTime(5000);<a name="line.5852"></a> -<span class="sourceLineNo">5853</span><a name="line.5853"></a> -<span class="sourceLineNo">5854</span> r = region.get(new Get(row));<a name="line.5854"></a> -<span class="sourceLineNo">5855</span> assertNull(r.getValue(fam1, q1));<a name="line.5855"></a> -<span class="sourceLineNo">5856</span> assertNull(r.getValue(fam1, q2));<a name="line.5856"></a> -<span class="sourceLineNo">5857</span> assertNotNull(r.getValue(fam1, q3));<a name="line.5857"></a> -<span class="sourceLineNo">5858</span> assertNotNull(r.getValue(fam1, q4));<a name="line.5858"></a> -<span class="sourceLineNo">5859</span><a name="line.5859"></a> -<span class="sourceLineNo">5860</span> // Increment time to T+15 seconds<a name="line.5860"></a> -<span class="sourceLineNo">5861</span> edge.incrementTime(5000);<a name="line.5861"></a> -<span class="sourceLineNo">5862</span><a name="line.5862"></a> -<span class="sourceLineNo">5863</span> r = region.get(new Get(row));<a name="line.5863"></a> -<span class="sourceLineNo">5864</span> assertNull(r.getValue(fam1, q1));<a name="line.5864"></a> -<span class="sourceLineNo">5865</span> assertNull(r.getValue(fam1, q2));<a name="line.5865"></a> -<span class="sourceLineNo">5866</span> assertNull(r.getValue(fam1, q3));<a name="line.5866"></a> -<span class="sourceLineNo">5867</span> assertNotNull(r.getValue(fam1, q4));<a name="line.5867"></a> -<span class="sourceLineNo">5868</span><a name="line.5868"></a> -<span class="sourceLineNo">5869</span> // Increment time to T+20 seconds<a name="line.5869"></a> -<span class="sourceLineNo">5870</span> edge.incrementTime(10000);<a name="line.5870"></a> +<span class="sourceLineNo">5742</span> // create and then open a region first so that it can be closed later<a name="line.5742"></a> +<span class="sourceLineNo">5743</span> region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5743"></a> +<span class="sourceLineNo">5744</span> region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5744"></a> +<span class="sourceLineNo">5745</span> TEST_UTIL.getConfiguration(), rss, null);<a name="line.5745"></a> +<span class="sourceLineNo">5746</span><a name="line.5746"></a> +<span class="sourceLineNo">5747</span> // close the region<a name="line.5747"></a> +<span class="sourceLineNo">5748</span> region.close(false);<a name="line.5748"></a> +<span class="sourceLineNo">5749</span><a name="line.5749"></a> +<span class="sourceLineNo">5750</span> // 2 times, one for region open, the other close region<a name="line.5750"></a> +<span class="sourceLineNo">5751</span> verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5751"></a> +<span class="sourceLineNo">5752</span> editCaptor.capture(), anyBoolean());<a name="line.5752"></a> +<span class="sourceLineNo">5753</span><a name="line.5753"></a> +<span class="sourceLineNo">5754</span> WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5754"></a> +<span class="sourceLineNo">5755</span> assertNotNull(edit);<a name="line.5755"></a> +<span class="sourceLineNo">5756</span> assertNotNull(edit.getCells());<a name="line.5756"></a> +<span class="sourceLineNo">5757</span> assertEquals(1, edit.getCells().size());<a name="line.5757"></a> +<span class="sourceLineNo">5758</span> RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5758"></a> +<span class="sourceLineNo">5759</span> assertNotNull(desc);<a name="line.5759"></a> +<span class="sourceLineNo">5760</span><a name="line.5760"></a> +<span class="sourceLineNo">5761</span> LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5761"></a> +<span class="sourceLineNo">5762</span><a name="line.5762"></a> +<span class="sourceLineNo">5763</span> assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5763"></a> +<span class="sourceLineNo">5764</span> assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5764"></a> +<span class="sourceLineNo">5765</span> assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5765"></a> +<span class="sourceLineNo">5766</span> hri.getEncodedNameAsBytes()));<a name="line.5766"></a> +<span class="sourceLineNo">5767</span> assertTrue(desc.getLogSequenceNumber() > 0);<a name="line.5767"></a> +<span class="sourceLineNo">5768</span> assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5768"></a> +<span class="sourceLineNo">5769</span> assertEquals(2, desc.getStoresCount());<a name="line.5769"></a> +<span class="sourceLineNo">5770</span><a name="line.5770"></a> +<span class="sourceLineNo">5771</span> StoreDescriptor store = desc.getStores(0);<a name="line.5771"></a> +<span class="sourceLineNo">5772</span> assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5772"></a> +<span class="sourceLineNo">5773</span> assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5773"></a> +<span class="sourceLineNo">5774</span> assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5774"></a> +<span class="sourceLineNo">5775</span><a name="line.5775"></a> +<span class="sourceLineNo">5776</span> store = desc.getStores(1);<a name="line.5776"></a> +<span class="sourceLineNo">5777</span> assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5777"></a> +<span class="sourceLineNo">5778</span> assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5778"></a> +<span class="sourceLineNo">5779</span> assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5779"></a> +<span class="sourceLineNo">5780</span> }<a name="line.5780"></a> +<span class="sourceLineNo">5781</span><a name="line.5781"></a> +<span class="sourceLineNo">5782</span> /**<a name="line.5782"></a> +<span class="sourceLineNo">5783</span> * Test RegionTooBusyException thrown when region is busy<a name="line.5783"></a> +<span class="sourceLineNo">5784</span> */<a name="line.5784"></a> +<span class="sourceLineNo">5785</span> @Test<a name="line.5785"></a> +<span class="sourceLineNo">5786</span> public void testRegionTooBusy() throws IOException {<a name="line.5786"></a> +<span class="sourceLineNo">5787</span> byte[] family = Bytes.toBytes("family");<a name="line.5787"></a> +<span class="sourceLineNo">5788</span> long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5788"></a> +<span class="sourceLineNo">5789</span> HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5789"></a> +<span class="sourceLineNo">5790</span> CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5790"></a> +<span class="sourceLineNo">5791</span> region = initHRegion(tableName, method, CONF, family);<a name="line.5791"></a> +<span class="sourceLineNo">5792</span> final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5792"></a> +<span class="sourceLineNo">5793</span> Thread t = new Thread(new Runnable() {<a name="line.5793"></a> +<span class="sourceLineNo">5794</span> @Override<a name="line.5794"></a> +<span class="sourceLineNo">5795</span> public void run() {<a name="line.5795"></a> +<span class="sourceLineNo">5796</span> try {<a name="line.5796"></a> +<span class="sourceLineNo">5797</span> region.lock.writeLock().lock();<a name="line.5797"></a> +<span class="sourceLineNo">5798</span> stopped.set(false);<a name="line.5798"></a> +<span class="sourceLineNo">5799</span> while (!stopped.get()) {<a name="line.5799"></a> +<span class="sourceLineNo">5800</span> Thread.sleep(100);<a name="line.5800"></a> +<span class="sourceLineNo">5801</span> }<a name="line.5801"></a> +<span class="sourceLineNo">5802</span> } catch (InterruptedException ie) {<a name="line.5802"></a> +<span class="sourceLineNo">5803</span> } finally {<a name="line.5803"></a> +<span class="sourceLineNo">5804</span> region.lock.writeLock().unlock();<a name="line.5804"></a> +<span class="sourceLineNo">5805</span> }<a name="line.5805"></a> +<span class="sourceLineNo">5806</span> }<a name="line.5806"></a> +<span class="sourceLineNo">5807</span> });<a name="line.5807"></a> +<span class="sourceLineNo">5808</span> t.start();<a name="line.5808"></a> +<span class="sourceLineNo">5809</span> Get get = new Get(row);<a name="line.5809"></a> +<span class="sourceLineNo">5810</span> try {<a name="line.5810"></a> +<span class="sourceLineNo">5811</span> while (stopped.get()) {<a name="line.5811"></a> +<span class="sourceLineNo">5812</span> Thread.sleep(100);<a name="line.5812"></a> +<span class="sourceLineNo">5813</span> }<a name="line.5813"></a> +<span class="sourceLineNo">5814</span> region.get(get);<a name="line.5814"></a> +<span class="sourceLineNo">5815</span> fail("Should throw RegionTooBusyException");<a name="line.5815"></a> +<span class="sourceLineNo">5816</span> } catch (InterruptedException ie) {<a name="line.5816"></a> +<span class="sourceLineNo">5817</span> fail("test interrupted");<a name="line.5817"></a> +<span class="sourceLineNo">5818</span> } catch (RegionTooBusyException e) {<a name="line.5818"></a> +<span class="sourceLineNo">5819</span> // Good, expected<a name="line.5819"></a> +<span class="sourceLineNo">5820</span> } finally {<a name="line.5820"></a> +<span class="sourceLineNo">5821</span> stopped.set(true);<a name="line.5821"></a> +<span class="sourceLineNo">5822</span> try {<a name="line.5822"></a> +<span class="sourceLineNo">5823</span> t.join();<a name="line.5823"></a> +<span class="sourceLineNo">5824</span> } catch (Throwable e) {<a name="line.5824"></a> +<span class="sourceLineNo">5825</span> }<a name="line.5825"></a> +<span class="sourceLineNo">5826</span><a name="line.5826"></a> +<span class="sourceLineNo">5827</span> HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5827"></a> +<span class="sourceLineNo">5828</span> region = null;<a name="line.5828"></a> +<span class="sourceLineNo">5829</span> CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5829"></a> +<span class="sourceLineNo">5830</span> }<a name="line.5830"></a> +<span class="sourceLineNo">5831</span> }<a name="line.5831"></a> +<span class="sourceLineNo">5832</span><a name="line.5832"></a> +<span class="sourceLineNo">5833</span> @Test<a name="line.5833"></a> +<span class="sourceLineNo">5834</span> public void testCellTTLs() throws IOException {<a name="line.5834"></a> +<span class="sourceLineNo">5835</span> IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5835"></a> +<span class="sourceLineNo">5836</span> EnvironmentEdgeManager.injectEdge(edge);<a name="line.5836"></a> +<span class="sourceLineNo">5837</span><a name="line.5837"></a> +<span class="sourceLineNo">5838</span> final byte[] row = Bytes.toBytes("testRow");<a name="line.5838"></a> +<span class="sourceLineNo">5839</span> final byte[] q1 = Bytes.toBytes("q1");<a name="line.5839"></a> +<span class="sourceLineNo">5840</span> final byte[] q2 = Bytes.toBytes("q2");<a name="line.5840"></a> +<span class="sourceLineNo">5841</span> final byte[] q3 = Bytes.toBytes("q3");<a name="line.5841"></a> +<span class="sourceLineNo">5842</span> final byte[] q4 = Bytes.toBytes("q4");<a name="line.5842"></a> +<span class="sourceLineNo">5843</span><a name="line.5843"></a> +<span class="sourceLineNo">5844</span> HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5844"></a> +<span class="sourceLineNo">5845</span> HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5845"></a> +<span class="sourceLineNo">5846</span> hcd.setTimeToLive(10); // 10 seconds<a name="line.5846"></a> +<span class="sourceLineNo">5847</span> htd.addFamily(hcd);<a name="line.5847"></a> +<span class="sourceLineNo">5848</span><a name="line.5848"></a> +<span class="sourceLineNo">5849</span> Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5849"></a> +<span class="sourceLineNo">5850</span> conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5850"></a> +<span class="sourceLineNo">5851</span><a name="line.5851"></a> +<span class="sourceLineNo">5852</span> region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5852"></a> +<span class="sourceLineNo">5853</span> HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5853"></a> +<span class="sourceLineNo">5854</span> TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5854"></a> +<span class="sourceLineNo">5855</span> assertNotNull(region);<a name="line.5855"></a> +<span class="sourceLineNo">5856</span> long now = EnvironmentEdgeManager.currentTime();<a name="line.5856"></a> +<span class="sourceLineNo">5857</span> // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5857"></a> +<span class="sourceLineNo">5858</span> region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5858"></a> +<span class="sourceLineNo">5859</span> HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5859"></a> +<span class="sourceLineNo">5860</span> // TTL tags specify ts in milliseconds<a name="line.5860"></a> +<span class="sourceLineNo">5861</span> new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5861"></a> +<span class="sourceLineNo">5862</span> // Add a cell that will expire after 10 seconds via family setting<a name="line.5862"></a> +<span class="sourceLineNo">5863</span> region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5863"></a> +<span class="sourceLineNo">5864</span> // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5864"></a> +<span class="sourceLineNo">5865</span> region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5865"></a> +<span class="sourceLineNo">5866</span> HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5866"></a> +<span class="sourceLineNo">5867</span> // TTL tags specify ts in milliseconds<a name="line.5867"></a> +<span class="sourceLineNo">5868</span> new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5868"></a> +<span class="sourceLineNo">5869</span> // Add a cell that will expire in 20 seconds via family setting<a name="line.5869"></a> +<span class="sourceLineNo">5870</span> region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5870"></a> <span class="sourceLineNo">5871</span><a name="line.5871"></a> -<span class="sourceLineNo">5872</span> r = region.get(new Get(row));<a name="line.5872"></a> -<span class="sourceLineNo">5873</span> assertNull(r.getValue(fam1, q1));<a name="line.5873"></a> -<span class="sourceLineNo">5874</span> assertNull(r.getValue(fam1, q2));<a name="line.5874"></a> -<span class="sourceLineNo">5875</span> assertNull(r.getValue(fam1, q3));<a name="line.5875"></a> -<span class="sourceLineNo">5876</span> assertNull(r.getValue(fam1, q4));<a name="line.5876"></a> -<span class="sourceLineNo">5877</span><a name="line.5877"></a> -<span class="sourceLineNo">5878</span> // Fun with disappearing increments<a name="line.5878"></a> -<span class="sourceLineNo">5879</span><a name="line.5879"></a> -<span class="sourceLineNo">5880</span> // Start at 1<a name="line.5880"></a> -<span class="sourceLineNo">5881</span> region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5881"></a> -<span class="sourceLineNo">5882</span> r = region.get(new Get(row));<a name="line.5882"></a> -<span class="sourceLineNo">5883</span> byte[] val = r.getValue(fam1, q1);<a name="line.5883"></a> -<span class="sourceLineNo">5884</span> assertNotNull(val);<a name="line.5884"></a> -<span class="sourceLineNo">5885</span> assertEquals(1L, Bytes.toLong(val));<a name="line.5885"></a> -<span class="sourceLineNo">5886</span><a name="line.5886"></a> -<span class="sourceLineNo">5887</span> // Increment with a TTL of 5 seconds<a name="line.5887"></a> -<span class="sourceLineNo">5888</span> Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5888"></a> -<span class="sourceLineNo">5889</span> incr.setTTL(5000);<a name="line.5889"></a> -<span class="sourceLineNo">5890</span> region.increment(incr); // 2<a name="line.5890"></a> -<span class="sourceLineNo">5891</span><a name="line.5891"></a> -<span class="sourceLineNo">5892</span> // New value should be 2<a name="line.5892"></a> -<span class="sourceLineNo">5893</span> r = region.get(new Get(row));<a name="line.5893"></a> -<span class="sourceLineNo">5894</span> val = r.getValue(fam1, q1);<a name="line.5894"></a> -<span class="sourceLineNo">5895</span> assertNotNull(val);<a name="line.5895"></a> -<span class="sourceLineNo">5896</span> assertEquals(2L, Bytes.toLong(val));<a name="line.5896"></a> -<span class="sourceLineNo">5897</span><a name="line.5897"></a> -<span class="sourceLineNo">5898</span> // Increment time to T+25 seconds<a name="line.5898"></a> -<span class="sourceLineNo">5899</span> edge.incrementTime(5000);<a name="line.5899"></a> -<span class="sourceLineNo">5900</span><a name="line.5900"></a> -<span class="sourceLineNo">5901</span> // Value should be back to 1<a name="line.5901"></a> -<span class="sourceLineNo">5902</span> r = region.get(new Get(row));<a name="line.5902"></a> -<span class="sourceLineNo">5903</span> val = r.getValue(fam1, q1);<a name="line.5903"></a> -<span class="sourceLineNo">5904</span> assertNotNull(val);<a name="line.5904"></a> -<span class="sourceLineNo">5905</span> assertEquals(1L, Bytes.toLong(val));<a name="line.5905"></a> -<span class="sourceLineNo">5906</span><a name="line.5906"></a> -<span class="sourceLineNo">5907</span> // Increment time to T+30 seconds<a name="line.5907"></a> -<span class="sourceLineNo">5908</span> edge.incrementTime(5000);<a name="line.5908"></a> -<span class="sourceLineNo">5909</span><a name="line.5909"></a> -<span class="sourceLineNo">5910</span> // Original value written at T+20 should be gone now via family TTL<a name="line.5910"></a> -<span class="sourceLineNo">5911</span> r = region.get(new Get(row));<a name="line.5911"></a> -<span class="sourceLineNo">5912</span> assertNull(r.getValue(fam1, q1));<a name="line.5912"></a> -<span class="sourceLineNo">5913</span> }<a name="line.5913"></a> -<span class="sourceLineNo">5914</span><a name="line.5914"></a> -<span class="sourceLineNo">5915</span> @Test<a name="line.5915"></a> -<span class="sourceLineNo">5916</span> public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5916"></a> -<span class="sourceLineNo">5917</span> region = initHRegion(tableName, method, CONF, fam1);<a name="line.5917"></a> -<span class="sourceLineNo">5918</span> ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5918"></a> -<span class="sourceLineNo">5919</span> EnvironmentEdgeManager.injectEdge(edge);<a name="line.5919"></a> -<span class="sourceLineNo">5920</span><a name="line.5920"></a> -<span class="sourceLineNo">5921</span> edge.setValue(10);<a name="line.5921"></a> -<span class="sourceLineNo">5922</span> Increment inc = new Increment(row);<a name="line.5922"></a> -<span class="sourceLineNo">5923</span> inc.setDurability(Durability.SKIP_WAL);<a name="line.5923"></a> -<span class="sourceLineNo">5924</span> inc.addColumn(fam1, qual1, 1L);<a name="line.5924"></a> -<span class="sourceLineNo">5925</span> region.increment(inc);<a name="line.5925"></a> +<span class="sourceLineNo">5872</span> // Flush so we are sure store scanning gets this right<a name="line.5872"></a> +<span class="sourceLineNo">5873</span> region.flush(true);<a name="line.5873"></a> +<span class="sourceLineNo">5874</span><a name="line.5874"></a> +<span class="sourceLineNo">5875</span> // A query at time T+0 should return all cells<a name="line.5875"></a> +<span class="sourceLineNo">5876</span> Result r = region.get(new Get(row));<a name="line.5876"></a> +<span class="sourceLineNo">5877</span> assertNotNull(r.getValue(fam1, q1));<a name="line.5877"></a> +<span class="sourceLineNo">5878</span> assertNotNull(r.getValue(fam1, q2));<a name="line.5878"></a> +<span class="sourceLineNo">5879</span> assertNotNull(r.getValue(fam1, q3));<a name="line.5879"></a> +<span class="sourceLineNo">5880</span> assertNotNull(r.getValue(fam1, q4));<a name="line.5880"></a> +<span class="sourceLineNo">5881</span><a name="line.5881"></a> +<span class="sourceLineNo">5882</span> // Increment time to T+5 seconds<a name="line.5882"></a> +<span class="sourceLineNo">5883</span> edge.incrementTime(5000);<a name="line.5883"></a> +<span class="sourceLineNo">5884</span><a name="line.5884"></a> +<span class="sourceLineNo">5885</span> r = region.get(new Get(row));<a name="line.5885"></a> +<span class="sourceLineNo">5886</span> assertNull(r.getValue(fam1, q1));<a name="line.5886"></a> +<span class="sourceLineNo">5887</span> assertNotNull(r.getValue(fam1, q2));<a name="line.5887"></a> +<span class="sourceLineNo">5888</span> assertNotNull(r.getValue(fam1, q3));<a name="line.5888"></a> +<span class="sourceLineNo">5889</span> assertNotNull(r.getValue(fam1, q4));<a name="line.5889"></a> +<span class="sourceLineNo">5890</span><a name="line.5890"></a> +<span class="sourceLineNo">5891</span> // Increment time to T+10 seconds<a name="line.5891"></a> +<span class="sourceLineNo">5892</span> edge.incrementTime(5000);<a name="line.5892"></a> +<span class="sourceLineNo">5893</span><a name="line.5893"></a> +<span class="sourceLineNo">5894</span> r = region.get(new Get(row));<a name="line.5894"></a> +<span class="sourceLineNo">5895</span> assertNull(r.getValue(fam1, q1));<a name="line.5895"></a> +<span class="sourceLineNo">5896</span> assertNull(r.getValue(fam1, q2));<a name="line.5896"></a> +<span class="sourceLineNo">5897</span> assertNotNull(r.getValue(fam1, q3));<a name="line.5897"></a> +<span class="sourceLineNo">5898</span> assertNotNull(r.getValue(fam1, q4));<a name="line.5898"></a> +<span class="sourceLineNo">5899</span><a name="line.5899"></a> +<span class="sourceLineNo">5900</span> // Increment time to T+15 seconds<a name="line.5900"></a> +<span class="sourceLineNo">5901</span> edge.incrementTime(5000);<a name="line.5901"></a> +<span class="sourceLineNo">5902</span><a name="line.5902"></a> +<span class="sourceLineNo">5903</span> r = region.get(new Get(row));<a name="line.5903"></a> +<span class="sourceLineNo">5904</span> assertNull(r.getValue(fam1, q1));<a name="line.5904"></a> +<span class="sourceLineNo">5905</span> assertNull(r.getValue(fam1, q2));<a name="line.5905"></a> +<span class="sourceLineNo">5906</span> assertNull(r.getValue(fam1, q3));<a name="line.5906"></a> +<span class="sourceLineNo">5907</span> assertNotNull(r.getValue(fam1, q4));<a name="line.5907"></a> +<span class="sourceLineNo">5908</span><a name="line.5908"></a> +<span class="sourceLineNo">5909</span> // Increment time to T+20 seconds<a name="line.5909"></a> +<span class="sourceLineNo">5910</span> edge.incrementTime(10000);<a name="line.5910"></a> +<span class="sourceLineNo">5911</span><a name="line.5911"></a> +<span class="sourceLineNo">5912</span> r = region.get(new Get(row));<a name="line.5912"></a> +<span class="sourceLineNo">5913</span> assertNull(r.getValue(fam1, q1));<a name="line.5913"></a> +<span class="sourceLineNo">5914</span> assertNull(r.getValue(fam1, q2));<a name="line.5914"></a> +<span class="sourceLineNo">5915</span> assertNull(r.getValue(fam1, q3));<a name="line.5915"></a> +<span class="sourceLineNo">5916</span> assertNull(r.getValue(fam1, q4));<a name="line.5916"></a> +<span class="sourceLineNo">5917</span><a name="line.5917"></a> +<span class="sourceLineNo">5918</span> // Fun with disappearing increments<a name="line.5918"></a> +<span class="sourceLineNo">5919</span><a name="line.5919"></a> +<span class="sourceLineNo">5920</span> // Start at 1<a name="line.5920"></a> +<span class="sourceLineNo">5921</span> region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5921"></a> +<span class="sourceLineNo">5922</span> r = region.get(new Get(row));<a name="line.5922"></a> +<span class="sourceLineNo">5923</span> byte[] val = r.getValue(fam1, q1);<a name="line.5923"></a> +<span class="sourceLineNo">5924</span> assertNotNull(val);<a name="line.5924"></a> +<span class="sourceLineNo">5925</span> assertEquals(1L, Bytes.toLong(val));<a name="line.5925"></a> <span class="sourceLineNo">5926</span><a name="line.5926"></a> -<span class="sourceLineNo">5927</span> Result result = region.get(new Get(row));<a name="line.5927"></a> -<span class="sourceLineNo">5928</span> Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5928"></a> -<span class="sourceLineNo">5929</span> assertNotNull(c);<a name="line.5929"></a> -<span class="sourceLineNo">5930</span> assertEquals(10L, c.getTimestamp());<a name="line.5930"></a> +<span class="sourceLineNo">5927</span> // Increment with a TTL of 5 seconds<a name="line.5927"></a> +<span class="sourceLineNo">5928</span> Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5928"></a> +<span class="sourceLineNo">5929</span> incr.setTTL(5000);<a name="line.5929"></a> +<span class="sourceLineNo">5930</span> region.increment(incr); // 2<a name="line.5930"></a> <span class="sourceLineNo">5931</span><a name="line.5931"></a> -<span class="sourceLineNo">5932</span> edge.setValue(1); // clock goes back<a name="line.5932"></a> -<span class="sourceLineNo">5933</span> region.increment(inc);<a name="line.5933"></a> -<span class="sourceLineNo">5934</span> result = region.get(new Get(row));<a name="line.5934"></a> -<span class="sourceLineNo">5935</span> c = result.getColumnLatestCell(fam1, qual1);<a name="line.5935"></a> -<span class="sourceLineNo">5936</span> assertEquals(11L, c.getTimestamp());<a name="line.5936"></a> -<span class="sourceLineNo">5937</span> assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5937"></a> -<span class="sourceLineNo">5938</span> }<a name="line.5938"></a> -<span class="sourceLineNo">5939</span><a name="line.5939"></a> -<span class="sourceLineNo">5940</span> @Test<a name="line.5940"></a> -<span class="sourceLineNo">5941</span> public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.5941"></a> -<span class="sourceLineNo">5942</span> region = initHRegion(tableName, method, CONF, fam1);<a name="line.5942"></a> -<span class="sourceLineNo">5943</span> ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5943"></a> -<span class="sourceLineNo">5944</span> EnvironmentEdgeManager.injectEdge(edge);<a name="line.5944"></a> -<span class="sourceLineNo">5945</span><a name="line.5945"></a> -<span class="sourceLineNo">5946</span> edge.setValue(10);<a name="line.5946"></a> -<span class="sourceLineNo">5947</span> Append a = new Append(row);<a name="line.5947"></a> -<span class="sourceLineNo">5948</span> a.setDurability(Durability.SKIP_WAL);<a name="line.5948"></a> -<span class="sourceLineNo">5949</span> a.addColumn(fam1, qual1, qual1);<a name="line.5949"></a> -<span class="sourceLineNo">5950</span> region.append(a);<a name="line.5950"></a> -<span class="sourceLineNo">5951</span><a name="line.5951"></a> -<span class="sourceLineNo">5952</span> Result result = region.get(new Get(row));<a name="line.5952"></a> -<span class="sourceLineNo">5953</span> Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5953"></a> -<span class="sourceLineNo">5954</span> assertNotNull(c);<a name="line.5954"></a> -<span class="sourceLineNo">5955</span> assertEquals(10L, c.getTimestamp());<a name="line.5955"></a> -<span class="sourceLineNo">5956</span><a name="line.5956"></a> -<span class="sourceLineNo">5957</span> edge.setValue(1); // clock goes back<a name="line.5957"></a> -<span class="sourceLineNo">5958</span> region.append(a);<a name="line.5958"></a> -<span class="sourceLineNo">5959</span> result = region.get(new Get(row));<a name="line.5959"></a> -<span class="sourceLineNo">5960</span> c = result.getColumnLatestCell(fam1, qual1);<a name="line.5960"></a> -<span class="sourceLineNo">5961</span> assertEquals(11L, c.getTimestamp());<a name="line.5961"></a> -<span class="sourceLineNo">5962</span><a name="line.5962"></a> -<span class="sourceLineNo">5963</span> byte[] expected = new byte[qual1.length*2];<a name="line.5963"></a> -<span class="sourceLineNo">5964</span> System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.5964"></a> -<span class="sourceLineNo">5965</span> System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.5965"></a> +<span class="sourceLineNo">5932</span> // New value should be 2<a name="line.5932"></a> +<span class="sourceLineNo">5933</span> r = region.get(new Get(row));<a name="line.5933"></a> +<span class="sourceLineNo">5934</span> val = r.getValue(fam1, q1);<a name="line.5934"></a> +<span class="sourceLineNo">5935</span> assertNotNull(val);<a name="line.5935"></a> +<span class="sourceLineNo">5936</span> assertEquals(2L, Bytes.toLong(val));<a name="line.5936"></a> +<span class="sourceLineNo">5937</span><a name="line.5937"></a> +<span class="sourceLineNo">5938</span> // Increment time to T+25 seconds<a name="line.5938"></a> +<span class="sourceLineNo">5939</span> edge.incrementTime(5000);<a name="line.5939"></a> +<span class="sourceLineNo">5940</span><a name="line.5940"></a> +<span class="sourceLineNo">5941</span> // Value should be back to 1<a name="line.5941"></a> +<span class="sourceLineNo">5942</span> r = region.get(new Get(row));<a name="line.5942"></a> +<span class="sourceLineNo">5943</span> val = r.getValue(fam1, q1);<a name="line.5943"></a> +<span class="sourceLineNo">5944</span> assertNotNull(val);<a name="line.5944"></a> +<span class="sourceLineNo">5945</span> assertEquals(1L, Bytes.toLong(val));<a name="line.5945"></a> +<span class="sourceLineNo">5946</span><a name="line.5946"></a> +<span class="sourceLineNo">5947</span> // Increment time to T+30 seconds<a name="line.5947"></a> +<span class="sourceLineNo">5948</span> edge.incrementTime(5000);<a name="line.5948"></a> +<span class="sourceLineNo">5949</span><a name="line.5949"></a> +<span class="sourceLineNo">5950</span> // Original value written at T+20 should be gone now via family TTL<a name="line.5950"></a> +<span class="sourceLineNo">5951</span> r = region.get(new Get(row));<a name="line.5951"></a> +<span class="sourceLineNo">5952</span> assertNull(r.getValue(fam1, q1));<a name="line.5952"></a> +<span class="sourceLineNo">5953</span> }<a name="line.5953"></a> +<span class="sourceLineNo">5954</span><a name="line.5954"></a> +<span class="sourceLineNo">5955</span> @Test<a name="line.5955"></a> +<span class="sourceLineNo">5956</span> public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5956"></a> +<span class="sourceLineNo">5957</span> region = initHRegion(tableName, method, CONF, fam1);<a name="line.5957"></a> +<span class="sourceLineNo">5958</span> ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5958"></a> +<span class="sourceLineNo">5959</span> EnvironmentEdgeManager.injectEdge(edge);<a name="line.5959"></a> +<span class="sourceLineNo">5960</span><a name="line.5960"></a> +<span class="sourceLineNo">5961</span> edge.setValue(10);<a name="line.5961"></a> +<span class="sourceLineNo">5962</span> Increment inc = new Increment(row);<a name="line.5962"></a> +<span class="sourceLineNo">5963</span> inc.setDurability(Durability.SKIP_WAL);<a name="line.5963"></a> +<span class="sourceLineNo">5964</span> inc.addColumn(fam1, qual1, 1L);<a name="line.5964"></a> +<span class="sourceLineNo">5965</span> region.increment(inc);<a name="line.5965"></a> <span class="sourceLineNo">5966</span><a name="line.5966"></a> -<span class="sourceLineNo">5967</span> assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.5967"></a> -<span class="sourceLineNo">5968</span> expected, 0, expected.length));<a name="line.5968"></a> -<span class="sourceLineNo">5969</span> }<a name="line.5969"></a> -<span class="sourceLineNo">5970</span><a name="line.5970"></a> -<span class="sourceLineNo">5971</span> @Test<a name="line.5971"></a> -<span class="sourceLineNo">5972</span> public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.5972"></a> -<span class="sourceLineNo">5973</span> region = initHRegion(tableName, method, CONF, fam1);<a name="line.5973"></a> -<span class="sourceLineNo">5974</span> ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5974"></a> -<span class="sourceLineNo">5975</span> EnvironmentEdgeManager.injectEdge(edge);<a name="line.5975"></a> -<span class="sourceLineNo">5976</span><a name="line.5976"></a> -<span class="sourceLineNo">5977</span> edge.setValue(10);<a name="line.5977"></a> -<span class="sourceLineNo">5978</span> Put p = new Put(row);<a name="line.5978"></a> -<span class="sourceLineNo">5979</span> p.setDurability(Durability.SKIP_WAL);<a name="line.5979"></a> -<span class="sourceLineNo">5980</span> p.addColumn(fam1, qual1, qual1);<a name="line.5980"></a> -<span class="sourceLineNo">5981</span> region.put(p);<a name="line.5981"></a> -<span class="sourceLineNo">5982</span><a name="line.5982"></a> -<span class="sourceLineNo">5983</span> Result result = region.get(new Get(row));<a name="line.5983"></a> -<span class="sourceLineNo">5984</span> Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5984"></a> -<span class="sourceLineNo">5985</span> assertNotNull(c);<a name="line.5985"></a> -<span class="sourceLineNo">5986</span> assertEquals(10L, c.getTimestamp());<a name="line.5986"></a> -<span class="sourceLineNo">5987</span><a name="line.5987"></a> -<span class="sourceLineNo">5988</span> edge.setValue(1); // clock goes back<a name="line.5988"></a> -<span class="sourceLineNo">5989</span> p = new Put(row);<a name="line.5989"></a> -<span class="sourceLineNo">5990</span> p.setDurability(Durability.SKIP_WAL);<a name="line.5990"></a> -<span class="sourceLineNo">5991</span> p.addColumn(fam1, qual1, qual2);<a name="line.5991"></a> -<span class="sourceLineNo">5992</span> region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.5992"></a> -<span class="sourceLineNo">5993</span> result = region.get(new Get(row));<a name="line.5993"></a> -
<TRUNCATED>