diff options
author | David Major <David.Major@Sun.COM> | 2009-04-15 16:16:13 -0500 |
---|---|---|
committer | David Major <David.Major@Sun.COM> | 2009-04-15 16:16:13 -0500 |
commit | 4ea0a8690a2e6ec3ccf6235e1cea96de94351bea (patch) | |
tree | 2bc92f5c4602b7420ad6507bf3e951ce78f88808 /usr/src | |
parent | c60a6da3c3825f88388f3fba451c3dd975088f07 (diff) | |
download | illumos-joyent-4ea0a8690a2e6ec3ccf6235e1cea96de94351bea.tar.gz |
6829466 mmsinit fails with return code 1 because database is not ready
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/cmd/mms/mgmt/init/common/mmsinit.c | 6 | ||||
-rw-r--r-- | usr/src/lib/mms/mgmt/common/mgmt_acsls.c | 1 | ||||
-rw-r--r-- | usr/src/lib/mms/mgmt/common/mgmt_media.c | 5 | ||||
-rw-r--r-- | usr/src/lib/mms/mgmt/common/mgmt_mm.c | 21 | ||||
-rw-r--r-- | usr/src/lib/mms/mgmt/common/mgmt_mmsdb.c | 135 | ||||
-rw-r--r-- | usr/src/lib/mms/mgmt/common/mgmt_util.c | 49 | ||||
-rw-r--r-- | usr/src/lib/mms/mgmt/common/mms_mgmt.h | 5 |
7 files changed, 205 insertions, 17 deletions
diff --git a/usr/src/cmd/mms/mgmt/init/common/mmsinit.c b/usr/src/cmd/mms/mgmt/init/common/mmsinit.c index 03da70dc15..08093a9fc7 100644 --- a/usr/src/cmd/mms/mgmt/init/common/mmsinit.c +++ b/usr/src/cmd/mms/mgmt/init/common/mmsinit.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -40,6 +40,7 @@ extern char *optarg; extern int optind, opterr, optopt; +static char *_SrcFile = __FILE__; #ifdef MMS_VAR_CFG static char *usemsg = \ @@ -102,7 +103,8 @@ main(int argc, char **argv) (void) mms_trace_open("/var/log/mms/mmsinit.log", MMS_ID_CLI, MMS_SEV_INFO, 5 * MEGA, 0, 0); - + (void) mms_trace_filter(MMS_SEV_DEVP); + mms_trace(MMS_DEBUG, "mmsinit started ###############################"); if (argc < 2) { st = 1; } diff --git a/usr/src/lib/mms/mgmt/common/mgmt_acsls.c b/usr/src/lib/mms/mgmt/common/mgmt_acsls.c index fb9b7b8669..e7f56089e2 100644 --- a/usr/src/lib/mms/mgmt/common/mgmt_acsls.c +++ b/usr/src/lib/mms/mgmt/common/mgmt_acsls.c @@ -227,6 +227,7 @@ acs_start_ssi(char *acshost, char *ssiport) cmd[2] = NULL; pid = exec_mgmt_cmd(NULL, NULL, 0, 0, B_TRUE, cmd); + mms_trace(MMS_DEBUG, "exec_mgmt_cmd: %s %s", cmd[0], cmd[1]); status = check_exit(pid, NULL); diff --git a/usr/src/lib/mms/mgmt/common/mgmt_media.c b/usr/src/lib/mms/mgmt/common/mgmt_media.c index 410107dec8..af05731cec 100644 --- a/usr/src/lib/mms/mgmt/common/mgmt_media.c +++ b/usr/src/lib/mms/mgmt/common/mgmt_media.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -2330,6 +2330,8 @@ call_mmsmnt(door_arg_t *arg) /* server is not running. Try to start it */ (void) exec_mgmt_cmd(NULL, NULL, 0, 0, B_TRUE, cmd); + mms_trace(MMS_DEBUG, + "exec_mgmt_cmd: %s", cmd[0]); } else { st = errno; return (st); @@ -2358,6 +2360,7 @@ call_mmsmnt(door_arg_t *arg) * the door file */ (void) exec_mgmt_cmd(NULL, NULL, 0, 0, B_TRUE, cmd); + mms_trace(MMS_DEBUG, "exec_mgmt_cmd: %s", cmd[0]); /* give the server a chance to start */ (void) nanosleep(&sleepfor, NULL); } else if ((saverr != EAGAIN) && (saverr != EINTR)) { diff --git a/usr/src/lib/mms/mgmt/common/mgmt_mm.c b/usr/src/lib/mms/mgmt/common/mgmt_mm.c index 7581432ffa..fb28acb53a 100644 --- a/usr/src/lib/mms/mgmt/common/mgmt_mm.c +++ b/usr/src/lib/mms/mgmt/common/mgmt_mm.c @@ -323,6 +323,7 @@ mms_mgmt_init_host(nvlist_t *opts, nvlist_t **errs) } if (!mgmt_chk_auth("solaris.mms.create")) { + mms_trace(MMS_DEBUG, "mgmt_chk_auth error"); return (EACCES); } @@ -330,12 +331,14 @@ mms_mgmt_init_host(nvlist_t *opts, nvlist_t **errs) /* make sure we've not already been initialized */ st = mms_cfg_getvar(MMS_CFG_CONFIG_TYPE, buf); if (st != 0) { + mms_trace(MMS_DEBUG, "mms_cfg_getvar error"); st = mgmt_xlate_cfgerr(st); if (st != ENOENT) { return (st); } } else { /* host already configured */ + mms_trace(MMS_DEBUG, "already config error"); return (EALREADY); } #endif /* MMS_VAR_CFG */ @@ -357,6 +360,7 @@ mms_mgmt_init_host(nvlist_t *opts, nvlist_t **errs) optp = mms_client_opts; #endif /* MMS_VAR_CFG */ } else { + mms_trace(MMS_DEBUG, "EINVAL error"); st = EINVAL; } } @@ -376,6 +380,7 @@ mms_mgmt_init_host(nvlist_t *opts, nvlist_t **errs) st = mms_cfg_getvar(MMS_CFG_MM_DB_USER, buf); if (st != 0) { + mms_trace(MMS_DEBUG, "mms_cfg_getvar error"); st = mgmt_xlate_cfgerr(st); if (st == ENOENT) { st = mms_cfg_getvar(MMS_CFG_DB_INST @@ -384,6 +389,7 @@ mms_mgmt_init_host(nvlist_t *opts, nvlist_t **errs) } if (st != 0) { /* major configuration error */ + mms_trace(MMS_DEBUG, "major configuration error"); MGMT_ADD_OPTERR(init_errs, "mmsdb method_context/user", st); @@ -517,16 +523,27 @@ mms_mgmt_init_host(nvlist_t *opts, nvlist_t **errs) } if (st != 0) { + mms_trace(MMS_DEBUG, "mgmt_db_create error"); goto done; } + mms_trace(MMS_DEBUG, "enable mm"); st = mgmt_set_svc_state(MMSVC, ENABLE, NULL); + if (st != 0) + mms_trace(MMS_DEBUG, + "mgmt_set_svc_state(MMSVC, ENABLE, NULL) " + "error"); } /* Watcher needs to be started for both host types */ if (st == 0) { + mms_trace(MMS_DEBUG, "enable wcr"); st = mgmt_set_svc_state(WCRSVC, ENABLE, NULL); } + if (st != 0) + mms_trace(MMS_DEBUG, + "mgmt_set_svc_state(WCRSVC, ENABLE, NULL) " + "error"); done: if (st != 0) { @@ -821,14 +838,17 @@ mms_mgmt_set_opts(nvlist_t *optlist, nvlist_t *errlist) /* refresh services */ if (*mmtype == 's') { if (refresh_svcs & DB) { + mms_trace(MMS_DEBUG, "refresh db"); (void) mgmt_set_svc_state(DBSVC, REFRESH, NULL); } if (refresh_svcs & MM) { + mms_trace(MMS_DEBUG, "refresh mm"); (void) mgmt_set_svc_state(MMSVC, REFRESH, NULL); } } if (refresh_svcs & WCR) { + mms_trace(MMS_DEBUG, "refresh wcr"); (void) mgmt_set_svc_state(WCRSVC, REFRESH, NULL); } @@ -849,6 +869,7 @@ mms_mgmt_uninitialize(void) /* stop all running services */ for (i = 0; mmsvcs[i] != NULL; i++) { + mms_trace(MMS_DEBUG, "disable %s", mmsvcs[i]); st = mgmt_set_svc_state(mmsvcs[i], DISABLE, NULL); if (st != 0) { break; diff --git a/usr/src/lib/mms/mgmt/common/mgmt_mmsdb.c b/usr/src/lib/mms/mgmt/common/mgmt_mmsdb.c index 9f97b9dcf1..f79716ea7d 100644 --- a/usr/src/lib/mms/mgmt/common/mgmt_mmsdb.c +++ b/usr/src/lib/mms/mgmt/common/mgmt_mmsdb.c @@ -193,6 +193,8 @@ mgmt_db_init(void) st = mgmt_get_db_opts(&opts); if (st != 0) { + mms_trace(MMS_DEBUG, + "mgmt_get_db_opts(&opts) error"); return (st); } @@ -212,8 +214,12 @@ mgmt_db_init(void) pid = exec_mgmt_cmd(NULL, NULL, opts.dbuid, opts.dbgid, B_FALSE, cmd); + mms_trace(MMS_DEBUG, "exec_mgmt_cmd: %s %s %s", cmd[0], cmd[1], cmd[2]); st = check_exit(pid, NULL); + if (st != 0) + mms_trace(MMS_DEBUG, + "exec_mgmt_cmd error"); return (st); } @@ -316,11 +322,15 @@ mgmt_db_create(int initialize, int populate, nvlist_t *optlist) mms_trace(MMS_DEBUG, "Creating the MMS Database"); if (!mgmt_chk_auth("solaris.mms.modify")) { + mms_trace(MMS_DEBUG, + "mgmt_chk_auth(\"solaris.mms.modify\") error"); return (EACCES); } st = mgmt_get_db_opts(&opts); if (st != 0) { + mms_trace(MMS_DEBUG, + "mgmt_get_db_opts(&opts) error"); return (st); } @@ -337,6 +347,8 @@ mgmt_db_create(int initialize, int populate, nvlist_t *optlist) if (initialize) { st = mgmt_db_check(); if (st == 0) { + mms_trace(MMS_DEBUG, + "EALREADY error"); /* db is alive, already inited */ return (EALREADY); } @@ -344,21 +356,30 @@ mgmt_db_create(int initialize, int populate, nvlist_t *optlist) /* check to see if files exist, even if svc is stopped */ (void) snprintf(buf, sizeof (buf), "%s/base", opts.path); if (access(buf, F_OK) == 0) { + mms_trace(MMS_DEBUG, + "access(buf, F_OK) error"); return (EALREADY); } st = mgmt_db_init(); + if (st != 0) + mms_trace(MMS_DEBUG, + "mgmt_db_init() error"); if (st == 0) { st = configure_pgconf(opts.port, opts.logdir); } if (st != 0) { + mms_trace(MMS_DEBUG, + "configure_pgconf error"); return (st); } /* create the dirs we need */ st = create_db_dirs(opts.path, opts.dbuid, opts.dbgid, NULL); if (st != 0) { + mms_trace(MMS_DEBUG, + "create_db_dirs error"); return (st); } } @@ -370,6 +391,8 @@ mgmt_db_create(int initialize, int populate, nvlist_t *optlist) if (populate) { st = get_dbver_from_optfile(pkgfile, &ver); if (st != 0) { + mms_trace(MMS_DEBUG, + "get_dbver_from_optfile error"); return (st); } @@ -377,6 +400,8 @@ mgmt_db_create(int initialize, int populate, nvlist_t *optlist) st = get_dbver_from_optfile(buf, &oldver); if (st != 0) { if (st != ENOENT) { + mms_trace(MMS_DEBUG, + "get_dbver_from_optfile error"); return (st); } st = 0; @@ -400,15 +425,32 @@ mgmt_db_create(int initialize, int populate, nvlist_t *optlist) } /* make sure the DB is running */ + mms_trace(MMS_DEBUG, "enable db"); st = mgmt_set_svc_state(DBSVC, ENABLE, NULL); if (st != 0) { + mms_trace(MMS_DEBUG, + "mgmt_set_svc_state error"); + return (st); + } + + st = mgmt_db_ready(); + if (st != 0) { + mms_trace(MMS_ERR, + "database did not go ready"); return (st); } pid = exec_mgmt_cmd(NULL, NULL, opts.dbuid, opts.dbgid, B_FALSE, cmd); + mms_trace(MMS_DEBUG, + "exec_mgmt_cmd: %s %s %s %s %s %s", + cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], cmd[5]); st = check_exit(pid, NULL); + if (st != 0) { + mms_trace(MMS_DEBUG, + "exec_mgmt_cmd error: st %d", st); + } if ((st == 0) && (populate)) { /* import all the sql cmds */ @@ -470,20 +512,89 @@ mgmt_db_drop(void) pid = exec_mgmt_cmd(NULL, NULL, opts.dbuid, opts.dbgid, B_FALSE, cmd); + mms_trace(MMS_DEBUG, "exec_mgmt_cmd: %s %s %s %s", + cmd[0], cmd[1], cmd[2], cmd[3]); + st = check_exit(pid, NULL); if (st != 0) { /* restart the service to force users to disconnect */ + mms_trace(MMS_DEBUG, "restart db"); (void) mgmt_set_svc_state(DBSVC, RESTART, NULL); - pid = exec_mgmt_cmd(NULL, NULL, opts.dbuid, opts.dbgid, + st = mgmt_db_ready(); + if (st != 0) { + mms_trace(MMS_ERR, + "database did not go ready"); + } + + if (st == 0) { + pid = exec_mgmt_cmd(NULL, NULL, opts.dbuid, opts.dbgid, + B_FALSE, cmd); + mms_trace(MMS_DEBUG, "exec_mgmt_cmd: %s %s %s %s", + cmd[0], cmd[1], cmd[2], cmd[3]); + + st = check_exit(pid, NULL); + } + } + + return (st); +} + +int +mgmt_db_ready(void) +{ + int i; + int st; + pid_t pid; + FILE *readf = NULL; + mmsdb_opts_t opts; + char *cmd[7]; + char dbbuf[2048]; + + if (!mgmt_chk_auth("solaris.mms.modify")) { + return (EACCES); + } + + st = mgmt_get_db_opts(&opts); + if (st != 0) { + return (st); + } + + mms_trace(MMS_DEBUG, "check for database ready"); + + (void) snprintf(dbbuf, sizeof (dbbuf), "%s/psql", opts.bindir); + + /* simple test to list available databases to check for db ready */ + cmd[0] = dbbuf; + cmd[1] = "-h"; + cmd[2] = opts.dbhost; + cmd[3] = "-p"; + cmd[4] = opts.port; + cmd[5] = "-l"; + cmd[6] = NULL; + + for (i = 0; i < 30; i++) { + + /* when the simple test is successful the */ + /* database is ready for socket connections */ + + pid = exec_mgmt_cmd(&readf, NULL, opts.dbuid, opts.dbgid, B_FALSE, cmd); + mms_trace(MMS_DEBUG, "exec_mgmt_cmd: %s %s %s %s %s %s", + cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], cmd[5]); st = check_exit(pid, NULL); + if (st == 0) { + break; + } + (void) sleep(1); } + (void) fclose(readf); + return (st); } @@ -507,6 +618,8 @@ mgmt_db_check(void) return (st); } + /* test to see if the mms database already exists */ + (void) snprintf(dbbuf, sizeof (dbbuf), "%s/psql", opts.bindir); cmd[0] = dbbuf; @@ -525,6 +638,9 @@ mgmt_db_check(void) pid = exec_mgmt_cmd(&readf, NULL, opts.dbuid, opts.dbgid, B_FALSE, cmd); + mms_trace(MMS_DEBUG, "exec_mgmt_cmd: %s %s %s %s %s %s %s %s", + cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], + cmd[5], cmd[6], cmd[7]); st = check_exit(pid, NULL); @@ -600,6 +716,9 @@ mgmt_db_dump(char *dumpdir, char *dumpfile, int len) pid = exec_mgmt_cmd(NULL, NULL, opts.dbuid, opts.dbgid, B_FALSE, cmd); + mms_trace(MMS_DEBUG, "exec_mgmt_cmd: %s %s %s %s %s %s %s %s %s %s", + cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], + cmd[5], cmd[6], cmd[7], cmd[8], cmd[9]); st = check_exit(pid, NULL); @@ -637,6 +756,7 @@ mgmt_db_restore(char *dumpfile) } /* shutdown MM */ + mms_trace(MMS_DEBUG, "disable mm"); st = mgmt_set_svc_state(MMSVC, DISABLE, &mmstate); if (st != 0) { if (mmstate) { @@ -654,6 +774,7 @@ mgmt_db_restore(char *dumpfile) st = mgmt_db_sql_exec(dumpfile, &opts); if ((st == 0) && (strcmp(mmstate, "online") == 0)) { + mms_trace(MMS_DEBUG, "enable mm"); st = mgmt_set_svc_state(MMSVC, ENABLE, NULL); } @@ -1083,6 +1204,9 @@ mgmt_db_sql_exec(char *cmdfile, mmsdb_opts_t *opts) pid = exec_mgmt_cmd(NULL, &dberr, opts->dbuid, opts->dbgid, B_FALSE, cmd); + mms_trace(MMS_DEBUG, "exec_mgmt_cmd: %s %s %s %s %s %s %s %s %s", + cmd[0], cmd[1], cmd[2], cmd[3], cmd[4], + cmd[5], cmd[6], cmd[7], cmd[8]); st = check_exit(pid, NULL); @@ -1294,8 +1418,17 @@ mgmt_set_db_pass(char *dbpass, nvlist_t *errs) } /* restart the db */ + mms_trace(MMS_DEBUG, "restart db"); st = mgmt_set_svc_state(DBSVC, RESTART, NULL); + if (st == 0) { + st = mgmt_db_ready(); + if (st != 0) { + mms_trace(MMS_ERR, + "database did not go ready"); + } + } + return (st); } diff --git a/usr/src/lib/mms/mgmt/common/mgmt_util.c b/usr/src/lib/mms/mgmt/common/mgmt_util.c index 7112a08683..02dd8c209f 100644 --- a/usr/src/lib/mms/mgmt/common/mgmt_util.c +++ b/usr/src/lib/mms/mgmt/common/mgmt_util.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -686,17 +686,23 @@ exec_mgmt_cmd( /* The path to the executable must be fully-qualified */ if ((cmd == NULL) || (cmd[0] == NULL) || (cmd[0][0] != '/')) { + mms_trace(MMS_DEBUG, + "validate error"); return (-1); } if (outstr != NULL) { if (pipe(fdo) < 0) { + mms_trace(MMS_DEBUG, + "pipe(fdo) error"); return (-1); } } if (errstr != NULL) { if (pipe(fde) < 0) { + mms_trace(MMS_DEBUG, + "pipe(fde) error"); (void) close(fdo[0]); (void) close(fdo[1]); return (-1); @@ -704,6 +710,8 @@ exec_mgmt_cmd( } if ((pid = fork()) < 0) { + mms_trace(MMS_DEBUG, + "fork() error"); (void) close(fdo[0]); (void) close(fdo[1]); (void) close(fde[0]); @@ -724,6 +732,8 @@ exec_mgmt_cmd( } if ((fde[1] == -1) || (fdo[1] == -1)) { + mms_trace(MMS_DEBUG, + "(fde[1] == -1) || (fdo[1] == -1) error"); exit(9); } @@ -760,6 +770,8 @@ exec_mgmt_cmd( ret = execv(cmd[0], cmd); if (0 != ret) { + mms_trace(MMS_DEBUG, + "execv(cmd[0], cmd) error"); return (ret); } } @@ -812,16 +824,17 @@ mgmt_set_svc_state( char *endState = NULL; int st = 0; const char *cmpState; - struct timespec ts; int i; if (fmri == NULL) { + mms_trace(MMS_ERR, "fmri is null"); return (MMS_MGMT_NOARG); } startState = smf_get_state(fmri); if (startState == NULL) { st = scf_error(); + mms_trace(MMS_ERR, "get state %s - %s", fmri, scf_strerror(st)); /* * Not an error if request to disable or degrade a * non-existent svc @@ -852,7 +865,15 @@ mgmt_set_svc_state( * though I can't see why. */ if (strcmp(startState, SCF_STATE_STRING_MAINT) == 0) { + mms_trace(MMS_DEBUG, + "restore before disable %s", + fmri); st = mgmt_set_svc_state(fmri, RESTORE, NULL); + if (st != 0) { + mms_trace(MMS_ERR, + "failed to restore %s", + fmri); + } st = smf_disable_instance(fmri, 0); } if (strcmp(startState, cmpState) != 0) { @@ -901,22 +922,25 @@ mgmt_set_svc_state( break; default: st = -1; + mms_trace(MMS_ERR, "%s unknown action %d", + fmri, targetState); break; } if (st == 0) { /* - * Changing state sometimes takes a while, so - * loop for up to 5 seconds. + * Changing state sometimes takes a while and + * the scf service state functions do not wait. + * Check to see if the action was successul. */ - ts.tv_sec = 0; - ts.tv_nsec = 500 * 1000000; - - for (i = 1; i < 10; i++) { - st = 1; + st = 1; + for (i = 0; i < 10; i++) { endState = smf_get_state(fmri); if (endState == NULL) { st = scf_error(); + mms_trace(MMS_ERR, + "wait for state change %s - %s", + fmri, scf_strerror(st)); break; } else if (strcmp(endState, cmpState) == 0) { st = 0; @@ -924,10 +948,12 @@ mgmt_set_svc_state( } free(endState); endState = NULL; - (void) nanosleep(&ts, NULL); + (void) sleep(1); } - } else { + } else if (st != -1) { st = scf_error(); + mms_trace(MMS_ERR, "state change %s - %s", + fmri, scf_strerror(st)); } if ((startState != NULL) && (original == NULL)) { @@ -970,7 +996,6 @@ check_exit(pid_t pid, int *signo) } } } - return (st); } diff --git a/usr/src/lib/mms/mgmt/common/mms_mgmt.h b/usr/src/lib/mms/mgmt/common/mms_mgmt.h index 428f8803dc..c1f43c5eb4 100644 --- a/usr/src/lib/mms/mgmt/common/mms_mgmt.h +++ b/usr/src/lib/mms/mgmt/common/mms_mgmt.h @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved. + * Copyright 2009 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ #ifndef _MMS_MGMT_H_ @@ -199,6 +199,9 @@ int mgmt_db_drop(void); int +mgmt_db_ready(void); + +int mgmt_db_check(void); int |