YR created HBASE-29216:
--------------------------
Summary: 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
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)