[patch RFC] client: return stripe address replicas

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The patch below is a first attempt at updating the libcephfs API to return replica locations. I wanted to get opinions on the interface. The short version of the patch is the API changes:

Client.h: returns vector of entity_addr_t
  -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)

libcephfs.h: returns array of sockaddr_storage
  int ceph_get_file_stripe_address(struct ceph_mount_info *cmount, int fd,
  -				 loff_t offset, char *buf, int buflen);
  +				 loff_t offset, struct sockaddr_storage *addr, int naddr);

Thanks,
Noah

=========================================================

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.
---
 src/client/Client.cc           |   17 +++++++----------
 src/client/Client.h            |    2 +-
 src/include/cephfs/libcephfs.h |    2 +-
 src/libcephfs.cc               |   28 +++++++++++++++-------------
 4 files changed, 24 insertions(+), 25 deletions(-)

diff --git a/src/client/Client.cc b/src/client/Client.cc
index 816fe83..1f01b80 100644
--- a/src/client/Client.cc
+++ b/src/client/Client.cc
@@ -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;
 }
 
diff --git a/src/client/Client.h b/src/client/Client.h
index bc98ac5..a30b73c 100644
--- a/src/client/Client.h
+++ b/src/client/Client.h
@@ -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();
diff --git a/src/include/cephfs/libcephfs.h b/src/include/cephfs/libcephfs.h
index 4b2b64f..6a4a20b 100644
--- a/src/include/cephfs/libcephfs.h
+++ b/src/include/cephfs/libcephfs.h
@@ -157,7 +157,7 @@ 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);
+				 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);
diff --git a/src/libcephfs.cc b/src/libcephfs.cc
index 153348c..378ce7e 100644
--- a/src/libcephfs.cc
+++ b/src/libcephfs.cc
@@ -584,21 +584,23 @@ 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 -ERANGE;
-  }
-  len = address.copy(buf, len, 0);
-  buf[len] = '\0'; // write a null char to terminate c-style string
-  return 0;
+    return r;
+
+  for (i = 0; i < (unsigned)naddr && i < address.size(); i++)
+    memcpy(&addr[i], &address[i].ss_addr(), sizeof(*addr));
+
+  return address.size();
 }
 
 extern "C" int ceph_localize_reads(struct ceph_mount_info *cmount, int val)
-- 
1.7.1
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux