adb_benchmark.c

来自「基于DHT的对等协议」· C语言 代码 · 共 195 行

C
195
字号
#include <async.h>#include <aios.h>#include <crypt.h>#include "location.h"#include "libadb.h"#include "misc_utils.h"#include "id_utils.h"str adbsock;ptr<adb> db (NULL);vec<ptr<location> > population;size_t count (1024);size_t remaining (count);size_t blocksize (8192);static const int max_out (128);static int ops_out (0);// copied from dhblock.Cbigintcompute_hash (const void *buf, size_t buflen){  char h[sha1::hashsize];  bzero(h, sha1::hashsize);  sha1_hash (h, buf, buflen);    bigint n;  mpz_set_rawmag_be(&n, h, sha1::hashsize);  // For big endian  return n;}chordIDmake_block (void *data, size_t datasize) {  char *rd = (char *)data;  for (unsigned int i = 0; i < datasize; i++)     rd[i] = random ();  rd[datasize - 1] = 0;  return compute_hash (rd, datasize);}voidbench_store_cb (u_int64_t start, adb_status stat){  static u_int32_t frac (count >> 6);  static u_int32_t progress (0);  remaining--;  ops_out--;  if (stat != ADB_OK)    warnx << "status = " << stat << "\n";  if (remaining == 0) {    u_int64_t finish = getusec ();    aout << "Finished " << count << " operations in "          << (finish-start)/1000 << "ms.\n";    exit (0);  } else if (frac && remaining % frac == 0) {    progress++;    warnx << progress << "/64\n";  }}voidbench_store (void){  vec<str> blocks;  vec<chordID> IDs;  aout << "Generating/hashing bulk data...";  aout->flush ();  srandom (0); // XXX allow seed on command line  char *buf = New char[blocksize];  for (size_t i = 0; i < count; i++) {    chordID k = make_block (buf, blocksize);    IDs.push_back (k);    blocks.push_back (str (buf, blocksize));  }  delete[] buf;  aout << "done\n";  aout << "Sending " << count << " requests.\n";  aout->flush ();  u_int64_t start = getusec ();  remaining = count;  for (size_t i = 0; i < count; i++, ops_out++) {    db->store (IDs[i], blocks[i], 0, timenow + 10, wrap (&bench_store_cb, start));    while (ops_out > max_out)       acheck ();  }}voidbench_getkeys_cb (u_int64_t start, adb_status stat, u_int32_t id, vec<adb_keyaux_t> keys){  if (stat != ADB_COMPLETE && stat != ADB_OK) {    fatal << "Unexpected getkeys status: " << stat << "\n";  }  remaining += keys.size ();  if (stat != ADB_COMPLETE) {    db->getkeys (id,		 wrap (&bench_getkeys_cb, start),		 /* ordered */ false,		 /* batchsize */ count);    warnx << ".\n";    return;  }  u_int64_t finish = getusec ();  aout << "Got " << remaining << " keys in "        << (finish-start)/1000 << "ms.\n";  exit (0);}voidbench_getkeys (void){  remaining = 0;  db->getkeys (0, wrap (&bench_getkeys_cb, getusec ()), false, count);}voidbench_expire_cb (u_int64_t start, adb_status stat){  u_int64_t finish = getusec ();  if (stat)    warnx << "Expiration error: " << stat << "\n";  aout << "Expiration in "       << (finish-start)/1000 << "ms.\n";  exit (0);}voidbench_expire (void){  db->expire (wrap (&bench_expire_cb, getusec (true)));}voidusage (){  warnx << "Usage: " << progname << " dbsock store|getkeys|expire [size=N] [count=N]\n";  exit (1);}boolparse_argv (const vec<str> &argv){  for (size_t i = 0; i < argv.size (); i++) {    char *eoff = strchr (argv[i].cstr (), '=');    if (!eoff)      return false;    str name = substr (argv[i], 0, eoff - argv[i].cstr ());    str val  = str (eoff + 1);    if (name == "count") {      count = atoi (val.cstr ());    }    else if (name == "size") {      blocksize = atoi (val.cstr ());      if (blocksize < 0)	return false;    }  }  return true;}int main (int argc, char *argv[]){  setprogname (argv[0]);    if (argc < 3)    usage ();  adbsock = argv[1];  str mode (argv[2]);  vec<str> sargv;  for (int i = 3; i < argc; i++)    sargv.push_back (str (argv[i]));  if (!parse_argv (sargv))    usage ();  if (mode == "store") {    delaycb (1, wrap (&bench_store));  } else if (mode == "getkeys") {    delaycb (1, wrap (&bench_getkeys));  } else if (mode == "expire") {    delaycb (0, wrap (&bench_expire));  } else {    usage ();  }  db = New refcounted<adb> (adbsock, "test", false);  amain ();}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?