diff options
author | jkennedy <none@none> | 2006-11-07 07:36:23 -0800 |
---|---|---|
committer | jkennedy <none@none> | 2006-11-07 07:36:23 -0800 |
commit | ab3487b0f99a72f54cfcffc43f7efd2c4bb2d608 (patch) | |
tree | 4b0f6c2d7ab8320e5f3e8f59d21a5584243d3603 /usr/src | |
parent | 166fae499b8c2c347337a348f0a38d1d0a0b4a7c (diff) | |
download | illumos-joyent-ab3487b0f99a72f54cfcffc43f7efd2c4bb2d608.tar.gz |
6331216 disksets: devid information not written to a newly created diskset
6345158 svm exited with error 1 in step cmmstep5, nodes panic
6402556 commd timeout should be a percentage of metaclust timeout value
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/cmd/lvm/rpc.metad/metad_svc_subr.c | 6 | ||||
-rw-r--r-- | usr/src/cmd/lvm/util/metaclust.c | 13 | ||||
-rw-r--r-- | usr/src/head/meta.h | 9 | ||||
-rw-r--r-- | usr/src/lib/lvm/libmeta/common/meta_mn_comm.c | 59 | ||||
-rw-r--r-- | usr/src/lib/lvm/libmeta/common/meta_set.c | 17 | ||||
-rw-r--r-- | usr/src/lib/lvm/libmeta/common/meta_set_drv.c | 20 | ||||
-rw-r--r-- | usr/src/lib/lvm/libmeta/common/metarpcopen.c | 9 | ||||
-rw-r--r-- | usr/src/uts/common/io/lvm/md/md_subr.c | 22 |
8 files changed, 117 insertions, 38 deletions
diff --git a/usr/src/cmd/lvm/rpc.metad/metad_svc_subr.c b/usr/src/cmd/lvm/rpc.metad/metad_svc_subr.c index 2ad33ff1d4..c89141da4a 100644 --- a/usr/src/cmd/lvm/rpc.metad/metad_svc_subr.c +++ b/usr/src/cmd/lvm/rpc.metad/metad_svc_subr.c @@ -4913,7 +4913,7 @@ mdrpc_mdcommdctl_2_svc( switch (args_cc->flag_action) { case COMMDCTL_SUSPEND: suspend_ret = mdmn_suspend(args_cc->setno, - args_cc->class); + args_cc->class, 0); if (suspend_ret != 0) { (void) mddserror(ep, suspend_ret, args_cc->setno, mynode(), @@ -4922,7 +4922,7 @@ mdrpc_mdcommdctl_2_svc( break; case COMMDCTL_RESUME: if (mdmn_resume(args_cc->setno, - args_cc->class, args_cc->flags)) { + args_cc->class, args_cc->flags, 0)) { (void) mddserror(ep, MDE_DS_COMMDCTL_RESUME_FAIL, args_cc->setno, mynode(), @@ -4930,7 +4930,7 @@ mdrpc_mdcommdctl_2_svc( } break; case COMMDCTL_REINIT: - if (mdmn_reinit_set(args_cc->setno)) { + if (mdmn_reinit_set(args_cc->setno, 0)) { (void) mddserror(ep, MDE_DS_COMMDCTL_REINIT_FAIL, args_cc->setno, mynode(), diff --git a/usr/src/cmd/lvm/util/metaclust.c b/usr/src/cmd/lvm/util/metaclust.c index ea4d44267d..895a475628 100644 --- a/usr/src/cmd/lvm/util/metaclust.c +++ b/usr/src/cmd/lvm/util/metaclust.c @@ -663,6 +663,7 @@ main(int argc, char **argv) int ret_val; mddb_config_t cfg; int set_info[MD_MAXSETS]; + long commd_timeout = 0; /* * Get the locale set up before calling any other routines @@ -794,6 +795,7 @@ main(int argc, char **argv) /* set timeout alarm signal, a value of 0 will disable timeout */ if (timeout > 0) { int stat_loc = 0; + commd_timeout = timeout * .75; c_pid = fork(); @@ -920,7 +922,7 @@ main(int argc, char **argv) /* suspend commd and spin waiting for drain */ while ((ret_val = mdmn_suspend(setno, - MD_COMM_ALL_CLASSES)) == + MD_COMM_ALL_CLASSES, commd_timeout)) == MDE_DS_COMMDCTL_SUSPEND_NYD) { sleep(1); } @@ -1126,7 +1128,7 @@ main(int argc, char **argv) /* suspend commd and spin waiting for drain */ while ((ret_val = mdmn_suspend(setno, - MD_COMM_ALL_CLASSES)) == + MD_COMM_ALL_CLASSES, commd_timeout)) == MDE_DS_COMMDCTL_SUSPEND_NYD) { sleep(1); } @@ -1225,7 +1227,7 @@ main(int argc, char **argv) * given the member information and send a reinit message * to rpc.mdcommd to reload the nodelist. */ - rval = meta_reconfig_choose_master(ep); + rval = meta_reconfig_choose_master(commd_timeout, ep); if (rval == 205) { /* * NOTE: Should issue call to reboot remote host that @@ -1566,7 +1568,7 @@ main(int argc, char **argv) meta_print_hrtime(gethrtime() - start_time)); /* reinitialzse rpc.mdcommd with new nodelist */ - if (mdmn_reinit_set(setno)) { + if (mdmn_reinit_set(setno, commd_timeout)) { md_eprintf(gettext( "Could not re-initialise rpc.mdcommd for " "set %s\n"), sp->setname); @@ -1754,7 +1756,8 @@ main(int argc, char **argv) } /* resume rpc.mdcommd */ - if (mdmn_resume(setno, MD_COMM_ALL_CLASSES, 0)) { + if (mdmn_resume(setno, MD_COMM_ALL_CLASSES, 0, + commd_timeout)) { md_eprintf(gettext("Unable to resume " "rpc.mdcommd for set %s\n"), sp->setname); md_exit(local_sp, 1); diff --git a/usr/src/head/meta.h b/usr/src/head/meta.h index 24a298fb43..e7318c53bf 100644 --- a/usr/src/head/meta.h +++ b/usr/src/head/meta.h @@ -1755,6 +1755,8 @@ extern CLIENT *metarpcopen(char *hostname, long time_out, md_error_t *ep); extern void metarpcclose(CLIENT *clntp); extern void metarpccloseall(void); +extern int cl_sto(CLIENT *clntp, char *hostname, long time_out, + md_error_t *ep); /* metasplitname.c */ extern int splitname(char *devname, md_splitname *splitname); @@ -1815,10 +1817,11 @@ extern int mdmn_send_message_with_msgid(set_t setno, int size, md_mn_result_t **resp, md_mn_msgid_t *msgid, md_error_t *ep); extern int mdmn_create_msgid(md_mn_msgid_t *id); -extern int mdmn_reinit_set(set_t setno); +extern int mdmn_reinit_set(set_t setno, long timeout); extern int mdmn_resume(set_t setno, md_mn_msgclass_t class, - uint_t flags); -extern int mdmn_suspend(set_t setno, md_mn_msgclass_t class); + uint_t flags, long timeout); +extern int mdmn_suspend(set_t setno, md_mn_msgclass_t class, + long timeout); extern int mdmn_msgtype_lock(md_mn_msgtype_t msgtype, uint_t locktype); extern void mdmn_abort(void); diff --git a/usr/src/lib/lvm/libmeta/common/meta_mn_comm.c b/usr/src/lib/lvm/libmeta/common/meta_mn_comm.c index 02ad7bf1e6..e005e83348 100644 --- a/usr/src/lib/lvm/libmeta/common/meta_mn_comm.c +++ b/usr/src/lib/lvm/libmeta/common/meta_mn_comm.c @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -21,7 +20,7 @@ */ /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -791,11 +790,12 @@ out: * MDE_DS_COMMDCTL_SUSPEND_FAIL if any failure occurred */ int -mdmn_suspend(set_t setno, md_mn_msgclass_t class) +mdmn_suspend(set_t setno, md_mn_msgclass_t class, long timeout) { - int *resp; - CLIENT *local_daemon; - md_mn_set_and_class_t msc; + int *resp; + CLIENT *local_daemon; + md_mn_set_and_class_t msc; + md_error_t xep = mdnullerror; if ((setno >= MD_MAXSETS) || (class >= MD_MN_NCLASSES)) { return (MDE_DS_COMMDCTL_SUSPEND_FAIL); @@ -806,6 +806,14 @@ mdmn_suspend(set_t setno, md_mn_msgclass_t class) clnt_pcreateerror("local_daemon"); return (MDE_DS_COMMDCTL_SUSPEND_FAIL); } + + if (timeout != 0) { + if (cl_sto(local_daemon, LOCALHOST_IPv4, timeout, &xep) != 0) { + clnt_destroy(local_daemon); + return (1); + } + } + msc.msc_set = setno; msc.msc_class = class; msc.msc_flags = 0; @@ -842,12 +850,13 @@ mdmn_suspend(set_t setno, md_mn_msgclass_t class) * MDE_DS_COMMDCTL_RESUME_FAIL on failure */ int -mdmn_resume(set_t setno, md_mn_msgclass_t class, uint_t flags) +mdmn_resume(set_t setno, md_mn_msgclass_t class, uint_t flags, long timeout) { - md_mn_set_and_class_t msc; - int ret = MDE_DS_COMMDCTL_RESUME_FAIL; - int *resp; - CLIENT *local_daemon; + md_mn_set_and_class_t msc; + int ret = MDE_DS_COMMDCTL_RESUME_FAIL; + int *resp; + CLIENT *local_daemon; + md_error_t xep = mdnullerror; if ((setno >= MD_MAXSETS) || (class >= MD_MN_NCLASSES)) { return (MDE_DS_COMMDCTL_RESUME_FAIL); @@ -859,6 +868,13 @@ mdmn_resume(set_t setno, md_mn_msgclass_t class, uint_t flags) return (MDE_DS_COMMDCTL_RESUME_FAIL); } + if (timeout != 0) { + if (cl_sto(local_daemon, LOCALHOST_IPv4, timeout, &xep) != 0) { + clnt_destroy(local_daemon); + return (1); + } + } + msc.msc_set = setno; msc.msc_class = class; msc.msc_flags = flags; @@ -909,12 +925,12 @@ mdmn_abort(void) * 1 on failure */ int -mdmn_reinit_set(set_t setno) +mdmn_reinit_set(set_t setno, long timeout) { - int ret = 1; - int *resp; - CLIENT *local_daemon; - + int ret = 1; + int *resp; + CLIENT *local_daemon; + md_error_t xep = mdnullerror; if ((setno == 0) || (setno >= MD_MAXSETS)) { return (1); @@ -926,6 +942,13 @@ mdmn_reinit_set(set_t setno) return (1); } + if (timeout != 0) { + if (cl_sto(local_daemon, LOCALHOST_IPv4, timeout, &xep) != 0) { + clnt_destroy(local_daemon); + return (1); + } + } + resp = mdmn_comm_reinit_set_1(&setno, local_daemon); if (resp != NULL) { diff --git a/usr/src/lib/lvm/libmeta/common/meta_set.c b/usr/src/lib/lvm/libmeta/common/meta_set.c index 397f016f7b..4b84be7b09 100644 --- a/usr/src/lib/lvm/libmeta/common/meta_set.c +++ b/usr/src/lib/lvm/libmeta/common/meta_set.c @@ -1928,6 +1928,10 @@ metadrivename_withdrkey( * devid code path can set and propagate the error and * eventually prevent did disks from being added to the * diskset under SunCluster systems + * + * Note that this code can be called through rpc.mdcommd. + * sdssc_version cannot be used because the library won't + * be bound. */ if ((strncmp(dnp->rname, "/dev/did/", strlen("/dev/did/")) == 0) || (MD_MNSET_DESC(sd))) @@ -1950,8 +1954,7 @@ metadrivename_withdrkey( * that's OK. dnp->devid will be null as it is in any * configuration with no devids. */ - if (meta_setdid(MD_LOCAL_SET, sideno + SKEW, key, - ep) < 0) + if (meta_setdid(MD_LOCAL_SET, sideno + SKEW, key, ep) < 0) return (NULL); if ((devidp = (ddi_devid_t)meta_getdidbykey(MD_LOCAL_SET, sideno+SKEW, key, ep)) != NULL) { @@ -4224,6 +4227,7 @@ out: */ int meta_reconfig_choose_master( + long timeout, md_error_t *ep ) { @@ -4356,8 +4360,13 @@ meta_reconfig_choose_master( return (205); } - /* Send new nodelist to rpc.mdcommd */ - (void) mdmn_reinit_set(sp->setno); + /* reinit rpc.mdcommd with new nodelist */ + if (mdmn_reinit_set(sp->setno, timeout)) { + md_eprintf(dgettext(TEXT_DOMAIN, + "Could not re-initialise rpc.mdcommd for " + "set %s\n"), sp->setname); + return (1); + } meta_mc_log(MC_LOG5, dgettext(TEXT_DOMAIN, "Choose master for set %s completed: %s"), diff --git a/usr/src/lib/lvm/libmeta/common/meta_set_drv.c b/usr/src/lib/lvm/libmeta/common/meta_set_drv.c index a2abef7eac..4c4eaf0d78 100644 --- a/usr/src/lib/lvm/libmeta/common/meta_set_drv.c +++ b/usr/src/lib/lvm/libmeta/common/meta_set_drv.c @@ -480,6 +480,26 @@ meta_set_adddrives( goto rollback; } + /* + * If this is not a MN set and the state flags do not indicate the + * presence of devids, update the set records on all nodes. + */ + if (!(sd->sd_flags & MD_SR_MB_DEVID) && !(MD_MNSET_DESC(sd))) { + if (meta_update_mb(sp, dd, ep) == 0) { + mdclrerror(ep); + + /* update the sr_flags on all hosts */ + for (i = 0; i < MD_MAXSIDES; i++) { + if (sd->sd_nodes[i][0] == '\0') + continue; + + if (clnt_upd_sr_flags(sd->sd_nodes[i], + sp, (sd->sd_flags | MD_SR_MB_DEVID), ep)) + goto rollback; + } + } + } + RB_TEST(6, "adddrives", ep) RB_PREEMPT; diff --git a/usr/src/lib/lvm/libmeta/common/metarpcopen.c b/usr/src/lib/lvm/libmeta/common/metarpcopen.c index bd0f4232f5..4e86a847eb 100644 --- a/usr/src/lib/lvm/libmeta/common/metarpcopen.c +++ b/usr/src/lib/lvm/libmeta/common/metarpcopen.c @@ -2,9 +2,8 @@ * CDDL HEADER START * * The contents of this file are subject to the terms of the - * Common Development and Distribution License, Version 1.0 only - * (the "License"). You may not use this file except in compliance - * with the License. + * Common Development and Distribution License (the "License"). + * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. @@ -20,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2004 Sun Microsystems, Inc. All rights reserved. + * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -146,7 +145,7 @@ cc_destroy(client_header_t *header) /* * Set the timeout value for this client handle. */ -static int +int cl_sto( CLIENT *clntp, char *hostname, diff --git a/usr/src/uts/common/io/lvm/md/md_subr.c b/usr/src/uts/common/io/lvm/md/md_subr.c index 95f206d91f..bff37b242c 100644 --- a/usr/src/uts/common/io/lvm/md/md_subr.c +++ b/usr/src/uts/common/io/lvm/md/md_subr.c @@ -3964,6 +3964,7 @@ mdmn_send_capability_message(minor_t mnum, volcap_t vc, IOLOCK *lockp) md_mn_kresult_t *kres; mdi_unit_t *ui = MDI_UNIT(mnum); int ret; + k_sigset_t oldmask, newmask; (void) strncpy((char *)&msg.msg_setcap_driver, md_ops[ui->ui_opsindex]->md_driver.md_drivername, MD_DRIVERNAMELEN); @@ -3973,9 +3974,19 @@ mdmn_send_capability_message(minor_t mnum, volcap_t vc, IOLOCK *lockp) if (lockp) IOLOCK_RETURN_RELEASE(0, lockp); kres = kmem_zalloc(sizeof (md_mn_kresult_t), KM_SLEEP); + + /* + * Mask signals for the mdmd_ksend_message call. This keeps the door + * interface from failing if the user process receives a signal while + * in mdmn_ksend_message. + */ + sigfillset(&newmask); + sigreplace(&newmask, &oldmask); ret = (mdmn_ksend_message(MD_MIN2SET(mnum), MD_MN_MSG_SET_CAP, MD_MSGF_NO_LOG, (char *)&msg, sizeof (md_mn_msg_setcap_t), kres)); + sigreplace(&oldmask, (k_sigset_t *)NULL); + if (!MDMN_KSEND_MSG_OK(ret, kres)) { mdmn_ksend_show_error(ret, kres, "MD_MN_MSG_SET_CAP"); ret = EIO; @@ -4001,6 +4012,7 @@ mdmn_clear_all_capabilities(minor_t mnum) int ret; md_mn_kresult_t *kresult; volcap_t vc; + k_sigset_t oldmask, newmask; clumsg.dev = md_makedevice(md_major, mnum); clumsg.mde = mdnullerror; @@ -4009,10 +4021,20 @@ mdmn_clear_all_capabilities(minor_t mnum) * result be stored in the MCT. We want an up-to-date state. */ kresult = kmem_zalloc(sizeof (md_mn_kresult_t), KM_SLEEP); + + /* + * Mask signals for the mdmd_ksend_message call. This keeps the door + * interface from failing if the user process receives a signal while + * in mdmn_ksend_message. + */ + sigfillset(&newmask); + sigreplace(&newmask, &oldmask); ret = mdmn_ksend_message(MD_MIN2SET(mnum), MD_MN_MSG_CLU_CHECK, MD_MSGF_STOP_ON_ERROR | MD_MSGF_NO_LOG | MD_MSGF_NO_MCT, (char *)&clumsg, sizeof (clumsg), kresult); + sigreplace(&oldmask, (k_sigset_t *)NULL); + if ((ret == 0) && (kresult->kmmr_exitval == 0)) { /* * Not open on any node, clear all capabilities, eg ABR and |