*** empty log message ***

git-svn-id: https://ceph.svn.sf.net/svnroot/ceph@529 29311d96-e01e-0410-9327-a35deaab8ce9
This commit is contained in:
sage 2005-12-16 21:45:39 +00:00
parent e72f3cec9a
commit 02baeeb6c8
12 changed files with 105 additions and 25 deletions

View File

@ -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

View File

@ -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) ---

View File

@ -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;

View File

@ -10,6 +10,8 @@
#include <set>
using namespace std;
#include <math.h>
#include "include/bufferlist.h"
namespace crush {

View File

@ -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,

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;

View File

@ -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();

View File

@ -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

View File

@ -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();