diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2021-03-05 22:12:58 +0100 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2021-03-08 15:30:18 +0100 |
commit | bc0cb663043bb9c67151f88061ff22c53c6883ea (patch) | |
tree | 83c4169623997e81a0d6c7c4eb8fd874de0a448b /lib/format_text | |
parent | a125a3bb505cc2f0374715f850f4c1e02c7d4e3c (diff) | |
download | lvm2-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.c | 17 |
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) { |