]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: return stripe address replicas
authorNoah Watkins <noahwatkins@gmail.com>
Wed, 9 Nov 2011 02:39:18 +0000 (18:39 -0800)
committerSage Weil <sage@newdream.net>
Wed, 9 Nov 2011 21:23:21 +0000 (13:23 -0800)
Changes ceph_get_file_stripe_address to return a
vector of entity_addr_t's for the primary and the
replicas. libcephfs is updated to return the
associated sockaddr_storage for each address.

Signed-off-by: Noah Watkins <noahwatkins@gmail.com>
src/client/Client.cc
src/client/Client.h
src/include/cephfs/libcephfs.h
src/libcephfs.cc

index ed9ada7f00a5a34c1e4b59c219d18fe5e907efd4..78d12c8ed5f8fe5bee5d9cce0b2ee0efb7d0f540 100644 (file)
@@ -6829,7 +6829,7 @@ int Client::get_pool_replication(int64_t pool)
   return osdmap->get_pg_pool(pool)->get_size();
 }
 
-int Client::get_file_stripe_address(int fd, loff_t offset, string& address)
+int Client::get_file_stripe_address(int fd, loff_t offset, vector<entity_addr_t>& address)
 {
   Mutex::Locker lock(client_lock);
 
@@ -6848,15 +6848,12 @@ int Client::get_file_stripe_address(int fd, loff_t offset, string& address)
   osdmap->pg_to_acting_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.in4_addr().sin_addr;
-  snprintf(foo, sizeof(foo), "%d.%d.%d.%d", (int)quad[0], (int)quad[1], (int)quad[2], (int)quad[3]);
-  address = foo;
+
+  for (unsigned i = 0; i < osds.size(); i++) {
+    entity_addr_t addr = osdmap->get_addr(osds[i]);
+    address.push_back(addr);
+  }
+
   return 0;
 }
 
index bc98ac5f03ac161c4bdebbf1d41032fe4c3c1c84..a30b73c16f02210b6d97c78258a1f9246a9dda5a 100644 (file)
@@ -607,7 +607,7 @@ public:
 
   // expose file layout
   int describe_layout(int fd, ceph_file_layout* layout);
-  int get_file_stripe_address(int fd, loff_t offset, string& address);
+  int get_file_stripe_address(int fd, loff_t offset, vector<entity_addr_t>& address);
 
   // expose osdmap 
   int get_local_osd();
index 4b2b64f49c539ea2b0a338edc8dbd2062190e36f..f4d4313e30e10ded49ff9f8b3730b775693b5e38 100644 (file)
@@ -156,8 +156,8 @@ int ceph_lsetxattr(struct ceph_mount_info *cmount, const char *path, const char
 int ceph_get_file_stripe_unit(struct ceph_mount_info *cmount, int fh);
 int ceph_get_file_pool(struct ceph_mount_info *cmount, int fh);
 int ceph_get_file_replication(struct ceph_mount_info *cmount, int fh);
-int ceph_get_file_stripe_address(struct ceph_mount_info *cmount, int fd,
-                                loff_t offset, char *buf, int buflen);
+int ceph_get_file_stripe_address(struct ceph_mount_info *cmount, int fd, loff_t offset,
+                                struct sockaddr_storage *addr, int naddr);
 
 /* set default layout for new files */
 int ceph_set_default_file_stripe_unit(struct ceph_mount_info *cmount, int stripe);
index 153348cfb51c971208b47311536dcf5850e4243f..974fe3a136ad4e18a3ad0ef9ef63d43949ae03cc 100644 (file)
@@ -584,21 +584,27 @@ extern "C" int ceph_set_default_preferred_pg(struct ceph_mount_info *cmount, int
 }
 
 extern "C" int ceph_get_file_stripe_address(struct ceph_mount_info *cmount, int fh,
-                                           loff_t offset, char *buf, int buflen)
+                                           loff_t offset, struct sockaddr_storage *addr, int naddr)
 {
-  string address;
-  int r = cmount->get_client()->get_file_stripe_address(fh, offset, address);
+  vector<entity_addr_t> address;
+  unsigned i;
+  int r;
+
+  if (naddr < 0)
+    return -EINVAL;
+
+  r = cmount->get_client()->get_file_stripe_address(fh, offset, address);
   if (r < 0)
-    return r; 
-  int len = address.size()+1;
-  if (len > buflen) {
-    if (buflen == 0)
-      return len;
+    return r;
+
+  for (i = 0; i < (unsigned)naddr && i < address.size(); i++)
+    memcpy(&addr[i], &address[i].ss_addr(), sizeof(*addr));
+
+  /* naddr == 0: drop through and return actual size */
+  if (naddr && (address.size() > (unsigned)naddr))
     return -ERANGE;
-  }
-  len = address.copy(buf, len, 0);
-  buf[len] = '\0'; // write a null char to terminate c-style string
-  return 0;
+
+  return address.size();
 }
 
 extern "C" int ceph_localize_reads(struct ceph_mount_info *cmount, int val)