[ https://issues.apache.org/jira/browse/PHOENIX-6213?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17237550#comment-17237550 ]
ASF GitHub Bot commented on PHOENIX-6213: ----------------------------------------- shahrs87 commented on a change in pull request #978: URL: https://github.com/apache/phoenix/pull/978#discussion_r528888617 ########## File path: phoenix-core/src/it/java/org/apache/phoenix/end2end/DeleteIT.java ########## @@ -943,6 +960,164 @@ public void testDeleteFilterWithMultipleIndexes() throws Exception { } } } -} + /* + Tests whether we have cell tags in delete marker for + ClientSelectDeleteMutationPlan. + */ + @Test + public void testDeleteClientDeleteMutationPlan() throws Exception { + String tableName = generateUniqueName(); + String indexName = generateUniqueName(); + String tagValue = "customer-delete"; + String delete = "DELETE FROM " + tableName + " WHERE v1 = 'foo'"; + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + // Add tag "customer-delete" to delete marker. + props.setProperty(ConnectionQueryServices.SOURCE_OPERATION_ATTRIB, tagValue); + + createAndUpsertTable(tableName, indexName, props); + // Make sure that the plan creates is of ClientSelectDeleteMutationPlan + verifyDeletePlan(delete, "ClientSelectDeleteMutationPlan", props); Review comment: DeleteCompiler#ClientSelectDeleteMutationPlan and other mutation plan classes are private nested classes and are not visible to test classes. Instead of making them public thought to hardcode the string. Let me know if you want me to make them public. Thank you ! ########## File path: phoenix-core/src/it/java/org/apache/phoenix/end2end/DeleteIT.java ########## @@ -943,6 +960,164 @@ public void testDeleteFilterWithMultipleIndexes() throws Exception { } } } -} + /* + Tests whether we have cell tags in delete marker for + ClientSelectDeleteMutationPlan. + */ + @Test + public void testDeleteClientDeleteMutationPlan() throws Exception { + String tableName = generateUniqueName(); + String indexName = generateUniqueName(); + String tagValue = "customer-delete"; + String delete = "DELETE FROM " + tableName + " WHERE v1 = 'foo'"; + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + // Add tag "customer-delete" to delete marker. + props.setProperty(ConnectionQueryServices.SOURCE_OPERATION_ATTRIB, tagValue); + + createAndUpsertTable(tableName, indexName, props); + // Make sure that the plan creates is of ClientSelectDeleteMutationPlan + verifyDeletePlan(delete, "ClientSelectDeleteMutationPlan", props); + executeDelete(delete, props, 1); + String startRowKeyForBaseTable = "1"; + String startRowKeyForIndexTable = "foo"; + // Make sure that Delete Marker has cell tag for base table + // and has no cell tag for index table. + checkTagPresentInDeleteMarker(tableName, startRowKeyForBaseTable, true, tagValue); + checkTagPresentInDeleteMarker(indexName, startRowKeyForIndexTable, false, null); + } + + /* + Tests whether we have cell tags in delete marker for + ServerSelectDeleteMutationPlan. + */ + @Test + public void testDeleteServerDeleteMutationPlan() throws Exception { + String tableName = generateUniqueName(); + String indexName = generateUniqueName(); + String tagValue = "customer-delete"; + String delete = "DELETE FROM " + tableName; + Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES); + props.setProperty(ConnectionQueryServices.SOURCE_OPERATION_ATTRIB, tagValue); + + createAndUpsertTable(tableName, indexName, props); + // Make sure that the plan creates is of ServerSelectDeleteMutationPlan + verifyDeletePlan(delete, "ServerSelectDeleteMutationPlan", props); Review comment: DeleteCompiler#ClientSelectDeleteMutationPlan and other mutation plan classes are private nested classes and are not visible to test classes. Instead of making them public thought to hardcode the string. Let me know if you want me to make them public. Thank you ! ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org > Extend Cell Tags to Delete object. > ---------------------------------- > > Key: PHOENIX-6213 > URL: https://issues.apache.org/jira/browse/PHOENIX-6213 > Project: Phoenix > Issue Type: New Feature > Reporter: Rushabh Shah > Assignee: Rushabh Shah > Priority: Major > > We want to track the source of mutations (especially Deletes) via Phoenix. We > have multiple use cases which does the deletes namely: customer deleting the > data, internal process like GDPR compliance, Phoenix TTL MR jobs. For every > mutations we want to track the source of operation which initiated the > deletes. > At my day job, we have custom Backup/Restore tool. > For example: During GDPR compliance cleanup (lets say at time t0), we > mistakenly deleted some customer data and it were possible that customer also > deleted some data from their side (at time t1). To recover mistakenly deleted > data, we restore from the backup at time (t0 - 1). By doing this, we also > recovered the data that customer intentionally deleted. > We need a way for Restore tool to selectively recover data. > Trying to explain via an example. > Lets say there are 2 different systems (lets say accidental-delete and > customer-delete) deleting the data from the same table at almost the same > time. As the name suggest customer-delete is the intentional delete and > accidental-delete is deletes done by mistake. We have restore tool which will > restore all the data between start time and end times (start-ts and end-ts). > We want to restore the deletes that happened by accidental-delete system and > not want to restore the deletes done by customer-delete system. By adding > cell tag to Delete Markers, we can not restore data done by customer-delete > system. > In my proposal, I want to add cell tags to Tombstone delete marker so that we > have that tag in the backups. Incase we have to restore data, we can restore > specific row depending on the tag present in the cell. > We want to leverage Cell Tag feature for Delete mutations to store these > metadata. Currently Delete object doesn't support Tag feature. > Also we want a solution that can be easily extensible to other mutations like > Put. > Some of the use cases I can think of where we can use tags for Put mutations > are: > 1. Identifying whether the put came from primary cluster or replicated > cluster so that we can make the backup tool more smarter and not backup the > same put twice in source and replicated cluster. > 2. We have a multi-tenancy concept in Phoenix. We want to track whether the > upsert (put operation in hbase) came from Global or Tenant connection. -- This message was sent by Atlassian Jira (v8.3.4#803005)