mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-04 09:18:36 +03:00
Drop cached VG metadata before and after committing changes to it.
This commit is contained in:
parent
adb578238d
commit
581b17def2
@ -1,5 +1,6 @@
|
|||||||
Version 2.02.35 -
|
Version 2.02.35 -
|
||||||
=================================
|
=================================
|
||||||
|
Drop cached VG metadata before and after committing changes to it.
|
||||||
Rename P_global to P_#global.
|
Rename P_global to P_#global.
|
||||||
Don't attempt remote metadata backups of non-clustered VGs. (2.02.29)
|
Don't attempt remote metadata backups of non-clustered VGs. (2.02.29)
|
||||||
Don't store fid in VG metadata cache to avoid clvmd segfault. (2.02.34)
|
Don't store fid in VG metadata cache to avoid clvmd segfault. (2.02.34)
|
||||||
|
@ -121,6 +121,8 @@ int do_command(struct local_client *client, struct clvm_header *msg, int msglen,
|
|||||||
/* P_#global causes a cache refresh */
|
/* P_#global causes a cache refresh */
|
||||||
if (strcmp(lockname, "P_#global") == 0)
|
if (strcmp(lockname, "P_#global") == 0)
|
||||||
do_refresh_cache();
|
do_refresh_cache();
|
||||||
|
else if (strncmp(lockname, "P_", 2) == 0)
|
||||||
|
lvmcache_drop_metadata(lockname + 2);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
10
lib/cache/lvmcache.c
vendored
10
lib/cache/lvmcache.c
vendored
@ -130,6 +130,16 @@ static void _update_cache_lock_state(const char *vgname, int locked)
|
|||||||
_update_cache_vginfo_lock_state(vginfo, locked);
|
_update_cache_vginfo_lock_state(vginfo, locked);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lvmcache_drop_metadata(const char *vgname)
|
||||||
|
{
|
||||||
|
struct lvmcache_vginfo *vginfo;
|
||||||
|
|
||||||
|
if (!(vginfo = vginfo_from_vgname(vgname, NULL)))
|
||||||
|
return;
|
||||||
|
|
||||||
|
_free_cached_vgmetadata(vginfo);
|
||||||
|
}
|
||||||
|
|
||||||
void lvmcache_lock_vgname(const char *vgname, int read_only __attribute((unused)))
|
void lvmcache_lock_vgname(const char *vgname, int read_only __attribute((unused)))
|
||||||
{
|
{
|
||||||
if (!_lock_hash && !lvmcache_init()) {
|
if (!_lock_hash && !lvmcache_init()) {
|
||||||
|
1
lib/cache/lvmcache.h
vendored
1
lib/cache/lvmcache.h
vendored
@ -111,5 +111,6 @@ struct list *lvmcache_get_pvids(struct cmd_context *cmd, const char *vgname,
|
|||||||
|
|
||||||
/* Returns cached volume group metadata. */
|
/* Returns cached volume group metadata. */
|
||||||
struct volume_group *lvmcache_get_vg(const char *vgid, unsigned precommitted);
|
struct volume_group *lvmcache_get_vg(const char *vgid, unsigned precommitted);
|
||||||
|
void lvmcache_drop_metadata(const char *vgname);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -389,7 +389,7 @@ int lock_resource(struct cmd_context *cmd, const char *resource, uint32_t flags)
|
|||||||
/* If the VG name is empty then lock the unused PVs */
|
/* If the VG name is empty then lock the unused PVs */
|
||||||
if (!*resource) /* FIXME Deprecated */
|
if (!*resource) /* FIXME Deprecated */
|
||||||
dm_snprintf(lockname, sizeof(lockname), "P_orphans");
|
dm_snprintf(lockname, sizeof(lockname), "P_orphans");
|
||||||
else if (*resource == '#')
|
else if (*resource == '#' || (flags & LCK_CACHE))
|
||||||
dm_snprintf(lockname, sizeof(lockname), "P_%s", resource);
|
dm_snprintf(lockname, sizeof(lockname), "P_%s", resource);
|
||||||
else
|
else
|
||||||
dm_snprintf(lockname, sizeof(lockname), "V_%s",
|
dm_snprintf(lockname, sizeof(lockname), "V_%s",
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "defaults.h"
|
#include "defaults.h"
|
||||||
#include "lvm-file.h"
|
#include "lvm-file.h"
|
||||||
#include "lvm-string.h"
|
#include "lvm-string.h"
|
||||||
|
#include "lvmcache.h"
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@ -209,6 +210,10 @@ static int _file_lock_resource(struct cmd_context *cmd, const char *resource,
|
|||||||
|
|
||||||
switch (flags & LCK_SCOPE_MASK) {
|
switch (flags & LCK_SCOPE_MASK) {
|
||||||
case LCK_VG:
|
case LCK_VG:
|
||||||
|
if (flags & LCK_CACHE) {
|
||||||
|
lvmcache_drop_metadata(resource);
|
||||||
|
break;
|
||||||
|
}
|
||||||
if (!*resource) /* FIXME Deprecated */
|
if (!*resource) /* FIXME Deprecated */
|
||||||
dm_snprintf(lockfile, sizeof(lockfile),
|
dm_snprintf(lockfile, sizeof(lockfile),
|
||||||
"%s/P_orphans", _lock_dir);
|
"%s/P_orphans", _lock_dir);
|
||||||
|
@ -324,7 +324,8 @@ static int _lock_vol(struct cmd_context *cmd, const char *resource, uint32_t fla
|
|||||||
assert(resource);
|
assert(resource);
|
||||||
|
|
||||||
if ((ret = _locking.lock_resource(cmd, resource, flags))) {
|
if ((ret = _locking.lock_resource(cmd, resource, flags))) {
|
||||||
if ((flags & LCK_SCOPE_MASK) == LCK_VG) {
|
if ((flags & LCK_SCOPE_MASK) == LCK_VG &&
|
||||||
|
!(flags & LCK_CACHE)) {
|
||||||
if ((flags & LCK_TYPE_MASK) == LCK_UNLOCK)
|
if ((flags & LCK_TYPE_MASK) == LCK_UNLOCK)
|
||||||
lvmcache_unlock_vgname(resource);
|
lvmcache_unlock_vgname(resource);
|
||||||
else
|
else
|
||||||
|
@ -69,6 +69,7 @@ int check_lvm1_vg_inactive(struct cmd_context *cmd, const char *vgname);
|
|||||||
#define LCK_HOLD 0x00000020U /* Hold lock when lock_vol returns? */
|
#define LCK_HOLD 0x00000020U /* Hold lock when lock_vol returns? */
|
||||||
#define LCK_LOCAL 0x00000040U /* Don't propagate to other nodes */
|
#define LCK_LOCAL 0x00000040U /* Don't propagate to other nodes */
|
||||||
#define LCK_CLUSTER_VG 0x00000080U /* VG is clustered */
|
#define LCK_CLUSTER_VG 0x00000080U /* VG is clustered */
|
||||||
|
#define LCK_CACHE 0x00000100U /* Operation on cache using P_ lock */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Additional lock bits for cluster communication
|
* Additional lock bits for cluster communication
|
||||||
@ -91,6 +92,7 @@ int check_lvm1_vg_inactive(struct cmd_context *cmd, const char *vgname);
|
|||||||
#define LCK_VG_READ (LCK_VG | LCK_READ | LCK_HOLD)
|
#define LCK_VG_READ (LCK_VG | LCK_READ | LCK_HOLD)
|
||||||
#define LCK_VG_WRITE (LCK_VG | LCK_WRITE | LCK_HOLD)
|
#define LCK_VG_WRITE (LCK_VG | LCK_WRITE | LCK_HOLD)
|
||||||
#define LCK_VG_UNLOCK (LCK_VG | LCK_UNLOCK)
|
#define LCK_VG_UNLOCK (LCK_VG | LCK_UNLOCK)
|
||||||
|
#define LCK_VG_DROP_CACHE (LCK_VG | LCK_WRITE | LCK_CACHE)
|
||||||
|
|
||||||
#define LCK_LV_EXCLUSIVE (LCK_LV | LCK_EXCL | LCK_NONBLOCK)
|
#define LCK_LV_EXCLUSIVE (LCK_LV | LCK_EXCL | LCK_NONBLOCK)
|
||||||
#define LCK_LV_SUSPEND (LCK_LV | LCK_WRITE | LCK_NONBLOCK)
|
#define LCK_LV_SUSPEND (LCK_LV | LCK_WRITE | LCK_NONBLOCK)
|
||||||
@ -116,6 +118,8 @@ int check_lvm1_vg_inactive(struct cmd_context *cmd, const char *vgname);
|
|||||||
lock_lv_vol(cmd, lv, LCK_LV_ACTIVATE | LCK_HOLD | LCK_LOCAL)
|
lock_lv_vol(cmd, lv, LCK_LV_ACTIVATE | LCK_HOLD | LCK_LOCAL)
|
||||||
#define deactivate_lv_local(cmd, lv) \
|
#define deactivate_lv_local(cmd, lv) \
|
||||||
lock_lv_vol(cmd, lv, LCK_LV_DEACTIVATE | LCK_LOCAL)
|
lock_lv_vol(cmd, lv, LCK_LV_DEACTIVATE | LCK_LOCAL)
|
||||||
|
#define drop_cached_metadata(vg) \
|
||||||
|
lock_vol((vg)->cmd, (vg)->name, LCK_VG_DROP_CACHE)
|
||||||
|
|
||||||
/* Process list of LVs */
|
/* Process list of LVs */
|
||||||
int suspend_lvs(struct cmd_context *cmd, struct list *lvs);
|
int suspend_lvs(struct cmd_context *cmd, struct list *lvs);
|
||||||
|
@ -1333,6 +1333,11 @@ int vg_commit(struct volume_group *vg)
|
|||||||
return cache_updated;
|
return cache_updated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!drop_cached_metadata(vg)) {
|
||||||
|
log_error("Unable to drop cached metadata for VG %s.", vg->name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Commit to each copy of the metadata area */
|
/* Commit to each copy of the metadata area */
|
||||||
list_iterate_items(mda, &vg->fid->metadata_areas) {
|
list_iterate_items(mda, &vg->fid->metadata_areas) {
|
||||||
failed = 0;
|
failed = 0;
|
||||||
@ -1348,6 +1353,10 @@ int vg_commit(struct volume_group *vg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!drop_cached_metadata(vg))
|
||||||
|
log_error("Attempt to drop cached metadata failed "
|
||||||
|
"after commit for VG %s.", vg->name);
|
||||||
|
|
||||||
/* If at least one mda commit succeeded, it was committed */
|
/* If at least one mda commit succeeded, it was committed */
|
||||||
return cache_updated;
|
return cache_updated;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user