public inbox for lvm2-cvs@sourceware.org help / color / mirror / Atom feed
From: zkabelac@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2 ./WHATS_NEW lib/metadata/metadata.c Date: Thu, 10 Mar 2011 13:12:00 -0000 [thread overview] Message-ID: <20110310131201.23411.qmail@sourceware.org> (raw) CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2011-03-10 13:12:00 Modified files: . : WHATS_NEW lib/metadata : metadata.c Log message: Use hash tables for validating names Accelerate validation loop by using lvname, lvid, pvid hash tables. Also merge pvl loop into one cycle now - no need to scan the list twice. List scan is stopped when dm_hash_insert fails. The error message with loop_counter1 is no longer provided - however the message has been misleading anyway. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/WHATS_NEW.diff?cvsroot=lvm2&r1=1.1941&r2=1.1942 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/lib/metadata/metadata.c.diff?cvsroot=lvm2&r1=1.438&r2=1.439 --- LVM2/WHATS_NEW 2011/03/10 12:43:30 1.1941 +++ LVM2/WHATS_NEW 2011/03/10 13:11:59 1.1942 @@ -1,5 +1,6 @@ Version 2.02.85 - =================================== + Use hash tables to speedup string search in validate_vg(). Refactor allocation of VG structure, add alloc_vg(). Avoid possible endless loop in _free_vginfo when 4 or more VGs have same name. Use empty string instead of /dev// for LV path when there's no VG. --- LVM2/lib/metadata/metadata.c 2011/03/10 12:43:30 1.438 +++ LVM2/lib/metadata/metadata.c 2011/03/10 13:12:00 1.439 @@ -1,6 +1,6 @@ /* * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved. - * Copyright (C) 2004-2010 Red Hat, Inc. All rights reserved. + * Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved. * * This file is part of LVM2. * @@ -2192,15 +2192,17 @@ int vg_validate(struct volume_group *vg) { - struct pv_list *pvl, *pvl2; - struct lv_list *lvl, *lvl2; + struct pv_list *pvl; + struct lv_list *lvl; struct lv_segment *seg; char uuid[64] __attribute__((aligned(8))); int r = 1; uint32_t hidden_lv_count = 0, lv_count = 0, lv_visible_count = 0; uint32_t pv_count = 0; uint32_t num_snapshots = 0; - uint32_t loop_counter1, loop_counter2; + struct dm_hash_table *lvname_hash; + struct dm_hash_table *lvid_hash; + struct dm_hash_table *pvid_hash; if (vg->alloc == ALLOC_CLING_BY_TAGS) { log_error(INTERNAL_ERROR "VG %s allocation policy set to invalid cling_by_tags.", @@ -2209,50 +2211,53 @@ } /* FIXME Also check there's no data/metadata overlap */ + if (!(pvid_hash = dm_hash_create(vg->pv_count))) { + log_error("Failed to allocate pvid hash."); + return 0; + } + dm_list_iterate_items(pvl, &vg->pvs) { if (++pv_count > vg->pv_count) { log_error(INTERNAL_ERROR "PV list corruption detected in VG %s.", vg->name); /* FIXME Dump list structure? */ r = 0; } + if (pvl->pv->vg != vg) { log_error(INTERNAL_ERROR "VG %s PV list entry points " - "to different VG %s", vg->name, + "to different VG %s.", vg->name, pvl->pv->vg ? pvl->pv->vg->name : "NULL"); r = 0; } - } - - loop_counter1 = loop_counter2 = 0; - /* FIXME Use temp hash table instead? */ - dm_list_iterate_items(pvl, &vg->pvs) { - if (++loop_counter1 > pv_count) - break; - dm_list_iterate_items(pvl2, &vg->pvs) { - if (++loop_counter2 > pv_count) - break; - if (pvl == pvl2) - break; - if (id_equal(&pvl->pv->id, - &pvl2->pv->id)) { - if (!id_write_format(&pvl->pv->id, uuid, - sizeof(uuid))) - stack; - log_error(INTERNAL_ERROR "Duplicate PV id " - "%s detected for %s in %s.", - uuid, pv_dev_name(pvl->pv), - vg->name); - r = 0; - } - } if (strcmp(pvl->pv->vg_name, vg->name)) { log_error(INTERNAL_ERROR "VG name for PV %s is corrupted.", pv_dev_name(pvl->pv)); r = 0; } + + if (dm_hash_lookup_binary(pvid_hash, &pvl->pv->id, + sizeof(pvl->pv->id))) { + if (!id_write_format(&pvl->pv->id, uuid, + sizeof(uuid))) + stack; + log_error(INTERNAL_ERROR "Duplicate PV id " + "%s detected for %s in %s.", + uuid, pv_dev_name(pvl->pv), + vg->name); + r = 0; + } + + if (!dm_hash_insert_binary(pvid_hash, &pvl->pv->id, + sizeof(pvl->pv->id), pvl->pv)) { + log_error("Failed to hash pvid."); + r = 0; + break; + } } + dm_hash_destroy(pvid_hash); + if (!check_pv_segments(vg)) { log_error(INTERNAL_ERROR "PV segments corrupted in %s.", vg->name); @@ -2320,33 +2325,34 @@ if (!r) return r; - loop_counter1 = loop_counter2 = 0; - /* FIXME Use temp hash table instead? */ + if (!(lvname_hash = dm_hash_create(lv_count))) { + log_error("Failed to allocate lv_name hash"); + return 0; + } + + if (!(lvid_hash = dm_hash_create(lv_count))) { + log_error("Failed to allocate uuid hash"); + dm_hash_destroy(lvname_hash); + return 0; + } + dm_list_iterate_items(lvl, &vg->lvs) { - if (++loop_counter1 > lv_count) - break; - dm_list_iterate_items(lvl2, &vg->lvs) { - if (++loop_counter2 > lv_count) - break; - if (lvl == lvl2) - break; - if (!strcmp(lvl->lv->name, lvl2->lv->name)) { - log_error(INTERNAL_ERROR "Duplicate LV name " - "%s detected in %s.", lvl->lv->name, - vg->name); - r = 0; - } - if (id_equal(&lvl->lv->lvid.id[1], - &lvl2->lv->lvid.id[1])) { - if (!id_write_format(&lvl->lv->lvid.id[1], uuid, - sizeof(uuid))) - stack; - log_error(INTERNAL_ERROR "Duplicate LV id " - "%s detected for %s and %s in %s.", - uuid, lvl->lv->name, lvl2->lv->name, - vg->name); - r = 0; - } + if (dm_hash_lookup(lvname_hash, lvl->lv->name)) { + log_error(INTERNAL_ERROR + "Duplicate LV name %s detected in %s.", + lvl->lv->name, vg->name); + r = 0; + } + + if (dm_hash_lookup_binary(lvid_hash, &lvl->lv->lvid.id[1], + sizeof(lvl->lv->lvid.id[1]))) { + if (!id_write_format(&lvl->lv->lvid.id[1], uuid, + sizeof(uuid))) + stack; + log_error(INTERNAL_ERROR "Duplicate LV id " + "%s detected for %s in %s.", + uuid, lvl->lv->name, vg->name); + r = 0; } if (!check_lv_segments(lvl->lv, 1)) { @@ -2354,8 +2360,24 @@ lvl->lv->name); r = 0; } + + if (!dm_hash_insert(lvname_hash, lvl->lv->name, lvl)) { + log_error("Failed to hash lvname."); + r = 0; + break; + } + + if (!dm_hash_insert_binary(lvid_hash, lvl->lv->lvid.id, + sizeof(lvl->lv->lvid.id), lvl->lv)) { + log_error("Failed to hash lvid."); + r = 0; + break; + } } + dm_hash_destroy(lvname_hash); + dm_hash_destroy(lvid_hash); + dm_list_iterate_items(lvl, &vg->lvs) { if (!_lv_postorder(lvl->lv, _lv_validate_references_single, NULL)) r = 0; @@ -2368,14 +2390,14 @@ if (seg_is_mirrored(seg)) { if (seg->area_count != 2) { log_error(INTERNAL_ERROR - "Segment %d in %s is not 2-way.", - loop_counter1, lvl->lv->name); + "Segment in %s is not 2-way.", + lvl->lv->name); r = 0; } } else if (seg->area_count != 1) { log_error(INTERNAL_ERROR - "Segment %d in %s has wrong number of areas: %d.", - loop_counter1, lvl->lv->name, seg->area_count); + "Segment in %s has wrong number of areas: %d.", + lvl->lv->name, seg->area_count); r = 0; } }
next reply other threads:[~2011-03-10 13:12 UTC|newest] Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top 2011-03-10 13:12 zkabelac [this message] -- strict thread matches above, loose matches on Subject: below -- 2012-03-12 14:18 zkabelac 2012-02-23 0:11 agk 2012-02-13 11:01 zkabelac 2012-02-13 10:58 zkabelac 2012-02-13 10:51 zkabelac 2011-11-18 19:28 zkabelac 2011-10-24 10:24 zkabelac 2011-08-11 16:31 prajnoha 2011-08-04 15:18 zkabelac 2011-03-29 21:57 zkabelac 2011-03-11 15:06 prajnoha 2010-12-08 10:45 zkabelac 2010-11-29 11:08 zkabelac 2010-08-19 23:03 mbroz 2010-06-22 21:10 mbroz 2010-05-21 12:45 zkabelac 2010-04-01 11:43 agk 2010-03-02 21:56 snitzer 2010-01-21 21:09 wysochanski 2010-01-05 16:01 mbroz 2009-12-18 12:45 mbroz 2009-12-18 12:44 mbroz 2009-12-11 13:14 zkabelac 2009-12-09 19:29 mbroz 2009-08-20 7:03 mbroz 2009-07-16 3:25 wysochanski 2009-05-27 13:19 agk 2009-05-12 19:09 mbroz 2009-04-22 9:31 mbroz 2009-04-10 9:56 mbroz 2009-01-26 22:43 agk 2008-09-25 15:59 mbroz 2008-06-03 17:56 agk 2008-05-08 18:06 agk 2008-04-07 22:12 agk 2008-04-04 15:41 wysochanski 2007-10-12 18:37 wysochanski 2007-07-02 21:48 wysochanski 2006-09-21 20:25 agk 2006-08-09 19:33 agk 2006-07-04 19:36 agk
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20110310131201.23411.qmail@sourceware.org \ --to=zkabelac@sourceware.org \ --cc=lvm-devel@redhat.com \ --cc=lvm2-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).