Hello community,

here is the log from the commit of package lvm2 for openSUSE:Factory checked in 
at 2014-02-17 07:18:24
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/lvm2 (Old)
 and      /work/SRC/openSUSE:Factory/.lvm2.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "lvm2"

Changes:
--------
--- /work/SRC/openSUSE:Factory/lvm2/lvm2.changes        2014-02-13 
15:01:53.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.lvm2.new/lvm2.changes   2014-02-17 
07:18:25.000000000 +0100
@@ -1,0 +2,6 @@
+Thu Feb 13 06:39:47 UTC 2014 - dmzh...@suse.com
+
+- fate#315092, improve performance of cluster mirror
+  add cmirrord_improvment_performance.patch
+
+-------------------------------------------------------------------

New:
----
  cmirrord_improvment_performance.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ lvm2.spec ++++++
--- /var/tmp/diff_new_pack.TOWsjM/_old  2014-02-17 07:18:26.000000000 +0100
+++ /var/tmp/diff_new_pack.TOWsjM/_new  2014-02-17 07:18:26.000000000 +0100
@@ -79,6 +79,9 @@
 # bnc#862076
 Patch74:        autoactivate-lvmetad-with-generator.patch
 
+#fate#315092
+Patch75:        cmirrord_improvment_performance.patch
+
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
 # Not a real replacement but we drop evms
 Provides:       evms = 2.5.5
@@ -118,6 +121,7 @@
 %patch72 -p1
 %patch73 -p1
 %patch74 -p1
+%patch75 -p1
 
 %build
 #set path so that thin_check can be found


