Whamcloud - gitweb
LU-1187 tests: Fixes in test-framework for DNE
[fs/lustre-release.git] / lustre / osp / osp_object.c
index 89bbf9f..d94b5b9 100644 (file)
@@ -93,7 +93,12 @@ static int osp_declare_attr_set(const struct lu_env *env, struct dt_object *dt,
         *
         * 2) send synchronous truncate RPC with just assigned id
         */
-       LASSERT(attr != NULL);
+
+       /* there are few places in MDD code still passing NULL
+        * XXX: to be fixed soon */
+       if (attr == NULL)
+               RETURN(0);
+
        if (attr->la_valid & LA_SIZE && attr->la_size > 0) {
                LASSERT(!dt_object_exists(dt));
                osp_object_assign_id(env, d, o);
@@ -102,6 +107,11 @@ static int osp_declare_attr_set(const struct lu_env *env, struct dt_object *dt,
                        RETURN(rc);
        }
 
+       if (o->opo_new) {
+               /* no need in logging for new objects being created */
+               RETURN(0);
+       }
+
        if (!(attr->la_valid & (LA_UID | LA_GID)))
                RETURN(0);
 
@@ -126,6 +136,15 @@ static int osp_attr_set(const struct lu_env *env, struct dt_object *dt,
        if (!(attr->la_valid & (LA_UID | LA_GID)))
                RETURN(0);
 
+       /* new object, the very first ->attr_set()
+        * initializing attributes needs no logging
+        * all subsequent one are subject to the
+        * logging and synchronization with OST */
+       if (o->opo_new) {
+               o->opo_new = 0;
+               RETURN(0);
+       }
+
        /*
         * once transaction is committed put proper command on
         * the queue going to our OST
@@ -152,13 +171,22 @@ static int osp_declare_object_create(const struct lu_env *env,
 
        ENTRY;
 
+       /* should happen to non-0 OSP only so that at least one object
+        * has been already declared in the scenario and LOD should
+        * cleanup that */
+       if (OBD_FAIL_CHECK(OBD_FAIL_MDS_OSC_CREATE_FAIL) && d->opd_index == 1)
+               RETURN(-ENOSPC);
+
        LASSERT(d->opd_last_used_file);
        fid = lu_object_fid(&dt->do_lu);
 
        /*
         * There can be gaps in precreated ids and record to unlink llog
+        * XXX: we do not handle gaps yet, implemented before solution
+        *      was found to be racy, so we disabled that. there is no
+        *      point in making useless but expensive llog declaration.
         */
-       rc = osp_sync_declare_add(env, o, MDS_UNLINK64_REC, th);
+       /* rc = osp_sync_declare_add(env, o, MDS_UNLINK64_REC, th); */
 
        if (unlikely(!fid_is_zero(fid))) {
                /* replay case: caller knows fid */
@@ -252,10 +280,17 @@ static int osp_object_create(const struct lu_env *env, struct dt_object *dt,
                }
        }
 
+       /* new object, the very first ->attr_set()
+        * initializing attributes needs no logging */
+       o->opo_new = 1;
+
        osp_objid_buf_prep(osi, d, d->opd_index);
        rc = dt_record_write(env, d->opd_last_used_file, &osi->osi_lb,
                             &osi->osi_off, th);
 
+       CDEBUG(D_HA, "%s: Wrote last used ID: "LPU64": %d\n",
+              d->opd_obd->obd_name, le64_to_cpu(d->opd_last_used_id), rc);
+
        RETURN(rc);
 }