From 85b4b559ac829ded1ffbd2aaddf74a118473aacb Mon Sep 17 00:00:00 2001 From: sageweil Date: Fri, 31 Aug 2007 17:08:13 +0000 Subject: [PATCH] object_rw fixed up git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@1758 29311d96-e01e-0410-9327-a35deaab8ce9 --- trunk/ceph/client/SyntheticClient.cc | 109 +++++++++++++++++++++------ trunk/ceph/client/SyntheticClient.h | 3 +- 2 files changed, 90 insertions(+), 22 deletions(-) diff --git a/trunk/ceph/client/SyntheticClient.cc b/trunk/ceph/client/SyntheticClient.cc index a45d3445409f4..8720f774fa1af 100644 --- a/trunk/ceph/client/SyntheticClient.cc +++ b/trunk/ceph/client/SyntheticClient.cc @@ -494,10 +494,13 @@ int SyntheticClient::run() int count = iargs.front(); iargs.pop_front(); int size = iargs.front(); iargs.pop_front(); int wrpc = iargs.front(); iargs.pop_front(); - int skew = iargs.front(); iargs.pop_front(); + int overlap = iargs.front(); iargs.pop_front(); + int rskew = iargs.front(); iargs.pop_front(); + int wskew = iargs.front(); iargs.pop_front(); if (run_me()) { - dout(2) << "objectrw " << cout << " " << size << " " << wrpc << " " << skew << dendl; - object_rw(count, size, wrpc, skew); + dout(2) << "objectrw " << cout << " " << size << " " << wrpc + << " " << overlap << " " << rskew << " " << wskew << dendl; + object_rw(count, size, wrpc, overlap, rskew, wskew); } } break; @@ -1609,11 +1612,23 @@ int SyntheticClient::create_objects(int nobj, int osize, int inflight) { // divy up int numc = g_conf.num_client ? g_conf.num_client : 1; - int start = nobj * client->get_nodeid() / numc; - int end = nobj * (client->get_nodeid()+1) / numc; + + int start, inc, end; + + if (0) { + // strided + start = nobj % numc; + inc = numc; + end = start + nobj; + } else { + // segments + start = nobj * client->get_nodeid() % numc; + inc = 1; + end = nobj * (client->get_nodeid()+1) / numc; + } dout(5) << "create_objects " << nobj << " size=" << osize - << " .. doing [" << start << "," << end << ")" + << " .. doing [" << start << "," << end << ") inc " << inc << dendl; bufferptr bp(osize); @@ -1627,28 +1642,41 @@ int SyntheticClient::create_objects(int nobj, int osize, int inflight) int unack = 0; int unsafe = 0; - for (int i=start; i starts; + + for (int i=start; iosdmap->make_object_layout(oid, pg_t::TYPE_REP, 2); + //oid = object_t(0x1000+i, i); // this magically fixes it.. so it's NOT the oid->pg translation + - lock.Lock(); - while (unack > inflight) { - dout(20) << "waiting for " << unack << " unack" << dendl; - cond.Wait(lock); - } - lock.Unlock(); if (i % inflight == 0) { dout(6) << "create_objects " << i << "/" << (nobj+1) << dendl; } dout(10) << "writing " << oid << dendl; + starts.push_back(g_clock.now()); client->client_lock.Lock(); client->objecter->write(oid, 0, osize, layout, bl, new C_Ref(lock, cond, &unack), new C_Ref(lock, cond, &unsafe)); client->client_lock.Unlock(); + + lock.Lock(); + while (unack > inflight) { + dout(20) << "waiting for " << unack << " unack" << dendl; + cond.Wait(lock); + } + lock.Unlock(); + + utime_t lat = g_clock.now(); + lat -= starts.front(); + starts.pop_front(); + if (client_logger) + client_logger->favg("owrlat", lat); } lock.Lock(); @@ -1667,10 +1695,15 @@ int SyntheticClient::create_objects(int nobj, int osize, int inflight) return 0; } -int SyntheticClient::object_rw(int nobj, int osize, int wrpc, double skew) +int SyntheticClient::object_rw(int nobj, int osize, int wrpc, + int overlappc, + double rskew, double wskew) { dout(5) << "object_rw " << nobj << " size=" << osize << " with " - << wrpc << "% writes, skew = " << skew + << wrpc << "% writes" + << ", " << overlappc << "% overlap" + << ", rskew = " << rskew + << ", wskew = " << wskew << dendl; bufferptr bp(osize); @@ -1678,6 +1711,23 @@ int SyntheticClient::object_rw(int nobj, int osize, int wrpc, double skew) bufferlist bl; bl.push_back(bp); + // start with odd number > nobj + rjhash h; + unsigned prime = nobj + 1; // this is the minimum! + prime += h(nobj) % (3*nobj); // bump it up some + prime |= 1; // make it odd + + while (true) { + unsigned j; + for (j=2; j*j<=prime; j++) + if (prime % j == 0) break; + if (j*j > prime) { + break; + //cout << "prime " << prime << endl; + } + prime += 2; + } + Mutex lock; Cond cond; @@ -1690,16 +1740,24 @@ int SyntheticClient::object_rw(int nobj, int osize, int wrpc, double skew) // read or write? bool write = (rand() % 100) < wrpc; - // pick a random object + // choose object double r = drand48(); // [0..1) - long o = (long)trunc(pow(r, skew) * (double)nobj); // exponentially skew towards 0 - - //if (write) o = hash(o) % nobj; + object_t oid; + if (write) { + long o = (long)trunc(pow(r, wskew) * (double)nobj); // exponentially skew towards 0 + int pnoremap = (long)(r * 100.0); + if (pnoremap >= overlappc) + o = (o*prime) % nobj; // remap + oid = object_t(0x1000, o); + } else { + long o = (long)trunc(pow(r, rskew) * (double)nobj); // exponentially skew towards 0 + oid = object_t(0x1000, o); + } - object_t oid(0x1000, o); ObjectLayout layout = client->osdmap->make_object_layout(oid, pg_t::TYPE_REP, 2); - + client->client_lock.Lock(); + utime_t start = g_clock.now(); if (write) { dout(10) << "write to " << oid << dendl; client->objecter->write(oid, 0, osize, layout, bl, @@ -1719,6 +1777,15 @@ int SyntheticClient::object_rw(int nobj, int osize, int wrpc, double skew) cond.Wait(lock); } lock.Unlock(); + + utime_t lat = g_clock.now(); + lat -= start; + if (client_logger) { + if (write) + client_logger->favg("owrlat", lat); + else + client_logger->favg("ordlat", lat); + } } diff --git a/trunk/ceph/client/SyntheticClient.h b/trunk/ceph/client/SyntheticClient.h index 14233aae8d1ca..3c51820082526 100644 --- a/trunk/ceph/client/SyntheticClient.h +++ b/trunk/ceph/client/SyntheticClient.h @@ -228,7 +228,8 @@ class SyntheticClient { int read_file(string& fn, int mb, int chunk, bool ignoreprint=false); int create_objects(int nobj, int osize, int inflight); - int object_rw(int nobj, int osize, int wrpc, double skew); + int object_rw(int nobj, int osize, int wrpc, int overlap, + double rskew, double wskew); int read_random(string& fn, int mb, int chunk); int read_random_ex(string& fn, int mb, int chunk); -- 2.39.5