2008-11-13 01:03:11 +00:00
|
|
|
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
|
|
|
|
// vim: ts=8 sw=2 smarttab
|
|
|
|
/*
|
|
|
|
* Ceph - scalable distributed file system
|
|
|
|
*
|
|
|
|
* Copyright (C) 2004-2006 Sage Weil <sage@newdream.net>
|
|
|
|
*
|
|
|
|
* This is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License version 2.1, as published by the Free Software
|
|
|
|
* Foundation. See file COPYING.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <iostream>
|
|
|
|
#include <string>
|
|
|
|
using namespace std;
|
|
|
|
|
2011-02-22 16:38:45 +00:00
|
|
|
#include "common/config.h"
|
2008-11-13 01:03:11 +00:00
|
|
|
|
|
|
|
#include "mon/MonMap.h"
|
|
|
|
#include "mon/MonClient.h"
|
|
|
|
#include "msg/SimpleMessenger.h"
|
|
|
|
#include "messages/MPing.h"
|
|
|
|
|
|
|
|
#include "common/Timer.h"
|
2009-02-09 23:46:02 +00:00
|
|
|
#include "common/common_init.h"
|
2011-02-20 17:18:03 +00:00
|
|
|
#include "common/ceph_argparse.h"
|
2008-11-13 01:03:11 +00:00
|
|
|
|
|
|
|
#ifndef DARWIN
|
|
|
|
#include <envz.h>
|
|
|
|
#endif // DARWIN
|
|
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/stat.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
|
|
|
|
|
|
|
Messenger *messenger = 0;
|
|
|
|
|
|
|
|
Mutex lock("mylock");
|
|
|
|
Cond cond;
|
|
|
|
|
2010-05-07 21:33:42 +00:00
|
|
|
uint64_t received = 0;
|
2008-11-13 01:03:11 +00:00
|
|
|
|
|
|
|
class Admin : public Dispatcher {
|
2011-06-09 23:08:14 +00:00
|
|
|
public:
|
|
|
|
Admin()
|
|
|
|
: Dispatcher(&g_ceph_context)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
private:
|
2009-08-31 21:12:58 +00:00
|
|
|
bool ms_dispatch(Message *m) {
|
2008-11-13 01:03:11 +00:00
|
|
|
|
|
|
|
//cerr << "got ping from " << m->get_source() << std::endl;
|
|
|
|
dout(0) << "got ping from " << m->get_source() << dendl;
|
|
|
|
lock.Lock();
|
|
|
|
++received;
|
|
|
|
cond.Signal();
|
|
|
|
lock.Unlock();
|
|
|
|
|
2010-03-30 19:37:01 +00:00
|
|
|
m->put();
|
2008-12-04 21:31:00 +00:00
|
|
|
return true;
|
2008-11-13 01:03:11 +00:00
|
|
|
}
|
|
|
|
|
2009-10-13 18:21:31 +00:00
|
|
|
bool ms_handle_reset(Connection *con) { return false; }
|
|
|
|
void ms_handle_remote_reset(Connection *con) {}
|
2008-11-13 01:03:11 +00:00
|
|
|
|
|
|
|
} dispatcher;
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, const char **argv, const char *envp[]) {
|
|
|
|
|
|
|
|
vector<const char*> args;
|
|
|
|
argv_to_vec(argc, argv, args);
|
|
|
|
env_to_vec(args);
|
2010-07-01 16:25:43 +00:00
|
|
|
|
2011-03-14 14:24:32 +00:00
|
|
|
common_init(args, CEPH_ENTITY_TYPE_CLIENT, CODE_ENVIRONMENT_UTILITY, 0);
|
2011-05-23 17:11:15 +00:00
|
|
|
common_init_finish(&g_ceph_context);
|
2008-11-13 01:03:11 +00:00
|
|
|
|
|
|
|
vec_to_argv(args, argc, argv);
|
|
|
|
|
2010-06-08 22:17:08 +00:00
|
|
|
dout(0) << "i am mon " << args[0] << dendl;
|
2008-11-13 01:03:11 +00:00
|
|
|
|
|
|
|
// get monmap
|
2011-06-04 00:13:47 +00:00
|
|
|
MonClient mc(&g_ceph_context);
|
2009-06-26 20:49:12 +00:00
|
|
|
if (mc.build_initial_monmap() < 0)
|
2008-11-13 01:03:11 +00:00
|
|
|
return -1;
|
|
|
|
|
|
|
|
// start up network
|
2010-06-08 22:17:08 +00:00
|
|
|
int whoami = mc.monmap.get_rank(args[0]);
|
|
|
|
assert(whoami >= 0);
|
2011-06-07 17:38:54 +00:00
|
|
|
g_conf->public_addr = mc.monmap.get_addr(whoami);
|
2011-06-09 23:08:14 +00:00
|
|
|
SimpleMessenger *rank = new SimpleMessenger(&g_ceph_context);
|
2011-03-17 19:06:26 +00:00
|
|
|
int err = rank->bind(getpid());
|
2008-11-13 01:03:11 +00:00
|
|
|
if (err < 0)
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
// start monitor
|
2010-01-06 22:13:05 +00:00
|
|
|
rank->register_entity(entity_name_t::MON(whoami));
|
|
|
|
messenger = rank;
|
2008-11-13 01:03:11 +00:00
|
|
|
messenger->set_default_send_priority(CEPH_MSG_PRIO_HIGH);
|
2009-09-15 22:02:17 +00:00
|
|
|
messenger->add_dispatcher_head(&dispatcher);
|
2008-11-13 01:03:11 +00:00
|
|
|
|
2011-04-29 18:29:42 +00:00
|
|
|
rank->start();
|
2008-11-13 01:03:11 +00:00
|
|
|
|
|
|
|
int isend = 0;
|
|
|
|
if (whoami == 0)
|
|
|
|
isend = 100;
|
|
|
|
|
|
|
|
lock.Lock();
|
2010-05-07 21:33:42 +00:00
|
|
|
uint64_t sent = 0;
|
2008-11-13 01:03:11 +00:00
|
|
|
while (1) {
|
|
|
|
while (received + isend <= sent) {
|
|
|
|
//cerr << "wait r " << received << " s " << sent << " is " << isend << std::endl;
|
|
|
|
dout(0) << "wait r " << received << " s " << sent << " is " << isend << dendl;
|
|
|
|
cond.Wait(lock);
|
|
|
|
}
|
|
|
|
|
2009-06-26 20:49:12 +00:00
|
|
|
int t = rand() % mc.get_num_mon();
|
2008-11-13 01:03:11 +00:00
|
|
|
if (t == whoami)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (rand() % 10 == 0) {
|
|
|
|
//cerr << "mark_down " << t << std::endl;
|
|
|
|
dout(0) << "mark_down " << t << dendl;
|
2009-06-26 20:49:12 +00:00
|
|
|
messenger->mark_down(mc.get_mon_addr(t));
|
2008-11-13 01:03:11 +00:00
|
|
|
}
|
|
|
|
//cerr << "pinging " << t << std::endl;
|
|
|
|
dout(0) << "pinging " << t << dendl;
|
2009-06-26 20:49:12 +00:00
|
|
|
messenger->send_message(new MPing, mc.get_mon_inst(t));
|
2008-11-13 01:03:11 +00:00
|
|
|
cerr << isend << "\t" << ++sent << "\t" << received << "\r";
|
|
|
|
}
|
|
|
|
lock.Unlock();
|
|
|
|
|
|
|
|
// wait for messenger to finish
|
2010-01-05 20:02:59 +00:00
|
|
|
rank->wait();
|
2008-11-13 01:03:11 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|