[lvm-devel] master - lvmetad: more reuse precommit buffer

Zdenek Kabelac zkabelac at fedoraproject.org
Sat Mar 1 13:24:46 UTC 2014


Gitweb:        http://git.fedorahosted.org/git/?p=lvm2.git;a=commitdiff;h=090e81281fbf88bf27ee6930dfaf03cd48aade88
Commit:        090e81281fbf88bf27ee6930dfaf03cd48aade88
Parent:        bda98c4b8dcd17d27c582fe6e2bc2d3c2742d4d7
Author:        Zdenek Kabelac <zkabelac at redhat.com>
AuthorDate:    Fri Feb 28 22:40:00 2014 +0100
Committer:     Zdenek Kabelac <zkabelac at redhat.com>
CommitterDate: Sat Mar 1 14:08:58 2014 +0100

lvmetad: more reuse precommit buffer

This patch moves more allocation to vg_write
(as started in 8c878438f5a75310d09a1ee035d9caf8e2b9e50b)
TODO: relocate also communication.
(in-release update)
---
 lib/cache/lvmetad.c     |   10 +++++-----
 lib/metadata/metadata.c |   38 +++++++++++++++++++++++++++-----------
 lib/metadata/vg.c       |    2 ++
 lib/metadata/vg.h       |    3 ++-
 4 files changed, 36 insertions(+), 17 deletions(-)

diff --git a/lib/cache/lvmetad.c b/lib/cache/lvmetad.c
index c994874..600fc19 100644
--- a/lib/cache/lvmetad.c
+++ b/lib/cache/lvmetad.c
@@ -468,7 +468,6 @@ int lvmetad_vg_update(struct volume_group *vg)
 	struct pv_list *pvl;
 	struct lvmcache_info *info;
 	struct _fixup_baton baton;
-	struct dm_config_tree *vgmeta;
 
 	if (!vg)
 		return 0;
@@ -476,13 +475,14 @@ int lvmetad_vg_update(struct volume_group *vg)
 	if (!lvmetad_active() || test_mode())
 		return 1; /* fake it */
 
-	if (!(vgmeta = export_vg_to_config_tree(vg)))
-		return_0;
+	if (!vg->cft_precommitted) {
+		log_error(INTERNAL_ERROR "VG update without precommited");
+		return 0;
+	}
 
 	log_debug_lvmetad("Sending lvmetad updated metadata for VG %s (seqno %" PRIu32 ")", vg->name, vg->seqno);
 	reply = _lvmetad_send("vg_update", "vgname = %s", vg->name,
-			      "metadata = %t", vgmeta, NULL);
-	dm_config_destroy(vgmeta);
+			      "metadata = %t", vg->cft_precommitted, NULL);
 
 	if (!_lvmetad_handle_reply(reply, "update VG", vg->name, NULL)) {
 		daemon_reply_destroy(reply);
diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
index 8643b75..278b519 100644
--- a/lib/metadata/metadata.c
+++ b/lib/metadata/metadata.c
@@ -864,20 +864,24 @@ int vgcreate_params_validate(struct cmd_context *cmd,
  */
 static int _vg_update_vg_precommitted(struct volume_group *vg)
 {
-	struct dm_config_tree *cft;
-
 	release_vg(vg->vg_precommitted);
 	vg->vg_precommitted = NULL;
 
-	if (!(cft = export_vg_to_config_tree(vg)))
-		return_0;
+	if (vg->cft_precommitted) {
+		dm_config_destroy(vg->cft_precommitted);
+		vg->cft_precommitted = NULL;
+	}
 
-	if (!(vg->vg_precommitted = import_vg_from_config_tree(cft, vg->fid)))
-		stack;
+	if (!(vg->cft_precommitted = export_vg_to_config_tree(vg)))
+		return_0;
 
-	dm_config_destroy(cft);
+	if (!(vg->vg_precommitted = import_vg_from_config_tree(vg->cft_precommitted, vg->fid))) {
+		dm_config_destroy(vg->cft_precommitted);
+		vg->cft_precommitted = NULL;
+		return_0;
+	}
 
-	return vg->vg_precommitted ? 1 : 0;
+	return 1;
 }
 
 static int _vg_update_vg_ondisk(struct volume_group *vg)
@@ -893,6 +897,10 @@ static int _vg_update_vg_ondisk(struct volume_group *vg)
 
 	vg->vg_ondisk = vg->vg_precommitted;
 	vg->vg_precommitted = NULL;
+	if (vg->cft_precommitted) {
+		dm_config_destroy(vg->cft_precommitted);
+		vg->cft_precommitted = NULL;
+	}
 
 	return 1;
 }
@@ -2695,6 +2703,9 @@ int vg_write(struct volume_group *vg)
 		}
 	}
 
+	if (!_vg_update_vg_precommitted(vg)) /* prepare precommited */
+		return_0;
+
 	/*
 	 * If precommit is not supported, changes take effect immediately.
 	 * FIXME Replace with a more-accurate FMT_COMMIT flag.
@@ -2702,9 +2713,6 @@ int vg_write(struct volume_group *vg)
 	if (!(vg->fid->fmt->features & FMT_PRECOMMIT) && !lvmetad_vg_update(vg))
 		return_0;
 
-	if (!_vg_update_vg_precommitted(vg)) /* prepare precommited */
-		return_0;
-
 	return 1;
 }
 
@@ -2773,6 +2781,10 @@ int vg_commit(struct volume_group *vg)
 		release_vg(vg->vg_ondisk);
 		vg->vg_ondisk = vg->vg_precommitted;
 		vg->vg_precommitted = NULL;
+		if (vg->cft_precommitted) {
+			dm_config_destroy(vg->cft_precommitted);
+			vg->cft_precommitted = NULL;
+		}
 	}
 
 	/* If update failed, remove any cached precommitted metadata. */
@@ -2791,6 +2803,10 @@ void vg_revert(struct volume_group *vg)
 
 	release_vg(vg->vg_precommitted);  /* VG is no longer needed */
 	vg->vg_precommitted = NULL;
+	if (vg->cft_precommitted) {
+		dm_config_destroy(vg->cft_precommitted);
+		vg->cft_precommitted = NULL;
+	}
 
 	dm_list_iterate_items(mda, &vg->fid->metadata_areas_in_use) {
 		if (mda->ops->vg_revert &&
diff --git a/lib/metadata/vg.c b/lib/metadata/vg.c
index 8f23d56..8ebec99 100644
--- a/lib/metadata/vg.c
+++ b/lib/metadata/vg.c
@@ -90,6 +90,8 @@ void release_vg(struct volume_group *vg)
 
 	release_vg(vg->vg_ondisk);
 	release_vg(vg->vg_precommitted);
+	if (vg->cft_precommitted)
+		dm_config_destroy(vg->cft_precommitted);
 	_free_vg(vg);
 }
 
diff --git a/lib/metadata/vg.h b/lib/metadata/vg.h
index 028471b..b3b7e93 100644
--- a/lib/metadata/vg.h
+++ b/lib/metadata/vg.h
@@ -57,7 +57,8 @@ struct volume_group {
 	 * _vg_update_vg_ondisk.
 	 */
 	struct volume_group *vg_ondisk;
-	struct volume_group *vg_precommitted; /* Parsed from precommitted */
+	struct dm_config_tree *cft_precommitted; /* Precommitted metadata */
+	struct volume_group *vg_precommitted; /* Parsed from cft */
 
 	alloc_policy_t alloc;
 	struct profile *profile;




More information about the lvm-devel mailing list