Accepting request 222430 from Base:System
fate#315092, improve performance of cluster mirror (forwarded request 222267 from deanraccoon) OBS-URL: https://build.opensuse.org/request/show/222430 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/lvm2?expand=0&rev=63
This commit is contained in:
commit
59dfe7b37a
155
cmirrord_improvment_performance.patch
Normal file
155
cmirrord_improvment_performance.patch
Normal file
@ -0,0 +1,155 @@
|
||||
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)
|
@ -1,3 +1,9 @@
|
||||
-------------------------------------------------------------------
|
||||
Thu Feb 13 06:39:47 UTC 2014 - dmzhang@suse.com
|
||||
|
||||
- fate#315092, improve performance of cluster mirror
|
||||
add cmirrord_improvment_performance.patch
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Wed Feb 12 15:17:05 UTC 2014 - arvidjaar@gmail.com
|
||||
|
||||
|
@ -79,6 +79,9 @@ Patch73: remove-fedora-systemd.patch
|
||||
# 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 @@ Volume Manager.
|
||||
%patch72 -p1
|
||||
%patch73 -p1
|
||||
%patch74 -p1
|
||||
%patch75 -p1
|
||||
|
||||
%build
|
||||
#set path so that thin_check can be found
|
||||
|
Loading…
Reference in New Issue
Block a user