Merge branch 'cassandra-3.0' into cassandra-3.11

This commit is contained in:
Andrés de la Peña 2021-08-24 18:06:04 +01:00
commit 0c38f9dfb8
3 changed files with 139 additions and 8 deletions

View File

@ -5,6 +5,7 @@
* Reduce thread contention in CommitLogSegment and HintsBuffer (CASSANDRA-16072)
* Avoid sending CDC column if not enabled (CASSANDRA-16770)
Merged from 3.0:
* Fix secondary indexes on primary key columns skipping some writes (CASSANDRA-16868)
* Fix incorrect error message in LegacyLayout (CASSANDRA-15136)
* Use JMX to validate nodetool --jobs parameter (CASSANDRA-16104)
* Handle properly UnsatisfiedLinkError in NativeLibrary#getProcessID() (CASSANDRA-16578)

View File

@ -427,7 +427,7 @@ public abstract class CassandraIndex implements Index
if (isPrimaryKeyIndex())
indexPrimaryKey(newRow.clustering(),
newRow.primaryKeyLivenessInfo(),
getPrimaryKeyIndexLiveness(newRow),
newRow.deletion());
if (indexedColumn.isComplex())
@ -505,10 +505,7 @@ public abstract class CassandraIndex implements Index
if (cell.isLive(nowInSec))
{
if (cellTimestamp > timestamp)
{
timestamp = cellTimestamp;
ttl = cell.ttl();
}
}
}
return LivenessInfo.create(timestamp, ttl, nowInSec);

View File

