*/
int Client::release_inode_buffers(Inode *in)
{
- dout(1) << "release_inode_buffers IMPLEMENT ME" << endl;
+ dout(2) << "release_inode_buffers IMPLEMENT ME" << endl;
}
return (void*)r;
}
+string SyntheticClient::get_sarg()
+{
+ string a;
+ if (!sargs.empty()) {
+ a = sargs.front();
+ sargs.pop_front();
+ }
+ if (a.length() == 0 || a == "~") {
+ char s[20];
+ sprintf(s,"syn.%d", client->whoami);
+ a = s;
+ }
+ //cout << "a is " << a << endl;
+ return a;
+}
int SyntheticClient::run()
{
- if (modes.empty()) modes.push_back(mode);
+ run_start = g_clock.gettimepair();
for (list<int>::iterator it = modes.begin();
it != modes.end();
int mode = *it;
switch (mode) {
+ case SYNCLIENT_MODE_UNTIL:
+ {
+ int iarg1 = iargs.front();
+ iargs.pop_front();
+ dout(2) << "until " << iarg1 << endl;
+ timepair_t dur(iarg1,0);
+ run_until = run_start + dur;
+ }
+ break;
case SYNCLIENT_MODE_RANDOMWALK:
- random_walk(iarg1);
+ {
+ int iarg1 = iargs.front();
+ iargs.pop_front();
+ dout(2) << "randomwalk " << iarg1 << endl;
+ random_walk(iarg1);
+ }
break;
case SYNCLIENT_MODE_MAKEDIRS:
- make_dirs(sarg1.c_str(), iarg1, iarg2, iarg3);
+ {
+ string sarg1 = get_sarg();
+ int iarg1 = iargs.front(); iargs.pop_front();
+ int iarg2 = iargs.front(); iargs.pop_front();
+ int iarg3 = iargs.front(); iargs.pop_front();
+ dout(2) << "makedirs " << sarg1 << " " << iarg1 << " " << iarg2 << " " << iarg3 << endl;
+ make_dirs(sarg1.c_str(), iarg1, iarg2, iarg3);
+ }
break;
case SYNCLIENT_MODE_FULLWALK:
- full_walk(sarg1);
+ {
+ string sarg1 = sargs.front(); sargs.pop_front();
+ dout(2) << "fullwalk" << sarg1 << endl;
+ full_walk(sarg1);
+ }
break;
case SYNCLIENT_MODE_WRITEFILE:
- write_file(sarg1, iarg1, iarg2);
+ {
+ string sarg1 = sargs.front(); sargs.pop_front();
+ int iarg1 = iargs.front(); iargs.pop_front();
+ int iarg2 = iargs.front(); iargs.pop_front();
+ write_file(sarg1, iarg1, iarg2);
+ }
break;
case SYNCLIENT_MODE_READFILE:
- dout(2) << "readfile" << endl;
- read_file(sarg1, iarg1, iarg2);
+ {
+ string sarg1 = sargs.front(); sargs.pop_front();
+ int iarg1 = iargs.front(); iargs.pop_front();
+ int iarg2 = iargs.front(); iargs.pop_front();
+ read_file(sarg1, iarg1, iarg2);
+ }
break;
default:
assert(0);
int SyntheticClient::full_walk(string& basedir)
{
+ if (g_clock.gettimepair() > run_until) return 0;
+
// read dir
map<string, inode_t*> contents;
int r = client->getdir(basedir.c_str(), contents);
int SyntheticClient::make_dirs(const char *basedir, int dirs, int files, int depth)
{
+ if (g_clock.gettimepair() > run_until) return 0;
+
// make sure base dir exists
int r = client->mkdir(basedir, 0755);
if (r != 0) {
if (fd < 0) return fd;
for (int i=0; i<chunks; i++) {
+ if (g_clock.gettimepair() > run_until) return 0;
dout(2) << "writing block " << i << "/" << chunks << endl;
client->write(fd, buf, wrsize, i*wrsize);
}
if (fd < 0) return fd;
for (int i=0; i<chunks; i++) {
+ if (g_clock.gettimepair() > run_until) return 0;
dout(2) << "reading block " << i << "/" << chunks << endl;
client->read(fd, buf, rdsize, i*rdsize);
}
{
int left = num_req;
- dout(1) << "random_walk() will do " << left << " ops" << endl;
+ //dout(1) << "random_walk() will do " << left << " ops" << endl;
init_op_dist(); // set up metadata op distribution
while (left > 0) {
left--;
+ if (g_clock.gettimepair() > run_until) return 0;
+
// ascend?
if (cwd.depth() && roll_die(.05)) {
up();
#define SYNCLIENT_MODE_MAKEDIRS 3
#define SYNCLIENT_MODE_WRITEFILE 4
#define SYNCLIENT_MODE_READFILE 5
+#define SYNCLIENT_MODE_UNTIL 6
class SyntheticClient {
Client *client;
int run();
// run() will do one of these things:
- int mode;
list<int> modes;
- string sarg1;
- int iarg1, iarg2, iarg3;
+ list<string> sargs;
+ list<int> iargs;
+ timepair_t run_start;
+ timepair_t run_until;
+
+ string get_sarg();
int full_walk(string& fromdir);
int random_walk(int n);
int write_file(string& fn, int mb, int chunk);
int read_file(string& fn, int mb, int chunk);
+
};
#endif
#define AVG_PER_INODE_SIZE 450
#define MDS_CACHE_MB_TO_INODES(x) ((x)*1000000/AVG_PER_INODE_SIZE)
-#define MDS_CACHE_SIZE MDS_CACHE_MB_TO_INODES( 50 )
-//#define MDS_CACHE_SIZE 25000 //
+//#define MDS_CACHE_SIZE MDS_CACHE_MB_TO_INODES( 50 )
+#define MDS_CACHE_SIZE 1500000
// hack hack hack ugly FIXME
fakeclient_op_statfs: false,
- fakeclient_op_stat: 10,
+ // loosely based on Roselli workload paper numbers
+ fakeclient_op_stat: 610,
fakeclient_op_lstat: false,
- fakeclient_op_utime: 10, // untested
- fakeclient_op_chmod: 10,
- fakeclient_op_chown: 10, // untested
+ fakeclient_op_utime: 0,
+ fakeclient_op_chmod: 1,
+ fakeclient_op_chown: 1,
- fakeclient_op_readdir: 10,
+ fakeclient_op_readdir: 20,
fakeclient_op_mknod: 10,
fakeclient_op_link: false,
- fakeclient_op_unlink: 10,
+ fakeclient_op_unlink: 5,
fakeclient_op_rename: 100,
fakeclient_op_mkdir: 50,
fakeclient_op_rmdir: 0, // there's a bug...10,
fakeclient_op_symlink: 10,
- fakeclient_op_openrd: 100,
- fakeclient_op_openwr: 100,
- fakeclient_op_openwrc: 100,
+ fakeclient_op_openrd: 200,
+ fakeclient_op_openwr: 0,
+ fakeclient_op_openwrc: 0,
fakeclient_op_read: false, // osd!
fakeclient_op_write: false, // osd!
fakeclient_op_truncate: false,
fakeclient_op_fsync: false,
- fakeclient_op_close: 20
+ fakeclient_op_close: 200
};
char **nargv = new pchar[argc];
nargv[nargc++] = argv[0];
- string syn_sarg1;
list<int> syn_modes;
- int syn_iarg1, syn_iarg2, syn_iarg3;
+ list<int> syn_iargs;
+ list<string> syn_sargs;
+
int mkfs = 0;
for (int i=1; i<argc; i++) {
+ //cout << "a " << argv[i] << endl;
if (strcmp(argv[i], "--fastmkfs") == 0) {
mkfs = MDS_MKFS_FAST;
}
else if (strcmp(argv[i], "--fullmkfs") == 0) {
mkfs = MDS_MKFS_FULL;
}
- else if (strcmp(argv[i],"--synsarg1") == 0)
- syn_sarg1 = argv[++i];
- else if (strcmp(argv[i],"--syniarg1") == 0)
- syn_iarg1 = atoi(argv[++i]);
- else if (strcmp(argv[i],"--syniarg2") == 0)
- syn_iarg2 = atoi(argv[++i]);
- else if (strcmp(argv[i],"--syniarg3") == 0)
- syn_iarg3 = atoi(argv[++i]);
- else if (strcmp(argv[i],"--synmode") == 0) {
+ else if (strcmp(argv[i],"--syn") == 0) {
++i;
- if (strcmp(argv[i],"writefile") == 0)
+ if (strcmp(argv[i],"writefile") == 0) {
syn_modes.push_back( SYNCLIENT_MODE_WRITEFILE );
- else if (strcmp(argv[i],"readfile") == 0)
+ syn_iargs.push_back( atoi(argv[++i]) );
+ syn_iargs.push_back( atoi(argv[++i]) );
+ } else if (strcmp(argv[i],"readfile") == 0) {
syn_modes.push_back( SYNCLIENT_MODE_READFILE );
- else if (strcmp(argv[i],"makedirs") == 0)
+ syn_iargs.push_back( atoi(argv[++i]) );
+ syn_iargs.push_back( atoi(argv[++i]) );
+ } else if (strcmp(argv[i],"makedirs") == 0) {
syn_modes.push_back( SYNCLIENT_MODE_MAKEDIRS );
- else if (strcmp(argv[i],"fullwalk") == 0)
+ syn_iargs.push_back( atoi(argv[++i]) );
+ syn_iargs.push_back( atoi(argv[++i]) );
+ syn_iargs.push_back( atoi(argv[++i]) );
+ } else if (strcmp(argv[i],"fullwalk") == 0) {
syn_modes.push_back( SYNCLIENT_MODE_FULLWALK );
- else if (strcmp(argv[i],"randomwalk") == 0)
+ //syn_sargs.push_back( atoi(argv[++i]) );
+ } else if (strcmp(argv[i],"randomwalk") == 0) {
syn_modes.push_back( SYNCLIENT_MODE_RANDOMWALK );
- else {
+ syn_iargs.push_back( atoi(argv[++i]) );
+ } else if (strcmp(argv[i],"until") == 0) {
+ syn_modes.push_back( SYNCLIENT_MODE_UNTIL );
+ syn_iargs.push_back( atoi(argv[++i]) );
+ } else {
cerr << "unknown syn mode " << argv[i] << endl;
return -1;
}
//cout << "starting synthetic client on rank " << myrank << endl;
syn[i] = new SyntheticClient(client[i]);
- char s[20];
- sprintf(s,"syn.%d", i);
- syn[i]->sarg1 = s;
-
syn[i]->modes = syn_modes;
- syn[i]->iarg1 = syn_iarg1;
- syn[i]->iarg2 = syn_iarg2;
- syn[i]->iarg3 = syn_iarg3;
+ syn[i]->sargs = syn_sargs;
+ syn[i]->iargs = syn_iargs;
syn[i]->start_thread();
}
for (int i=0; i<NUMCLIENT; i++) {