- how to get usage feedback to monitor?
+- fix tare weirdness
+
+
osd/rados
- clean up writeahead logs
- fix heartbeat wrt new replication
}
}
+ struct timeval& timeval() { return tv; }
+ friend class Clock;
+
public:
// cons
utime_t() { tv.tv_sec = 0; tv.tv_usec = 0; normalize(); }
time_t& sec_ref() { return tv.tv_sec; }
long& usec_ref() { return tv.tv_usec; }
- struct timeval& timeval() { return tv; }
-
// cast to double
operator double() {
return (double)sec() + ((double)usec() / 1000000.0L);
public:
Clock() {
// set offset
- //start_offset = now();
}
- // relative time (from startup)
- const utime_t& now() {
- gettimeofday(&last.timeval(), NULL);
- last -= zero;
- //last = abs_last - start_offset;
- return last;
- }
-
- void realify(utime_t& t) {
- t += zero;
- }
+ // real time.
utime_t real_now() {
utime_t realnow;
gettimeofday(&realnow.timeval(), NULL);
return realnow;
}
- const utime_t& recent_now() {
+ // relative time (from startup)
+ void tare() {
+ gettimeofday(&zero.timeval(), NULL);
+ }
+ utime_t now() {
+ utime_t n;
+ gettimeofday(&n.timeval(), NULL);
+ n -= zero;
+ last = n;
+ return n;
+ }
+ utime_t recent_now() {
return last;
}
- void tare() {
- gettimeofday(&zero.timeval(), NULL);
+ void realify(utime_t& t) {
+ t += zero;
+ }
+
+ void make_timespec(utime_t& t, struct timespec *ts) {
+ utime_t real = t;
+ realify(real);
+
+ memset(ts, 0, sizeof(*ts));
+ ts->tv_sec = real.sec();
+ ts->tv_nsec = real.nsec();
}
+
+
// absolute time
time_t gettime() {
- now();
- return last.sec();
+ return now().sec();
}
};
return r;
}
- int WaitUntil(Mutex &mutex,
- struct timeval *tv) {
- return WaitUntil(mutex, utime_t(tv->tv_sec, tv->tv_usec));
- }
-
int WaitUntil(Mutex &mutex, utime_t when) {
- // make sure it's _real_ time
- g_clock.realify(when);
-
- // timeval -> timespec
struct timespec ts;
- memset(&ts, 0, sizeof(ts));
- ts.tv_sec = when.sec();
- ts.tv_nsec = when.nsec();
+ g_clock.make_timespec(when, &ts);
//cout << "timedwait for " << ts.tv_sec << " sec " << ts.tv_nsec << " nsec" << endl;
int r = pthread_cond_timedwait(&C, &mutex.M, &ts);
return r;
//cout << "opening log file " << filename << endl;
}
- utime_t fromstart = g_clock.recent_now();
- if (fromstart < start)
+ utime_t fromstart = g_clock.now();
+ if (fromstart < start) {
+ cerr << "logger time jumped backwards from " << start << " to " << fromstart << endl;
start = fromstart;
+ }
fromstart -= start;
while (force ||
assert(nargs.empty());
+ g_clock.tare();
+
MDCluster *mdc = new MDCluster(NUMMDS, NUMOSD);
};
-#include "msg/new_mpistarter.cc"
+/*
+ * start up NewMessenger via MPI.
+ */
+#include <mpi.h>
+
+pair<int,int> mpi_bootstrap_new(int& argc, char**& argv)
+{
+ MPI_Init(&argc, &argv);
+
+ int mpi_world;
+ int mpi_rank;
+ MPI_Comm_size(MPI_COMM_WORLD, &mpi_world);
+ MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
+
+ tcpaddr_t nsaddr;
+ memset(&nsaddr, 0, sizeof(nsaddr));
+
+ if (mpi_rank == 0) {
+ // i am root.
+ dout(-10) << "I am root" << endl;
+ rank.my_rank = 0;
+ rank.start_rank(nsaddr);
+ nsaddr = rank.get_listen_addr();
+ }
+
+ int r = MPI_Bcast(&nsaddr, sizeof(nsaddr), MPI_CHAR,
+ 0, MPI_COMM_WORLD);
+
+ dout(-30) << "r = " << r << " ns tcpaddr is " << nsaddr << endl;
+
+ if (mpi_rank != 0) {
+ rank.start_rank(nsaddr);
+ }
+
+ MPI_Barrier(MPI_COMM_WORLD);
+
+ dout(-10) << "tare" << endl;
+ g_clock.tare();
+
+ MPI_Finalize();
+
+ return pair<int,int>(mpi_rank, mpi_world);
+}
utime_t tick_start;
int tick_count = 0;
#include "messages/MOSDPGRemove.h"
#undef dout
-#define dout(l) if (l<=g_conf.debug || l<=g_conf.debug_osd) cout << "osd" << osd->whoami << " " << (osd->osdmap ? osd->osdmap->get_epoch():0) << " " << *this << " "
+#define dout(l) if (l<=g_conf.debug || l<=g_conf.debug_osd) cout << g_clock.now() << " osd" << osd->whoami << " " << (osd->osdmap ? osd->osdmap->get_epoch():0) << " " << *this << " "
/******* PGLog ********/