All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 8 of 13] LVM: add logic to allow mirrored log
@ 2010-02-17 17:56 Jonathan Brassow
  2010-02-19  1:41 ` Takahiro Yasui
  2010-02-22  6:08 ` Takahiro Yasui
  0 siblings, 2 replies; 3+ messages in thread
From: Jonathan Brassow @ 2010-02-17 17:56 UTC (permalink / raw)
  To: lvm-devel

Patch name: lvm-add-logic-to-allow-mirrored-log.patch

Insert the couple of lines that adds the logic necessary to
create the mirrored log.

Signed-off-by: Jonathan Brassow <jbrassow@redhat.com>

Index: LVM2/lib/metadata/mirror.c
===================================================================
--- LVM2.orig/lib/metadata/mirror.c
+++ LVM2/lib/metadata/mirror.c
@@ -1592,7 +1592,7 @@ static struct logical_volume *_set_up_mi
 						 struct alloc_handle *ah,
 						 struct logical_volume *lv,
 						 uint32_t log_count,
-						 uint32_t region_size __attribute((unused)),
+						 uint32_t region_size,
 						 alloc_policy_t alloc,
 						 int in_sync)
 {
@@ -1636,6 +1636,12 @@ static struct logical_volume *_set_up_mi
 		return NULL;
 	}
 
+	if ((log_count > 1) &&
+	    !_form_mirror(cmd, ah, log_lv, log_count-1, region_size, 1)) {
+		log_error("Failed to form mirrored log.");
+		return NULL;
+	}
+
 	if (!_init_mirror_log(cmd, log_lv, in_sync, &lv->tags, 1)) {
 		log_error("Failed to initialise mirror log.");
 		return NULL;
Index: LVM2/tools/lvconvert.c
===================================================================
--- LVM2.orig/tools/lvconvert.c
+++ LVM2/tools/lvconvert.c
@@ -647,9 +647,24 @@ static void _lvconvert_mirrors_repair_as
 	}
 }
 
-static int _using_corelog(struct logical_volume *lv)
+/*
+ * _get_log_count
+ * @lv: the mirror LV
+ *
+ * Get the number of on-disk copies of the log.
+ *  0  = 'core'
+ *  1  = 'disk'
+ *  2+ = 'mirrored'
+ */
+static int _get_log_count(struct logical_volume *lv)
 {
-	return !first_seg(_original_lv(lv))->log_lv;
+	struct logical_volume *log_lv;
+
+	log_lv = first_seg(_original_lv(lv))->log_lv;
+	if (!log_lv)
+		return 0;
+
+	return lv_mirror_count(log_lv);
 }
 
 static int _lv_update_log_type(struct cmd_context *cmd,
@@ -657,21 +672,48 @@ static int _lv_update_log_type(struct cm
 			       struct logical_volume *lv,
 			       int log_count)
 {
-	struct logical_volume *original_lv = _original_lv(lv);
-	if (_using_corelog(lv) && log_count) {
+	uint32_t region_size;
+	int old_log_count;
+	struct logical_volume *original_lv;
+	struct logical_volume *log_lv;
+
+	old_log_count = _get_log_count(lv);
+	if (old_log_count == log_count)
+		return 1;
+
+	original_lv = _original_lv(lv);
+	region_size = adjusted_mirror_region_size(lv->vg->extent_size,
+						  lv->le_count,
+						  lp->region_size);
+
+	/* Add a log where there is none */
+	if (!old_log_count) {
 		if (!add_mirror_log(cmd, original_lv, log_count,
-				    adjusted_mirror_region_size(
-					lv->vg->extent_size,
-					lv->le_count,
-					lp->region_size),
-				    lp->pvh, lp->alloc))
+				    region_size, lp->pvh, lp->alloc))
 			return_0;
-	} else if (!_using_corelog(lv) && !log_count) {
+		return 1;
+	}
+
+	/* Remove an existing log completely */
+	if (!log_count) {
 		if (!remove_mirror_log(cmd, original_lv,
 				       lp->pv_count ? lp->pvh : NULL))
 			return_0;
+		return 1;
+	}
+
+	log_lv = first_seg(original_lv)->log_lv;
+
+	/* Adding redundancy to the log */
+	if (old_log_count < log_count) {
+		log_error("Adding log redundancy not supported yet.");
+		log_error("Try converting the log to 'core' first.");
+		return_0;
 	}
-	return 1;
+
+	/* Reducing redundancy of the log */
+	return remove_mirror_images(log_lv, log_count,
+				    lp->pv_count ? lp->pvh : NULL, 1U);
 }
 
 /*
@@ -798,9 +840,15 @@ static int _lvconvert_mirrors(struct cmd
 			return_0;
 		lp->pvh = lp->failed_pvs = failed_pvs;
 		log_lv = first_seg(lv)->log_lv;
-		if (!log_lv || log_lv->status & PARTIAL_LV) {
+		if (!log_lv) {
 			failed_log = 1;
 			log_count = 0;
+		} else {
+			log_count = lv_mirror_count(log_lv);
+			if (log_lv->status & PARTIAL_LV) {
+				failed_log = 1;
+				log_count -= _failed_mirrors_count(log_lv);
+			}
 		}
 	} else {
 		/*
@@ -992,7 +1040,7 @@ static int _lvconvert_mirrors(struct cmd
 	}
 
 	if (lp->mirrors == existing_mirrors) {
-		if (_using_corelog(lv) != !log_count) {
+		if (_get_log_count(lv) != log_count) {
 			if (!_lv_update_log_type(cmd, lp, lv, log_count)) {
 				stack;
 				return failure_code;



^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 8 of 13] LVM: add logic to allow mirrored log
  2010-02-17 17:56 [PATCH 8 of 13] LVM: add logic to allow mirrored log Jonathan Brassow
@ 2010-02-19  1:41 ` Takahiro Yasui
  2010-02-22  6:08 ` Takahiro Yasui
  1 sibling, 0 replies; 3+ messages in thread
From: Takahiro Yasui @ 2010-02-19  1:41 UTC (permalink / raw)
  To: lvm-devel

On 02/17/10 12:56, Jonathan Brassow wrote:
>  /*
> @@ -798,9 +840,15 @@ static int _lvconvert_mirrors(struct cmd
>  			return_0;
>  		lp->pvh = lp->failed_pvs = failed_pvs;
>  		log_lv = first_seg(lv)->log_lv;
> -		if (!log_lv || log_lv->status & PARTIAL_LV) {
> +		if (!log_lv) {
>  			failed_log = 1;
>  			log_count = 0;
> +		} else {
> +			log_count = lv_mirror_count(log_lv);
> +			if (log_lv->status & PARTIAL_LV) {
> +				failed_log = 1;
> +				log_count -= _failed_mirrors_count(log_lv);
> +			}

When log is a "disk" type log and log disk failed, lvconvert --repair
vg00/lv00 doesn't work. In this case, _failed_mirrors_count() returns
"-1" and log_count became "2." (should be "0") I think that we need to
check if its return value is negative.

    if (_failed_mirrors_count(log_lv) < 0)
        log_count = 0;
    else
        log_count -= _failed_mirrors_count(log_lv);


Here is the reproduction steps.

1. create mirror volume with disk log

# lvcreate -m1 -L12m -nlv00 --mirrorlog disk vg00
  Logical volume "lv00" created

2. disable log device

# echo offline > /sys/block/sde/device/state  /* sde is a log device */

3. kill dmeventd

4. Write data

# dd if=/dev/zero of=/dev/vg00/lv00 bs=4096 count=1
<no response>

5. execute lvconvert command.

# lvconvert --config 'devices{ignore_suspended_devices=1}' --repair --use-policies vg00/lv00
  Couldn't find device with uuid 'CAteli-tCjh-3zZ3-yEjl-mcLX-uVff-aRDh7b'.
  Couldn't find device with uuid 'CAteli-tCjh-3zZ3-yEjl-mcLX-uVff-aRDh7b'.
  Mirror status: 0 of 2 images failed.

  Adding log redundancy not supported yet.
  Try converting the log to 'core' first.

Thanks,
Taka



^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 8 of 13] LVM: add logic to allow mirrored log
  2010-02-17 17:56 [PATCH 8 of 13] LVM: add logic to allow mirrored log Jonathan Brassow
  2010-02-19  1:41 ` Takahiro Yasui
@ 2010-02-22  6:08 ` Takahiro Yasui
  1 sibling, 0 replies; 3+ messages in thread
From: Takahiro Yasui @ 2010-02-22  6:08 UTC (permalink / raw)
  To: lvm-devel

Jonathan Brassow wrote:
>  static int _lv_update_log_type(struct cmd_context *cmd,
> @@ -657,21 +672,48 @@ static int _lv_update_log_type(struct cm
>  			       struct logical_volume *lv,
>  			       int log_count)
>  {
...
> +	log_lv = first_seg(original_lv)->log_lv;
> +
> +	/* Adding redundancy to the log */
> +	if (old_log_count < log_count) {
> +		log_error("Adding log redundancy not supported yet.");
> +		log_error("Try converting the log to 'core' first.");
> +		return_0;
>  	}
> -	return 1;
> +
> +	/* Reducing redundancy of the log */
> +	return remove_mirror_images(log_lv, log_count,
> +				    lp->pv_count ? lp->pvh : NULL, 1U);
>  }

Should we pass lp->pvh even if lp->pv_count is 0?

+	return remove_mirror_images(log_lv, log_count, lp->pvh, 1U);

Looking at remove_mirror_images(), the third agrument, removable_pvs,
is used to decide which mirror leg should be removed. When lp->pv_count
is 0, lp->pvh has the list of PVs in the VG (see lvconvert_single())
and the PV list needs to be passed to remove_mirror_images().

This issue is found during tests. When the primary leg of the mirrored
log (e.g. vg00-lv00_mlog_mimage_0) failed, lvconvert --repair vg00/lv00
didn't recover the vg00/lv00.

With the above fix, lvconvert --repair vg00/lv00 worked well when
the primary leg of the mirrored log failed.

Thanks,
Taka



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2010-02-22  6:08 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-17 17:56 [PATCH 8 of 13] LVM: add logic to allow mirrored log Jonathan Brassow
2010-02-19  1:41 ` Takahiro Yasui
2010-02-22  6:08 ` Takahiro Yasui

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.