mirror of
git://sourceware.org/git/lvm2.git
synced 2025-01-04 09:18:36 +03:00
Tidy the clvmd backup code.
Move the backups inside the protection of the VG lock, Don't backup if we have a suspended LV Correct the vg_read() call
This commit is contained in:
parent
ec0b80be6b
commit
8a0a9a93d9
@ -54,6 +54,7 @@ static struct dm_hash_table *lv_hash = NULL;
|
|||||||
static pthread_mutex_t lv_hash_lock;
|
static pthread_mutex_t lv_hash_lock;
|
||||||
static pthread_mutex_t lvm_lock;
|
static pthread_mutex_t lvm_lock;
|
||||||
static char last_error[1024];
|
static char last_error[1024];
|
||||||
|
static int suspended = 0;
|
||||||
|
|
||||||
struct lv_info {
|
struct lv_info {
|
||||||
int lock_id;
|
int lock_id;
|
||||||
@ -340,11 +341,15 @@ int do_lock_lv(unsigned char command, unsigned char lock_flags, char *resource)
|
|||||||
|
|
||||||
case LCK_LV_SUSPEND:
|
case LCK_LV_SUSPEND:
|
||||||
status = do_suspend_lv(resource);
|
status = do_suspend_lv(resource);
|
||||||
|
if (!status)
|
||||||
|
suspended++;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LCK_UNLOCK:
|
case LCK_UNLOCK:
|
||||||
case LCK_LV_RESUME: /* if active */
|
case LCK_LV_RESUME: /* if active */
|
||||||
status = do_resume_lv(resource);
|
status = do_resume_lv(resource);
|
||||||
|
if (!status)
|
||||||
|
suspended--;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LCK_LV_ACTIVATE:
|
case LCK_LV_ACTIVATE:
|
||||||
@ -602,18 +607,21 @@ void init_lvhash()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Backups up the LVM metadata if it's changed */
|
/* Backups up the LVM metadata if it's changed */
|
||||||
void lvm_do_backup(char *vgname)
|
void lvm_do_backup(const char *vgname)
|
||||||
{
|
{
|
||||||
struct volume_group * vg;
|
struct volume_group * vg;
|
||||||
int consistent;
|
int consistent = 0;
|
||||||
|
|
||||||
DEBUGLOG("Triggering backup of VG metadata for %s\n", vgname);
|
DEBUGLOG("Triggering backup of VG metadata for %s. suspended=%d\n", vgname, suspended);
|
||||||
|
|
||||||
vg = vg_read(cmd, vgname, NULL /*vgid*/, &consistent);
|
vg = vg_read(cmd, vgname, NULL /*vgid*/, &consistent);
|
||||||
if (vg)
|
if (vg) {
|
||||||
|
if (consistent)
|
||||||
check_current_backup(vg);
|
check_current_backup(vg);
|
||||||
else
|
}
|
||||||
|
else {
|
||||||
log_error("Error backing up metadata, can't find VG for group %s", vgname);
|
log_error("Error backing up metadata, can't find VG for group %s", vgname);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called to initialise the LVM context of the daemon */
|
/* Called to initialise the LVM context of the daemon */
|
||||||
|
@ -28,7 +28,7 @@ extern int do_check_lvm1(const char *vgname);
|
|||||||
extern int do_refresh_cache(void);
|
extern int do_refresh_cache(void);
|
||||||
extern int init_lvm(int using_gulm);
|
extern int init_lvm(int using_gulm);
|
||||||
extern void init_lvhash(void);
|
extern void init_lvhash(void);
|
||||||
extern void lvm_do_backup(char *vgname);
|
extern void lvm_do_backup(const char *vgname);
|
||||||
extern int hold_unlock(char *resource);
|
extern int hold_unlock(char *resource);
|
||||||
extern int hold_lock(char *resource, int mode, int flags);
|
extern int hold_lock(char *resource, int mode, int flags);
|
||||||
extern void unlock_all(void);
|
extern void unlock_all(void);
|
||||||
|
@ -378,7 +378,6 @@ int lock_resource(struct cmd_context *cmd, const char *resource, uint32_t flags)
|
|||||||
{
|
{
|
||||||
char lockname[PATH_MAX];
|
char lockname[PATH_MAX];
|
||||||
int cluster_cmd = 0;
|
int cluster_cmd = 0;
|
||||||
int ret;
|
|
||||||
const char *lock_scope;
|
const char *lock_scope;
|
||||||
const char *lock_type = "";
|
const char *lock_type = "";
|
||||||
|
|
||||||
@ -439,6 +438,12 @@ int lock_resource(struct cmd_context *cmd, const char *resource, uint32_t flags)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we are unlocking a VG, then trigger remote metadata backups */
|
||||||
|
if (cluster_cmd == CLVMD_CMD_LOCK_VG && ((flags & LCK_TYPE_MASK) == LCK_UNLOCK)) {
|
||||||
|
log_very_verbose("Requesing backup of VG metadata for %s", resource);
|
||||||
|
_lock_for_cluster(CLVMD_CMD_VG_BACKUP, LCK_CLUSTER_VG, resource);
|
||||||
|
}
|
||||||
|
|
||||||
log_very_verbose("Locking %s %s %s %s%s%s%s (0x%x)", lock_scope, lockname,
|
log_very_verbose("Locking %s %s %s %s%s%s%s (0x%x)", lock_scope, lockname,
|
||||||
lock_type,
|
lock_type,
|
||||||
flags & LCK_NONBLOCK ? "" : "B",
|
flags & LCK_NONBLOCK ? "" : "B",
|
||||||
@ -448,13 +453,7 @@ int lock_resource(struct cmd_context *cmd, const char *resource, uint32_t flags)
|
|||||||
flags);
|
flags);
|
||||||
|
|
||||||
/* Send a message to the cluster manager */
|
/* Send a message to the cluster manager */
|
||||||
ret = _lock_for_cluster(cluster_cmd, flags, lockname);
|
return _lock_for_cluster(cluster_cmd, flags, lockname);
|
||||||
|
|
||||||
/* If we are unlocking a VG, then trigger remote metadata backups */
|
|
||||||
if (ret && cluster_cmd == CLVMD_CMD_LOCK_VG && ((flags & LCK_TYPE_MASK) == LCK_UNLOCK)) {
|
|
||||||
ret = _lock_for_cluster(CLVMD_CMD_VG_BACKUP, LCK_CLUSTER_VG, resource);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CLUSTER_LOCKING_INTERNAL
|
#ifdef CLUSTER_LOCKING_INTERNAL
|
||||||
|
Loading…
Reference in New Issue
Block a user