mirror of
https://github.com/ceph/ceph
synced 2024-12-18 01:16:55 +00:00
*** empty log message ***
git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@529 29311d96-e01e-0410-9327-a35deaab8ce9
This commit is contained in:
parent
e72f3cec9a
commit
02baeeb6c8
@ -8,7 +8,7 @@
|
||||
# This makes it less annoying to build on non-mpi hosts for dev work, and seems to
|
||||
# behave just fine... change ${CC} back to mpicxx if you get paranoid.
|
||||
CC = g++
|
||||
CFLAGS = -g -Wall -I. -D_FILE_OFFSET_BITS=64 -DMPICH_IGNORE_CXX_SEEK -D_REENTRANT -D_THREAD_SAFE -DUSE_EBOFS
|
||||
CFLAGS = -pg -g -Wall -I. -D_FILE_OFFSET_BITS=64 -DMPICH_IGNORE_CXX_SEEK -D_REENTRANT -D_THREAD_SAFE -DUSE_EBOFS
|
||||
LIBS = -lpthread -lrt -ldb
|
||||
|
||||
#for normal mpich2 machines
|
||||
|
@ -116,8 +116,9 @@ md_config_t g_conf = {
|
||||
osd_fakestore_syncthreads: 4,
|
||||
osd_ebofs: 0,
|
||||
|
||||
ebofs_bc_size: (50 *256), // measured in 4k blocks, or *256 for MB
|
||||
ebofs_bc_max_dirty: ebofs_bc_size*8/10, // before write() will wait for data to flush
|
||||
ebofs_commit_interval: 2, // seconds. 0 = no timeout (for debugging/tracing)
|
||||
ebofs_bc_size: (50 *256), // measured in 4k blocks, or *256 for MB
|
||||
ebofs_bc_max_dirty: (40 *256), // before write() will wait for data to flush
|
||||
|
||||
|
||||
// --- fakeclient (mds regression testing) (ancient history) ---
|
||||
|
@ -91,6 +91,7 @@ struct md_config_t {
|
||||
int osd_fakestore_syncthreads; // such crap
|
||||
int osd_ebofs;
|
||||
|
||||
int ebofs_commit_interval;
|
||||
off_t ebofs_bc_size;
|
||||
off_t ebofs_bc_max_dirty;
|
||||
|
||||
|
@ -10,6 +10,8 @@
|
||||
#include <set>
|
||||
using namespace std;
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "include/bufferlist.h"
|
||||
|
||||
namespace crush {
|
||||
|
@ -26,12 +26,12 @@ class AlignedBufferPool {
|
||||
bool dommap;
|
||||
|
||||
public:
|
||||
AlignedBufferPool(int a) : alignment(a), dommap(false) {}
|
||||
AlignedBufferPool(int a) : alignment(a), dommap(true) {}
|
||||
~AlignedBufferPool() {
|
||||
}
|
||||
|
||||
void free(char *p, unsigned len) {
|
||||
dout(30) << "bufferpool.free " << (void*)p << " len " << len << endl;
|
||||
dout(1) << "bufferpool.free " << (void*)p << " len " << len << endl;
|
||||
if (dommap)
|
||||
munmap(p, len);
|
||||
else
|
||||
@ -54,7 +54,7 @@ class AlignedBufferPool {
|
||||
|
||||
::memset(p, 0, bytes); // only to shut up valgrind
|
||||
|
||||
dout(30) << "bufferpool.alloc " << (void*)p << endl;
|
||||
dout(1) << "bufferpool.alloc " << (void*)p << endl;
|
||||
|
||||
return new buffer(p, bytes, BUFFER_MODE_NOCOPY|BUFFER_MODE_NOFREE|BUFFER_MODE_CUSTOMFREE,
|
||||
bytes,
|
||||
|
@ -1,6 +1,9 @@
|
||||
|
||||
#include "Ebofs.h"
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
|
||||
// *******************
|
||||
|
||||
#undef dout
|
||||
@ -84,7 +87,7 @@ int Ebofs::mkfs()
|
||||
// create first noderegion
|
||||
Extent nr;
|
||||
nr.start = 2;
|
||||
nr.length = num_blocks / 100;
|
||||
nr.length = 10+ (num_blocks / 1000);
|
||||
if (nr.length < 10) nr.length = 10;
|
||||
nodepool.add_region(nr);
|
||||
dout(1) << "mkfs: first node region at " << nr << endl;
|
||||
@ -271,7 +274,7 @@ int Ebofs::commit_thread_entry()
|
||||
while (mounted) {
|
||||
|
||||
// wait for kick, or timeout
|
||||
if (EBOFS_COMMIT_INTERVAL) {
|
||||
if (g_conf.ebofs_commit_interval) {
|
||||
commit_cond.WaitInterval(ebofs_lock, utime_t(EBOFS_COMMIT_INTERVAL,0));
|
||||
} else {
|
||||
// DEBUG.. wait until kicked
|
||||
@ -1364,6 +1367,20 @@ int Ebofs::read(object_t oid,
|
||||
}
|
||||
|
||||
|
||||
bool Ebofs::_write_will_block()
|
||||
{
|
||||
return (bc.get_stat_dirty()+bc.get_stat_tx() > g_conf.ebofs_bc_max_dirty);
|
||||
}
|
||||
|
||||
bool Ebofs::write_will_block()
|
||||
{
|
||||
ebofs_lock.Lock();
|
||||
bool b = _write_will_block();
|
||||
ebofs_lock.Unlock();
|
||||
return b;
|
||||
}
|
||||
|
||||
|
||||
int Ebofs::write(object_t oid,
|
||||
size_t len, off_t off,
|
||||
bufferlist& bl, bool fsync)
|
||||
@ -1401,6 +1418,12 @@ int Ebofs::write(object_t oid,
|
||||
ebofs_lock.Unlock();
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
// too much unflushed dirty data? (if so, block!)
|
||||
while (_write_will_block()) {
|
||||
dout(1) << "write blocking on write" << endl;
|
||||
bc.waitfor_stat();
|
||||
}
|
||||
|
||||
// get|create inode
|
||||
Onode *on = get_onode(oid);
|
||||
|
@ -170,6 +170,8 @@ class Ebofs : public ObjectStore {
|
||||
void* entry() { return (void*)ebofs->finisher_thread_entry(); }
|
||||
} finisher_thread;
|
||||
|
||||
bool _write_will_block();
|
||||
|
||||
public:
|
||||
Ebofs(BlockDevice& d) :
|
||||
dev(d),
|
||||
@ -209,6 +211,8 @@ class Ebofs : public ObjectStore {
|
||||
int truncate(object_t oid, off_t size);
|
||||
int remove(object_t oid);
|
||||
|
||||
bool write_will_block();
|
||||
|
||||
// object attr
|
||||
int setattr(object_t oid, const char *name, void *value, size_t size);
|
||||
int getattr(object_t oid, const char *name, void *value, size_t size);
|
||||
|
@ -111,21 +111,26 @@ public:
|
||||
void verify_extents() {
|
||||
block_t count = 0;
|
||||
interval_set<block_t> is;
|
||||
set<block_t> s;
|
||||
for (unsigned i=0; i<extents.size(); i++) {
|
||||
//cout << "verify_extents " << i << " off " << count << " " << extents[i] << endl;
|
||||
count += extents[i].length;
|
||||
|
||||
//assert(!is.contains(extents[i].start, extents[i].length));
|
||||
//is.insert(extents[i].start, extents[i].length);
|
||||
|
||||
for (unsigned j=0;j<extents[i].length;j++) {
|
||||
assert(s.count(extents[i].start+j) == 0);
|
||||
s.insert(extents[i].start+j);
|
||||
if (0) { // do crazy stupid sanity checking
|
||||
set<block_t> s;
|
||||
cout << "verifying" << endl;
|
||||
for (unsigned i=0; i<extents.size(); i++) {
|
||||
//cout << "verify_extents " << i << " off " << count << " " << extents[i] << endl;
|
||||
count += extents[i].length;
|
||||
|
||||
//assert(!is.contains(extents[i].start, extents[i].length));
|
||||
//is.insert(extents[i].start, extents[i].length);
|
||||
|
||||
for (unsigned j=0;j<extents[i].length;j++) {
|
||||
assert(s.count(extents[i].start+j) == 0);
|
||||
s.insert(extents[i].start+j);
|
||||
}
|
||||
}
|
||||
cout << "verified " << extents.size() << " extents" << endl;
|
||||
assert(s.size() == count);
|
||||
assert(count == object_blocks);
|
||||
}
|
||||
assert(count == object_blocks);
|
||||
assert(s.size() == count);
|
||||
}
|
||||
void set_extent(block_t offset, Extent ex) {
|
||||
//cout << "set_extent " << offset << " " << ex << " ... " << object_blocks << endl;
|
||||
|
@ -31,6 +31,31 @@ int main(int argc, char **argv)
|
||||
// test-o-rama!
|
||||
Ebofs fs(dev);
|
||||
fs.mount();
|
||||
|
||||
if (1) { // big writes
|
||||
bufferlist bl;
|
||||
char crap[1024*1024];
|
||||
memset(crap, 0, 1024*1024);
|
||||
bl.append(crap, 1024*1024);
|
||||
|
||||
int megs = 10000;
|
||||
|
||||
utime_t start = g_clock.now();
|
||||
|
||||
for (off_t m=0; m<megs; m++) {
|
||||
cout << m << " / " << megs << endl;
|
||||
fs.write(10, bl.length(), 1024LL*1024LL*m, bl, (Context*)0);
|
||||
}
|
||||
fs.sync();
|
||||
|
||||
utime_t end = g_clock.now();
|
||||
end -= start;
|
||||
|
||||
dout(1) << "elapsed " << end << endl;
|
||||
|
||||
float mbs = (float)megs / (float)end;
|
||||
dout(1) << "mb/s " << mbs << endl;
|
||||
}
|
||||
|
||||
if (0) { // test
|
||||
bufferlist bl;
|
||||
@ -46,7 +71,7 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
// test small writes
|
||||
if (1) {
|
||||
if (0) {
|
||||
char crap[1024*1024];
|
||||
memset(crap, 0, 1024*1024);
|
||||
bufferlist bl;
|
||||
|
@ -132,7 +132,10 @@ class bufferlist {
|
||||
void copy(unsigned off, unsigned len, char *dest) {
|
||||
assert(off >= 0);
|
||||
assert(off + len <= length());
|
||||
|
||||
/*assert(off < length());
|
||||
if (off + len > length())
|
||||
len = length() - off;
|
||||
*/
|
||||
// advance to off
|
||||
list<bufferptr>::iterator curbuf = _buffers.begin();
|
||||
|
||||
|
@ -86,7 +86,10 @@ OSD::OSD(int id, Messenger *m)
|
||||
# ifdef USE_EBOFS
|
||||
storedev = 0;
|
||||
if (g_conf.osd_ebofs) {
|
||||
sprintf(ebofs_path, "%s/%d", ebofs_base_path, whoami);
|
||||
char hostname[100];
|
||||
hostname[0] = 0;
|
||||
gethostname(hostname,100);
|
||||
sprintf(ebofs_path, "%s/%s", ebofs_base_path, hostname);
|
||||
storedev = new BlockDevice(ebofs_path);
|
||||
store = new Ebofs(*storedev);
|
||||
} else
|
||||
|
@ -120,6 +120,15 @@ int main(int argc, char **argv)
|
||||
char s[80];
|
||||
sprintf(s,"clnode.%d", myrank);
|
||||
client_logger = new Logger(s, &client_logtype);
|
||||
|
||||
client_logtype.add_inc("lsum");
|
||||
client_logtype.add_inc("lnum");
|
||||
client_logtype.add_inc("lwsum");
|
||||
client_logtype.add_inc("lwnum");
|
||||
client_logtype.add_inc("lrsum");
|
||||
client_logtype.add_inc("lrnum");
|
||||
client_logtype.add_inc("trsum");
|
||||
client_logtype.add_inc("trnum");
|
||||
}
|
||||
|
||||
client[i]->init();
|
||||
@ -131,12 +140,16 @@ int main(int argc, char **argv)
|
||||
it != clientlist.end();
|
||||
it++) {
|
||||
int i = *it;
|
||||
// use my argc, argv (make sure you pass a mount point!)
|
||||
//cout << "mounting" << endl;
|
||||
|
||||
|
||||
client[i]->mount(mkfs);
|
||||
|
||||
//cout << "starting synthetic client on rank " << myrank << endl;
|
||||
syn[i] = new SyntheticClient(client[i]);
|
||||
|
||||
syn[i]->modes = syn_modes;
|
||||
syn[i]->sargs = syn_sargs;
|
||||
syn[i]->iargs = syn_iargs;
|
||||
|
||||
syn[i]->start_thread();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user