[ 
https://issues.apache.org/jira/browse/PHOENIX-7667?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Viraj Jasani reassigned PHOENIX-7667:
-------------------------------------

    Assignee: Viraj Jasani

> Strict vs Relaxed TTL
> ---------------------
>
>                 Key: PHOENIX-7667
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-7667
>             Project: Phoenix
>          Issue Type: Improvement
>            Reporter: Viraj Jasani
>            Assignee: Viraj Jasani
>            Priority: Major
>             Fix For: 5.3.0
>
>
> Types of TTLs supported by Phoenix:
> *Literal TTL:* A simple numeric value specifying the TTL in seconds.
> e.g.
> {code:java}
> CREATE TABLE T1 (id VARCHAR PRIMARY KEY, COL1 VARCHAR, COL2 INTEGER) TTL = 
> 86400{code}
> Literal TTL values:
>  * {{NONE}} / {{{}TTL_EXPRESSION_NOT_DEFINED{}}}: TTL is not specified for 
> the table.
>  * {{FOREVER}} / {{{}TTL_EXPRESSION_FOREVER{}}}: TTL is set to not expire for 
> the rows.
>  * {{{}TTL_EXPRESSION_DEFINED_IN_TABLE_DESCRIPTOR{}}}: Clients older than 
> Phoenix 5.3 sets TTL value to the HBase TableDescriptor.
>  * {{{}User provided TTL{}}}: Literal value of TTL in seconds.
> *Conditional TTL:* A boolean expression to determine the row expiration based 
> on column values.
> e.g.
> {code:java}
> CREATE TABLE T1 (id VARCHAR PRIMARY KEY, status VARCHAR) TTL = 'status = 
> ''EXPIRED'' OR TO_NUMBER(CURRENT_TIME()) - TO_NUMBER(PHOENIX_ROW_TIMESTAMP()) 
> >= 108000000'{code}
> As of Phoenix 5.3.0 (client and server), both types of TTLs are stored in 
> SYSTEM.CATALOG table.
> The default behavior of conditional TTL includes parsing and compilation of 
> the TTL expression, serializing the compiled expression into bytes and 
> sending the serialized bytes as the Scan attribute. The scan attribute for 
> Conditional TTL is deserialized and used by many region coprocessors and 
> scanner implementations including TTLRegionScanner, GlobalIndexRegionScanner 
> and IndexRegionObserver.
> In order to provide strict TTL view for the users, the region observers 
> perform extra computation on the row to determine whether the row has already 
> expired and therefore should not be processed. For instance, 
> IndexRegionObserver performs read for the given upsert to identify whether 
> the row has already expired. While the extra cost incurred by the region 
> observers help provide strict TTL expiration, some use case might not require 
> strict TTL expiry.
> Let’s define the types of TTL use cases:
>  * {*}Strict TTL expiration{*}: As soon as the TTL expires for the given row, 
> the row must not be visible to the user queries.
>  * *Relaxed TTL expiration:* After the TTL expiration, it can take several 
> hours to days for the row to not be visible to the user queries.
> Costs involved to achieve strict Conditional TTL expiry:
>  * TTLRegionScanner achieves masking of the row (Literal and Conditional TTL)
>  * IndexRegionObserver performs read for each update operation (No additional 
> cost when the table has covered index)
>  * GlobalIndexRegionScanner evaluates TTL expression for each data table row 
> during rebuild
> For users that do not care about the immediate row masking after the TTL 
> expiry, we can provide optional configuration to avoid the extra cost 
> associated with making the strict TTL expiration. The relaxed TTL expiration 
> is expected to rely only on the Major compaction. After the major compaction 
> successfully expires or deletes the given row, the client will no longer be 
> able to read the expired row.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to