summaryrefslogtreecommitdiff
path: root/lib/format_text
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2021-03-05 22:12:58 +0100
committerZdenek Kabelac <zkabelac@redhat.com>2021-03-08 15:30:18 +0100
commitbc0cb663043bb9c67151f88061ff22c53c6883ea (patch)
tree83c4169623997e81a0d6c7c4eb8fd874de0a448b /lib/format_text
parenta125a3bb505cc2f0374715f850f4c1e02c7d4e3c (diff)
downloadlvm2-bc0cb663043bb9c67151f88061ff22c53c6883ea.tar.gz
vg_write: optimize caching of precommitted VG
Every vg_write stores new 'metadata' into precommitted slot. For this step we use 'serialized buffer' to ascii metadata. Instead of recreating this buffer after whole 'vg_write()' we use this buffer instantly for creating of precommitted VG. This has also the advantage of catching any problems with reparsing of ascii metadata back to VG early before any write.
Diffstat (limited to 'lib/format_text')
-rw-r--r--lib/format_text/format-text.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index e8533d5dc..bf1b9b3a4 100644
--- a/lib/format_text/format-text.c
+++ b/lib/format_text/format-text.c
@@ -28,6 +28,7 @@
#include "lib/mm/xlate.h"
#include "lib/label/label.h"
#include "lib/cache/lvmcache.h"
+#include "libdaemon/client/config-util.h"
#include <unistd.h>
#include <limits.h>
@@ -579,6 +580,7 @@ static int _vg_write_raw(struct format_instance *fid, struct volume_group *vg,
struct metadata_area *mda)
{
char desc[2048];
+ struct dm_config_tree *cft;
struct mda_context *mdac = (struct mda_context *) mda->metadata_locn;
struct text_fid_context *fidtc = (struct text_fid_context *) fid->private;
struct raw_locn *rlocn_old;
@@ -662,6 +664,21 @@ static int _vg_write_raw(struct format_instance *fid, struct volume_group *vg,
fidtc->write_buf = write_buf;
fidtc->write_buf_size = write_buf_size;
fidtc->new_metadata_size = new_size;
+
+ /* Immediatelly reuse existing buffer for parsing metadata back.
+ * Such VG is then used for as precommitted VG and later committed VG.
+ *
+ * 'Lazy' creation of such VG might improve performance, but we
+ * lose important validation that written metadata can be parsed. */
+ if (!(cft = config_tree_from_string_without_dup_node_check(write_buf))) {
+ log_error("Error parsing metadata for VG %s.", vg->name);
+ goto out;
+ }
+ release_vg(vg->vg_precommitted);
+ vg->vg_precommitted = import_vg_from_config_tree(vg->cmd, vg->fid, cft);
+ dm_config_destroy(cft);
+ if (!vg->vg_precommitted)
+ goto_out;
}
if (!new_size || !write_buf) {