root/source4/torture/local/dbspeed.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. tdb_add_record
  2. test_tdb_speed
  3. ldb_add_record
  4. test_ldb_speed
  5. torture_local_dbspeed

   1 /* 
   2    Unix SMB/CIFS implementation.
   3 
   4    local test for tdb/ldb speed
   5 
   6    Copyright (C) Andrew Tridgell 2004
   7    
   8    This program is free software; you can redistribute it and/or modify
   9    it under the terms of the GNU General Public License as published by
  10    the Free Software Foundation; either version 3 of the License, or
  11    (at your option) any later version.
  12    
  13    This program is distributed in the hope that it will be useful,
  14    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16    GNU General Public License for more details.
  17    
  18    You should have received a copy of the GNU General Public License
  19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
  20 */
  21 
  22 #include "includes.h"
  23 #include "system/filesys.h"
  24 #include "../tdb/include/tdb.h"
  25 #include "lib/ldb/include/ldb.h"
  26 #include "lib/ldb/include/ldb_errors.h"
  27 #include "lib/ldb_wrap.h"
  28 #include "lib/tdb_wrap.h"
  29 #include "torture/smbtorture.h"
  30 #include "param/param.h"
  31 
  32 float tdb_speed;
  33 
  34 static bool tdb_add_record(struct tdb_wrap *tdbw, const char *fmt1, 
     /* [<][>][^][v][top][bottom][index][help] */
  35                            const char *fmt2, int i)
  36 {
  37         TDB_DATA key, data;
  38         int ret;
  39         key.dptr = (uint8_t *)talloc_asprintf(tdbw, fmt1, i);
  40         key.dsize = strlen((char *)key.dptr)+1;
  41         data.dptr = (uint8_t *)talloc_asprintf(tdbw, fmt2, i+10000);
  42         data.dsize = strlen((char *)data.dptr)+1;
  43 
  44         ret = tdb_store(tdbw->tdb, key, data, TDB_INSERT);
  45 
  46         talloc_free(key.dptr);
  47         talloc_free(data.dptr);
  48         return ret == 0;
  49 }
  50 
  51 /*
  52   test tdb speed
  53 */
  54 static bool test_tdb_speed(struct torture_context *torture, const void *_data)
     /* [<][>][^][v][top][bottom][index][help] */
  55 {
  56         struct timeval tv;
  57         struct tdb_wrap *tdbw;
  58         int timelimit = torture_setting_int(torture, "timelimit", 10);
  59         int i, count;
  60         TALLOC_CTX *tmp_ctx = talloc_new(torture);
  61 
  62         unlink("test.tdb");
  63 
  64         torture_comment(torture, "Testing tdb speed for sidmap\n");
  65 
  66         tdbw = tdb_wrap_open(tmp_ctx, "test.tdb", 
  67                              10000, 0, O_RDWR|O_CREAT|O_TRUNC, 0600);
  68         if (!tdbw) {
  69                 unlink("test.tdb");
  70                 talloc_free(tmp_ctx);
  71                 torture_fail(torture, "Failed to open test.tdb");
  72         }
  73 
  74         torture_comment(torture, "Adding %d SID records\n", torture_entries);
  75 
  76         for (i=0;i<torture_entries;i++) {
  77                 if (!tdb_add_record(tdbw, 
  78                                     "S-1-5-21-53173311-3623041448-2049097239-%u",
  79                                     "UID %u", i)) {
  80                         torture_result(torture, TORTURE_FAIL, "Failed to add SID %d\n", i);
  81                         goto failed;
  82                 }
  83                 if (!tdb_add_record(tdbw, 
  84                                     "UID %u",
  85                                     "S-1-5-21-53173311-3623041448-2049097239-%u", i)) {
  86                         torture_result(torture, TORTURE_FAIL, "Failed to add UID %d\n", i);
  87                         goto failed;
  88                 }
  89         }
  90 
  91         torture_comment(torture, "Testing for %d seconds\n", timelimit);
  92 
  93         tv = timeval_current();
  94 
  95         for (count=0;timeval_elapsed(&tv) < timelimit;count++) {
  96                 TDB_DATA key, data;
  97                 i = random() % torture_entries;
  98                 key.dptr = (uint8_t *)talloc_asprintf(tmp_ctx, "S-1-5-21-53173311-3623041448-2049097239-%u", i);
  99                 key.dsize = strlen((char *)key.dptr)+1;
 100                 data = tdb_fetch(tdbw->tdb, key);
 101                 talloc_free(key.dptr);
 102                 if (data.dptr == NULL) {
 103                         torture_result(torture, TORTURE_FAIL, "Failed to fetch SID %d\n", i);
 104                         goto failed;
 105                 }
 106                 free(data.dptr);
 107                 key.dptr = (uint8_t *)talloc_asprintf(tmp_ctx, "UID %u", i);
 108                 key.dsize = strlen((char *)key.dptr)+1;
 109                 data = tdb_fetch(tdbw->tdb, key);
 110                 talloc_free(key.dptr);
 111                 if (data.dptr == NULL) {
 112                         torture_result(torture, TORTURE_FAIL, "Failed to fetch UID %d\n", i);
 113                         goto failed;
 114                 }
 115                 free(data.dptr);
 116         }
 117 
 118         tdb_speed = count/timeval_elapsed(&tv);
 119         torture_comment(torture, "tdb speed %.2f ops/sec\n", tdb_speed);
 120         
 121 
 122         unlink("test.tdb");
 123         talloc_free(tmp_ctx);
 124         return true;
 125 
 126 failed:
 127         unlink("test.tdb");
 128         talloc_free(tmp_ctx);
 129         return false;
 130 }
 131 
 132 
 133 static bool ldb_add_record(struct ldb_context *ldb, unsigned rid)
     /* [<][>][^][v][top][bottom][index][help] */
 134 {
 135         struct ldb_message *msg;        
 136         int ret;
 137 
 138         msg = ldb_msg_new(ldb);
 139         if (msg == NULL) {
 140                 return false;
 141         }
 142 
 143         msg->dn = ldb_dn_new_fmt(msg, ldb, "SID=S-1-5-21-53173311-3623041448-2049097239-%u", rid);
 144         if (msg->dn == NULL) {
 145                 return false;
 146         }
 147 
 148         if (ldb_msg_add_fmt(msg, "UID", "%u", rid) != 0) {
 149                 return false;
 150         }
 151 
 152         ret = ldb_add(ldb, msg);
 153 
 154         talloc_free(msg);
 155 
 156         return ret == LDB_SUCCESS;
 157 }
 158 
 159 
 160 /*
 161   test ldb speed
 162 */
 163 static bool test_ldb_speed(struct torture_context *torture, const void *_data)
     /* [<][>][^][v][top][bottom][index][help] */
 164 {
 165         struct timeval tv;
 166         struct ldb_context *ldb;
 167         int timelimit = torture_setting_int(torture, "timelimit", 10);
 168         int i, count;
 169         TALLOC_CTX *tmp_ctx = talloc_new(torture);
 170         struct ldb_ldif *ldif;
 171         const char *init_ldif = "dn: @INDEXLIST\n" \
 172                 "@IDXATTR: UID\n";
 173         float ldb_speed;
 174 
 175         unlink("./test.ldb");
 176 
 177         torture_comment(torture, "Testing ldb speed for sidmap\n");
 178 
 179         ldb = ldb_wrap_connect(tmp_ctx, torture->ev, torture->lp_ctx, "tdb://test.ldb", 
 180                                 NULL, NULL, LDB_FLG_NOSYNC, NULL);
 181         if (!ldb) {
 182                 unlink("./test.ldb");
 183                 talloc_free(tmp_ctx);
 184                 torture_fail(torture, "Failed to open test.ldb");
 185         }
 186 
 187         /* add an index */
 188         ldif = ldb_ldif_read_string(ldb, &init_ldif);
 189         if (ldif == NULL) goto failed;
 190         if (ldb_add(ldb, ldif->msg) != LDB_SUCCESS) goto failed;
 191         talloc_free(ldif);
 192 
 193         torture_comment(torture, "Adding %d SID records\n", torture_entries);
 194 
 195         for (i=0;i<torture_entries;i++) {
 196                 if (!ldb_add_record(ldb, i)) {
 197                         torture_result(torture, TORTURE_FAIL, "Failed to add SID %d\n", i);
 198                         goto failed;
 199                 }
 200         }
 201 
 202         if (talloc_total_blocks(torture) > 100) {
 203                 torture_result(torture, TORTURE_FAIL, "memory leak in ldb add\n");
 204                 goto failed;
 205         }
 206 
 207         torture_comment(torture, "Testing for %d seconds\n", timelimit);
 208 
 209         tv = timeval_current();
 210 
 211         for (count=0;timeval_elapsed(&tv) < timelimit;count++) {
 212                 struct ldb_dn *dn;
 213                 struct ldb_result *res;
 214 
 215                 i = random() % torture_entries;
 216                 dn = ldb_dn_new_fmt(tmp_ctx, ldb, "SID=S-1-5-21-53173311-3623041448-2049097239-%u", i);
 217                 if (ldb_search(ldb, tmp_ctx, &res, dn, LDB_SCOPE_BASE, NULL, NULL) != LDB_SUCCESS || res->count != 1) {
 218                         torture_fail(torture, talloc_asprintf(torture, "Failed to find SID %d", i));
 219                 }
 220                 talloc_free(res);
 221                 talloc_free(dn);
 222                 if (ldb_search(ldb, tmp_ctx, &res, NULL, LDB_SCOPE_SUBTREE, NULL, "(UID=%u)", i) != LDB_SUCCESS || res->count != 1) {
 223                         torture_fail(torture, talloc_asprintf(torture, "Failed to find UID %d", i));
 224                 }
 225                 talloc_free(res);
 226         }
 227 
 228         if (talloc_total_blocks(torture) > 100) {
 229                 unlink("./test.ldb");
 230                 talloc_free(tmp_ctx);
 231                 torture_fail(torture, "memory leak in ldb search");
 232         }
 233 
 234         ldb_speed = count/timeval_elapsed(&tv);
 235         torture_comment(torture, "ldb speed %.2f ops/sec\n", ldb_speed);
 236 
 237         torture_comment(torture, "ldb/tdb speed ratio is %.2f%%\n", (100*ldb_speed/tdb_speed));
 238         
 239 
 240         unlink("./test.ldb");
 241         talloc_free(tmp_ctx);
 242         return true;
 243 
 244 failed:
 245         unlink("./test.ldb");
 246         talloc_free(tmp_ctx);
 247         return false;
 248 }
 249 
 250 struct torture_suite *torture_local_dbspeed(TALLOC_CTX *mem_ctx)
     /* [<][>][^][v][top][bottom][index][help] */
 251 {
 252         struct torture_suite *s = torture_suite_create(mem_ctx, "DBSPEED");
 253         torture_suite_add_simple_tcase_const(s, "tdb_speed", test_tdb_speed,
 254                         NULL);
 255         torture_suite_add_simple_tcase_const(s, "ldb_speed", test_ldb_speed,
 256                         NULL);
 257         return s;
 258 }

/* [<][>][^][v][top][bottom][index][help] */