Skip to content

Commit 15ae0dc

Browse files
committed
CNDB-15609 test SAI disk size for all versions
Add tests to control SAI disk size for different format version and different partition sizes.
1 parent b9c402b commit 15ae0dc

File tree

1 file changed

+194
-0
lines changed

1 file changed

+194
-0
lines changed
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
/*
2+
* Copyright DataStax, Inc.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.apache.cassandra.index.sai.functional;
18+
19+
import java.math.BigDecimal;
20+
import java.math.BigInteger;
21+
import java.net.UnknownHostException;
22+
import java.nio.ByteBuffer;
23+
import java.util.Collection;
24+
import java.util.Date;
25+
import java.util.UUID;
26+
import java.util.stream.Collectors;
27+
import java.util.stream.Stream;
28+
29+
import org.junit.Before;
30+
import org.junit.Test;
31+
import org.junit.runner.RunWith;
32+
import org.junit.runners.Parameterized;
33+
import org.slf4j.Logger;
34+
import org.slf4j.LoggerFactory;
35+
36+
import org.apache.cassandra.index.sai.SAITester;
37+
import org.apache.cassandra.index.sai.SAIUtil;
38+
import org.apache.cassandra.index.sai.disk.format.Version;
39+
import org.apache.cassandra.locator.InetAddressAndPort;
40+
41+
import static org.assertj.core.api.Assertions.assertThat;
42+
43+
@RunWith(Parameterized.class)
44+
public class SaiDiskSizeTest extends SAITester
45+
{
46+
private static final Logger logger = LoggerFactory.getLogger(SaiDiskSizeTest.class);
47+
48+
@Parameterized.Parameter
49+
public Version version;
50+
51+
@Parameterized.Parameter(1)
52+
public int size;
53+
54+
@Parameterized.Parameter(2)
55+
public String pkSuffix;
56+
57+
@Parameterized.Parameter(3)
58+
public int rowsPerPartition;
59+
60+
@Parameterized.Parameters(name = "{0}, size={1}, pk={2}, partitionSize={3}")
61+
public static Collection<Object[]> data()
62+
{
63+
return Version.ALL.stream()
64+
.flatMap(v -> {
65+
switch (v.toString())
66+
{
67+
case "aa":
68+
return Stream.of(
69+
new Object[]{ v, 13014, "pk", 1 },
70+
new Object[]{ v, 13016, "pk, v_int", 2 },
71+
new Object[]{ v, 14266, "pk, v_int", 100 });
72+
case "ba":
73+
case "ca":
74+
case "db":
75+
case "dc":
76+
return Stream.of(
77+
new Object[]{ v, 65734, "pk", 1 },
78+
new Object[]{ v, 57627, "pk, v_int", 2 },
79+
new Object[]{ v, 28004, "pk, v_int", 100 });
80+
case "eb":
81+
case "ec":
82+
return Stream.of(
83+
new Object[]{ v, 67370, "pk", 1 },
84+
new Object[]{ v, 59263, "pk, v_int", 2 },
85+
new Object[]{ v, 29640, "pk, v_int", 100 });
86+
case "ed":
87+
return Stream.of(
88+
new Object[]{ v, 67378, "pk", 1 },
89+
new Object[]{ v, 59271, "pk, v_int", 2 },
90+
new Object[]{ v, 29648, "pk, v_int", 100 });
91+
default:
92+
return // A new version assumes the latest size by default
93+
Stream.of(
94+
new Object[]{ v, 67378, "pk", 1 },
95+
new Object[]{ v, 59271, "pk, v_int", 2 },
96+
new Object[]{ v, 29648, "pk, v_int", 100 });
97+
}
98+
})
99+
.collect(Collectors.toList());
100+
}
101+
102+
@Before
103+
public void setVersion()
104+
{
105+
SAIUtil.setCurrentVersion(version);
106+
}
107+
108+
@Test
109+
public void testIndexDiskSizeAcrossVersions() throws UnknownHostException
110+
{
111+
createTable("CREATE TABLE %s (" +
112+
"pk int, " +
113+
"v_ascii ascii, " +
114+
"v_bigint bigint, " +
115+
"v_blob blob, " +
116+
"v_boolean boolean, " +
117+
"v_decimal decimal, " +
118+
"v_double double, " +
119+
"v_float float, " +
120+
"v_int int, " +
121+
"v_text text, " +
122+
"v_timestamp timestamp, " +
123+
"v_uuid uuid, " +
124+
"v_varchar varchar, " +
125+
"v_varint varint, " +
126+
"v_timeuuid timeuuid, " +
127+
"v_inet inet, " +
128+
"v_date date, " +
129+
"v_time time, " +
130+
"v_smallint smallint, " +
131+
"v_tinyint tinyint, " +
132+
"v_duration duration, " +
133+
"PRIMARY KEY (" + pkSuffix + "))");
134+
135+
verifyNoIndexFiles();
136+
createIndex("CREATE CUSTOM INDEX ON %s(v_int) USING 'StorageAttachedIndex'");
137+
138+
waitForTableIndexesQueryable();
139+
140+
// Split data into 2 sstable segments
141+
insertRows(0, 1000);
142+
flush();
143+
insertRows(1000, 1000);
144+
flush();
145+
146+
long diskSize = indexDiskSpaceUse();
147+
logger.info("SAI Version: {}, Index Disk Size: {} bytes", version, diskSize);
148+
assertThat(diskSize)
149+
.as("Disk size for SAI version %s", version)
150+
.isLessThanOrEqualTo(size);
151+
152+
compact();
153+
154+
diskSize = indexDiskSpaceUse();
155+
logger.info("SAI Version: {}, Index Disk Size: {} bytes", version, diskSize);
156+
assertThat(diskSize)
157+
.as("Disk size for SAI version %s", version)
158+
.isLessThanOrEqualTo(size);
159+
}
160+
161+
private void insertRows(int size, int start) throws UnknownHostException
162+
{
163+
for (int i = start; i < start + size; i++)
164+
{
165+
execute("INSERT INTO %s (pk, v_ascii, v_bigint, v_blob, v_boolean, v_decimal, " +
166+
"v_double, v_float, v_int, v_text, v_timestamp, v_uuid, v_varchar, " +
167+
"v_varint, v_timeuuid, v_inet, v_date, v_time, v_smallint, v_tinyint, v_duration) " +
168+
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
169+
i % (size / rowsPerPartition), // Have 2 rows per partition
170+
"ascii_" + i,
171+
(long) i * 1000000,
172+
ByteBuffer.wrap(("blob_" + i).getBytes()),
173+
i % 2 == 0,
174+
new BigDecimal(i + ".123"),
175+
i * 1.5,
176+
(float) (i * 2.5),
177+
i * 2,
178+
"text_value_" + i,
179+
new Date(System.currentTimeMillis() + i * 1000L),
180+
UUID.randomUUID(),
181+
"varchar_" + i,
182+
BigInteger.valueOf(i).multiply(BigInteger.valueOf(100)),
183+
UUID.fromString("00000000-0000-1000-8000-" +
184+
String.format("%012d", i)),
185+
InetAddressAndPort.getByName("127.0.0." + (i % 256)).address,
186+
i + 1,
187+
(long) i * 1000000000L,
188+
(short) (i % 32767),
189+
(byte) (i % 128),
190+
org.apache.cassandra.cql3.Duration.newInstance(i % 12, i % 30, i * 1000000000L)
191+
);
192+
}
193+
}
194+
}

0 commit comments

Comments
 (0)