Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 4B053200C57 for ; Sat, 1 Apr 2017 05:33:34 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 49C85160B8C; Sat, 1 Apr 2017 03:33:34 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id D3E3C160BA5 for ; Sat, 1 Apr 2017 05:33:30 +0200 (CEST) Received: (qmail 76822 invoked by uid 500); 1 Apr 2017 03:33:29 -0000 Mailing-List: contact commits-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@hbase.apache.org Delivered-To: mailing list commits@hbase.apache.org Received: (qmail 74938 invoked by uid 99); 1 Apr 2017 03:33:28 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 01 Apr 2017 03:33:28 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 78368E00FF; Sat, 1 Apr 2017 03:33:28 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: git-site-role@apache.org To: commits@hbase.apache.org Date: Sat, 01 Apr 2017 03:33:37 -0000 Message-Id: <59c238862d7b4de1a741442bbf21d982@git.apache.org> In-Reply-To: <16729bd3672d4c04a6f13bdb72b1fa90@git.apache.org> References: <16729bd3672d4c04a6f13bdb72b1fa90@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [10/25] hbase-site git commit: Published site at 9facfa550f1e7386be3a04d84f7e8013f5002965. archived-at: Sat, 01 Apr 2017 03:33:34 -0000 http://git-wip-us.apache.org/repos/asf/hbase-site/blob/993199fc/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html ---------------------------------------------------------------------- diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html index c885b3a..ac9ce7d 100644 --- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html +++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RSRpcServices.RegionScannerHolder.html @@ -1303,1942 +1303,1943 @@ 1295 throw new RegionServerStoppedException("File system not available"); 1296 } 1297 if (!regionServer.isOnline()) { -1298 throw new ServerNotRunningYetException("Server is not running yet"); -1299 } -1300 } -1301 -1302 /** -1303 * @return list of blocking services and their security info classes that this server supports -1304 */ -1305 protected List<BlockingServiceAndInterface> getServices() { -1306 List<BlockingServiceAndInterface> bssi = new ArrayList<>(2); -1307 bssi.add(new BlockingServiceAndInterface( -1308 ClientService.newReflectiveBlockingService(this), -1309 ClientService.BlockingInterface.class)); -1310 bssi.add(new BlockingServiceAndInterface( -1311 AdminService.newReflectiveBlockingService(this), -1312 AdminService.BlockingInterface.class)); -1313 return bssi; -1314 } -1315 -1316 public InetSocketAddress getSocketAddress() { -1317 return isa; -1318 } -1319 -1320 @Override -1321 public int getPriority(RequestHeader header, Message param, User user) { -1322 return priority.getPriority(header, param, user); -1323 } -1324 -1325 @Override -1326 public long getDeadline(RequestHeader header, Message param) { -1327 return priority.getDeadline(header, param); -1328 } -1329 -1330 /* -1331 * Check if an OOME and, if so, abort immediately to avoid creating more objects. -1332 * -1333 * @param e -1334 * -1335 * @return True if we OOME'd and are aborting. -1336 */ -1337 @Override -1338 public boolean checkOOME(final Throwable e) { -1339 return exitIfOOME(e); -1340 } -1341 -1342 public static boolean exitIfOOME(final Throwable e ){ -1343 boolean stop = false; -1344 try { -1345 if (e instanceof OutOfMemoryError -1346 || (e.getCause() != null && e.getCause() instanceof OutOfMemoryError) -1347 || (e.getMessage() != null && e.getMessage().contains( -1348 "java.lang.OutOfMemoryError"))) { -1349 stop = true; -1350 LOG.fatal("Run out of memory; " + RSRpcServices.class.getSimpleName() -1351 + " will abort itself immediately", e); -1352 } -1353 } finally { -1354 if (stop) { -1355 Runtime.getRuntime().halt(1); -1356 } -1357 } -1358 return stop; -1359 } -1360 -1361 /** -1362 * Close a region on the region server. -1363 * -1364 * @param controller the RPC controller -1365 * @param request the request -1366 * @throws ServiceException -1367 */ -1368 @Override -1369 @QosPriority(priority=HConstants.ADMIN_QOS) -1370 public CloseRegionResponse closeRegion(final RpcController controller, -1371 final CloseRegionRequest request) throws ServiceException { -1372 final ServerName sn = (request.hasDestinationServer() ? -1373 ProtobufUtil.toServerName(request.getDestinationServer()) : null); -1374 -1375 try { -1376 checkOpen(); -1377 if (request.hasServerStartCode()) { -1378 // check that we are the same server that this RPC is intended for. -1379 long serverStartCode = request.getServerStartCode(); -1380 if (regionServer.serverName.getStartcode() != serverStartCode) { -1381 throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " + -1382 "different server with startCode: " + serverStartCode + ", this server is: " -1383 + regionServer.serverName)); -1384 } -1385 } -1386 final String encodedRegionName = ProtobufUtil.getRegionEncodedName(request.getRegion()); -1387 -1388 requestCount.increment(); -1389 if (sn == null) { -1390 LOG.info("Close " + encodedRegionName + " without moving"); -1391 } else { -1392 LOG.info("Close " + encodedRegionName + ", moving to " + sn); -1393 } -1394 boolean closed = regionServer.closeRegion(encodedRegionName, false, sn); -1395 CloseRegionResponse.Builder builder = CloseRegionResponse.newBuilder().setClosed(closed); -1396 return builder.build(); -1397 } catch (IOException ie) { -1398 throw new ServiceException(ie); -1399 } -1400 } -1401 -1402 @Override -1403 @QosPriority(priority=HConstants.ADMIN_QOS) -1404 public CloseRegionForSplitOrMergeResponse closeRegionForSplitOrMerge( -1405 final RpcController controller, -1406 final CloseRegionForSplitOrMergeRequest request) throws ServiceException { -1407 try { -1408 checkOpen(); -1409 -1410 List<String> encodedRegionNameList = new ArrayList<>(); -1411 for(int i = 0; i < request.getRegionCount(); i++) { -1412 final String encodedRegionName = ProtobufUtil.getRegionEncodedName(request.getRegion(i)); -1413 -1414 // Can be null if we're calling close on a region that's not online -1415 final Region targetRegion = regionServer.getFromOnlineRegions(encodedRegionName); -1416 if ((targetRegion != null) && (targetRegion.getCoprocessorHost() != null)) { -1417 targetRegion.getCoprocessorHost().preClose(false); -1418 encodedRegionNameList.add(encodedRegionName); -1419 } -1420 } -1421 requestCount.increment(); -1422 LOG.info("Close and offline " + encodedRegionNameList + " regions."); -1423 boolean closed = regionServer.closeAndOfflineRegionForSplitOrMerge(encodedRegionNameList); -1424 CloseRegionForSplitOrMergeResponse.Builder builder = -1425 CloseRegionForSplitOrMergeResponse.newBuilder().setClosed(closed); -1426 return builder.build(); -1427 } catch (IOException ie) { -1428 throw new ServiceException(ie); -1429 } -1430 } -1431 -1432 /** -1433 * Compact a region on the region server. -1434 * -1435 * @param controller the RPC controller -1436 * @param request the request -1437 * @throws ServiceException -1438 */ -1439 @Override -1440 @QosPriority(priority=HConstants.ADMIN_QOS) -1441 public CompactRegionResponse compactRegion(final RpcController controller, -1442 final CompactRegionRequest request) throws ServiceException { -1443 try { -1444 checkOpen(); -1445 requestCount.increment(); -1446 Region region = getRegion(request.getRegion()); -1447 region.startRegionOperation(Operation.COMPACT_REGION); -1448 LOG.info("Compacting " + region.getRegionInfo().getRegionNameAsString()); -1449 boolean major = false; -1450 byte [] family = null; -1451 Store store = null; -1452 if (request.hasFamily()) { -1453 family = request.getFamily().toByteArray(); -1454 store = region.getStore(family); -1455 if (store == null) { -1456 throw new ServiceException(new DoNotRetryIOException("column family " + -1457 Bytes.toString(family) + " does not exist in region " + -1458 region.getRegionInfo().getRegionNameAsString())); -1459 } -1460 } -1461 if (request.hasMajor()) { -1462 major = request.getMajor(); -1463 } -1464 if (major) { -1465 if (family != null) { -1466 store.triggerMajorCompaction(); -1467 } else { -1468 region.triggerMajorCompaction(); -1469 } -1470 } -1471 -1472 String familyLogMsg = (family != null)?" for column family: " + Bytes.toString(family):""; -1473 if (LOG.isTraceEnabled()) { -1474 LOG.trace("User-triggered compaction requested for region " -1475 + region.getRegionInfo().getRegionNameAsString() + familyLogMsg); -1476 } -1477 String log = "User-triggered " + (major ? "major " : "") + "compaction" + familyLogMsg; -1478 if(family != null) { -1479 regionServer.compactSplitThread.requestCompaction(region, store, log, -1480 Store.PRIORITY_USER, null, RpcServer.getRequestUser()); -1481 } else { -1482 regionServer.compactSplitThread.requestCompaction(region, log, -1483 Store.PRIORITY_USER, null, RpcServer.getRequestUser()); -1484 } -1485 return CompactRegionResponse.newBuilder().build(); -1486 } catch (IOException ie) { -1487 throw new ServiceException(ie); -1488 } -1489 } -1490 -1491 /** -1492 * Flush a region on the region server. -1493 * -1494 * @param controller the RPC controller -1495 * @param request the request -1496 * @throws ServiceException -1497 */ -1498 @Override -1499 @QosPriority(priority=HConstants.ADMIN_QOS) -1500 public FlushRegionResponse flushRegion(final RpcController controller, -1501 final FlushRegionRequest request) throws ServiceException { -1502 try { -1503 checkOpen(); -1504 requestCount.increment(); -1505 Region region = getRegion(request.getRegion()); -1506 LOG.info("Flushing " + region.getRegionInfo().getRegionNameAsString()); -1507 boolean shouldFlush = true; -1508 if (request.hasIfOlderThanTs()) { -1509 shouldFlush = region.getEarliestFlushTimeForAllStores() < request.getIfOlderThanTs(); -1510 } -1511 FlushRegionResponse.Builder builder = FlushRegionResponse.newBuilder(); -1512 if (shouldFlush) { -1513 boolean writeFlushWalMarker = request.hasWriteFlushWalMarker() ? -1514 request.getWriteFlushWalMarker() : false; -1515 // Go behind the curtain so we can manage writing of the flush WAL marker -1516 HRegion.FlushResultImpl flushResult = (HRegion.FlushResultImpl) -1517 ((HRegion)region).flushcache(true, writeFlushWalMarker); -1518 boolean compactionNeeded = flushResult.isCompactionNeeded(); -1519 if (compactionNeeded) { -1520 regionServer.compactSplitThread.requestSystemCompaction(region, -1521 "Compaction through user triggered flush"); -1522 } -1523 builder.setFlushed(flushResult.isFlushSucceeded()); -1524 builder.setWroteFlushWalMarker(flushResult.wroteFlushWalMarker); -1525 } -1526 builder.setLastFlushTime(region.getEarliestFlushTimeForAllStores()); -1527 return builder.build(); -1528 } catch (DroppedSnapshotException ex) { -1529 // Cache flush can fail in a few places. If it fails in a critical -1530 // section, we get a DroppedSnapshotException and a replay of wal -1531 // is required. Currently the only way to do this is a restart of -1532 // the server. -1533 regionServer.abort("Replay of WAL required. Forcing server shutdown", ex); -1534 throw new ServiceException(ex); -1535 } catch (IOException ie) { -1536 throw new ServiceException(ie); -1537 } -1538 } -1539 -1540 @Override -1541 @QosPriority(priority=HConstants.ADMIN_QOS) -1542 public GetOnlineRegionResponse getOnlineRegion(final RpcController controller, -1543 final GetOnlineRegionRequest request) throws ServiceException { -1544 try { -1545 checkOpen(); -1546 requestCount.increment(); -1547 Map<String, Region> onlineRegions = regionServer.onlineRegions; -1548 List<HRegionInfo> list = new ArrayList<>(onlineRegions.size()); -1549 for (Region region: onlineRegions.values()) { -1550 list.add(region.getRegionInfo()); -1551 } -1552 Collections.sort(list); -1553 return ResponseConverter.buildGetOnlineRegionResponse(list); -1554 } catch (IOException ie) { -1555 throw new ServiceException(ie); -1556 } -1557 } -1558 -1559 @Override -1560 @QosPriority(priority=HConstants.ADMIN_QOS) -1561 public GetRegionInfoResponse getRegionInfo(final RpcController controller, -1562 final GetRegionInfoRequest request) throws ServiceException { -1563 try { -1564 checkOpen(); -1565 requestCount.increment(); -1566 Region region = getRegion(request.getRegion()); -1567 HRegionInfo info = region.getRegionInfo(); -1568 GetRegionInfoResponse.Builder builder = GetRegionInfoResponse.newBuilder(); -1569 builder.setRegionInfo(HRegionInfo.convert(info)); -1570 if (request.hasCompactionState() && request.getCompactionState()) { -1571 builder.setCompactionState(region.getCompactionState()); -1572 } -1573 builder.setIsRecovering(region.isRecovering()); -1574 return builder.build(); -1575 } catch (IOException ie) { -1576 throw new ServiceException(ie); -1577 } -1578 } -1579 -1580 @Override -1581 @QosPriority(priority=HConstants.ADMIN_QOS) -1582 public GetRegionLoadResponse getRegionLoad(RpcController controller, -1583 GetRegionLoadRequest request) throws ServiceException { -1584 -1585 List<Region> regions; -1586 if (request.hasTableName()) { -1587 TableName tableName = ProtobufUtil.toTableName(request.getTableName()); -1588 regions = regionServer.getOnlineRegions(tableName); -1589 } else { -1590 regions = regionServer.getOnlineRegions(); -1591 } -1592 List<RegionLoad> rLoads = new ArrayList<>(regions.size()); -1593 RegionLoad.Builder regionLoadBuilder = ClusterStatusProtos.RegionLoad.newBuilder(); -1594 RegionSpecifier.Builder regionSpecifier = RegionSpecifier.newBuilder(); -1595 -1596 try { -1597 for (Region region : regions) { -1598 rLoads.add(regionServer.createRegionLoad(region, regionLoadBuilder, regionSpecifier)); -1599 } -1600 } catch (IOException e) { -1601 throw new ServiceException(e); -1602 } -1603 GetRegionLoadResponse.Builder builder = GetRegionLoadResponse.newBuilder(); -1604 builder.addAllRegionLoads(rLoads); -1605 return builder.build(); -1606 } -1607 -1608 /** -1609 * Get some information of the region server. -1610 * -1611 * @param controller the RPC controller -1612 * @param request the request -1613 * @throws ServiceException -1614 */ -1615 @Override -1616 @QosPriority(priority=HConstants.ADMIN_QOS) -1617 public GetServerInfoResponse getServerInfo(final RpcController controller, -1618 final GetServerInfoRequest request) throws ServiceException { -1619 try { -1620 checkOpen(); -1621 } catch (IOException ie) { -1622 throw new ServiceException(ie); -1623 } -1624 requestCount.increment(); -1625 int infoPort = regionServer.infoServer != null ? regionServer.infoServer.getPort() : -1; -1626 return ResponseConverter.buildGetServerInfoResponse(regionServer.serverName, infoPort); -1627 } -1628 -1629 @Override -1630 @QosPriority(priority=HConstants.ADMIN_QOS) -1631 public GetStoreFileResponse getStoreFile(final RpcController controller, -1632 final GetStoreFileRequest request) throws ServiceException { -1633 try { -1634 checkOpen(); -1635 Region region = getRegion(request.getRegion()); -1636 requestCount.increment(); -1637 Set<byte[]> columnFamilies; -1638 if (request.getFamilyCount() == 0) { -1639 columnFamilies = region.getTableDesc().getFamiliesKeys(); -1640 } else { -1641 columnFamilies = new TreeSet<>(Bytes.BYTES_RAWCOMPARATOR); -1642 for (ByteString cf: request.getFamilyList()) { -1643 columnFamilies.add(cf.toByteArray()); -1644 } -1645 } -1646 int nCF = columnFamilies.size(); -1647 List<String> fileList = region.getStoreFileList( -1648 columnFamilies.toArray(new byte[nCF][])); -1649 GetStoreFileResponse.Builder builder = GetStoreFileResponse.newBuilder(); -1650 builder.addAllStoreFile(fileList); -1651 return builder.build(); -1652 } catch (IOException ie) { -1653 throw new ServiceException(ie); -1654 } -1655 } -1656 -1657 /** -1658 * Open asynchronously a region or a set of regions on the region server. -1659 * -1660 * The opening is coordinated by ZooKeeper, and this method requires the znode to be created -1661 * before being called. As a consequence, this method should be called only from the master. -1662 * <p> -1663 * Different manages states for the region are: -1664 * </p><ul> -1665 * <li>region not opened: the region opening will start asynchronously.</li> -1666 * <li>a close is already in progress: this is considered as an error.</li> -1667 * <li>an open is already in progress: this new open request will be ignored. This is important -1668 * because the Master can do multiple requests if it crashes.</li> -1669 * <li>the region is already opened: this new open request will be ignored.</li> -1670 * </ul> -1671 * <p> -1672 * Bulk assign: If there are more than 1 region to open, it will be considered as a bulk assign. -1673 * For a single region opening, errors are sent through a ServiceException. For bulk assign, -1674 * errors are put in the response as FAILED_OPENING. -1675 * </p> -1676 * @param controller the RPC controller -1677 * @param request the request -1678 * @throws ServiceException -1679 */ -1680 @Override -1681 @QosPriority(priority=HConstants.ADMIN_QOS) -1682 public OpenRegionResponse openRegion(final RpcController controller, -1683 final OpenRegionRequest request) throws ServiceException { -1684 requestCount.increment(); -1685 if (request.hasServerStartCode()) { -1686 // check that we are the same server that this RPC is intended for. -1687 long serverStartCode = request.getServerStartCode(); -1688 if (regionServer.serverName.getStartcode() != serverStartCode) { -1689 throw new ServiceException(new DoNotRetryIOException("This RPC was intended for a " + -1690 "different server with startCode: " + serverStartCode + ", this server is: " -1691 + regionServer.serverName)); -1692 } -1693 } -1694 -1695 OpenRegionResponse.Builder builder = OpenRegionResponse.newBuilder(); -1696 final int regionCount = request.getOpenInfoCount(); -1697 final Map<TableName, HTableDescriptor> htds = new HashMap<>(regionCount); -1698 final boolean isBulkAssign = regionCount > 1; -1699 try { -1700 checkOpen(); -1701 } catch (IOException ie) { -1702 TableName tableName = null; -1703 if (regionCount == 1) { -1704 RegionInfo ri = request.getOpenInfo(0).getRegion(); -1705 if (ri != null) { -1706 tableName = ProtobufUtil.toTableName(ri.getTableName()); -1707 } -1708 } -1709 if (!TableName.META_TABLE_NAME.equals(tableName)) { -1710 throw new ServiceException(ie); -1711 } -1712 // We are assigning meta, wait a little for regionserver to finish initialization. -1713 int timeout = regionServer.conf.getInt(HConstants.HBASE_RPC_TIMEOUT_KEY, -1714 HConstants.DEFAULT_HBASE_RPC_TIMEOUT) >> 2; // Quarter of RPC timeout -1715 long endTime = System.currentTimeMillis() + timeout; -1716 synchronized (regionServer.online) { -1717 try { -1718 while (System.currentTimeMillis() <= endTime -1719 && !regionServer.isStopped() && !regionServer.isOnline()) { -1720 regionServer.online.wait(regionServer.msgInterval); -1721 } -1722 checkOpen(); -1723 } catch (InterruptedException t) { -1724 Thread.currentThread().interrupt(); -1725 throw new ServiceException(t); -1726 } catch (IOException e) { -1727 throw new ServiceException(e); -1728 } -1729 } -1730 } -1731 -1732 long masterSystemTime = request.hasMasterSystemTime() ? request.getMasterSystemTime() : -1; -1733 -1734 for (RegionOpenInfo regionOpenInfo : request.getOpenInfoList()) { -1735 final HRegionInfo region = HRegionInfo.convert(regionOpenInfo.getRegion()); -1736 HTableDescriptor htd; -1737 try { -1738 String encodedName = region.getEncodedName(); -1739 byte[] encodedNameBytes = region.getEncodedNameAsBytes(); -1740 final Region onlineRegion = regionServer.getFromOnlineRegions(encodedName); -1741 if (onlineRegion != null) { -1742 // The region is already online. This should not happen any more. -1743 String error = "Received OPEN for the region:" -1744 + region.getRegionNameAsString() + ", which is already online"; -1745 regionServer.abort(error); -1746 throw new IOException(error); -1747 } -1748 LOG.info("Open " + region.getRegionNameAsString()); -1749 -1750 final Boolean previous = regionServer.regionsInTransitionInRS.putIfAbsent( -1751 encodedNameBytes, Boolean.TRUE); -1752 -1753 if (Boolean.FALSE.equals(previous)) { -1754 if (regionServer.getFromOnlineRegions(encodedName) != null) { -1755 // There is a close in progress. This should not happen any more. -1756 String error = "Received OPEN for the region:" -1757 + region.getRegionNameAsString() + ", which we are already trying to CLOSE"; -1758 regionServer.abort(error); -1759 throw new IOException(error); -1760 } -1761 regionServer.regionsInTransitionInRS.put(encodedNameBytes, Boolean.TRUE); -1762 } -1763 -1764 if (Boolean.TRUE.equals(previous)) { -1765 // An open is in progress. This is supported, but let's log this. -1766 LOG.info("Receiving OPEN for the region:" + -1767 region.getRegionNameAsString() + ", which we are already trying to OPEN" -1768 + " - ignoring this new request for this region."); -1769 } -1770 -1771 // We are opening this region. If it moves back and forth for whatever reason, we don't -1772 // want to keep returning the stale moved record while we are opening/if we close again. -1773 regionServer.removeFromMovedRegions(region.getEncodedName()); -1774 -1775 if (previous == null || !previous.booleanValue()) { -1776 // check if the region to be opened is marked in recovering state in ZK -1777 if (ZKSplitLog.isRegionMarkedRecoveringInZK(regionServer.getZooKeeper(), -1778 region.getEncodedName())) { -1779 // Check if current region open is for distributedLogReplay. This check is to support -1780 // rolling restart/upgrade where we want to Master/RS see same configuration -1781 if (!regionOpenInfo.hasOpenForDistributedLogReplay() -1782 || regionOpenInfo.getOpenForDistributedLogReplay()) { -1783 regionServer.recoveringRegions.put(region.getEncodedName(), null); -1784 } else { -1785 // Remove stale recovery region from ZK when we open region not for recovering which -1786 // could happen when turn distributedLogReplay off from on. -1787 List<String> tmpRegions = new ArrayList<>(); -1788 tmpRegions.add(region.getEncodedName()); -1789 ZKSplitLog.deleteRecoveringRegionZNodes(regionServer.getZooKeeper(), -1790 tmpRegions); -1791 } -1792 } -1793 htd = htds.get(region.getTable()); -1794 if (htd == null) { -1795 htd = regionServer.tableDescriptors.get(region.getTable()); -1796 htds.put(region.getTable(), htd); -1797 } -1798 if (htd == null) { -1799 throw new IOException("Missing table descriptor for " + region.getEncodedName()); -1800 } -1801 // If there is no action in progress, we can submit a specific handler. -1802 // Need to pass the expected version in the constructor. -1803 if (region.isMetaRegion()) { -1804 regionServer.service.submit(new OpenMetaHandler( -1805 regionServer, regionServer, region, htd, masterSystemTime)); -1806 } else { -1807 if (regionOpenInfo.getFavoredNodesCount() > 0) { -1808 regionServer.updateRegionFavoredNodesMapping(region.getEncodedName(), -1809 regionOpenInfo.getFavoredNodesList()); -1810 } -1811 if (htd.getPriority() >= HConstants.ADMIN_QOS || region.getTable().isSystemTable()) { -1812 regionServer.service.submit(new OpenPriorityRegionHandler( -1813 regionServer, regionServer, region, htd, masterSystemTime)); -1814 } else { -1815 regionServer.service.submit(new OpenRegionHandler( -1816 regionServer, regionServer, region, htd, masterSystemTime)); -1817 } -1818 } -1819 } -1820 -1821 builder.addOpeningState(RegionOpeningState.OPENED); -1822 -1823 } catch (KeeperException zooKeeperEx) { -1824 LOG.error("Can't retrieve recovering state from zookeeper", zooKeeperEx); -1825 throw new ServiceException(zooKeeperEx); -1826 } catch (IOException ie) { -1827 LOG.warn("Failed opening region " + region.getRegionNameAsString(), ie); -1828 if (isBulkAssign) { -1829 builder.addOpeningState(RegionOpeningState.FAILED_OPENING); -1830 } else { -1831 throw new ServiceException(ie); -1832 } -1833 } -1834 } -1835 return builder.build(); -1836 } -1837 -1838 /** -1839 * Wamrmup a region on this server. -1840 * -1841 * This method should only be called by Master. It synchrnously opens the region and -1842 * closes the region bringing the most important pages in cache. -1843 * <p> -1844 * -1845 * @param controller the RPC controller -1846 * @param request the request -1847 * @throws ServiceException -1848 */ -1849 @Override -1850 public WarmupRegionResponse warmupRegion(final RpcController controller, -1851 final WarmupRegionRequest request) throws ServiceException { -1852 -1853 RegionInfo regionInfo = request.getRegionInfo(); -1854 final HRegionInfo region = HRegionInfo.convert(regionInfo); -1855 HTableDescriptor htd; -1856 WarmupRegionResponse response = WarmupRegionResponse.getDefaultInstance(); -1857 -1858 try { -1859 checkOpen(); -1860 String encodedName = region.getEncodedName(); -1861 byte[] encodedNameBytes = region.getEncodedNameAsBytes(); -1862 final Region onlineRegion = regionServer.getFromOnlineRegions(encodedName); -1863 -1864 if (onlineRegion != null) { -1865 LOG.info("Region already online. Skipping warming up " + region); -1866 return response; -1867 } -1868 -1869 if (LOG.isDebugEnabled()) { -1870 LOG.debug("Warming up Region " + region.getRegionNameAsString()); -1871 } -1872 -1873 htd = regionServer.tableDescriptors.get(region.getTable()); -1874 -1875 if (regionServer.getRegionsInTransitionInRS().containsKey(encodedNameBytes)) { -1876 LOG.info("Region is in transition. Skipping warmup " + region); -1877 return response; -1878 } -1879 -1880 HRegion.warmupHRegion(region, htd, regionServer.getWAL(region), -1881 regionServer.getConfiguration(), regionServer, null); -1882 -1883 } catch (IOException ie) { -1884 LOG.error("Failed warming up region " + region.getRegionNameAsString(), ie); -1885 throw new ServiceException(ie); -1886 } -1887 -1888 return response; -1889 } -1890 -1891 /** -1892 * Replay the given changes when distributedLogReplay WAL edits from a failed RS. The guarantee is -1893 * that the given mutations will be durable on the receiving RS if this method returns without any -1894 * exception. -1895 * @param controller the RPC controller -1896 * @param request the request -1897 * @throws ServiceException -1898 */ -1899 @Override -1900 @QosPriority(priority = HConstants.REPLAY_QOS) -1901 public ReplicateWALEntryResponse replay(final RpcController controller, -1902 final ReplicateWALEntryRequest request) throws ServiceException { -1903 long before = EnvironmentEdgeManager.currentTime(); -1904 CellScanner cells = ((HBaseRpcController) controller).cellScanner(); -1905 try { -1906 checkOpen(); -1907 List<WALEntry> entries = request.getEntryList(); -1908 if (entries == null || entries.isEmpty()) { -1909 // empty input -1910 return ReplicateWALEntryResponse.newBuilder().build(); -1911 } -1912 ByteString regionName = entries.get(0).getKey().getEncodedRegionName(); -1913 Region region = regionServer.getRegionByEncodedName(regionName.toStringUtf8()); -1914 RegionCoprocessorHost coprocessorHost = -1915 ServerRegionReplicaUtil.isDefaultReplica(region.getRegionInfo()) -1916 ? region.getCoprocessorHost() -1917 : null; // do not invoke coprocessors if this is a secondary region replica -1918 List<Pair<WALKey, WALEdit>> walEntries = new ArrayList<>(); -1919 -1920 // Skip adding the edits to WAL if this is a secondary region replica -1921 boolean isPrimary = RegionReplicaUtil.isDefaultReplica(region.getRegionInfo()); -1922 Durability durability = isPrimary ? Durability.USE_DEFAULT : Durability.SKIP_WAL; -1923 -1924 for (WALEntry entry : entries) { -1925 if (!regionName.equals(entry.getKey().getEncodedRegionName())) { -1926 throw new NotServingRegionException("Replay request contains entries from multiple " + -1927 "regions. First region:" + regionName.toStringUtf8() + " , other region:" -1928 + entry.getKey().getEncodedRegionName()); -1929 } -1930 if (regionServer.nonceManager != null && isPrimary) { -1931 long nonceGroup = entry.getKey().hasNonceGroup() -1932 ? entry.getKey().getNonceGroup() : HConstants.NO_NONCE; -1933 long nonce = entry.getKey().hasNonce() ? entry.getKey().getNonce() : HConstants.NO_NONCE; -1934 regionServer.nonceManager.reportOperationFromWal( -1935 nonceGroup, -1936 nonce, -1937 entry.getKey().getWriteTime()); -1938 } -1939 Pair<WALKey, WALEdit> walEntry = (coprocessorHost == null) ? null : new Pair<>(); -1940 List<WALSplitter.MutationReplay> edits = WALSplitter.getMutationsFromWALEntry(entry, -1941 cells, walEntry, durability); -1942 if (coprocessorHost != null) { -1943 // Start coprocessor replay here. The coprocessor is for each WALEdit instead of a -1944 // KeyValue. -1945 if (coprocessorHost.preWALRestore(region.getRegionInfo(), walEntry.getFirst(), -1946 walEntry.getSecond())) { -1947 // if bypass this log entry, ignore it ... -1948 continue; -1949 } -1950 walEntries.add(walEntry); -1951 } -1952 if(edits!=null && !edits.isEmpty()) { -1953 long replaySeqId = (entry.getKey().hasOrigSequenceNumber()) ? -1954 entry.getKey().getOrigSequenceNumber() : entry.getKey().getLogSequenceNumber(); -1955 OperationStatus[] result = doReplayBatchOp(region, edits, replaySeqId); -1956 // check if it's a partial success -1957 for (int i = 0; result != null && i < result.length; i++) { -1958 if (result[i] != OperationStatus.SUCCESS) { -1959 throw new IOException(result[i].getExceptionMsg()); -1960 } -1961 } -1962 } -1963 } -1964 -1965 //sync wal at the end because ASYNC_WAL is used above -1966 WAL wal = getWAL(region); -1967 if (wal != null) { -1968 wal.sync(); -1969 } -1970 -1971 if (coprocessorHost != null) { -1972 for (Pair<WALKey, WALEdit> entry : walEntries) { -1973 coprocessorHost.postWALRestore(region.getRegionInfo(), entry.getFirst(), -1974 entry.getSecond()); -1975 } -1976 } -1977 return ReplicateWALEntryResponse.newBuilder().build(); -1978 } catch (IOException ie) { -1979 throw new ServiceException(ie); -1980 } finally { -1981 if (regionServer.metricsRegionServer != null) { -1982 regionServer.metricsRegionServer.updateReplay( -1983 EnvironmentEdgeManager.currentTime() - before); -1984 } -1985 } -1986 } -1987 -1988 WAL getWAL(Region region) { -1989 return ((HRegion)region).getWAL(); -1990 } -1991 -1992 /** -1993 * Replicate WAL entries on the region server. -1994 * -1995 * @param controller the RPC controller -1996 * @param request the request -1997 * @throws ServiceException -1998 */ -1999 @Override -2000 @QosPriority(priority=HConstants.REPLICATION_QOS) -2001 public ReplicateWALEntryResponse replicateWALEntry(final RpcController controller, -2002 final ReplicateWALEntryRequest request) throws ServiceException { -2003 try { -2004 checkOpen(); -2005 if (regionServer.replicationSinkHandler != null) { -2006 requestCount.increment(); -2007 List<WALEntry> entries = request.getEntryList(); -2008 CellScanner cellScanner = ((HBaseRpcController)controller).cellScanner(); -2009 regionServer.getRegionServerCoprocessorHost().preReplicateLogEntries(entries, cellScanner); -2010 regionServer.replicationSinkHandler.replicateLogEntries(entries, cellScanner, -2011 request.getReplicationClusterId(), request.getSourceBaseNamespaceDirPath(), -2012 request.getSourceHFileArchiveDirPath()); -2013 regionServer.getRegionServerCoprocessorHost().postReplicateLogEntries(entries, cellScanner); -2014 return ReplicateWALEntryResponse.newBuilder().build(); -2015 } else { -2016 throw new ServiceException("Replication services are not initialized yet"); -2017 } -2018 } catch (IOException ie) { -2019 throw new ServiceException(ie); -2020 } -2021 } -2022 -2023 /** -2024 * Roll the WAL writer of the region server. -2025 * @param controller the RPC controller -2026 * @param request the request -2027 * @throws ServiceException -2028 */ -2029 @Override -2030 public RollWALWriterResponse rollWALWriter(final RpcController controller, -2031 final RollWALWriterRequest request) throws ServiceException { -2032 try { -2033 checkOpen(); -2034 requestCount.increment(); -2035 regionServer.getRegionServerCoprocessorHost().preRollWALWriterRequest(); -2036 regionServer.walRoller.requestRollAll(); -2037 regionServer.getRegionServerCoprocessorHost().postRollWALWriterRequest(); -2038 RollWALWriterResponse.Builder builder = RollWALWriterResponse.newBuilder(); -2039 return builder.build(); -2040 } catch (IOException ie) { -2041 throw new ServiceException(ie); -2042 } -2043 } -2044 -2045 /** -2046 * Split a region on the region server. -2047 * -2048 * @param controller the RPC controller -2049 * @param request the request -2050 * @throws ServiceException -2051 */ -2052 @Override -2053 @QosPriority(priority=HConstants.ADMIN_QOS) -2054 public SplitRegionResponse splitRegion(final RpcController controller, -2055 final SplitRegionRequest request) throws ServiceException { -2056 try { -2057 checkOpen(); -2058 requestCount.increment(); -2059 Region region = getRegion(request.getRegion()); -2060 region.startRegionOperation(Operation.SPLIT_REGION); -2061 if (region.getRegionInfo().getReplicaId() != HRegionInfo.DEFAULT_REPLICA_ID) { -2062 throw new IOException("Can't split replicas directly. " -2063 + "Replicas are auto-split when their primary is split."); -2064 } -2065 LOG.info("Splitting " + region.getRegionInfo().getRegionNameAsString()); -2066 region.flush(true); -2067 byte[] splitPoint = null; -2068 if (request.hasSplitPoint()) { -2069 splitPoint = request.getSplitPoint().toByteArray(); -2070 } -2071 ((HRegion)region).forceSplit(splitPoint); -2072 regionServer.compactSplitThread.requestSplit(region, ((HRegion)region).checkSplit(), -2073 RpcServer.getRequestUser()); -2074 return SplitRegionResponse.newBuilder().build(); -2075 } catch (DroppedSnapshotException ex) { -2076 regionServer.abort("Replay of WAL required. Forcing server shutdown", ex); -2077 throw new ServiceException(ex); -2078 } catch (IOException ie) { -2079 throw new ServiceException(ie); -2080 } -2081 } -2082 -2083 /** -2084 * Stop the region server. -2085 * -2086 * @param controller the RPC controller -2087 * @param request the request -2088 * @throws ServiceException -2089 */ -2090 @Override -2091 @QosPriority(priority=HConstants.ADMIN_QOS) -2092 public StopServerResponse stopServer(final RpcController controller, -2093 final StopServerRequest request) throws ServiceException { -2094 requestCount.increment(); -2095 String reason = request.getReason(); -2096 regionServer.stop(reason); -2097 return StopServerResponse.newBuilder().build(); -2098 } -2099 -2100 @Override -2101 public UpdateFavoredNodesResponse updateFavoredNodes(RpcController controller, -2102 UpdateFavoredNodesRequest request) throws ServiceException { -2103 List<UpdateFavoredNodesRequest.RegionUpdateInfo> openInfoList = request.getUpdateInfoList(); -2104 UpdateFavoredNodesResponse.Builder respBuilder = UpdateFavoredNodesResponse.newBuilder(); -2105 for (UpdateFavoredNodesRequest.RegionUpdateInfo regionUpdateInfo : openInfoList) { -2106 HRegionInfo hri = HRegionInfo.convert(regionUpdateInfo.getRegion()); -2107 if (regionUpdateInfo.getFavoredNodesCount() > 0) { -2108 regionServer.updateRegionFavoredNodesMapping(hri.getEncodedName(), -2109 regionUpdateInfo.getFavoredNodesList()); -2110 } -2111 } -2112 respBuilder.setResponse(openInfoList.size()); -2113 return respBuilder.build(); -2114 } -2115 -2116 /** -2117 * Atomically bulk load several HFiles into an open region -2118 * @return true if successful, false is failed but recoverably (no action) -2119 * @throws ServiceException if failed unrecoverably -2120 */ -2121 @Override -2122 public BulkLoadHFileResponse bulkLoadHFile(final RpcController controller, -2123 final BulkLoadHFileRequest request) throws ServiceException { -2124 long start = EnvironmentEdgeManager.currentTime(); -2125 try { -2126 checkOpen(); -2127 requestCount.increment(); -2128 Region region = getRegion(request.getRegion()); -2129 boolean bypass = false; -2130 boolean loaded = false; -2131 Map<byte[], List<Path>> map = null; -2132 -2133 if (!request.hasBulkToken()) { -2134 // Old style bulk load. This will not be supported in future releases -2135 List<Pair<byte[], String>> familyPaths = new ArrayList<>(request.getFamilyPathCount()); -2136 for (FamilyPath familyPath : request.getFamilyPathList()) { -2137 familyPaths.add(new Pair<>(familyPath.getFamily().toByteArray(), familyPath.getPath())); -2138 } -2139 if (region.getCoprocessorHost() != null) { -2140 bypass = region.getCoprocessorHost().preBulkLoadHFile(familyPaths); -2141 } -2142 try { -2143 if (!bypass) { -2144 map = region.bulkLoadHFiles(familyPaths, request.getAssignSeqNum(), null, -2145 request.getCopyFile()); -2146 if (map != null) { -2147 loaded = true; -2148 } -2149