summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Benjamin <matt@linuxbox.com>2013-05-23 19:31:33 -0700
committerDavid Zafman <david.zafman@inktank.com>2013-10-03 15:23:02 -0700
commit80a1a11504aed31e5d0a0a725345ba899eff2c30 (patch)
tree13112486c92f252f18c5e00e239e1eab86a3c2f6
parentaf95a64cc6742e6e98d76a91a598564124256582 (diff)
downloadceph-80a1a11504aed31e5d0a0a725345ba899eff2c30.tar.gz
client/SyntheticClient: adapt to new ll_* interface
(Includes pieces of NFS interface widening by Adam.) Signed-off-by: Matt Benjamin <matt@linuxbox.com>
-rw-r--r--src/client/SyntheticClient.cc141
1 files changed, 95 insertions, 46 deletions
diff --git a/src/client/SyntheticClient.cc b/src/client/SyntheticClient.cc
index b81de86d29d..a2f4ba805ba 100644
--- a/src/client/SyntheticClient.cc
+++ b/src/client/SyntheticClient.cc
@@ -1017,9 +1017,11 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
hash_map<int64_t, dir_result_t*> open_dirs;
hash_map<int64_t, Fh*> ll_files;
- hash_map<int64_t, void*> ll_dirs;
+ hash_map<int64_t, dir_result_t*> ll_dirs;
hash_map<uint64_t, int64_t> ll_inos;
+ Inode *i1, *i2;
+
ll_inos[1] = 1; // root inode is known.
// prefix?
@@ -1027,14 +1029,16 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
if (prefix.length()) {
client->mkdir(prefix.c_str(), 0755);
struct stat attr;
- if (client->ll_lookup(vinodeno_t(1, CEPH_NOSNAP), prefix.c_str(), &attr) == 0) {
+ i1 = client->ll_get_inode(vinodeno_t(1, CEPH_NOSNAP));
+ if (client->ll_lookup(i1, prefix.c_str(), &attr, &i2) == 0) {
ll_inos[1] = attr.st_ino;
dout(5) << "'root' ino is " << inodeno_t(attr.st_ino) << dendl;
+ client->ll_put(i1);
} else {
dout(0) << "warning: play_trace couldn't lookup up my per-client directory" << dendl;
}
- }
-
+ } else
+ (void) client->ll_get_inode(vinodeno_t(1, CEPH_NOSNAP));
utime_t last_status = start;
@@ -1226,20 +1230,27 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
const char *name = t.get_string(buf, p);
int64_t r = t.get_int();
struct stat attr;
- if (ll_inos.count(i) &&
- client->ll_lookup(vinodeno_t(ll_inos[i],CEPH_NOSNAP), name, &attr) == 0)
- ll_inos[r] = attr.st_ino;
+ if (ll_inos.count(i)) {
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ if (client->ll_lookup(i1, name, &attr, &i2) == 0)
+ ll_inos[r] = attr.st_ino;
+ client->ll_put(i1);
+ }
} else if (strcmp(op, "ll_forget") == 0) {
int64_t i = t.get_int();
int64_t n = t.get_int();
if (ll_inos.count(i) &&
- client->ll_forget(vinodeno_t(ll_inos[i],CEPH_NOSNAP), n))
+ client->ll_forget(
+ client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP)), n))
ll_inos.erase(i);
} else if (strcmp(op, "ll_getattr") == 0) {
int64_t i = t.get_int();
struct stat attr;
- if (ll_inos.count(i))
- client->ll_getattr(vinodeno_t(ll_inos[i],CEPH_NOSNAP), &attr);
+ if (ll_inos.count(i)) {
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ client->ll_getattr(i1, &attr);
+ client->ll_put(i1);
+ }
} else if (strcmp(op, "ll_setattr") == 0) {
int64_t i = t.get_int();
struct stat attr;
@@ -1251,13 +1262,19 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
attr.st_mtime = t.get_int();
attr.st_atime = t.get_int();
int mask = t.get_int();
- if (ll_inos.count(i))
- client->ll_setattr(vinodeno_t(ll_inos[i],CEPH_NOSNAP), &attr, mask);
+ if (ll_inos.count(i)) {
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ client->ll_setattr(i1, &attr, mask);
+ client->ll_put(i1);
+ }
} else if (strcmp(op, "ll_readlink") == 0) {
int64_t i = t.get_int();
const char *value;
- if (ll_inos.count(i))
- client->ll_readlink(vinodeno_t(ll_inos[i],CEPH_NOSNAP), &value);
+ if (ll_inos.count(i)) {
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ client->ll_readlink(i1, &value);
+ client->ll_put(i1);
+ }
} else if (strcmp(op, "ll_mknod") == 0) {
int64_t i = t.get_int();
const char *n = t.get_string(buf, p);
@@ -1265,62 +1282,88 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
int r = t.get_int();
int64_t ri = t.get_int();
struct stat attr;
- if (ll_inos.count(i) &&
- client->ll_mknod(vinodeno_t(ll_inos[i],CEPH_NOSNAP), n, m, r, &attr) == 0)
- ll_inos[ri] = attr.st_ino;
+ if (ll_inos.count(i)) {
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ if (client->ll_mknod(i1, n, m, r, &attr, &i2) == 0)
+ ll_inos[ri] = attr.st_ino;
+ client->ll_put(i1);
+ }
} else if (strcmp(op, "ll_mkdir") == 0) {
int64_t i = t.get_int();
const char *n = t.get_string(buf, p);
int m = t.get_int();
int64_t ri = t.get_int();
struct stat attr;
- if (ll_inos.count(i) &&
- client->ll_mkdir(vinodeno_t(ll_inos[i],CEPH_NOSNAP), n, m, &attr) == 0)
- ll_inos[ri] = attr.st_ino;
+ if (ll_inos.count(i)) {
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ if (client->ll_mkdir(i1, n, m, &attr, &i2) == 0)
+ ll_inos[ri] = attr.st_ino;
+ client->ll_put(i1);
+ }
} else if (strcmp(op, "ll_symlink") == 0) {
int64_t i = t.get_int();
const char *n = t.get_string(buf, p);
const char *v = t.get_string(buf2, p);
int64_t ri = t.get_int();
struct stat attr;
- if (ll_inos.count(i) &&
- client->ll_symlink(vinodeno_t(ll_inos[i],CEPH_NOSNAP), n, v, &attr) == 0)
- ll_inos[ri] = attr.st_ino;
+ if (ll_inos.count(i)) {
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ if (client->ll_symlink(i1, n, v, &attr, &i2) == 0)
+ ll_inos[ri] = attr.st_ino;
+ client->ll_put(i1);
+ }
} else if (strcmp(op, "ll_unlink") == 0) {
int64_t i = t.get_int();
const char *n = t.get_string(buf, p);
- if (ll_inos.count(i))
- client->ll_unlink(vinodeno_t(ll_inos[i],CEPH_NOSNAP), n);
+ if (ll_inos.count(i)) {
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ client->ll_unlink(i1, n);
+ client->ll_put(i1);
+ }
} else if (strcmp(op, "ll_rmdir") == 0) {
int64_t i = t.get_int();
const char *n = t.get_string(buf, p);
- if (ll_inos.count(i))
- client->ll_rmdir(vinodeno_t(ll_inos[i],CEPH_NOSNAP), n);
+ if (ll_inos.count(i)) {
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ client->ll_rmdir(i1, n);
+ client->ll_put(i1);
+ }
} else if (strcmp(op, "ll_rename") == 0) {
int64_t i = t.get_int();
const char *n = t.get_string(buf, p);
int64_t ni = t.get_int();
const char *nn = t.get_string(buf2, p);
if (ll_inos.count(i) &&
- ll_inos.count(ni))
- client->ll_rename(vinodeno_t(ll_inos[i],CEPH_NOSNAP), n,
- vinodeno_t(ll_inos[ni],CEPH_NOSNAP), nn);
+ ll_inos.count(ni)) {
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ i2 = client->ll_get_inode(vinodeno_t(ll_inos[ni],CEPH_NOSNAP));
+ client->ll_rename(i1, n, i2, nn);
+ client->ll_put(i1);
+ client->ll_put(i2);
+ }
} else if (strcmp(op, "ll_link") == 0) {
int64_t i = t.get_int();
int64_t ni = t.get_int();
const char *nn = t.get_string(buf, p);
struct stat attr;
if (ll_inos.count(i) &&
- ll_inos.count(ni))
- client->ll_link(vinodeno_t(ll_inos[i],CEPH_NOSNAP),
- vinodeno_t(ll_inos[ni],CEPH_NOSNAP), nn, &attr);
+ ll_inos.count(ni)) {
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ i2 = client->ll_get_inode(vinodeno_t(ll_inos[ni],CEPH_NOSNAP));
+ client->ll_link(i1, i2, nn, &attr);
+ client->ll_put(i1);
+ client->ll_put(i2);
+ }
} else if (strcmp(op, "ll_opendir") == 0) {
int64_t i = t.get_int();
int64_t r = t.get_int();
- void *dirp;
- if (ll_inos.count(i) &&
- client->ll_opendir(vinodeno_t(ll_inos[i],CEPH_NOSNAP), &dirp) == 0)
- ll_dirs[r] = dirp;
+ dir_result_t *dirp;
+ if (ll_inos.count(i)) {
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ if (client->ll_opendir(i1, &dirp) == 0)
+ ll_dirs[r] = dirp;
+ client->ll_put(i1);
+ }
} else if (strcmp(op, "ll_releasedir") == 0) {
int64_t f = t.get_int();
if (ll_dirs.count(f)) {
@@ -1332,9 +1375,12 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
int64_t f = t.get_int();
int64_t r = t.get_int();
Fh *fhp;
- if (ll_inos.count(i) &&
- client->ll_open(vinodeno_t(ll_inos[i],CEPH_NOSNAP), f, &fhp) == 0)
- ll_files[r] = fhp;
+ if (ll_inos.count(i)) {
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ if (client->ll_open(i1, f, &fhp) == 0)
+ ll_files[r] = fhp;
+ client->ll_put(i1);
+ }
} else if (strcmp(op, "ll_create") == 0) {
int64_t i = t.get_int();
const char *n = t.get_string(buf, p);
@@ -1342,12 +1388,15 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
int64_t f = t.get_int();
int64_t r = t.get_int();
int64_t ri = t.get_int();
- Fh *fhp;
struct stat attr;
- if (ll_inos.count(i) &&
- client->ll_create(vinodeno_t(ll_inos[i],CEPH_NOSNAP), n, m, f, &attr, &fhp) == 0) {
- ll_inos[ri] = attr.st_ino;
- ll_files[r] = fhp;
+ if (ll_inos.count(i)) {
+ Fh *fhp;
+ i1 = client->ll_get_inode(vinodeno_t(ll_inos[i],CEPH_NOSNAP));
+ if (client->ll_create(i1, n, m, f, &attr, NULL, &fhp) == 0) {
+ ll_inos[ri] = attr.st_ino;
+ ll_files[r] = fhp;
+ }
+ client->ll_put(i1);
}
} else if (strcmp(op, "ll_read") == 0) {
int64_t f = t.get_int();
@@ -1496,7 +1545,7 @@ int SyntheticClient::play_trace(Trace& t, string& prefix, bool metadata_only)
dout(1) << "leftover ll_release " << fi->second << dendl;
if (fi->second) client->ll_release(fi->second);
}
- for (hash_map<int64_t,void*>::iterator fi = ll_dirs.begin();
+ for (hash_map<int64_t,dir_result_t*>::iterator fi = ll_dirs.begin();
fi != ll_dirs.end();
++fi) {
dout(1) << "leftover ll_releasedir " << fi->second << dendl;