diff --git a/client/acct_mgr.cpp b/client/acct_mgr.cpp
index e84275ba06..a4d2192d61 100644
--- a/client/acct_mgr.cpp
+++ b/client/acct_mgr.cpp
@@ -169,12 +169,6 @@ int ACCT_MGR_OP::do_rpc(ACCT_MGR_INFO& _ami, bool _via_gui) {
" %d\n"
" %d\n"
" %f\n"
- " %f\n"
- " %f\n"
- " %f\n"
- " %f\n"
- " %d\n"
- " %d\n"
" %f\n"
" %f\n",
p->master_url,
@@ -188,22 +182,28 @@ int ACCT_MGR_OP::do_rpc(ACCT_MGR_INFO& _ami, bool _via_gui) {
p->detach_when_done?1:0,
p->ended?1:0,
p->resource_share,
- p->cpu_ec,
- p->cpu_time,
- p->gpu_ec,
- p->gpu_time,
- p->njobs_success,
- p->njobs_error,
p->disk_usage,
p->disk_share
);
- // send starvation-related info
+ // send work and starvation-related info
//
- if (ami.send_rec) {
+ if (ami.dynamic) {
fprintf(f,
- " %d",
- p->nrpc_failures
+ " %d"
+ " %f\n"
+ " %f\n"
+ " %f\n"
+ " %f\n"
+ " %d\n"
+ " %d\n",
+ p->nrpc_failures,
+ p->cpu_ec,
+ p->cpu_time,
+ p->gpu_ec,
+ p->gpu_time,
+ p->njobs_success,
+ p->njobs_error
);
for (int j=0; jsched_req_no_work[j]) {
@@ -387,6 +387,7 @@ int ACCT_MGR_OP::parse(FILE* f) {
safe_strcpy(host_venue, "");
safe_strcpy(ami.opaque, "");
ami.no_project_notices = false;
+ ami.dynamic = false;
rss_feeds.clear();
if (!xp.parse_start("acct_mgr_reply")) return ERR_XML_PARSE;
while (!xp.get_tag()) {
@@ -406,6 +407,7 @@ int ACCT_MGR_OP::parse(FILE* f) {
if (xp.parse_string("error", error_str)) continue;
if (xp.parse_string("error_msg", error_str)) continue;
if (xp.parse_double("repeat_sec", repeat_sec)) continue;
+ if (xp.parse_bool("dynamic", ami.dynamic)) continue;
if (xp.parse_string("message", message)) {
msg_printf(NULL, MSG_INFO, "Account manager: %s", message.c_str());
continue;
@@ -613,6 +615,7 @@ void ACCT_MGR_OP::handle_reply(int http_op_retval) {
safe_strcpy(gstate.acct_mgr_info.password_hash, ami.password_hash);
safe_strcpy(gstate.acct_mgr_info.authenticator, ami.authenticator);
gstate.acct_mgr_info.no_project_notices = ami.no_project_notices;
+ gstate.acct_mgr_info.dynamic = ami.dynamic;
// process projects
//
@@ -840,7 +843,7 @@ int ACCT_MGR_INFO::write_info() {
fclose(f);
}
- if (strlen(login_name)) {
+ if (strlen(login_name) || strlen(authenticator)) {
f = fopen(ACCT_MGR_LOGIN_FILENAME, "w");
if (!f) {
msg_printf(NULL, MSG_USER_ALERT,
@@ -870,11 +873,13 @@ int ACCT_MGR_INFO::write_info() {
" %f\n"
" \n%s\n"
" \n"
- " %d\n",
+ " %d\n"
+ " %d\n",
previous_host_cpid,
next_rpc_time,
opaque,
- no_project_notices?1:0
+ no_project_notices?1:0,
+ dynamic?1:0
);
user_keywords.write(f);
fprintf(f,
@@ -906,6 +911,7 @@ void ACCT_MGR_INFO::clear() {
first_starved = 0;
starved_rpc_backoff = 0;
starved_rpc_min_time = 0;
+ dynamic = false;
}
ACCT_MGR_INFO::ACCT_MGR_INFO() {
@@ -944,6 +950,7 @@ int ACCT_MGR_INFO::parse_login_file(FILE* p) {
continue;
}
else if (xp.parse_bool("no_project_notices", no_project_notices)) continue;
+ else if (xp.parse_bool("dynamic", dynamic)) continue;
else if (xp.match_tag("user_keywords")) {
retval = user_keywords.parse(xp);
if (retval) {
@@ -1056,7 +1063,7 @@ bool ACCT_MGR_INFO::poll() {
// if not dynamic AM, we're done
//
- if (!send_rec) {
+ if (!dynamic) {
return false;
}
diff --git a/client/acct_mgr.h b/client/acct_mgr.h
index ddbe22ffb9..ab4ce99a21 100644
--- a/client/acct_mgr.h
+++ b/client/acct_mgr.h
@@ -72,8 +72,10 @@ struct ACCT_MGR_INFO : PROJ_AM {
// what login name and password they have been assigned
bool password_error;
- bool send_rec;
- // send REC in AM RPCs
+ bool dynamic;
+ // This AM dynamically decides what projects to assign.
+ // - send EC in AM RPCs
+ // - send starvation info if idle resources
USER_KEYWORDS user_keywords;
// user's yes/no keywords.
// These are conveyed to projects in scheduler requests
diff --git a/client/gui_rpc_server_ops.cpp b/client/gui_rpc_server_ops.cpp
index a950cccf16..5f1318a1e3 100644
--- a/client/gui_rpc_server_ops.cpp
+++ b/client/gui_rpc_server_ops.cpp
@@ -945,6 +945,7 @@ static void handle_acct_mgr_rpc(GUI_RPC_CONN& grc) {
bool use_config_file = false;
bool bad_arg = false;
bool url_found=false, name_found=false, password_found = false;
+ ACCT_MGR_INFO ami;
while (!grc.xp.get_tag()) {
if (grc.xp.parse_string("url", url)) {
@@ -970,10 +971,7 @@ static void handle_acct_mgr_rpc(GUI_RPC_CONN& grc) {
"Not using account manager"
);
} else {
- url = gstate.acct_mgr_info.master_url;
- name = gstate.acct_mgr_info.login_name;
- password_hash = gstate.acct_mgr_info.password_hash;
- authenticator = gstate.acct_mgr_info.authenticator;
+ ami = gstate.acct_mgr_info;
}
} else {
bad_arg = !url_found || !name_found || !password_found;
@@ -986,7 +984,11 @@ static void handle_acct_mgr_rpc(GUI_RPC_CONN& grc) {
// Remove 'hash:'
password_hash = password.substr(5);
}
- }
+ safe_strcpy(ami.master_url, url.c_str());
+ safe_strcpy(ami.login_name, name.c_str());
+ safe_strcpy(ami.password_hash, password_hash.c_str());
+ safe_strcpy(ami.authenticator, authenticator.c_str());
+ }
}
if (bad_arg) {
@@ -997,11 +999,6 @@ static void handle_acct_mgr_rpc(GUI_RPC_CONN& grc) {
){
grc.mfout.printf("attached to a different AM - detach first\n");
} else {
- ACCT_MGR_INFO ami;
- safe_strcpy(ami.master_url, url.c_str());
- safe_strcpy(ami.login_name, name.c_str());
- safe_strcpy(ami.password_hash, password_hash.c_str());
- safe_strcpy(ami.authenticator, authenticator.c_str());
gstate.acct_mgr_op.do_rpc(ami, true);
grc.mfout.printf("\n");
}