Back to home page

Enduro/X

 
 

    


0001 /* test_nstd_msync.c - parallel writes & locking test */
0002 /*
0003  * Copyright 2011-2017 Howard Chu, Symas Corp.
0004  * All rights reserved.
0005  *
0006  * Redistribution and use in source and binary forms, with or without
0007  * modification, are permitted only as authorized by the OpenLDAP
0008  * Public License.
0009  *
0010  * A copy of this license is available in the file LICENSE in the
0011  * top-level directory of the distribution or, alternatively, at
0012  * <http://www.OpenLDAP.org/license.html>.
0013  */
0014 
0015 /* Just like mtest.c, but using a subDB instead of the main DB */
0016 
0017 #include <stdio.h>
0018 #include <stdlib.h>
0019 #include <time.h>
0020 #include <unistd.h>
0021 
0022 #include "exdb.h"
0023 
0024 #define E(expr) CHECK((rc = (expr)) == EDB_SUCCESS, #expr)
0025 #define RES(err, expr) ((rc = expr) == (err) || (CHECK(!rc, #expr), 0))
0026 #define CHECK(test, msg) ((test) ? (void)0 : ((void)fprintf(stderr, \
0027     "%s:%d: %s: %s\n", __FILE__, __LINE__, msg, edb_strerror(rc)), abort()))
0028 
0029 int main(int argc, char **argv)
0030 {
0031     int i = 0, j = 0, rc;
0032     EDB_env *env;
0033     EDB_dbi dbi;
0034     EDB_val key, data;
0035     EDB_txn *txn;
0036     EDB_stat mst;
0037     EDB_cursor *cursor;
0038     int count;
0039     int *values;
0040     char sval[32] = "";
0041     int sleeps;
0042 
0043     if (argc < 2)
0044     {
0045         fprintf(stderr, "usage: %s <sync_seconds_sleeps> [R]\n where R - start with RO tran\n", argv[0]);
0046         exit(1);
0047     }
0048     sleeps = atoi(argv[1]);
0049 
0050     srand(time(NULL));
0051 
0052     count = (rand()%384) + 64;
0053     values = (int *)malloc(count*sizeof(int));
0054 
0055     for(i = 0;i<count;i++) {
0056         values[i] = rand()%1024;
0057     }
0058 
0059     E(edb_env_create(&env));
0060     E(edb_env_set_maxreaders(env, 2));
0061     E(edb_env_set_mapsize(env, 10485760));
0062     E(edb_env_set_maxdbs(env, 4));
0063     E(edb_env_open(env, "./testdb", 0, 0664));
0064 
0065     if (2==argc)
0066     {
0067     fprintf(stderr, "About to begin RW....\n");
0068     E(edb_txn_begin(env, NULL, 0, &txn));
0069     fprintf(stderr, "After begin RW....\n");
0070     E(edb_dbi_open(txn, "id1", EDB_CREATE, &dbi));
0071     }
0072     else
0073     {
0074     fprintf(stderr, "About to begin RO (env)....\n");
0075     E(edb_txn_begin(env, NULL, EDB_RDONLY, &txn));
0076     fprintf(stderr, "After begin RO (env)....\n");
0077     E(edb_dbi_open(txn, "id1", 0, &dbi));
0078     }
0079 
0080     fprintf(stderr, "About to commit (env)....\n");
0081     E(edb_txn_commit(txn));
0082     fprintf(stderr, "About commit (env)....\n");
0083     
0084    
0085     key.mv_size = sizeof(int);
0086     key.mv_data = sval;
0087 
0088     /* if argc > 2 then skip the first phase, and run directly to 
0089      * to read only tran
0090      */
0091     if (2==argc)
0092     {
0093     fprintf(stderr, "About to begin RW....\n");
0094     E(edb_txn_begin(env, NULL, 0, &txn));
0095     fprintf(stderr, "After begin RW....\n");
0096     fprintf(stderr, "Adding %d values -> about to sleep (2) %d sec\n", count, sleeps);
0097     sleep(atoi(argv[1]));
0098 
0099     fprintf(stderr, "COUNT=%d, After sleep (1) %d sec\n", count, sleeps);
0100     for (i=0;i<count;i++) { 
0101         sprintf(sval, "%03x %d foo bar %d", values[i], values[i], sleeps);
0102         data.mv_size = sizeof(sval);
0103         data.mv_data = sval;
0104         if (RES(EDB_KEYEXIST, edb_put(txn, dbi, &key, &data, EDB_NOOVERWRITE)))
0105             j++;
0106     }
0107 
0108     if (j) fprintf(stderr, "%d duplicates skipped\n", j);
0109     
0110     fprintf(stderr, "About to begin RW COMMIT....\n");
0111     E(edb_txn_commit(txn));
0112     fprintf(stderr, "After RW COMMIT....\n");
0113     }
0114 
0115     E(edb_env_stat(env, &mst));
0116 
0117     
0118     fprintf(stderr, "About to begin RO TRAN....\n");
0119     E(edb_txn_begin(env, NULL, EDB_RDONLY, &txn));
0120     fprintf(stderr, "After RO TRAN....\n");
0121 
0122     E(edb_cursor_open(txn, dbi, &cursor));
0123     while ((rc = edb_cursor_get(cursor, &key, &data, EDB_NEXT)) == 0) {
0124         fprintf(stderr, "key: %p %.*s, data: %p %.*s\n",
0125             key.mv_data,  (int) key.mv_size,  (char *) key.mv_data,
0126             data.mv_data, (int) data.mv_size, (char *) data.mv_data);
0127     }
0128     CHECK(rc == EDB_NOTFOUND, "edb_cursor_get");
0129     edb_cursor_close(cursor);
0130     edb_txn_abort(txn);
0131 
0132     j=0;
0133     key.mv_data = sval;
0134     for (i= count - 1; i > -1; i-= (rand()%5)) {
0135         j++;
0136         txn=NULL;
0137 
0138         fprintf(stderr, "About to begin RW TRAN....\n");
0139         E(edb_txn_begin(env, NULL, 0, &txn));
0140         fprintf(stderr, "After begin RW TRAN....\n");
0141 
0142         sprintf(sval, "%03x ", values[i]);
0143         if (RES(EDB_NOTFOUND, edb_del(txn, dbi, &key, NULL))) {
0144             j--;
0145             fprintf(stderr, "About to ABORT RW TRAN....\n");
0146             edb_txn_abort(txn);
0147             fprintf(stderr, "After ABORT RW TRAN....\n");
0148         } else {
0149             fprintf(stderr, "About to COMMIT RW TRAN....\n");
0150             E(edb_txn_commit(txn));
0151             fprintf(stderr, "After COMMIT RW TRAN....\n");
0152         }
0153     }
0154     free(values);
0155     fprintf(stderr, "Deleted %d values\n", j);
0156 
0157     E(edb_env_stat(env, &mst));
0158     E(edb_txn_begin(env, NULL, EDB_RDONLY, &txn));
0159     E(edb_cursor_open(txn, dbi, &cursor));
0160     fprintf(stderr, "Cursor next\n");
0161     while ((rc = edb_cursor_get(cursor, &key, &data, EDB_NEXT)) == 0) {
0162         fprintf(stderr, "key: %.*s, data: %.*s\n",
0163             (int) key.mv_size,  (char *) key.mv_data,
0164             (int) data.mv_size, (char *) data.mv_data);
0165     }
0166     CHECK(rc == EDB_NOTFOUND, "edb_cursor_get");
0167     fprintf(stderr, "Cursor prev\n");
0168     while ((rc = edb_cursor_get(cursor, &key, &data, EDB_PREV)) == 0) {
0169         fprintf(stderr, "key: %.*s, data: %.*s\n",
0170             (int) key.mv_size,  (char *) key.mv_data,
0171             (int) data.mv_size, (char *) data.mv_data);
0172     }
0173     CHECK(rc == EDB_NOTFOUND, "edb_cursor_get");
0174     edb_cursor_close(cursor);
0175     edb_txn_abort(txn);
0176 
0177     edb_dbi_close(env, dbi);
0178     edb_env_close(env);
0179     return 0;
0180 }
0181