Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add the crashtest1.c program used to test the ability of the database to survive a program crash or power failure. Ticket #599. (CVS 1210) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
597a59a72d662b291fb09a069547efd0 |
User & Date: | drh 2004-02-08 06:06:37.000 |
Context
2004-02-08
| ||
06:17 | Fix a bug in the VDBE that occurs when a CreateTable or CreateIndex fails. (CVS 1211) (check-in: 42cfd541dc user: drh tags: trunk) | |
06:06 | Add the crashtest1.c program used to test the ability of the database to survive a program crash or power failure. Ticket #599. (CVS 1210) (check-in: 597a59a72d user: drh tags: trunk) | |
06:05 | Fix inaccuracies and add details to comments in the pager. Change the name of one function to make its purpose clearer. Ticket #599. (CVS 1209) (check-in: 48832d35ed user: drh tags: trunk) | |
Changes
Added test/crashtest1.c.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | /* ** This program tests the ability of SQLite database to recover from a crash. ** This program runs under Unix only, but the results are applicable to all ** systems. ** ** The main process first constructs a test database, then starts creating ** subprocesses that write to that database. Each subprocess is killed off, ** without a chance to clean up its database connection, after a random ** delay. This killing of the subprocesses simulates a crash or power ** failure. The next subprocess to open the database should rollback ** whatever operation was in process at the time of the simulated crash. ** ** If any problems are encountered, an error is reported and the test stops. ** If no problems are seen after a large number of tests, we assume that ** the rollback mechanism is working. */ #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <signal.h> #include <stdlib.h> #include <string.h> #include <sched.h> #include "sqlite.h" static void do_some_sql(int parent){ char *zErr; int rc = SQLITE_OK; sqlite *db; int cnt = 0; static char zBig[] = "-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" "-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; if( access("./test.db-journal",0)==0 ){ /*printf("pid %d: journal exists. rollback will be required\n",getpid());*/ unlink("test.db-saved"); system("cp test.db test.db-saved"); unlink("test.db-journal-saved"); system("cp test.db-journal test.db-journal-saved"); } db = sqlite_open("./test.db", 0, &zErr); if( db==0 ){ printf("ERROR: %s\n", zErr); if( strcmp(zErr,"database disk image is malformed")==0 ){ kill(parent, SIGKILL); } exit(1); } srand(getpid()); while( rc==SQLITE_OK ){ cnt++; rc = sqlite_exec_printf(db, "INSERT INTO t1 VALUES(%d,'%d%s')", 0, 0, &zErr, rand(), rand(), zBig); } if( rc!=SQLITE_OK ){ printf("ERROR #%d: %s\n", rc, zErr); if( rc==SQLITE_CORRUPT ){ kill(parent, SIGKILL); } } printf("pid %d: cnt=%d\n", getpid(), cnt); } int main(int argc, char **argv){ int i; sqlite *db; char *zErr; int status; int parent = getpid(); unlink("test.db"); unlink("test.db-journal"); db = sqlite_open("test.db", 0, &zErr); if( db==0 ){ printf("Cannot initialize: %s\n", zErr); return 1; } sqlite_exec(db, "CREATE TABLE t1(a,b)", 0, 0, 0); sqlite_close(db); for(i=0; i<10000; i++){ int pid = fork(); if( pid==0 ){ sched_yield(); do_some_sql(parent); return 0; } printf("test %d, pid=%d\n", i, pid); usleep(rand()%10000 + 1000); kill(pid, SIGKILL); waitpid(pid, &status, 0); } return 0; } |