예제 #1
0
파일: filestore.C 프로젝트: Amit-DU/dht
int main(int argc, char *argv[]) {
  if(argc != 5)
    fatal("Usage: filestore sockname -[fls] filename_or_hash"
	  " num_RPCs_in_flight\n");

  dhash = New dhashclient(argv[1]);
  chordID ID;
  char *cmd = argv[2];
  char *name = argv[3];
  maxinflight = atoi(argv[4]);

  if(!strcmp(cmd, "-s")) {
    // store
    store(name);

  } else if(!strcmp(cmd, "-l")) {
    // list
    str2chordID(name, ID);
    dhash->retrieve(ID, wrap(&list_cb));

  } else if(!strcmp(cmd, "-f")) {
    // retrieve
    str2chordID(name, ID);
    dhash->retrieve(ID, wrap(&gotinode_cb));
    warnx << "retrieve " << ID << "\n";

  } else {
    fatal("Usage: filestore sockname -[fls] filename_or_hash"
	  " num_RPCs_in_flight\n");
  }

  amain();
  return 0;
}
예제 #2
0
int main (int argc, char **argv) {

  uint num_keys = 150;
  if (argc > 1) {
    num_keys = atoi (argv[1]);
  }

  srandom (time (NULL));

  merkle_tree *tree = New merkle_tree_disk ("/tmp/index.mrk", 
					    "/tmp/internal.mrk",
					    "/tmp/leaf.mrk", true);

  // if a trace is provided, execute the trace
  if (argc > 2) {
    str filename = argv[2];
    str file = file2str (filename);
    rxx newline ("\\n");
    vec<str> lines;
    split (&lines, newline, file);
    
    for (uint i = 0; i < lines.size(); i++) {
      if (i > num_keys) {
	warn << "did enough keys!\n";
	exit(0);
      }
      static const rxx space_rx ("\\s+");
      vec<str> parts;
      split (&parts, space_rx, lines[i]);
      if (parts.size() != 2) {
	continue;
      }
      chordID c;
      str2chordID (parts[1], c);
      if (parts[0] == "I") {
	warn << i << ") going to insert " << c << "\n";
	tree->insert (c);
      } else {
	warn << i << ") going to remove " << c << "\n";
	tree->remove (c);
      }
      tree->check_invariants ();
    }
    exit(0);
  }


  //tree->dump ();

  // inserts

  chordID c;
  for (uint i = 0; i < num_keys; i++) {
    c = make_randomID ();
    warn << "inserting " << c << " (" << i << ")\n";
    tree->insert (c);
    tree->check_invariants();
  }

  // lookups

  merkle_node_disk *n = (merkle_node_disk *) tree->lookup (to_merkle_hash (c));

  warn << "found node " << n->count << ": \n";

  if (n->isleaf ()) {
    merkle_key *k = n->keylist.first ();
    while (k != NULL) {
      warn << "\t" << k->id << "\n";
      k = n->keylist.next (k);
    }
  }

  tree->lookup_release (n);

  assert (tree->key_exists (c));

  // remove

  tree->remove (c);

  assert (!tree->key_exists (c));

  //tree->dump ();

  chordID min = c;
  chordID max = ((chordID) 1) << 156;
  vec<chordID> keys = tree->get_keyrange (min, max, 65);
  for (uint i = 0; i < keys.size (); i++) {
    warn << "Found key " << keys[i] << " in range [" 
	 << min << "," << max << "]\n";
  }
  delete tree;
  tree = NULL;

  unlink("/tmp/index.mrk");
  unlink("/tmp/internal.mrk");
  unlink("/tmp/leaf.mrk");
}