[ https://issues.apache.org/jira/browse/CASSANDRA-13127?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16002522#comment-16002522 ]
ZhaoYang edited comment on CASSANDRA-13127 at 5/9/17 2:26 PM: -------------------------------------------------------------- "UPDATE" semantic was designed to be different from "INSERT" to solve some TTL issue which will remove entire PK when only ttl of column is updated. There are two issues here: 1. In the update statement, there is no row-liveness info associated with update. ( so no base row liveness info because of Update semantic). it thinks this update query won't affect view, thus no view update is generated. if we need to fix it, it means we have to generate view update for more kinds of base modifications. ( "View.mayBeAffectedBy" will mostly return true) 2. another issue is in Row.Merger: {quote} if (row.primaryKeyLivenessInfo().supersedes(rowInfo)) rowInfo = row.primaryKeyLivenessInfo(); {quote} This comparison isn't enough. TTL/expireTime needs to be aggregated differently, not just based on timestamp. was (Author: jasonstack): "UPDATE" semantic was designed to be different from "INSERT" to solve some TTL issue which will remove entire PK when only ttl of column is updated. There are two issues here: 1. In the update statement, there is no row-liveness info associated with update. ( so no base row liveness info because of Update semantic). it thinks this update query won't affect view, thus no view update is generated. if we need to fix it, it means we have to generate view update for more kinds of base modifications. ( "View.mayBeAffectedBy" will mostly return true) 2. another issue is in Row.Merger: {quote} if (row.primaryKeyLivenessInfo().supersedes(rowInfo)) rowInfo = row.primaryKeyLivenessInfo(); {quote} This comparison isn't enough. timestamp could be the same but TTL/expireTime is different. > Materialized Views: View row expires too soon > --------------------------------------------- > > Key: CASSANDRA-13127 > URL: https://issues.apache.org/jira/browse/CASSANDRA-13127 > Project: Cassandra > Issue Type: Bug > Components: Local Write-Read Paths, Materialized Views > Reporter: Duarte Nunes > > Consider the following commands, ran against trunk: > {code} > echo "DROP MATERIALIZED VIEW ks.mv; DROP TABLE ks.base;" | bin/cqlsh > echo "CREATE TABLE ks.base (p int, c int, v int, PRIMARY KEY (p, c));" | > bin/cqlsh > echo "CREATE MATERIALIZED VIEW ks.mv AS SELECT p, c FROM base WHERE p IS NOT > NULL AND c IS NOT NULL PRIMARY KEY (c, p);" | bin/cqlsh > echo "INSERT INTO ks.base (p, c) VALUES (0, 0) USING TTL 10;" | bin/cqlsh > # wait for row liveness to get closer to expiration > sleep 6; > echo "UPDATE ks.base USING TTL 8 SET v = 0 WHERE p = 0 and c = 0;" | bin/cqlsh > echo "SELECT p, c, ttl(v) FROM ks.base; SELECT * FROM ks.mv;" | bin/cqlsh > p | c | ttl(v) > ---+---+-------- > 0 | 0 | 7 > (1 rows) > c | p > ---+--- > 0 | 0 > (1 rows) > # wait for row liveness to expire > sleep 4; > echo "SELECT p, c, ttl(v) FROM ks.base; SELECT * FROM ks.mv;" | bin/cqlsh > p | c | ttl(v) > ---+---+-------- > 0 | 0 | 3 > (1 rows) > c | p > ---+--- > (0 rows) > {code} > Notice how the view row is removed even though the base row is still live. I > would say this is because in ViewUpdateGenerator#computeLivenessInfoForEntry > the TTLs are compared instead of the expiration times, but I'm not sure I'm > getting that far ahead in the code when updating a column that's not in the > view. -- This message was sent by Atlassian JIRA (v6.3.15#6346) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org