]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
objecter: return ENOENT/EEXIST on pool snap delete/create
authorSage Weil <sage@inktank.com>
Mon, 23 Jul 2012 23:01:14 +0000 (16:01 -0700)
committerSage Weil <sage@inktank.com>
Fri, 27 Jul 2012 17:43:26 +0000 (10:43 -0700)
Do these checks on the client to mask monitor idempotency from the user.

Signed-off-by: Sage Weil <sage@inktank.com>
src/osdc/Objecter.cc

index 9ebc22b53137b0f4725ee22c12664750df14ec14..eeed06173ee2af1fc6874f4a3591db81993b04dd 100644 (file)
@@ -1480,14 +1480,22 @@ void Objecter::_list_reply(ListContext *list_context, int r, bufferlist *bl,
 
 //snapshots
 
-int Objecter::create_pool_snap(int64_t pool, string& snapName, Context *onfinish) {
-  ldout(cct, 10) << "create_pool_snap; pool: " << pool << "; snap: " << snapName << dendl;
+int Objecter::create_pool_snap(int64_t pool, string& snap_name, Context *onfinish)
+{
+  ldout(cct, 10) << "create_pool_snap; pool: " << pool << "; snap: " << snap_name << dendl;
+
+  const pg_pool_t *p = osdmap->get_pg_pool(pool);
+  if (!p)
+    return -EINVAL;
+  if (p->snap_exists(snap_name.c_str()))
+    return -EEXIST;
+
   PoolOp *op = new PoolOp;
   if (!op)
     return -ENOMEM;
   op->tid = ++last_tid;
   op->pool = pool;
-  op->name = snapName;
+  op->name = snap_name;
   op->onfinish = onfinish;
   op->pool_op = POOL_OP_CREATE_SNAP;
   pool_ops[op->tid] = op;
@@ -1530,15 +1538,22 @@ int Objecter::allocate_selfmanaged_snap(int64_t pool, snapid_t *psnapid,
   return 0;
 }
 
-int Objecter::delete_pool_snap(int64_t pool, string& snapName, Context *onfinish)
+int Objecter::delete_pool_snap(int64_t pool, string& snap_name, Context *onfinish)
 {
-  ldout(cct, 10) << "delete_pool_snap; pool: " << pool << "; snap: " << snapName << dendl;
+  ldout(cct, 10) << "delete_pool_snap; pool: " << pool << "; snap: " << snap_name << dendl;
+
+  const pg_pool_t *p = osdmap->get_pg_pool(pool);
+  if (!p)
+    return -EINVAL;
+  if (!p->snap_exists(snap_name.c_str()))
+    return -ENOENT;
+
   PoolOp *op = new PoolOp;
   if (!op)
     return -ENOMEM;
   op->tid = ++last_tid;
   op->pool = pool;
-  op->name = snapName;
+  op->name = snap_name;
   op->onfinish = onfinish;
   op->pool_op = POOL_OP_DELETE_SNAP;
   pool_ops[op->tid] = op;