[
https://issues.apache.org/jira/browse/HBASE-29216?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
YR reassigned HBASE-29216:
--------------------------
Assignee: YR
> Recovered replication stuck , when enabled
> “hbase.separate.oldlogdir.by.regionserver”
> ---------------------------------------------------------------------------------------
>
> Key: HBASE-29216
> URL: https://issues.apache.org/jira/browse/HBASE-29216
> Project: HBase
> Issue Type: Bug
> Components: regionserver
> Reporter: YR
> Assignee: YR
> Priority: Minor
>
> Recovered replication stuck , when enabled
> “hbase.separate.oldlogdir.by.regionserver”
> The WAL location cannot be found after the configuration is enabled.
> The execution logic looks like this
> 1. Set “hbase.separate.oldlogdir.by.regionserver” to enabled
> 2. Restart the RegionServer, the "write a head log" will from
> /hbase/WALs/servername/{wal-filename} moves to
> /hbase/oldWALs/servername/{wal-filename}
> 3. WALEntryStream will find archive logs using
> AbstractFSWALProvider.findArchivedLog
> To solve this problem, we can try to improve the findArchiveLog method
> Some codes
> {code:java}
> // HRegionServer.java
> private void shutdownWAL(final boolean close) {
> if (this.walFactory != null) {
> try {
> if (close) {
> walFactory.close(); // here will move wals to oldwals
> } else {
> walFactory.shutdown();
> }
> } catch (Throwable e) {
> e = e instanceof RemoteException ? ((RemoteException)
> e).unwrapRemoteException() : e;
> LOG.error("Shutdown / close of WAL failed: " + e);
> LOG.debug("Shutdown / close exception details:", e);
> }
> }
> }
> {code}
> {code:java}
> // AbstractFSWALProvider.java:450
> public static Path findArchivedLog(Path path, Configuration conf) throws
> IOException {
> // Here will be return , stuck the replication
> if (path.toString().contains(HConstants.HREGION_OLDLOGDIR_NAME)) {
> return null;
> }
> Path walRootDir = CommonFSUtils.getWALRootDir(conf);
> FileSystem fs = path.getFileSystem(conf);
> // Try finding the log in old dir
> Path oldLogDir = new Path(walRootDir, HConstants.HREGION_OLDLOGDIR_NAME);
> Path archivedLogLocation = new Path(oldLogDir, path.getName());
> if (fs.exists(archivedLogLocation)) {
> LOG.info("Log " + path + " was moved to " + archivedLogLocation);
> return archivedLogLocation;
> }
> ServerName serverName = getServerNameFromWALDirectoryName(path);
> if (serverName == null) {
> LOG.warn("Can not extract server name from path {}, "
> + "give up searching the separated old log dir", path);
> return null;
> }
> // Try finding the log in separate old log dir
> oldLogDir = new Path(walRootDir, new
> StringBuilder(HConstants.HREGION_OLDLOGDIR_NAME)
> .append(Path.SEPARATOR).append(serverName.getServerName()).toString());
> archivedLogLocation = new Path(oldLogDir, path.getName());
> if (fs.exists(archivedLogLocation)) {
> LOG.info("Log " + path + " was moved to " + archivedLogLocation);
> return archivedLogLocation;
> }
> LOG.error("Couldn't locate log: " + path);
> return null;
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)