@ -30,7 +30,6 @@ import org.apache.cassandra.config.ColumnDefinition;
import org.apache.cassandra.config.DatabaseDescriptor;
import org.apache.cassandra.cql3.CQLTester;
import org.apache.cassandra.cql3.ColumnIdentifier;
import org.apache.cassandra.cql3.Duration;
import org.apache.cassandra.cql3.QueryProcessor;
import org.apache.cassandra.cql3.restrictions.StatementRestrictions;
import org.apache.cassandra.cql3.statements.IndexTarget;
@ -1537,46 +1536,180 @@ public class SecondaryIndexTest extends CQLTester
@Test
public void testIndexOnPartitionKeyInsertExpiringColumn() throws Throwable
{
testIndexOnPartitionKeyInsertExpiringColumn(false);
}
@Test
public void testIndexOnPartitionKeyInsertExpiringColumnWithFlush() throws Throwable
{
testIndexOnPartitionKeyInsertExpiringColumn(true);
}
private void testIndexOnPartitionKeyInsertExpiringColumn(boolean flushBeforeUpdate) throws Throwable
{
createTable("CREATE TABLE %s (k1 int, k2 int, a int, b int, PRIMARY KEY ((k1, k2)))");
createIndex("CREATE INDEX on %s(k1)");
createIndex("CREATE INDEX ON %s(k1)");
execute("INSERT INTO %s (k1, k2, a, b) VALUES (1, 2, 3, 4)");
assertRows(execute("SELECT * FROM %s WHERE k1 = 1"), row(1, 2, 3, 4));
if (flushBeforeUpdate)
flush();
execute("UPDATE %s USING TTL 1 SET b = 10 WHERE k1 = 1 AND k2 = 2");
Thread.sleep(1000);
assertRows(execute("SELECT * FROM %s WHERE k1 = 1"), row(1, 2, 3, null));
}
@Test
public void testIndexOnPartitionKeyOverridingExpiredRow() throws Throwable
{
createTable("CREATE TABLE %s (k1 int, k2 int, v int, PRIMARY KEY ((k1, k2)))");
createIndex("CREATE INDEX ON %s(k1)");
execute("UPDATE %s USING TTL 1 SET v = 3 WHERE k1 = 1 AND k2 = 2");
Thread.sleep(1000);
assertEmpty(execute("SELECT * FROM %s WHERE k1 = 1"));
execute("UPDATE %s SET v = 3 WHERE k1 = 1 AND k2 = 2");
assertRows(execute("SELECT * FROM %s WHERE k1 = 1"), row(1, 2, 3));
}
@Test
public void testIndexOnPartitionKeyOverridingDeletedRow() throws Throwable
{
createTable("CREATE TABLE %s (k1 int, k2 int, c int, v int, PRIMARY KEY ((k1, k2), c))");
createIndex("CREATE INDEX ON %s(k1)");
execute("INSERT INTO %s(k1, k2, c, v) VALUES (1, 2, 3, 4)");
execute("DELETE FROM %s WHERE k1 = 1 AND k2 = 2 AND c = 3");
execute("UPDATE %s SET v = 4 WHERE k1 = 1 AND k2 = 2 AND c = 3");
assertRows(execute("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c = 3"), row(1, 2, 3, 4));
assertRows(execute("SELECT * FROM %s WHERE k1 = 1"), row(1, 2, 3, 4));
}
@Test
public void testIndexOnClusteringKeyInsertExpiringColumn() throws Throwable
{
testIndexOnClusteringKeyInsertExpiringColumn(false);
}
@Test
public void testIndexOnClusteringKeyInsertExpiringColumnWithFlush() throws Throwable
{
testIndexOnClusteringKeyInsertExpiringColumn(true);
}
private void testIndexOnClusteringKeyInsertExpiringColumn(boolean flushBeforeUpdate) throws Throwable
{
createTable("CREATE TABLE %s (pk int, ck int, a int, b int, PRIMARY KEY (pk, ck))");
createIndex("CREATE INDEX on %s(ck)");
createIndex("CREATE INDEX ON %s(ck)");
execute("INSERT INTO %s (pk, ck, a, b) VALUES (1, 2, 3, 4)");
assertRows(execute("SELECT * FROM %s WHERE ck = 2"), row(1, 2, 3, 4));
if (flushBeforeUpdate)
flush();
execute("UPDATE %s USING TTL 1 SET b = 10 WHERE pk = 1 AND ck = 2");
Thread.sleep(1000);
assertRows(execute("SELECT * FROM %s WHERE ck = 2"), row(1, 2, 3, null));
}
@Test
public void testIndexOnClusteringKeyOverridingExpiredRow() throws Throwable
{
createTable("CREATE TABLE %s (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
createIndex("CREATE INDEX ON %s(ck)");
execute("UPDATE %s USING TTL 1 SET v = 3 WHERE pk = 1 AND ck = 2");
Thread.sleep(1000);
assertEmpty(execute("SELECT * FROM %s WHERE ck = 2"));
execute("UPDATE %s SET v = 3 WHERE pk = 1 AND ck = 2");
assertRows(execute("SELECT * FROM %s WHERE ck = 2"), row(1, 2, 3));
}
@Test
public void testIndexOnClusteringKeyOverridingDeletedRow() throws Throwable
{
createTable("CREATE TABLE %s (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
createIndex("CREATE INDEX ON %s(ck)");
execute("INSERT INTO %s(pk, ck, v) VALUES (1, 2, 3)");
execute("DELETE FROM %s WHERE pk = 1 AND ck = 2");
execute("UPDATE %s SET v = 3 WHERE pk = 1 AND ck = 2");
assertRows(execute("SELECT * FROM %s WHERE pk = 1 AND ck = 2"), row(1, 2, 3));
assertRows(execute("SELECT * FROM %s WHERE ck = 2"), row(1, 2, 3));
}
@Test
public void testIndexOnRegularColumnInsertExpiringColumn() throws Throwable
{
testIndexOnRegularColumnInsertExpiringColumn(false);
}
@Test
public void testIndexOnRegularColumnInsertExpiringColumnWithFlush() throws Throwable
{
testIndexOnRegularColumnInsertExpiringColumn(true);
}
private void testIndexOnRegularColumnInsertExpiringColumn(boolean flushBeforeUpdate) throws Throwable
{
createTable("CREATE TABLE %s (pk int, ck int, a int, b int, PRIMARY KEY (pk, ck))");
createIndex("CREATE INDEX on %s(a)");
createIndex("CREATE INDEX ON %s(a)");
execute("INSERT INTO %s (pk, ck, a, b) VALUES (1, 2, 3, 4)");
assertRows(execute("SELECT * FROM %s WHERE a = 3"), row(1, 2, 3, 4));
if (flushBeforeUpdate)
flush();
execute("UPDATE %s USING TTL 1 SET b = 10 WHERE pk = 1 AND ck = 2");
Thread.sleep(1000);
assertRows(execute("SELECT * FROM %s WHERE a = 3"), row(1, 2, 3, null));
if (flushBeforeUpdate)
flush();
execute("UPDATE %s USING TTL 1 SET a = 5 WHERE pk = 1 AND ck = 2");
Thread.sleep(1000);
assertEmpty(execute("SELECT * FROM %s WHERE a = 3"));
assertEmpty(execute("SELECT * FROM %s WHERE a = 5"));
}
@Test
public void testIndexOnRegularColumnOverridingExpiredRow() throws Throwable
{
createTable("CREATE TABLE %s (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
createIndex("CREATE INDEX ON %s(v)");
execute("UPDATE %s USING TTL 1 SET v = 3 WHERE pk = 1 AND ck = 2");
Thread.sleep(1000);
assertEmpty(execute("SELECT * FROM %s WHERE v = 3"));
execute("UPDATE %s SET v = 3 WHERE pk = 1 AND ck = 2");
assertRows(execute("SELECT * FROM %s WHERE v = 3"), row(1, 2, 3));
}
@Test
public void testIndexOnRegularColumnOverridingDeletedRow() throws Throwable
{
createTable("CREATE TABLE %s (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
createIndex("CREATE INDEX ON %s(v)");
execute("INSERT INTO %s(pk, ck, v) VALUES (1, 2, 3)");
execute("DELETE FROM %s WHERE pk=1 AND ck=2");
execute("UPDATE %s SET v=3 WHERE pk=1 AND ck=2");
assertRows(execute("SELECT * FROM %s WHERE pk=1 AND ck=2"), row(1, 2, 3));
assertRows(execute("SELECT * FROM %s WHERE v=3"), row(1, 2, 3));
}
@Test
public void testIndicesOnCompactTable() throws Throwable
{