]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
kv/RocksDBStore: use vector instead of VLA for holding slices
authorKefu Chai <kchai@redhat.com>
Thu, 27 Jul 2017 02:34:43 +0000 (10:34 +0800)
committerKefu Chai <kchai@redhat.com>
Thu, 27 Jul 2017 02:44:50 +0000 (10:44 +0800)
clang complains:

ceph/src/kv/RocksDBStore.cc:611:32: error: variable length array of
non-POD element type
      'rocksdb::Slice'
    rocksdb::Slice value_slices[to_set_bl.buffers().size()];

and i believe GCC will also complains with: -Wvla or -pedantic. as
to_set_bl.buffers().size() is not a const expr at compile time.

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/kv/RocksDBStore.cc

index a58f529a99e7a45196649b7a146711064b8fa375..4902ffe15ba15c853f804f5cbd2ae190a5a9f46d 100644 (file)
@@ -34,15 +34,16 @@ using std::string;
 #undef dout_prefix
 #define dout_prefix *_dout << "rocksdb: "
 
-static rocksdb::SliceParts prepare_sliceparts(const bufferlist &bl, rocksdb::Slice *slices)
+static rocksdb::SliceParts prepare_sliceparts(const bufferlist &bl,
+                                             vector<rocksdb::Slice> *slices)
 {
   unsigned n = 0;
-  for (std::list<buffer::ptr>::const_iterator p = bl.buffers().begin();
-       p != bl.buffers().end(); ++p, ++n) {
-    slices[n].data_ = p->c_str();
-    slices[n].size_ = p->length();
+  for (auto& buf : bl.buffers()) {
+    (*slices)[n].data_ = buf.c_str();
+    (*slices)[n].size_ = buf.length();
+    n++;
   }
-  return rocksdb::SliceParts(slices, n);
+  return rocksdb::SliceParts(slices->data(), slices->size());
 }
 
 //
@@ -608,9 +609,9 @@ void RocksDBStore::RocksDBTransactionImpl::set(
                            to_set_bl.length()));
   } else {
     rocksdb::Slice key_slice(key);
-    rocksdb::Slice value_slices[to_set_bl.buffers().size()];
+    vector<rocksdb::Slice> value_slices(to_set_bl.buffers().size());
     bat.Put(nullptr, rocksdb::SliceParts(&key_slice, 1),
-            prepare_sliceparts(to_set_bl, value_slices));
+            prepare_sliceparts(to_set_bl, &value_slices));
   }
 }
 
@@ -629,9 +630,9 @@ void RocksDBStore::RocksDBTransactionImpl::set(
                            to_set_bl.length()));
   } else {
     rocksdb::Slice key_slice(key);
-    rocksdb::Slice value_slices[to_set_bl.buffers().size()];
+    vector<rocksdb::Slice> value_slices(to_set_bl.buffers().size());
     bat.Put(nullptr, rocksdb::SliceParts(&key_slice, 1),
-            prepare_sliceparts(to_set_bl, value_slices));
+            prepare_sliceparts(to_set_bl, &value_slices));
   }
 }
 
@@ -707,9 +708,9 @@ void RocksDBStore::RocksDBTransactionImpl::merge(
   } else {
     // make a copy
     rocksdb::Slice key_slice(key);
-    rocksdb::Slice value_slices[to_set_bl.buffers().size()];
+    vector<rocksdb::Slice> value_slices(to_set_bl.buffers().size());
     bat.Merge(nullptr, rocksdb::SliceParts(&key_slice, 1),
-              prepare_sliceparts(to_set_bl, value_slices));
+              prepare_sliceparts(to_set_bl, &value_slices));
   }
 }