Skip to content

Commit 76f1788

Browse files
authored
Merge pull request #1852 from tursodatabase/fix-disappearing-frames
libsql-sqlite3: Fix problem with disappearing WAL frames
2 parents f453e44 + adb5eeb commit 76f1788

File tree

4 files changed

+57
-6
lines changed

4 files changed

+57
-6
lines changed

libsql-ffi/bundled/SQLite3MultipleCiphers/src/sqlite3.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65324,10 +65324,17 @@ SQLITE_PRIVATE int sqlite3PagerWalBeginCommit(Pager *pPager) {
6532465324
}
6532565325

6532665326
SQLITE_PRIVATE int sqlite3PagerWalEndCommit(Pager *pPager) {
65327+
int rc = SQLITE_ERROR;
6532765328
if (!pagerUseWal(pPager)) {
65328-
return SQLITE_ERROR;
65329+
return rc;
6532965330
}
65330-
return pPager->wal->methods.xEndWriteTransaction(pPager->wal->pData);
65331+
rc = pPager->wal->methods.xEndWriteTransaction(pPager->wal->pData);
65332+
if (rc != SQLITE_OK) {
65333+
return rc;
65334+
}
65335+
pager_reset(pPager);
65336+
pager_unlock(pPager);
65337+
return rc;
6533165338
}
6533265339

6533365340
SQLITE_PRIVATE int sqlite3PagerWalInsert(Pager *pPager, unsigned int iFrame, void *pBuf, unsigned int nBuf) {

libsql-ffi/bundled/src/sqlite3.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65324,10 +65324,17 @@ SQLITE_PRIVATE int sqlite3PagerWalBeginCommit(Pager *pPager) {
6532465324
}
6532565325

6532665326
SQLITE_PRIVATE int sqlite3PagerWalEndCommit(Pager *pPager) {
65327+
int rc = SQLITE_ERROR;
6532765328
if (!pagerUseWal(pPager)) {
65328-
return SQLITE_ERROR;
65329+
return rc;
6532965330
}
65330-
return pPager->wal->methods.xEndWriteTransaction(pPager->wal->pData);
65331+
rc = pPager->wal->methods.xEndWriteTransaction(pPager->wal->pData);
65332+
if (rc != SQLITE_OK) {
65333+
return rc;
65334+
}
65335+
pager_reset(pPager);
65336+
pager_unlock(pPager);
65337+
return rc;
6533165338
}
6533265339

6533365340
SQLITE_PRIVATE int sqlite3PagerWalInsert(Pager *pPager, unsigned int iFrame, void *pBuf, unsigned int nBuf) {

libsql-sqlite3/src/pager.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7813,10 +7813,17 @@ int sqlite3PagerWalBeginCommit(Pager *pPager) {
78137813
}
78147814

78157815
int sqlite3PagerWalEndCommit(Pager *pPager) {
7816+
int rc = SQLITE_ERROR;
78167817
if (!pagerUseWal(pPager)) {
7817-
return SQLITE_ERROR;
7818+
return rc;
78187819
}
7819-
return pPager->wal->methods.xEndWriteTransaction(pPager->wal->pData);
7820+
rc = pPager->wal->methods.xEndWriteTransaction(pPager->wal->pData);
7821+
if (rc != SQLITE_OK) {
7822+
return rc;
7823+
}
7824+
pager_reset(pPager);
7825+
pager_unlock(pPager);
7826+
return rc;
78207827
}
78217828

78227829
int sqlite3PagerWalInsert(Pager *pPager, unsigned int iFrame, void *pBuf, unsigned int nBuf) {

libsql-sqlite3/src/test_walapi.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,42 @@ void test_sync_by_parts() {
119119
cmp_data(db_primary, db_backup);
120120
}
121121

122+
// This test case writes to a local database, syncs it to remote, and then verifies the remote.
123+
// The test then writes some more to local database, syncs it again, and verifies the remote again.
124+
void test_sync_while_reading() {
125+
sqlite3 *db_primary, *db_backup;
126+
unsigned int max_frame;
127+
open_db("primary_test_sync_while_reading.db", &db_primary);
128+
ensure(sqlite3_exec(db_primary, "CREATE TABLE t (x)", 0, 0, 0) == SQLITE_OK, "failed to insert data\n");
129+
ensure(sqlite3_exec(db_primary, "INSERT INTO t VALUES (randomblob(4 * 1024))", 0, 0, 0) == SQLITE_OK, "failed to insert data\n");
130+
ensure(sqlite3_exec(db_primary, "INSERT INTO t VALUES (randomblob(1 * 1024))", 0, 0, 0) == SQLITE_OK, "failed to insert data\n");
131+
ensure(sqlite3_exec(db_primary, "INSERT INTO t VALUES (randomblob(1 * 1024))", 0, 0, 0) == SQLITE_OK, "failed to insert data\n");
132+
133+
open_db("backup_test_sync_while_reading.db", &db_backup);
134+
ensure(libsql_wal_frame_count(db_backup, &max_frame) == SQLITE_OK, "failed to get frames count: %s\n", sqlite3_errmsg(db_backup));
135+
assert(max_frame == 0);
136+
137+
eprintf("start full sync\n");
138+
sync_db(db_primary, db_backup);
139+
cmp_data(db_primary, db_backup);
140+
141+
ensure(sqlite3_exec(db_primary, "INSERT INTO t VALUES (randomblob(4 * 1024))", 0, 0, 0) == SQLITE_OK, "failed to insert data\n");
142+
ensure(sqlite3_exec(db_primary, "INSERT INTO t VALUES (randomblob(1 * 1024))", 0, 0, 0) == SQLITE_OK, "failed to insert data\n");
143+
ensure(sqlite3_exec(db_primary, "INSERT INTO t VALUES (randomblob(1 * 1024))", 0, 0, 0) == SQLITE_OK, "failed to insert data\n");
144+
sync_db(db_primary, db_backup);
145+
cmp_data(db_primary, db_backup);
146+
}
147+
122148
int main(int argc, char *argv[])
123149
{
124150
test_huge_payload();
125151
printf("============= OK test_huge_payload\n");
126152

127153
test_sync_by_parts();
128154
printf("============= OK test_sync_by_parts\n");
155+
156+
test_sync_while_reading();
157+
printf("============= OK test_sync_while_reading\n");
158+
129159
return 0;
130160
}

0 commit comments

Comments
 (0)