Annotation of embedaddon/sqlite3/test/crashtest1.c, revision 1.1.1.1

1.1       misho       1: /*
                      2: ** This program tests the ability of SQLite database to recover from a crash.
                      3: ** This program runs under Unix only, but the results are applicable to all
                      4: ** systems.
                      5: **
                      6: ** The main process first constructs a test database, then starts creating
                      7: ** subprocesses that write to that database.  Each subprocess is killed off,
                      8: ** without a chance to clean up its database connection, after a random
                      9: ** delay.  This killing of the subprocesses simulates a crash or power
                     10: ** failure.  The next subprocess to open the database should rollback
                     11: ** whatever operation was in process at the time of the simulated crash.
                     12: **
                     13: ** If any problems are encountered, an error is reported and the test stops.
                     14: ** If no problems are seen after a large number of tests, we assume that
                     15: ** the rollback mechanism is working.
                     16: */
                     17: #include <stdio.h>
                     18: #include <unistd.h>
                     19: #include <sys/types.h>
                     20: #include <sys/wait.h>
                     21: #include <signal.h>
                     22: #include <stdlib.h>
                     23: #include <string.h>
                     24: #include <sched.h>
                     25: #include "sqlite.h"
                     26: 
                     27: static void do_some_sql(int parent){
                     28:   char *zErr;
                     29:   int rc = SQLITE_OK;
                     30:   sqlite *db;
                     31:   int cnt = 0;
                     32:   static char zBig[] = 
                     33:     "-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
                     34:     "-abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
                     35: 
                     36:   if( access("./test.db-journal",0)==0 ){
                     37:     /*printf("pid %d: journal exists.  rollback will be required\n",getpid());*/    unlink("test.db-saved");
                     38:     system("cp test.db test.db-saved");
                     39:     unlink("test.db-journal-saved");
                     40:     system("cp test.db-journal test.db-journal-saved");
                     41:   }
                     42:   db = sqlite_open("./test.db", 0, &zErr);
                     43:   if( db==0 ){
                     44:     printf("ERROR: %s\n", zErr);
                     45:     if( strcmp(zErr,"database disk image is malformed")==0 ){
                     46:       kill(parent, SIGKILL);
                     47:     }
                     48:     exit(1);
                     49:   }
                     50:   srand(getpid());
                     51:   while( rc==SQLITE_OK ){
                     52:     cnt++;
                     53:     rc = sqlite_exec_printf(db, 
                     54:        "INSERT INTO t1 VALUES(%d,'%d%s')", 0, 0, &zErr,
                     55:        rand(), rand(), zBig);
                     56:   }
                     57:   if( rc!=SQLITE_OK ){
                     58:     printf("ERROR #%d: %s\n", rc, zErr);
                     59:     if( rc==SQLITE_CORRUPT ){
                     60:       kill(parent, SIGKILL);
                     61:     }
                     62:   }
                     63:   printf("pid %d: cnt=%d\n", getpid(), cnt);
                     64: }
                     65: 
                     66: 
                     67: int main(int argc, char **argv){
                     68:   int i;
                     69:   sqlite *db;
                     70:   char *zErr;
                     71:   int status;
                     72:   int parent = getpid();
                     73: 
                     74:   unlink("test.db");
                     75:   unlink("test.db-journal");
                     76:   db = sqlite_open("test.db", 0, &zErr);
                     77:   if( db==0 ){
                     78:     printf("Cannot initialize: %s\n", zErr);
                     79:     return 1;
                     80:   }
                     81:   sqlite_exec(db, "CREATE TABLE t1(a,b)", 0, 0, 0);
                     82:   sqlite_close(db);
                     83:   for(i=0; i<10000; i++){
                     84:     int pid = fork();
                     85:     if( pid==0 ){
                     86:       sched_yield();
                     87:       do_some_sql(parent);
                     88:       return 0;
                     89:     }
                     90:     printf("test %d, pid=%d\n", i, pid);
                     91:     usleep(rand()%10000 + 1000);
                     92:     kill(pid, SIGKILL);
                     93:     waitpid(pid, &status, 0);
                     94:   }
                     95:   return 0;
                     96: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>