// Berkeley Open Infrastructure for Network Computing // http://boinc.berkeley.edu // Copyright (C) 2005 University of California // // This is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public // License as published by the Free Software Foundation; // either version 2.1 of the License, or (at your option) any later version. // // This software is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU Lesser General Public License for more details. // // To view the GNU Lesser General Public License visit // http://www.gnu.org/copyleft/lesser.html // or write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA // update_stats: // Update average credit for idle users, hosts and teams. // These fields are updates as new credit is granted; // the purpose of this program is to decay credit of entities // that are inactive for long periods. // Hence it should be run about once a day at most. // // Also updates the nusers field of teams // // usage: update_stats [-update_teams] [-update_users] [-update_hosts] #include "config.h" #include #include #include #include #include #include "boinc_db.h" #include "util.h" #include "str_util.h" #include "sched_config.h" #include "sched_util.h" #include "sched_msgs.h" #ifdef EINSTEIN_AT_HOME #define UPDATE_INTERVAL 3600*24; #else #define UPDATE_INTERVAL 3600*24*4; #endif double update_time_cutoff; int update_users() { DB_USER user; int retval; char buf[256]; while (!user.enumerate("where expavg_credit>0.1")) { if (user.expavg_time > update_time_cutoff) continue; update_average(0, 0, CREDIT_HALF_LIFE, user.expavg_credit, user.expavg_time); sprintf( buf, "expavg_credit=%f, expavg_time=%f", user.expavg_credit, user.expavg_time ); retval = user.update_field(buf); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't update user %d\n", user.id); return retval; } } return 0; } int update_hosts() { DB_HOST host; int retval; char buf[256]; while (!host.enumerate("where expavg_credit>0.1")) { if (host.expavg_time > update_time_cutoff) continue; update_average(0, 0, CREDIT_HALF_LIFE, host.expavg_credit, host.expavg_time); sprintf( buf,"expavg_credit=%f, expavg_time=%f", host.expavg_credit, host.expavg_time ); retval = host.update_field(buf); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't update host %d\n", host.id); return retval; } } return 0; } int get_team_totals(TEAM& team) { int nusers; int retval; DB_USER user; char buf[256]; // count the number of users on the team // sprintf(buf, "where teamid=%d", team.id); retval = user.count(nusers, buf); if (retval) return retval; if (team.nusers != nusers) { log_messages.printf(MSG_CRITICAL, "updating member count for [TEAM#%d]: database has %d users, count shows %d\n", team.id, team.nusers, nusers ); } team.nusers = nusers; return 0; } // fill in the nusers, total_credit and expavg_credit fields // of the team table. // This may take a while; don't do it often // int update_teams() { DB_TEAM team; int retval; char buf[256]; while (!team.enumerate("where expavg_credit>0.1")) { retval = get_team_totals(team); if (retval) { log_messages.printf(MSG_CRITICAL, "update_teams: get_team_credit([TEAM#%d]) failed: %d\n", team.id, retval ); continue; } if (team.expavg_time < update_time_cutoff) { update_average(0, 0, CREDIT_HALF_LIFE, team.expavg_credit, team.expavg_time); } sprintf( buf, "expavg_credit=%f, expavg_time=%f, nusers=%d", team.expavg_credit, team.expavg_time, team.nusers ); retval = team.update_field(buf); if (retval) { log_messages.printf(MSG_CRITICAL, "Can't update team %d\n", team.id); return retval; } } return 0; } int main(int argc, char** argv) { int retval, i; bool do_update_teams = false, do_update_users = false; bool do_update_hosts = false; update_time_cutoff = time(0) - UPDATE_INTERVAL; check_stop_daemons(); for (i=1; i