// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*- // vim: ts=8 sw=2 smarttab /* * Ceph - scalable distributed file system * * Copyright (C) 2004-2006 Sage Weil * * This is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software * Foundation. See file COPYING. * */ #ifndef CEPH_SYNTHETICCLIENT_H #define CEPH_SYNTHETICCLIENT_H #include #include "Client.h" #include "include/Distribution.h" #include "Trace.h" #define SYNCLIENT_FIRST_POOL 0 #define SYNCLIENT_MODE_RANDOMWALK 1 #define SYNCLIENT_MODE_FULLWALK 2 #define SYNCLIENT_MODE_REPEATWALK 3 #define SYNCLIENT_MODE_MAKEDIRMESS 7 #define SYNCLIENT_MODE_MAKEDIRS 8 // dirs files depth #define SYNCLIENT_MODE_STATDIRS 9 // dirs files depth #define SYNCLIENT_MODE_READDIRS 10 // dirs files depth #define SYNCLIENT_MODE_MAKEFILES 11 // num count private #define SYNCLIENT_MODE_MAKEFILES2 12 // num count private #define SYNCLIENT_MODE_CREATESHARED 13 // num #define SYNCLIENT_MODE_OPENSHARED 14 // num count #define SYNCLIENT_MODE_RMFILE 19 #define SYNCLIENT_MODE_WRITEFILE 20 #define SYNCLIENT_MODE_READFILE 21 #define SYNCLIENT_MODE_WRITEBATCH 22 #define SYNCLIENT_MODE_WRSHARED 23 #define SYNCLIENT_MODE_READSHARED 24 #define SYNCLIENT_MODE_RDWRRANDOM 25 #define SYNCLIENT_MODE_RDWRRANDOM_EX 26 #define SYNCLIENT_MODE_LINKTEST 27 #define SYNCLIENT_MODE_OVERLOAD_OSD_0 28 // two args #define SYNCLIENT_MODE_DROPCACHE 29 #define SYNCLIENT_MODE_TRACE 30 #define SYNCLIENT_MODE_CREATEOBJECTS 35 #define SYNCLIENT_MODE_OBJECTRW 36 #define SYNCLIENT_MODE_OPENTEST 40 #define SYNCLIENT_MODE_OPTEST 41 #define SYNCLIENT_MODE_ONLY 50 #define SYNCLIENT_MODE_ONLYRANGE 51 #define SYNCLIENT_MODE_EXCLUDE 52 #define SYNCLIENT_MODE_EXCLUDERANGE 53 #define SYNCLIENT_MODE_UNTIL 55 #define SYNCLIENT_MODE_SLEEPUNTIL 56 #define SYNCLIENT_MODE_RANDOMSLEEP 61 #define SYNCLIENT_MODE_SLEEP 62 #define SYNCLIENT_MODE_DUMP 63 #define SYNCLIENT_MODE_LOOKUPHASH 70 #define SYNCLIENT_MODE_LOOKUPINO 71 #define SYNCLIENT_MODE_TRUNCATE 200 #define SYNCLIENT_MODE_FOO 100 #define SYNCLIENT_MODE_THRASHLINKS 101 #define SYNCLIENT_MODE_IMPORTFIND 300 #define SYNCLIENT_MODE_CHUNK 400 #define SYNCLIENT_MODE_MKSNAP 1000 #define SYNCLIENT_MODE_RMSNAP 1001 #define SYNCLIENT_MODE_MKSNAPFILE 1002 void parse_syn_options(vector& args); extern int num_client; class SyntheticClient { StandaloneClient *client; int whoami; pthread_t thread_id; Distribution op_dist; void init_op_dist(); int get_op(); filepath cwd; map contents; set subdirs; bool did_readdir; set open_files; void up(); void clear_dir() { contents.clear(); subdirs.clear(); did_readdir = false; } int get_random_fh() { int r = rand() % open_files.size(); set::iterator it = open_files.begin(); while (r--) ++it; return *it; } filepath n1; const char *get_random_subdir() { assert(!subdirs.empty()); int r = ((rand() % subdirs.size()) + (rand() % subdirs.size())) / 2; // non-uniform distn set::iterator it = subdirs.begin(); while (r--) ++it; n1 = cwd; n1.push_dentry( *it ); return n1.get_path().c_str(); } filepath n2; const char *get_random_sub() { assert(!contents.empty()); int r = ((rand() % contents.size()) + (rand() % contents.size())) / 2; // non-uniform distn if (cwd.depth() && cwd.last_dentry().length()) r += cwd.last_dentry().c_str()[0]; // slightly permuted r %= contents.size(); map::iterator it = contents.begin(); while (r--) ++it; n2 = cwd; n2.push_dentry( it->first ); return n2.get_path().c_str(); } filepath sub; char sub_s[50]; const char *make_sub(const char *base) { snprintf(sub_s, sizeof(sub_s), "%s.%d", base, rand() % 100); string f = sub_s; sub = cwd; sub.push_dentry(f); return sub.c_str(); } public: SyntheticClient(StandaloneClient *client, int w = -1); int start_thread(); int join_thread(); int run(); bool run_me() { if (run_only >= 0) { if (run_only == client->get_nodeid()) return true; else return false; } return true; } void did_run_me() { run_only = -1; run_until = utime_t(); } // run() will do one of these things: list modes; list sargs; list iargs; utime_t run_start; utime_t run_until; client_t run_only; client_t exclude; string get_sarg(int seq); int get_iarg() { int i = iargs.front(); iargs.pop_front(); return i; } bool time_to_stop() { utime_t now = ceph_clock_now(); if (0) cout << "time_to_stop .. now " << now << " until " << run_until << " start " << run_start << std::endl; if (run_until.sec() && now > run_until) return true; else return false; } string compose_path(string& prefix, char *rest) { return prefix + rest; } int full_walk(string& fromdir); int random_walk(int n); int dump_placement(string& fn); int make_dirs(const char *basedir, int dirs, int files, int depth); int stat_dirs(const char *basedir, int dirs, int files, int depth); int read_dirs(const char *basedir, int dirs, int files, int depth); int make_files(int num, int count, int priv, bool more); int link_test(); int create_shared(int num); int open_shared(int num, int count); int rm_file(string& fn); int write_file(string& fn, int mb, loff_t chunk); int write_fd(int fd, int size, int wrsize); int write_batch(int nfile, int mb, int chunk); int read_file(const std::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, 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); int overload_osd_0(int n, int sie, int wrsize); int check_first_primary(int fd); int clean_dir(string& basedir); int play_trace(Trace& t, string& prefix, bool metadata_only=false); void make_dir_mess(const char *basedir, int n); void foo(); int thrash_links(const char *basedir, int dirs, int files, int depth, int n); void import_find(const char *basedir, const char *find, bool writedata); int lookup_hash(inodeno_t ino, inodeno_t dirino, const char *name, const UserPerm& perms); int lookup_ino(inodeno_t ino, const UserPerm& perms); int chunk_file(string &filename); void mksnap(const char *base, const char *name, const UserPerm& perms); void rmsnap(const char *base, const char *name, const UserPerm& perms); void mksnapfile(const char *dir); }; #endif