Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 01fc00f

Browse files
committed
Add test
1 parent cad242c commit 01fc00f

File tree

6 files changed

+93
-3
lines changed

6 files changed

+93
-3
lines changed

Makefile

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ PGFILEDESC = "lsm3 - MVCC storage with undo log"
55
EXTENSION = lsm3
66
DATA = lsm3--1.0.sql
77

8-
REGRESS = lsm3
8+
REGRESS = test
9+
REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/lsm3/lsm3.conf
10+
911

1012
ifdef USE_PGXS
1113
PG_CONFIG ?= pg_config

expected/test.out

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
create extension lsm3;
2+
create table t(k bigint, val bigint);
3+
create index lsm3_index on t using lsm3(k);
4+
insert into t values (generate_series(1,100000), 1);
5+
insert into t values (generate_series(1000001,200000), 2);
6+
insert into t values (generate_series(2000001,300000), 3);
7+
insert into t values (generate_series(1,100000), 1);
8+
insert into t values (generate_series(1000001,200000), 2);
9+
insert into t values (generate_series(2000001,300000), 3);
10+
select * from t where k = 1;
11+
k | val
12+
---+-----
13+
1 | 1
14+
1 | 1
15+
(2 rows)
16+
17+
select * from t where k = 1000000;
18+
k | val
19+
---+-----
20+
(0 rows)
21+
22+
select * from t where k = 2000000;
23+
k | val
24+
---+-----
25+
(0 rows)
26+
27+
select * from t where k = 3000000;
28+
k | val
29+
---+-----
30+
(0 rows)
31+
32+
explain (COSTS OFF, TIMING OFF, SUMMARY OFF) select * from t where k = 1;
33+
QUERY PLAN
34+
----------------------------------
35+
Index Scan using lsm3_index on t
36+
Index Cond: (k = 1)
37+
(2 rows)
38+
39+
select lsm3_get_merge_count('lsm3_index') > 0;
40+
?column?
41+
----------
42+
t
43+
(1 row)
44+
45+
drop table t;

lsm3--1.0.sql

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,3 +785,6 @@ CREATE OPERATOR CLASS uuid_ops DEFAULT
785785
FUNCTION 1 uuid_cmp(uuid,uuid),
786786
FUNCTION 2 uuid_sortsupport(internal),
787787
FUNCTION 4 btequalimage(oid);
788+
789+
CREATE FUNCTION lsm3_get_merge_count(index regclass) returns bigint
790+
AS 'MODULE_PATHNAME' LANGUAGE C STRICT PARALLEL RESTRICTED;

lsm3.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ PG_MODULE_MAGIC;
3434

3535
PG_FUNCTION_INFO_V1(lsm3_handler);
3636
PG_FUNCTION_INFO_V1(lsm3_btree_wrapper);
37+
PG_FUNCTION_INFO_V1(lsm3_get_merge_count);
38+
3739
extern void _PG_init(void);
3840
extern void _PG_fini(void);
3941

@@ -191,6 +193,7 @@ lsm3_truncate_index(Oid index_oid, Oid heap_oid)
191193
Relation heap = table_open(heap_oid, AccessShareLock); /* heap is actually not used, because we will not load data to top indexes */
192194
IndexInfo* indexInfo = BuildDummyIndexInfo(index);
193195
RelationTruncate(index, 0);
196+
elog(LOG, "Lsm3: truncate index %s", RelationGetRelationName(index));
194197
index_build(heap, index, indexInfo, true, false);
195198
index_close(index, AccessExclusiveLock);
196199
table_close(heap, AccessShareLock);
@@ -207,6 +210,8 @@ lsm3_merge_indexes(Oid dst_oid, Oid src_oid, Oid heap_oid)
207210
bool ok;
208211
Oid save_am = base_index->rd_rel->relam;
209212

213+
elog(LOG, "Lsm3: merge index %s", RelationGetRelationName(top_index));
214+
210215
base_index->rd_rel->relam = BTREE_AM_OID;
211216
scan = index_beginscan(heap, top_index, SnapshotAny, 0, 0);
212217
scan->xs_want_itup = true;
@@ -432,7 +437,6 @@ lsm3_insert(Relation rel, Datum *values, bool *isnull,
432437
/* If all inserts in previous active index are completed then we can start merge */
433438
if (entry->merge_in_progress && entry->active_index != active_index && entry->access_count[active_index] == 0)
434439
{
435-
elog(LOG, "Initiate merge of index %s", RelationGetRelationName(index));
436440
entry->start_merge = true;
437441
if (entry->merger == NULL) /* lazy start of bgworker */
438442
{
@@ -499,6 +503,10 @@ lsm3_endscan(IndexScanDesc scan)
499503
for (int i = 0; i < 3; i++)
500504
{
501505
btendscan(so->scan[i]);
506+
if (i < 2)
507+
{
508+
index_close(so->top_index[i], AccessShareLock);
509+
}
502510
}
503511
pfree(so);
504512
}
@@ -756,7 +764,7 @@ lsm3_process_utility(PlannedStmt *plannedStmt,
756764
for (i = 0; i < 2; i++)
757765
{
758766
stmt->accessMethod = "lsm3_btree_wrapper";
759-
stmt->idxname = psprintf("%s_top%d", originIndexName, i);
767+
stmt->idxname = psprintf("%s_top%d", get_rel_name(Lsm3Entry->base), i);
760768
Lsm3Entry->top[i] = DefineIndex(Lsm3Entry->heap,
761769
stmt,
762770
InvalidOid,
@@ -831,3 +839,16 @@ void _PG_fini(void)
831839
shmem_startup_hook = PreviousShmemStartupHook;
832840
}
833841

842+
Datum
843+
lsm3_get_merge_count(PG_FUNCTION_ARGS)
844+
{
845+
Oid relid = PG_GETARG_OID(0);
846+
Relation index = index_open(relid, AccessShareLock);
847+
Lsm3DictEntry* entry = lsm3_get_entry(index);
848+
index_close(index, AccessShareLock);
849+
if (entry == NULL)
850+
PG_RETURN_NULL();
851+
else
852+
PG_RETURN_INT64(entry->n_merges);
853+
}
854+

lsm3.conf

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
shared_preload_libraries = 'lsm3'
2+
lsm3.max_top_index_size=1MB

sql/test.sql

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
create extension lsm3;
2+
3+
create table t(k bigint, val bigint);
4+
create index lsm3_index on t using lsm3(k);
5+
insert into t values (generate_series(1,100000), 1);
6+
insert into t values (generate_series(1000001,200000), 2);
7+
insert into t values (generate_series(2000001,300000), 3);
8+
insert into t values (generate_series(1,100000), 1);
9+
insert into t values (generate_series(1000001,200000), 2);
10+
insert into t values (generate_series(2000001,300000), 3);
11+
select * from t where k = 1;
12+
select * from t where k = 1000000;
13+
select * from t where k = 2000000;
14+
select * from t where k = 3000000;
15+
explain (COSTS OFF, TIMING OFF, SUMMARY OFF) select * from t where k = 1;
16+
select lsm3_get_merge_count('lsm3_index') > 0;
17+
drop table t;

0 commit comments

Comments
 (0)