[ https://issues.apache.org/jira/browse/HBASE-29502?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Charles Connell resolved HBASE-29502. ------------------------------------- Fix Version/s: 2.7.0 2.6.4 Resolution: Fixed > RegionReplicaReplicationEndpoint fails to forward mutations when meta cache > does not contain secondary replica locations > ------------------------------------------------------------------------------------------------------------------------ > > Key: HBASE-29502 > URL: https://issues.apache.org/jira/browse/HBASE-29502 > Project: HBase > Issue Type: Bug > Components: read replicas > Affects Versions: 2.7.0, 2.6.3 > Reporter: Charles Connell > Assignee: Charles Connell > Priority: Major > Labels: pull-request-available > Fix For: 2.7.0, 2.6.4 > > > (this only affects 2.x versions) > When region replicas are enabled in "asynchronous WAL replication" mode, each > RegionServer uses a {{RegionReplicaReplicationEndpoint}} object to tail its > own WAL. Each mutation in its WAL may be related to a region which has its > primary replica on this RegionServer, and has one or more secondary replicas > on other servers. So, for each mutation in the WAL, > {{RegionReplicaReplicationEndpoint}} decides whether any other servers are > hosting replicas of the relevant region, and if so, sends an RPC to those > servers containing the mutations they should apply to their memstores. > When region replicas are enabled, a {{RegionReplicaReplicationEndpoint}} > instance is created, with its own {{ConnectionImplementation}} and therefore > its own {{MetaCache}}. This {{RegionReplicaReplicationEndpoint}} immediately > starts attempting to send mutations to secondary replica regions, even though > they will not be open for a few more seconds or minutes. In this moment, the > {{MetaCache}} gets populated with entries that say that most regions are > hosted on only one server. These cached lookups remain in use indefinitely, > even though they are incorrect for most of their lifetime. Without knowing > where the secondary replica regions are hosted, or if they exist at all, the > {{RegionReplicaReplicationEndpoint}} cannot forward mutations to them. This > leads to the secondary replica regions' memstores not getting updates, so > their data is even more stale than it should be. Users would get > unnecessarily incorrect results. > {{RegionReplicaReplicationEndpoint}} actually contains cache-busting logic > seemingly designed to fix this exact problem: > {code:java} > // Replicas can take a while to come online. The cache may have only the > primary. If we > // keep going to the cache, we will not learn of the replicas and their > locations after > // they come online. > if (useCache && locations.size() == 1 && > TableName.isMetaTableName(tableName)) { > if (tableDescriptors.get(tableName).getRegionReplication() > 1) { > // Make an obnoxious log here. See how bad this issue is. Add a timer if > happening > // too much. > LOG.info("Skipping location cache; only one location found for {}", > tableName); > useCache = false; > continue; > } > } > {code} > However, because of the {{TableName.isMetaTableName(tableName)}} clause, the > cache-busting only takes effect if the mutation being forwarded belongs to > the meta table. I don't know why that restriction would make sense. > In this ticket I plan to just remove the "is meta table" clause to fix this > bug. -- This message was sent by Atlassian Jira (v8.20.10#820010)