]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/ConfigKeyService: dump: print placeholder value for binary blobs 21368/head
authorAbhishek Lekshmanan <abhishek@suse.com>
Fri, 8 Jun 2018 15:41:54 +0000 (17:41 +0200)
committerAbhishek Lekshmanan <abhishek@suse.com>
Fri, 8 Jun 2018 15:48:12 +0000 (17:48 +0200)
JSON cannot express arbitrary binary blobs.  Instead of outputting invalid
and unparseable JSON, represent the value of blobs as something like
'<<< binary blob of length 12 >>>'.

Fixes: http://tracker.ceph.com/issues/23622
Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 4669134b89ee1f7759fb59faef218da0880daa98)

Conflicts:
PendingReleaseNotes: 12.2.6 dropped, will be added in a seperate pr
src/mon/ConfigKeyService.cc (ConfigKeyService::store_dump does not take
            prefix argument in luminous)

src/mon/ConfigKeyService.cc

index 29ae9d959427aa4c38872fddb33607b44b1c6e24..e191f8367c80276d9f7f55c4d8973e269188417a 100644 (file)
@@ -108,6 +108,17 @@ bool ConfigKeyService::store_has_prefix(const string &prefix)
   return false;
 }
 
+static bool is_binary_string(const string& s)
+{
+  for (auto c : s) {
+    // \n and \t are escaped in JSON; other control characters are not.
+    if ((c < 0x20 && c != '\n' && c != '\t') || c >= 0x7f) {
+      return true;
+    }
+  }
+  return false;
+}
+
 void ConfigKeyService::store_dump(stringstream &ss)
 {
   KeyValueDB::Iterator iter =
@@ -117,7 +128,14 @@ void ConfigKeyService::store_dump(stringstream &ss)
   f.open_object_section("config-key store");
 
   while (iter->valid()) {
-    f.dump_string(iter->key().c_str(), iter->value().to_str());
+    string s = iter->value().to_str();
+    if (is_binary_string(s)) {
+      ostringstream ss;
+      ss << "<<< binary blob of length " << s.size() << " >>>";
+      f.dump_string(iter->key().c_str(), ss.str());
+    } else {
+      f.dump_string(iter->key().c_str(), s);
+    }
     iter->next();
   }
   f.close_section();