growtdb-bench.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "tdb2.h"
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <unistd.h>
  6. #include <err.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <fcntl.h>
  10. static void logfn(struct tdb_context *tdb,
  11. enum tdb_log_level level,
  12. enum TDB_ERROR ecode,
  13. const char *message,
  14. void *data)
  15. {
  16. fprintf(stderr, "tdb:%s:%s:%s\n",
  17. tdb_name(tdb), tdb_errorstr(ecode), message);
  18. }
  19. int main(int argc, char *argv[])
  20. {
  21. unsigned int i, j, users, groups;
  22. TDB_DATA idxkey, idxdata;
  23. TDB_DATA k, d, gk;
  24. char cmd[100];
  25. struct tdb_context *tdb;
  26. enum TDB_ERROR ecode;
  27. union tdb_attribute log;
  28. if (argc != 3) {
  29. printf("Usage: growtdb-bench <users> <groups>\n");
  30. exit(1);
  31. }
  32. users = atoi(argv[1]);
  33. groups = atoi(argv[2]);
  34. sprintf(cmd, "cat /proc/%i/statm", getpid());
  35. log.base.attr = TDB_ATTRIBUTE_LOG;
  36. log.base.next = NULL;
  37. log.log.fn = logfn;
  38. tdb = tdb_open("/tmp/growtdb.tdb", TDB_DEFAULT,
  39. O_RDWR|O_CREAT|O_TRUNC, 0600, &log);
  40. idxkey.dptr = (unsigned char *)"User index";
  41. idxkey.dsize = strlen("User index");
  42. idxdata.dsize = 51;
  43. idxdata.dptr = calloc(idxdata.dsize, 1);
  44. /* Create users. */
  45. k.dsize = 48;
  46. k.dptr = calloc(k.dsize, 1);
  47. d.dsize = 64;
  48. d.dptr = calloc(d.dsize, 1);
  49. tdb_transaction_start(tdb);
  50. for (i = 0; i < users; i++) {
  51. memcpy(k.dptr, &i, sizeof(i));
  52. ecode = tdb_store(tdb, k, d, TDB_INSERT);
  53. if (ecode != TDB_SUCCESS)
  54. errx(1, "tdb insert failed: %s", tdb_errorstr(ecode));
  55. /* This simulates a growing index record. */
  56. ecode = tdb_append(tdb, idxkey, idxdata);
  57. if (ecode != TDB_SUCCESS)
  58. errx(1, "tdb append failed: %s", tdb_errorstr(ecode));
  59. }
  60. if ((ecode = tdb_transaction_commit(tdb)) != 0)
  61. errx(1, "tdb commit1 failed: %s", tdb_errorstr(ecode));
  62. if ((ecode = tdb_check(tdb, NULL, NULL)) != 0)
  63. errx(1, "tdb_check failed after initial insert!");
  64. system(cmd);
  65. /* Now put them all in groups: add 32 bytes to each record for
  66. * a group. */
  67. gk.dsize = 48;
  68. gk.dptr = calloc(k.dsize, 1);
  69. gk.dptr[gk.dsize-1] = 1;
  70. d.dsize = 32;
  71. for (i = 0; i < groups; i++) {
  72. tdb_transaction_start(tdb);
  73. /* Create the "group". */
  74. memcpy(gk.dptr, &i, sizeof(i));
  75. ecode = tdb_store(tdb, gk, d, TDB_INSERT);
  76. if (ecode != TDB_SUCCESS)
  77. errx(1, "tdb insert failed: %s", tdb_errorstr(ecode));
  78. /* Now populate it. */
  79. for (j = 0; j < users; j++) {
  80. /* Append to the user. */
  81. memcpy(k.dptr, &j, sizeof(j));
  82. if ((ecode = tdb_append(tdb, k, d)) != 0)
  83. errx(1, "tdb append failed: %s",
  84. tdb_errorstr(ecode));
  85. /* Append to the group. */
  86. if ((ecode = tdb_append(tdb, gk, d)) != 0)
  87. errx(1, "tdb append failed: %s",
  88. tdb_errorstr(ecode));
  89. }
  90. if ((ecode = tdb_transaction_commit(tdb)) != 0)
  91. errx(1, "tdb commit2 failed: %s", tdb_errorstr(ecode));
  92. if ((ecode = tdb_check(tdb, NULL, NULL)) != 0)
  93. errx(1, "tdb_check failed after iteration %i!", i);
  94. system(cmd);
  95. }
  96. return 0;
  97. }