diff --git a/llap-server/src/test/org/apache/hadoop/hive/llap/cache/TestCacheContentsTracker.java b/llap-server/src/test/org/apache/hadoop/hive/llap/cache/TestCacheContentsTracker.java index 1d242e02707e0b1bc42b904730ad11abcbea53b2..03e66a8b0305ca1860ae943a58933e00089cbce9 100644 --- a/llap-server/src/test/org/apache/hadoop/hive/llap/cache/TestCacheContentsTracker.java +++ b/llap-server/src/test/org/apache/hadoop/hive/llap/cache/TestCacheContentsTracker.java @@ -83,6 +83,55 @@ public void testAggregatedStatsGeneration() { assertEquals(EXPECTED_CACHE_STATE_AFTER_EVICTION, sb.toString()); } + + /** + * Tests CacheTag.compareTo(). + */ + @Test + public void testCacheTagComparison() { + + // Comparing with null + compareViceVersa(1, cacheTagBuilder("dbname.tablename"), null); + compareViceVersa(1, cacheTagBuilder("dbname.tablename", "p1=v1"), null); + compareViceVersa(1, cacheTagBuilder("dbname.tablename", "p1=v1", "p2=v2"), null); + + // Comparing similar constructs + compareViceVersa(0, cacheTagBuilder("dbname.tablename"), + cacheTagBuilder("dbname.tablename")); + compareViceVersa(0, cacheTagBuilder("dbname.tablename", "p1=v1"), + cacheTagBuilder("dbname.tablename", "p1=v1")); + compareViceVersa(0, cacheTagBuilder("dbname.tablename", "p1=v1", "p2=v2"), + cacheTagBuilder("dbname.tablename", "p1=v1", "p2=v2")); + + // Comparing structs of different lengths + compareViceVersa(1, cacheTagBuilder("dbname.tablename", "p1=v1", "p2=v2", "p3=v3"), + cacheTagBuilder("dbname.tablename", "p1=v1", "p2=v2")); + compareViceVersa(1, cacheTagBuilder("dbname.tablename", "p1=v1", "p2=v2"), + cacheTagBuilder("dbname.tablename", "p1=v1")); + compareViceVersa(1, cacheTagBuilder("dbname.tablename", "p1=v1"), + cacheTagBuilder("dbname.tablename")); + + // Comparing different constructs with same length + compareViceVersa(-1, cacheTagBuilder("dbname.tablename", "p1=v1"), + cacheTagBuilder("dbname.tablenamf", "p1=v0")); + compareViceVersa(-1, cacheTagBuilder("dbname.tablename", "p1=v1", "p2=v3"), + cacheTagBuilder("dbname.tablenamf", "p1=v1", "p2=v2")); + compareViceVersa(-25, cacheTagBuilder("dbname.tablename", "p1=v1", "p2=v2a"), + cacheTagBuilder("dbname.tablename", "p1=v1", "p2=v2z")); + compareViceVersa(-1, cacheTagBuilder("dbname.tablenameAA", "p1=v1", "p2=v2"), + cacheTagBuilder("dbname.tablenameBB", "p1=v1", "p2=v2")); + + } + + private static void compareViceVersa(int expected, CacheTag a, CacheTag b) { + if (a != null) { + assertEquals(expected, a.compareTo(b)); + } + if (b != null) { + assertEquals(-1 * expected, b.compareTo(a)); + } + } + private static LlapCacheableBuffer createMockBuffer(long size, CacheTag cacheTag) { LlapCacheableBuffer llapCacheableBufferMock = mock(LlapCacheableBuffer.class); diff --git a/storage-api/src/java/org/apache/hadoop/hive/common/io/CacheTag.java b/storage-api/src/java/org/apache/hadoop/hive/common/io/CacheTag.java index 623c1814b4f4524399a61d9d4ac01abcb9feb6af..47730ccbe3ec9a1b123c53aef2253af88da10c66 100644 --- a/storage-api/src/java/org/apache/hadoop/hive/common/io/CacheTag.java +++ b/storage-api/src/java/org/apache/hadoop/hive/common/io/CacheTag.java @@ -46,6 +46,9 @@ public String getTableName() { @Override public int compareTo(CacheTag o) { + if (o == null) { + return 1; + } return tableName.compareTo(o.tableName); } @@ -152,6 +155,9 @@ private TableCacheTag(String tableName) { @Override public int compareTo(CacheTag o) { + if (o == null) { + return 1; + } if (o instanceof SinglePartitionCacheTag || o instanceof MultiPartitionCacheTag) { return -1; } else { @@ -200,14 +206,21 @@ public String partitionDescToString() { @Override public int compareTo(CacheTag o) { + if (o == null) { + return 1; + } if (o instanceof TableCacheTag) { return 1; } else if (o instanceof MultiPartitionCacheTag) { return -1; } SinglePartitionCacheTag other = (SinglePartitionCacheTag) o; - return super.compareTo(o) + - partitionDesc.toString().compareTo(other.partitionDesc.toString()); + int tableNameDiff = super.compareTo(other); + if (tableNameDiff != 0) { + return tableNameDiff; + } else { + return partitionDesc.compareTo(other.partitionDesc); + } } @Override @@ -235,12 +248,30 @@ private MultiPartitionCacheTag(String tableName, LinkedList partitionDes @Override public int compareTo(CacheTag o) { + if (o == null) { + return 1; + } if (o instanceof TableCacheTag || o instanceof SinglePartitionCacheTag) { return 1; } MultiPartitionCacheTag other = (MultiPartitionCacheTag) o; - return super.compareTo(o) + - partitionDesc.toString().compareTo(other.partitionDesc.toString()); + int tableNameDiff = super.compareTo(other); + if (tableNameDiff != 0) { + return tableNameDiff; + } else { + int sizeDiff = partitionDesc.size() - other.partitionDesc.size(); + if (sizeDiff != 0) { + return sizeDiff; + } else { + for (int i = 0; i < partitionDesc.size(); ++i) { + int partDiff = partitionDesc.get(i).compareTo(other.partitionDesc.get(i)); + if (partDiff != 0) { + return partDiff; + } + } + return 0; + } + } } @Override