++++++ cmirrord_improvment_performance.patch ++++++
diff --git a/daemons/cmirrord/cluster.c b/daemons/cmirrord/cluster.c
index fea739a..aa35f62 100644
--- a/daemons/cmirrord/cluster.c
+++ b/daemons/cmirrord/cluster.c
@@ -353,6 +353,10 @@ static int handle_cluster_response(struct clog_cpg *entry,
        /* FIXME: Ensure memcpy cannot explode */
        memcpy(orig_rq, rq, sizeof(*rq) + rq->u_rq.data_size);
 
+       /* make sure the response of DM_ULOG_FLUSH has no payload */
+       if (orig_rq->u_rq.request_type == DM_ULOG_FLUSH)
+               orig_rq->u_rq.data_size = 0;
+
        r = kernel_send(&orig_rq->u_rq);
        if (r)
                LOG_ERROR("Failed to send response to kernel");
diff --git a/daemons/cmirrord/functions.c b/daemons/cmirrord/functions.c
index f6e0918..c1c3538 100644
--- a/daemons/cmirrord/functions.c
+++ b/daemons/cmirrord/functions.c
@@ -362,7 +362,7 @@ static int find_disk_path(char *major_minor_str, char 
*path_rtn, int *unlink_pat
        // return r ? -errno : 0;
 }
 
-static int _clog_ctr(char *uuid, uint64_t luid,
+static int _clog_ctr(char *uuid, uint64_t luid, uint32_t version,
                     int argc, char **argv, uint64_t device_size)
 {
        int i;
@@ -431,6 +431,8 @@ static int _clog_ctr(char *uuid, uint64_t luid,
                        log_sync = NOSYNC;
                else if (!strcmp(argv[i], "block_on_error"))
                        block_on_error = 1;
+               else if (!strcmp(argv[i], "integrated_flush") && version > 2)
+                       LOG_PRINT("support integrated_flush");
        }
 
        lc = dm_zalloc(sizeof(*lc));
@@ -594,7 +596,7 @@ static int clog_ctr(struct dm_ulog_request *rq)
                return -EINVAL;
        }
 
-       r = _clog_ctr(rq->uuid, rq->luid, argc - 1, argv + 1, device_size);
+       r = _clog_ctr(rq->uuid, rq->luid, rq->version, argc - 1, argv + 1, 
device_size);
 
        /* We join the CPG when we resume */
 
@@ -1026,12 +1028,14 @@ static int clog_in_sync(struct dm_ulog_request *rq)
        return 0;
 }
 
+static int _clog_mark_region(struct log_c * lc, struct dm_ulog_request *rq, 
uint32_t originator);
+
 /*
  * clog_flush
  * @rq
  *
  */
-static int clog_flush(struct dm_ulog_request *rq, int server)
+static int clog_flush(struct dm_ulog_request *rq, uint32_t originator, int 
server)
 {
        int r = 0;
        struct log_c *lc = get_log(rq->uuid, rq->luid);
@@ -1042,6 +1046,15 @@ static int clog_flush(struct dm_ulog_request *rq, int 
server)
        if (!lc->touched)
                return 0;
 
+       /* flush has payload to mark region */
+       if(rq->data_size) {
+               r = _clog_mark_region(lc, rq, originator);
+               if (r) {
+                       LOG_ERROR("mark region failed in integrated flush");
+                       return r;
+               }
+       }
+
        /*
         * Do the actual flushing of the log only
         * if we are the server.
@@ -1104,25 +1117,11 @@ static int mark_region(struct log_c *lc, uint64_t 
region, uint32_t who)
        return 0;
 }
 
-/*
- * clog_mark_region
- * @rq
- *
- * rq may contain more than one mark request.  We
- * can determine the number from the 'data_size' field.
- *
- * Returns: 0 on success, -EXXX on failure
- */
-static int clog_mark_region(struct dm_ulog_request *rq, uint32_t originator)
+static int _clog_mark_region(struct log_c * lc, struct dm_ulog_request *rq, 
uint32_t originator)
 {
        int r;
        int count;
        uint64_t *region;
-       struct log_c *lc = get_log(rq->uuid, rq->luid);
-
-       if (!lc)
-               return -EINVAL;
-
        if (rq->data_size % sizeof(uint64_t)) {
                LOG_ERROR("Bad data size given for mark_region request");
                return -EINVAL;
@@ -1142,6 +1141,25 @@ static int clog_mark_region(struct dm_ulog_request *rq, 
uint32_t originator)
        return 0;
 }
 
+/*
+ * clog_mark_region
+ * @rq
+ *
+ * rq may contain more than one mark request.  We
+ * can determine the number from the 'data_size' field.
+ *
+ * Returns: 0 on success, -EXXX on failure
+ */
+static int clog_mark_region(struct dm_ulog_request *rq, uint32_t originator)
+{
+       struct log_c *lc = get_log(rq->uuid, rq->luid);
+
+       if (!lc)
+               return -EINVAL;
+
+       return _clog_mark_region(lc, rq, originator);
+}
+
 static int clear_region(struct log_c *lc, uint64_t region, uint32_t who)
 {
        int other_matches = 0;
@@ -1673,7 +1691,7 @@ int do_request(struct clog_request *rq, int server)
                r = clog_in_sync(&rq->u_rq);
                break;
        case DM_ULOG_FLUSH:
-               r = clog_flush(&rq->u_rq, server);
+               r = clog_flush(&rq->u_rq, rq->originator, server);
                break;
        case DM_ULOG_MARK_REGION:
                r = clog_mark_region(&rq->u_rq, rq->originator);
diff --git a/libdm/libdm-deptree.c b/libdm/libdm-deptree.c
index 752a44b..fb78cb6 100644
--- a/libdm/libdm-deptree.c
+++ b/libdm/libdm-deptree.c
@@ -2164,6 +2164,10 @@ static int _mirror_emit_segment_line(struct dm_task 
*dmt, struct load_segment *s
        if (block_on_error)
                EMIT_PARAMS(pos, " block_on_error");
 
+       /* for cluster raid1, use integrated flush to improve performance */
+       if (dm_log_userspace)
+               EMIT_PARAMS(pos, " integrated_flush");
+
        EMIT_PARAMS(pos, " %u ", seg->mirror_area_count);
 
        if (_emit_areas_line(dmt, seg, params, paramsize, &pos) <= 0)
-- 
To unsubscribe, e-mail: opensuse-commit+unsubscr...@opensuse.org
For additional commands, e-mail: opensuse-commit+h...@opensuse.org

Reply via email to