The legacy mapred InputFormatBase now verifies (and fixes the scanner for) a possible change in table name that could happen between the configuration of the map/reduce job and the actual processing of the scanner for a specific split. In that case, the most recent table name associated with the id is always used for the scanner (though the table name that was expected during job setup is still used in the RangeInputSplit). ACCUMULO-391
Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/d340d82c Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/d340d82c Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/d340d82c Branch: refs/heads/ACCUMULO-391 Commit: d340d82c08d4b2181d6900cea1455913f268ba6e Parents: 01b8f2a Author: Corey J. Nolet <[email protected]> Authored: Sat Sep 28 23:01:04 2013 -0400 Committer: Corey J. Nolet <[email protected]> Committed: Sat Sep 28 23:01:04 2013 -0400 ---------------------------------------------------------------------- .../accumulo/core/client/mapred/InputFormatBase.java | 15 ++++++++++++++- .../client/mapreduce/AccumuloInputFormatTest.java | 1 - 2 files changed, 14 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/accumulo/blob/d340d82c/core/src/main/java/org/apache/accumulo/core/client/mapred/InputFormatBase.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/accumulo/core/client/mapred/InputFormatBase.java b/core/src/main/java/org/apache/accumulo/core/client/mapred/InputFormatBase.java index 2d4eadf..fb1b193 100644 --- a/core/src/main/java/org/apache/accumulo/core/client/mapred/InputFormatBase.java +++ b/core/src/main/java/org/apache/accumulo/core/client/mapred/InputFormatBase.java @@ -594,6 +594,19 @@ public abstract class InputFormatBase<K,V> implements InputFormat<K,V> { AuthenticationToken token = getAuthenticationToken(job); Authorizations authorizations = getScanAuthorizations(job); + // in case the table name changed, we can still use the previous name for terms of configuration, + // but for the scanner, we'll need to reference the new table name. + String actualNameForId = split.getTableName(); + if(!(instance instanceof MockInstance)) { // Really, the Tables helper class should not be tied to Zookeeper + try { + actualNameForId = Tables.getTableName(instance, split.getTableId()); + if (!actualNameForId.equals(split.getTableName())) + log.debug("Table name changed from " + split.getTableName() + " to " + actualNameForId); + } catch (TableNotFoundException e) { + throw new IOException("The specified table was not found for id=" + split.getTableId()); + } + } + try { log.debug("Creating connector with user: " + user); Connector conn = instance.getConnector(user, token); @@ -602,7 +615,7 @@ public abstract class InputFormatBase<K,V> implements InputFormat<K,V> { if (isOfflineScan(job)) { scanner = new OfflineScanner(instance, new Credentials(user, token), Tables.getTableId(instance, getInputTableName(job)), authorizations); } else { - scanner = conn.createScanner(getInputTableName(job), authorizations); + scanner = conn.createScanner(actualNameForId, authorizations); } if (isIsolated(job)) { log.info("Creating isolated scanner"); http://git-wip-us.apache.org/repos/asf/accumulo/blob/d340d82c/core/src/test/java/org/apache/accumulo/core/client/mapreduce/AccumuloInputFormatTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/accumulo/core/client/mapreduce/AccumuloInputFormatTest.java b/core/src/test/java/org/apache/accumulo/core/client/mapreduce/AccumuloInputFormatTest.java index 96a67a6..1b4aa26 100644 --- a/core/src/test/java/org/apache/accumulo/core/client/mapreduce/AccumuloInputFormatTest.java +++ b/core/src/test/java/org/apache/accumulo/core/client/mapreduce/AccumuloInputFormatTest.java @@ -331,5 +331,4 @@ public class AccumuloInputFormatTest { assertEquals(table1, AccumuloInputFormat.getTableQueryConfiguration(job, TEST_TABLE_1)); assertEquals(table2, AccumuloInputFormat.getTableQueryConfiguration(job, TEST_TABLE_2)); } - }
