[ https://issues.apache.org/jira/browse/PHOENIX-2143?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15095523#comment-15095523 ]
James Taylor commented on PHOENIX-2143: --------------------------------------- Thanks for the patch, [~ankit.singhal]. Overall, it looks very good. Just a couple of questions and minor nits (and I agree with [~samarthjain] about the formatting changes, but we can give you a free pass this time as the formatting changes are mostly around code you've already changed). One question about the upgrade code in ConnectionQueryServicesImpl: * Is this change necessary (to use a ts of MIN_SYSTEM_TABLE_TIMESTAMP_4_7_0 - 1)? If not, please revert that line. {code} metaConnection = addColumn(metaConnection, PhoenixDatabaseMetaData.SYSTEM_CATALOG, - MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP_4_7_0, columnsToAdd, false); + MetaDataProtocol.MIN_SYSTEM_TABLE_TIMESTAMP_4_7_0 - 1, columnsToAdd, false); {code} * Also, did you test the upgrade path manually with a pre 4.7.0 client and 4.7.0 server? Minor nit here in MetaDataUtil, can you create a new ScanUtil.setTimeRange(long minTime, long maxTime) that throws a RuntimeException instead of an IOException and then use that instead of scan.setTimeRange() to prevent the IOException having to be thrown from this function?: {code} --- a/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/util/MetaDataUtil.java @@ -436,24 +436,32 @@ public class MetaDataUtil { public static final String IS_LOCAL_INDEX_TABLE_PROP_NAME = "IS_LOCAL_INDEX_TABLE"; public static final byte[] IS_LOCAL_INDEX_TABLE_PROP_BYTES = Bytes.toBytes(IS_LOCAL_INDEX_TABLE_PROP_NAME); - public static Scan newTableRowsScan(byte[] key, long startTimeStamp, long stopTimeStamp) + public static Scan newTableRowsScan(byte[] key, long startTimeStamp, long stopTimeStamp) throws IOException { + return newTableRowsScan(key, null, startTimeStamp, stopTimeStamp); + } + + public static Scan newTableRowsScan(byte[] startKey, byte[] stopKey, long startTimeStamp, long stopTimeStamp) throws IOException { Scan scan = new Scan(); scan.setTimeRange(startTimeStamp, stopTimeStamp); - scan.setStartRow(key); - byte[] stopKey = ByteUtil.concat(key, QueryConstants.SEPARATOR_BYTE_ARRAY); - ByteUtil.nextKey(stopKey, stopKey.length); + scan.setStartRow(startKey); + if (stopKey == null) { + stopKey = ByteUtil.concat(startKey, QueryConstants.SEPARATOR_BYTE_ARRAY); + ByteUtil.nextKey(stopKey, stopKey.length); + } scan.setStopRow(stopKey); return scan; } {code} Also, looks like you won't need to call this line anymore in StatisticsUtil.readStatistics as you're setting the time range in the util function already: {code} + s.setTimeRange(MetaDataProtocol.MIN_TABLE_TIMESTAMP, clientTimeStamp); {code} > Use guidepost bytes instead of region name in stats primary key > --------------------------------------------------------------- > > Key: PHOENIX-2143 > URL: https://issues.apache.org/jira/browse/PHOENIX-2143 > Project: Phoenix > Issue Type: Sub-task > Reporter: James Taylor > Assignee: Ankit Singhal > Attachments: PHOENIX-2143.patch, PHOENIX-2143_v2.patch, > PHOENIX-2143_wip.patch, PHOENIX-2143_wip_2.patch > > > Our current SYSTEM.STATS table uses the region name as the last column in the > primary key constraint. Instead, we should use the MIN_KEY column (which > corresponds to the region start key). The advantage would be that the stats > would then be ordered by region start key allowing us to approximate the > number of guideposts which would be traversed given the start/stop row of a > scan: > {code} > SELECT SUM(guide_posts_count) FROM SYSTEM.STATS WHERE min_key > :1 AND > min_key < :2 > {code} > where :1 is the start row and :2 is the stop row of the scan. With an UNNEST > operator for ARRAYs, we could get a better approximation. > As part of the upgrade to the new Phoenix version containing this fix, stats > could simply be dropped and they'd be recalculated with the new schema. > An alternative, even more granular approach would be to *not* use arrays to > store the guide posts, but instead store them as individual rows with a > schema like this. > |PHYSICAL_NAME|VARCHAR| > |COLUMN_FAMILY|VARCHAR| > |GUIDE_POST_KEY|VARBINARY| > In this alternative, the maintenance during compaction is higher, though, as > you'd need to run a separate query to do the deletion of the old guideposts, > followed by a commit of the new guideposts. The other disadvantage (besides > requiring multiple queries) is that this couldn't be done transactionally. -- This message was sent by Atlassian JIRA (v6.3.4#6332)