[
https://issues.apache.org/jira/browse/PHOENIX-7006?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17822856#comment-17822856
]
ASF GitHub Bot commented on PHOENIX-7006:
-----------------------------------------
virajjasani commented on code in PR #1751:
URL: https://github.com/apache/phoenix/pull/1751#discussion_r1509896530
##########
phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/BaseScannerRegionObserver.java:
##########
@@ -527,6 +535,28 @@ public static boolean isMaxLookbackTimeEnabled(long
maxLookbackTime){
return maxLookbackTime > 0L;
}
+ public static long
getMaxLookbackAge(ObserverContext<RegionCoprocessorEnvironment> c) {
Review Comment:
nit: `private`
##########
phoenix-core-client/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java:
##########
@@ -432,6 +432,8 @@ public class PhoenixDatabaseMetaData implements
DatabaseMetaData {
public static final String SYSTEM_TRANSFORM_TABLE = "TRANSFORM";
public static final String SYSTEM_TRANSFORM_NAME =
SchemaUtil.getTableName(SYSTEM_CATALOG_SCHEMA, SYSTEM_TRANSFORM_TABLE);
+ public static final String MAX_LOOKBACK_AGE = "MAX_LOOKBACK_AGE";
Review Comment:
`public static final String MAX_LOOKBACK_AGE =
BaseScannerRegionObserverConstants.MAX_LOOKBACK_AGE`
##########
phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java:
##########
@@ -1587,6 +1623,56 @@ private PTable getTableFromCells(List<Cell>
tableCellList, List<List<Cell>> allC
return builder.build();
}
+ private Long scanMaxLookbackAgeFromParent(byte[] key, long
clientTimeStamp) throws IOException {
+ Scan scan = MetaDataUtil.newTableRowsScan(key, MIN_TABLE_TIMESTAMP,
clientTimeStamp);
+ Table sysCat = ServerUtil.getHTableForCoprocessorScan(this.env,
+ SchemaUtil.getPhysicalTableName(SYSTEM_CATALOG_NAME_BYTES,
env.getConfiguration()));
Review Comment:
We need to close the Table instance, let's wrap in try-with-resources
##########
phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java:
##########
@@ -27,16 +27,15 @@
import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TABLE_SEQ_NUM;
import static org.apache.phoenix.query.QueryConstants.DEFAULT_COLUMN_FAMILY;
import static
org.apache.phoenix.query.QueryConstants.ENCODED_CQ_COUNTER_INITIAL_VALUE;
-import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
-import static org.apache.phoenix.util.TestUtil.closeConnection;
-import static org.apache.phoenix.util.TestUtil.closeStatement;
Review Comment:
you can adjust IDE settings to avoid the reformat from doing such changes
##########
phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/BaseScannerRegionObserver.java:
##########
@@ -527,6 +535,28 @@ public static boolean isMaxLookbackTimeEnabled(long
maxLookbackTime){
return maxLookbackTime > 0L;
}
+ public static long
getMaxLookbackAge(ObserverContext<RegionCoprocessorEnvironment> c) {
+ TableName tableName =
c.getEnvironment().getRegion().getRegionInfo().getTable();
+ String fullTableName = tableName.getNameAsString();
+ Configuration conf = c.getEnvironment().getConfiguration();
+ PTable table;
+ try(PhoenixConnection conn = QueryUtil.getConnectionOnServer(
+ conf).unwrap(PhoenixConnection.class)) {
+ table = conn.getTableNoCache(fullTableName);
+ }
+ catch (Exception e) {
Review Comment:
Let's keep it `SQLException`
##########
phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java:
##########
@@ -1587,6 +1623,56 @@ private PTable getTableFromCells(List<Cell>
tableCellList, List<List<Cell>> allC
return builder.build();
}
+ private Long scanMaxLookbackAgeFromParent(byte[] key, long
clientTimeStamp) throws IOException {
+ Scan scan = MetaDataUtil.newTableRowsScan(key, MIN_TABLE_TIMESTAMP,
clientTimeStamp);
+ Table sysCat = ServerUtil.getHTableForCoprocessorScan(this.env,
+ SchemaUtil.getPhysicalTableName(SYSTEM_CATALOG_NAME_BYTES,
env.getConfiguration()));
+ ResultScanner scanner = sysCat.getScanner(scan);
Review Comment:
Same here, ResultScanner needs to be closed, try-with-resources will be
helpful
##########
phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java:
##########
@@ -1463,6 +1485,7 @@ private PTable getTableFromCells(List<Cell>
tableCellList, List<List<Cell>> allC
PTable transformingNewTable = null;
boolean isRegularView = (tableType == PTableType.VIEW && viewType !=
ViewType.MAPPED);
+ boolean isThisAViewIndex = false;
Review Comment:
nit: `hasViewIndex`
##########
phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java:
##########
@@ -1587,6 +1623,56 @@ private PTable getTableFromCells(List<Cell>
tableCellList, List<List<Cell>> allC
return builder.build();
}
+ private Long scanMaxLookbackAgeFromParent(byte[] key, long
clientTimeStamp) throws IOException {
+ Scan scan = MetaDataUtil.newTableRowsScan(key, MIN_TABLE_TIMESTAMP,
clientTimeStamp);
+ Table sysCat = ServerUtil.getHTableForCoprocessorScan(this.env,
+ SchemaUtil.getPhysicalTableName(SYSTEM_CATALOG_NAME_BYTES,
env.getConfiguration()));
+ ResultScanner scanner = sysCat.getScanner(scan);
+ Result result = scanner.next();
+ boolean startCheckingForLink = false;
+ byte[] parentTableKey = null;
+ do {
+ if (result == null) {
+ return null;
+ }
+ else if (startCheckingForLink) {
+ byte[] linkTypeBytes = result.getValue(TABLE_FAMILY_BYTES,
LINK_TYPE_BYTES);
+ if (linkTypeBytes != null) {
+ LinkType linkType =
LinkType.fromSerializedValue(linkTypeBytes[0]);
+ int rowKeyColMetadataLength = 5;
+ byte[][] rowKeyMetaData = new
byte[rowKeyColMetadataLength][];
+ getVarChars(result.getRow(), rowKeyColMetadataLength,
rowKeyMetaData);
+ if (linkType == VIEW_INDEX_PARENT_TABLE) {
+ parentTableKey =
getParentTableKeyFromChildRowKeyMetaData(rowKeyMetaData);
+ return scanMaxLookbackAgeFromParent(parentTableKey,
clientTimeStamp);
+ }
+ else if (linkType == PHYSICAL_TABLE) {
Review Comment:
Does this cover "index table to data table" link also? Or does it only
covers "view index to view hierarchy's base table"?
I believe you are covering "index table to data table" case here right?
```
if (tableType == INDEX && ! isThisAViewIndex) {
byte[] tableKey = SchemaUtil.getTableKey(tenantId == null ? null
: tenantId.getBytes(),
parentSchemaName == null ? null :
parentSchemaName.getBytes(), parentTableName.getBytes());
maxLookbackAge = scanMaxLookbackAgeFromParent(tableKey,
clientTimeStamp);
}
```
##########
phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/BaseScannerRegionObserver.java:
##########
@@ -527,6 +535,28 @@ public static boolean isMaxLookbackTimeEnabled(long
maxLookbackTime){
return maxLookbackTime > 0L;
}
+ public static long
getMaxLookbackAge(ObserverContext<RegionCoprocessorEnvironment> c) {
+ TableName tableName =
c.getEnvironment().getRegion().getRegionInfo().getTable();
+ String fullTableName = tableName.getNameAsString();
+ Configuration conf = c.getEnvironment().getConfiguration();
+ PTable table;
+ try(PhoenixConnection conn = QueryUtil.getConnectionOnServer(
+ conf).unwrap(PhoenixConnection.class)) {
+ table = conn.getTableNoCache(fullTableName);
+ }
+ catch (Exception e) {
+ if (e instanceof TableNotFoundException) {
+ LOGGER.debug("Ignoring HBase table that is not a Phoenix
table: "
+ + fullTableName);
Review Comment:
let's use parameterized version:
```
LOGGER.debug("Ignoring HBase table that is not a Phoenix table: {}",
fullTableName);
```
same for error log also
##########
phoenix-core-client/src/main/java/org/apache/phoenix/schema/PTable.java:
##########
@@ -997,6 +997,8 @@ IndexMaintainer getIndexMaintainer(PTable dataTable,
PhoenixConnection connectio
* @throws SQLException
*/
Set<ColumnReference> getIndexWhereColumns(PhoenixConnection connection)
throws SQLException;
+
+ Long getMaxLookbackAge();
Review Comment:
nit: javadoc
##########
phoenix-core-client/src/main/java/org/apache/phoenix/util/MetaDataUtil.java:
##########
@@ -1182,4 +1184,10 @@ public static void
deleteFromStatsTable(PhoenixConnection connection,
connection.setAutoCommit(isAutoCommit);
}
}
+
+ public static long getMaxLookbackAge(Configuration conf, Long
maxLookbackAge) {
Review Comment:
nit: javadoc
##########
phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/MetaDataRegionObserver.java:
##########
@@ -61,6 +61,7 @@
import org.apache.hadoop.hbase.security.User;
import org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos;
import org.apache.hadoop.hbase.util.Pair;
+import org.apache.hadoop.hbase.util.Bytes;
Review Comment:
unused
##########
phoenix-core-server/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java:
##########
@@ -1587,6 +1623,56 @@ private PTable getTableFromCells(List<Cell>
tableCellList, List<List<Cell>> allC
return builder.build();
}
+ private Long scanMaxLookbackAgeFromParent(byte[] key, long
clientTimeStamp) throws IOException {
+ Scan scan = MetaDataUtil.newTableRowsScan(key, MIN_TABLE_TIMESTAMP,
clientTimeStamp);
+ Table sysCat = ServerUtil.getHTableForCoprocessorScan(this.env,
+ SchemaUtil.getPhysicalTableName(SYSTEM_CATALOG_NAME_BYTES,
env.getConfiguration()));
Review Comment:
With both try-with-resources, it might look something like this:
```
private Long scanMaxLookbackAgeFromParent(byte[] key, long
clientTimeStamp) throws IOException {
Scan scan = MetaDataUtil.newTableRowsScan(key, MIN_TABLE_TIMESTAMP,
clientTimeStamp);
byte[] parentTableKey = null;
try (Table sysCat = ServerUtil.getHTableForCoprocessorScan(this.env,
SchemaUtil.getPhysicalTableName(SYSTEM_CATALOG_NAME_BYTES,
env.getConfiguration()))) {
try (ResultScanner scanner = sysCat.getScanner(scan)) {
Result result = scanner.next();
boolean startCheckingForLink = false;
do {
if (result == null) {
return null;
} else if (startCheckingForLink) {
byte[] linkTypeBytes =
result.getValue(TABLE_FAMILY_BYTES, LINK_TYPE_BYTES);
if (linkTypeBytes != null) {
LinkType linkType =
LinkType.fromSerializedValue(linkTypeBytes[0]);
int rowKeyColMetadataLength = 5;
byte[][] rowKeyMetaData = new
byte[rowKeyColMetadataLength][];
getVarChars(result.getRow(),
rowKeyColMetadataLength, rowKeyMetaData);
if (linkType == VIEW_INDEX_PARENT_TABLE) {
parentTableKey =
getParentTableKeyFromChildRowKeyMetaData(rowKeyMetaData);
return
scanMaxLookbackAgeFromParent(parentTableKey,
clientTimeStamp);
} else if (linkType == PHYSICAL_TABLE) {
parentTableKey =
getParentTableKeyFromChildRowKeyMetaData(rowKeyMetaData);
}
}
} else {
byte[] maxLookbackAgeInBytes =
result.getValue(TABLE_FAMILY_BYTES,
MAX_LOOKBACK_AGE_BYTES);
if (maxLookbackAgeInBytes != null) {
return PLong.INSTANCE.getCodec()
.decodeLong(maxLookbackAgeInBytes, 0,
SortOrder.getDefault());
}
}
result = scanner.next();
startCheckingForLink = true;
} while (result != null);
}
}
return parentTableKey == null ?
null : scanMaxLookbackAgeFromParent(parentTableKey,
clientTimeStamp);
}
```
> Configure maxLookbackAge at table level
> ---------------------------------------
>
> Key: PHOENIX-7006
> URL: https://issues.apache.org/jira/browse/PHOENIX-7006
> Project: Phoenix
> Issue Type: Improvement
> Reporter: Viraj Jasani
> Assignee: Sanjeet Malhotra
> Priority: Major
>
> Phoenix max lookback age feature preserves live or deleted row versions that
> are only visible through the max lookback window, it does not preserve any
> unwanted row versions that should not be visible through the max lookback
> window. More details on the max lookback redesign: PHOENIX-6888
> As of today, maxlookback age is only configurable at the cluster level
> (config key: {_}phoenix.max.lookback.age.seconds{_}), meaning the same value
> is used by all tables. This does not allow individual table level compaction
> scanner to be able to retain data based on the table level maxlookback age.
> Setting max lookback age at the table level can serve multiple purposes e.g.
> change-data-capture (PHOENIX-7001) for individual table should have it's own
> latest data retention period.
> The purpose of this Jira is to allow maxlookback age as a table level
> property:
> * New column in SYSTEM.CATALOG to preserve table level maxlookback age
> * PTable object to read the value of maxlookback from SYSTEM.CATALOG
> * Allow CREATE/ALTER TABLE DDLs to provide maxlookback attribute
> * CompactionScanner should use table level maxlookbackAge, if available,
> else use cluster level config
--
This message was sent by Atlassian Jira
(v8.20.10#820010)