]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
uClient/libceph: initial implementation of get_file_stripe_address
authorGreg Farnum <gregf@hq.newdream.net>
Wed, 5 Aug 2009 23:51:49 +0000 (16:51 -0700)
committerGreg Farnum <gregf@hq.newdream.net>
Thu, 6 Aug 2009 21:41:54 +0000 (14:41 -0700)
src/client/Client.cc
src/client/libceph.cc
src/client/libceph.h

index ddbea0fa885ea3573eb12e700a850ee16d22730a..5fbcede2d886ed4bb35ed9a4a317b522dcb598ba 100644 (file)
@@ -5228,6 +5228,32 @@ int Client::get_file_replication(int fd)
 
 int Client::get_file_stripe_address(int fd, loff_t offset, string& address)
 {
+  Mutex::Locker lock(client_lock);
+
+  assert(fd_map.count(fd));
+  Fh *f = fd_map[fd];
+  Inode *in = f->inode;
+
+  // which object?
+  vector<ObjectExtent> extents;
+  filer->file_to_extents(in->ino, &in->layout, offset, 1, extents);
+  assert(extents.size() == 1);
+
+  // now we have the object and its 'layout'
+  pg_t pg = (pg_t)extents[0].layout.ol_pgid;
+  vector<int> osds;
+  osdmap->pg_to_osds(pg, osds);
+  if (!osds.size())
+    return -EINVAL;
+  
+  // now we have the osd(s)
+  entity_addr_t addr = osdmap->get_addr(osds[0]);
+  
+  // now we need to turn it into a string
+  char foo[30];
+  __u8 *quad = (__u8*) &addr.ipaddr.sin_addr;
+  sprintf(foo, "%d.%d.%d.%d", (int)quad[0], (int)quad[1], (int)quad[2], (int)quad[3]);
+  address = foo;
   return 0;
 }
 
index 00661218f24ef357952c5c4730549c694ad6648c..7f39bd6a1a6730b43bc4193a33302956434a81b6 100644 (file)
@@ -268,6 +268,10 @@ extern "C" int ceph_get_file_replication(const char *path) {
   return rep;
 }
 
+int ceph_get_file_stripe_address(int fh, loff_t offset, std::string& address) {
+  return client->get_file_stripe_address(fh, offset, address);
+}
+
 int ceph_getdir(const char *relpath, std::list<std::string>& names)
 {
   return client->getdir(relpath, names);
index 0d4b9e983d80f3349619475193a248d742e506f1..2d8343c487b404b057b4bec5d1722aaaffeba7c4 100644 (file)
@@ -74,6 +74,7 @@ int ceph_get_file_replication(const char *path);
 //not for C, sorry!
 int ceph_getdir(const char *relpath, std::list<std::string>& names);
 void ceph_getcwd(std::string& cwd);
+int ceph_get_file_stripe_address(int fd, loff_t offset, std::string& address);
 }
 #endif