mirror of https://github.com/BOINC/boinc.git
*** empty log message ***
svn path=/trunk/boinc/; revision=3923
This commit is contained in:
parent
be7d2664c9
commit
11fda1b929
|
@ -15483,11 +15483,6 @@ Rom July 19 2004
|
|||
|
||||
Karl 2004-07-21
|
||||
- fix bug in "couldn't find app" messages
|
||||
|
||||
sched/
|
||||
message_handler.C
|
||||
validator.C
|
||||
|
||||
- allow '.msi' as extension for installation package
|
||||
|
||||
tools/
|
||||
|
@ -15502,3 +15497,42 @@ Karl 2004-07-21
|
|||
old_news.php
|
||||
project.sample/
|
||||
project_news.inc
|
||||
|
||||
sched/
|
||||
message_handler.C
|
||||
validator.C
|
||||
|
||||
David 21 July 2004
|
||||
- Database optimization in the transitioner:
|
||||
add several results in a single SQL insert statement
|
||||
(using values (...),(...),(...))
|
||||
instead of separate inserts.
|
||||
This is enabled by a BATCH_INSERT compile flag in transitioner.C
|
||||
- Add a USE_TRANSACTIONS flag to transitioner.
|
||||
Leave it off for now.
|
||||
- For some reason we weren't processing the UPLOAD_URL symbol
|
||||
in result templates.
|
||||
Restore this, using the info in the config file.
|
||||
- transitioner: if anything fails (result creation, WU update), quit.
|
||||
- result.random must be initialize by caller on insert
|
||||
(not too relevant since we don't use it anymore)
|
||||
- start/commit_transaction are now members of DB_CONN
|
||||
rather than DB_BASE_SPECIAL
|
||||
- scheduler: in scan_work_array, do all "cheap" checks
|
||||
(i.e. those that don't require DB access)
|
||||
before releasing the semaphore.
|
||||
Thus if all the results are infeasible,
|
||||
we'll acquire/release the semaphore once, not 100 times.
|
||||
- re-enable team name search
|
||||
|
||||
db/
|
||||
boinc_db.C,h
|
||||
db_base.C,h
|
||||
html/user/
|
||||
team.php
|
||||
team_lookup.php
|
||||
sched/
|
||||
sched_send.C
|
||||
transitioner.C
|
||||
tools/
|
||||
backend_lib.C,h
|
||||
|
|
|
@ -492,6 +492,34 @@ void DB_RESULT::db_print(char* buf){
|
|||
UNESCAPE(stderr_out);
|
||||
}
|
||||
|
||||
void DB_RESULT::db_print_values(char* buf){
|
||||
ESCAPE(xml_doc_out);
|
||||
ESCAPE(stderr_out);
|
||||
sprintf(
|
||||
buf,
|
||||
"(0, %d, %d, "
|
||||
"%d, %d, %d, "
|
||||
"%d, %d, "
|
||||
"%d, %d, %d, "
|
||||
"'%s', %.15e, "
|
||||
"'%s', '%s', '%s', "
|
||||
"%d, %d, %d, "
|
||||
"%.15e, %.15e, %f, %d, "
|
||||
"%d, %d, %d, %d)",
|
||||
create_time, workunitid,
|
||||
server_state, outcome, client_state,
|
||||
hostid, userid,
|
||||
report_deadline, sent_time, received_time,
|
||||
name, cpu_time,
|
||||
xml_doc_in, xml_doc_out, stderr_out,
|
||||
batch, file_delete_state, validate_state,
|
||||
claimed_credit, granted_credit, opaque, random,
|
||||
app_version_num, appid, exit_status, teamid
|
||||
);
|
||||
UNESCAPE(xml_doc_out);
|
||||
UNESCAPE(stderr_out);
|
||||
}
|
||||
|
||||
void DB_RESULT::db_parse(MYSQL_ROW &r) {
|
||||
int i=0;
|
||||
clear();
|
||||
|
@ -524,11 +552,6 @@ void DB_RESULT::db_parse(MYSQL_ROW &r) {
|
|||
teamid = atoi(r[i++]);
|
||||
}
|
||||
|
||||
int DB_RESULT::insert() {
|
||||
random = lrand48();
|
||||
return DB_BASE::insert();
|
||||
}
|
||||
|
||||
void DB_MSG_FROM_HOST::db_print(char* buf) {
|
||||
ESCAPE(xml);
|
||||
sprintf(buf,
|
||||
|
|
|
@ -533,9 +533,9 @@ public:
|
|||
class DB_RESULT : public DB_BASE, public RESULT {
|
||||
public:
|
||||
DB_RESULT();
|
||||
int insert();
|
||||
int get_id();
|
||||
void db_print(char*);
|
||||
void db_print_values(char*);
|
||||
void db_parse(MYSQL_ROW &row);
|
||||
void operator=(RESULT& r) {RESULT::operator=(r);}
|
||||
};
|
||||
|
|
24
db/db_base.C
24
db/db_base.C
|
@ -60,6 +60,14 @@ const char* DB_CONN::error_string() {
|
|||
return mysql?mysql_error(mysql):"Not connected";
|
||||
}
|
||||
|
||||
int DB_CONN::start_transaction() {
|
||||
return do_query("START TRANSACTION");
|
||||
}
|
||||
|
||||
int DB_CONN::commit_transaction() {
|
||||
return do_query("COMMIT");
|
||||
}
|
||||
|
||||
DB_BASE::DB_BASE(DB_CONN& p, char *tn) : db(&p), table_name(tn) {
|
||||
is_high_priority = false;
|
||||
}
|
||||
|
@ -76,6 +84,12 @@ int DB_BASE::insert() {
|
|||
return db->do_query(query);
|
||||
}
|
||||
|
||||
int DB_BASE::insert_batch(const char* values) {
|
||||
char query[MAX_QUERY_LEN];
|
||||
sprintf(query, "insert into %s values %s", table_name, values);
|
||||
return db->do_query(query);
|
||||
}
|
||||
|
||||
// update an entire record
|
||||
//
|
||||
int DB_BASE::update() {
|
||||
|
@ -253,17 +267,9 @@ int DB_BASE::sum(double& x, char* field, char* clause) {
|
|||
DB_BASE_SPECIAL::DB_BASE_SPECIAL(DB_CONN& p) : db(&p) {
|
||||
}
|
||||
|
||||
int DB_BASE_SPECIAL::start_transaction() {
|
||||
return db->do_query("START TRANSACTION");
|
||||
}
|
||||
|
||||
int DB_BASE_SPECIAL::commit_transaction() {
|
||||
return db->do_query("COMMIT");
|
||||
}
|
||||
|
||||
// convert a string into a form that allows it to be used
|
||||
// in SQL queries delimited by single quotes:
|
||||
// replace ' with \', \ with \\
|
||||
// replace ' with \', '\' with '\\'
|
||||
//
|
||||
void escape_string(char* field, int len) {
|
||||
char buf[MAX_QUERY_LEN];
|
||||
|
|
|
@ -68,6 +68,8 @@ public:
|
|||
const char* error_string();
|
||||
|
||||
MYSQL* mysql;
|
||||
int start_transaction();
|
||||
int commit_transaction();
|
||||
};
|
||||
|
||||
// Base for derived classes that can access the DB
|
||||
|
@ -77,6 +79,7 @@ class DB_BASE {
|
|||
public:
|
||||
DB_BASE(DB_CONN&, char *table_name);
|
||||
int insert();
|
||||
int insert_batch(const char*);
|
||||
int update();
|
||||
int update_field(char*);
|
||||
int lookup_id(int id);
|
||||
|
@ -106,9 +109,6 @@ public:
|
|||
|
||||
DB_CONN* db;
|
||||
CURSOR cursor;
|
||||
|
||||
int start_transaction();
|
||||
int commit_transaction();
|
||||
};
|
||||
|
||||
void escape_string(char* field, int len);
|
||||
|
|
|
@ -23,7 +23,7 @@ echo "<p>".PROJECT." participants may form <b>teams</b>.
|
|||
</ul>
|
||||
<p>
|
||||
<form method=get action=team_lookup.php>
|
||||
Search for a team whose name contains:
|
||||
Search for teams whose name start with:
|
||||
<input name=team_name>
|
||||
<input type=submit name=search value=Search>
|
||||
</form>
|
||||
|
|
|
@ -12,14 +12,7 @@
|
|||
$length = count($words);
|
||||
$name_lc = strtolower($team_name);
|
||||
|
||||
echo "Team lookup disabled";
|
||||
page_tail();
|
||||
exit();
|
||||
|
||||
$query = sprintf(
|
||||
"select * from team where name_lc like '%s'",
|
||||
"%$name_lc%"
|
||||
);
|
||||
$query = "select * from team where name like '$name_lc%'";
|
||||
$result_list = mysql_query($query);
|
||||
page_head("Search Results");
|
||||
if ($result_list) {
|
||||
|
|
|
@ -490,47 +490,44 @@ static void scan_work_array(
|
|||
|
||||
WU_RESULT& wu_result = ss.wu_results[i];
|
||||
|
||||
// the following should be a critical section
|
||||
//
|
||||
// do fast checks on this wu_result;
|
||||
// i.e. ones that don't require DB access
|
||||
// if any check fails, continue
|
||||
|
||||
switch (wu_result.state) {
|
||||
case WR_STATE_EMPTY:
|
||||
case WR_STATE_CHECKED_OUT:
|
||||
continue;
|
||||
}
|
||||
wu_result.state = WR_STATE_CHECKED_OUT;
|
||||
unlock_sema();
|
||||
|
||||
// from here on in this loop, don't continue;
|
||||
// you can only goto dont_send (so that we reacquire semaphore)
|
||||
if (wreq.infeasible_only && (wu_result.infeasible_count==0)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (wu_result.workunit.rsc_disk_bound > wreq.disk_available) {
|
||||
wreq.insufficient_disk = true;
|
||||
wu_result.infeasible_count++;
|
||||
goto dont_send;
|
||||
}
|
||||
|
||||
if (wreq.infeasible_only && (wu_result.infeasible_count==0)) {
|
||||
goto dont_send;
|
||||
continue;
|
||||
}
|
||||
|
||||
// don't send if we're already sending a result for same WU
|
||||
//
|
||||
if (already_in_reply(wu_result, reply)) {
|
||||
goto dont_send;
|
||||
continue;
|
||||
}
|
||||
|
||||
// don't send if host can't handle it
|
||||
//
|
||||
wu = wu_result.workunit;
|
||||
if (!wu_is_feasible(wu, reply.host, wreq,
|
||||
sreq.resource_share_fraction)
|
||||
) {
|
||||
if (!wu_is_feasible(
|
||||
wu, reply.host, wreq, sreq.resource_share_fraction
|
||||
)) {
|
||||
log_messages.printf(
|
||||
SCHED_MSG_LOG::DEBUG, "[HOST#%d] [WU#%d %s] WU is infeasible\n",
|
||||
reply.host.id, wu.id, wu.name
|
||||
);
|
||||
wu_result.infeasible_count++;
|
||||
goto dont_send;
|
||||
continue;
|
||||
}
|
||||
|
||||
// Find the app and app_version for the client's platform.
|
||||
|
@ -540,14 +537,14 @@ static void scan_work_array(
|
|||
app = ss.lookup_app(wu.appid);
|
||||
found = sreq.has_version(*app);
|
||||
if (!found) {
|
||||
goto dont_send;
|
||||
continue;
|
||||
}
|
||||
avp = NULL;
|
||||
} else {
|
||||
found = find_app_version(wreq, wu, platform, ss, app, avp);
|
||||
if (!found) {
|
||||
wu_result.infeasible_count++;
|
||||
goto dont_send;
|
||||
continue;
|
||||
}
|
||||
|
||||
// see if the core client is too old.
|
||||
|
@ -555,12 +552,18 @@ static void scan_work_array(
|
|||
// isn't the result's fault
|
||||
//
|
||||
if (!app_core_compatible(wreq, *avp)) {
|
||||
goto dont_send;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
// end of fast checks - mark wu_result as checked out and release sema.
|
||||
// from here on in this loop, don't continue on failure;
|
||||
// instead, goto dont_send (so that we reacquire semaphore)
|
||||
|
||||
wu_result.state = WR_STATE_CHECKED_OUT;
|
||||
unlock_sema();
|
||||
|
||||
// Don't send if we've already sent a result of this WU to this user.
|
||||
// NOTE: do this check last since it involves a DB access
|
||||
//
|
||||
if (config.one_result_per_user_per_wu) {
|
||||
sprintf(buf,
|
||||
|
|
|
@ -47,6 +47,9 @@ using namespace std;
|
|||
|
||||
#define SELECT_LIMIT 100
|
||||
|
||||
#define BATCH_INSERT 1
|
||||
//#define USE_TRANSACTIONS 1
|
||||
|
||||
int startup_time;
|
||||
SCHED_CONFIG config;
|
||||
R_RSA_PRIVATE_KEY key;
|
||||
|
@ -59,7 +62,7 @@ int result_suffix(char* name) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
void handle_wu(
|
||||
int handle_wu(
|
||||
DB_TRANSITIONER_ITEM_SET& transitioner,
|
||||
std::vector<TRANSITIONER_ITEM>& items
|
||||
) {
|
||||
|
@ -226,8 +229,11 @@ void handle_wu(
|
|||
}
|
||||
} else if (items[0].assimilate_state == ASSIMILATE_INIT) {
|
||||
// If no error, generate new results if needed.
|
||||
// NOTE!! `n' must be a SIGNED integer!
|
||||
// NOTE: n must be signed
|
||||
//
|
||||
int n = items[0].target_nresults - nunsent - ninprogress - nsuccess;
|
||||
string values;
|
||||
char value_buf[MAX_QUERY_LEN];
|
||||
if (n > 0) {
|
||||
log_messages.printf(
|
||||
SCHED_MSG_LOG::NORMAL,
|
||||
|
@ -238,9 +244,10 @@ void handle_wu(
|
|||
sprintf(suffix, "%d", max_result_suffix+i+1);
|
||||
char rtfpath[256];
|
||||
sprintf(rtfpath, "../%s", items[0].result_template_file);
|
||||
#ifdef BATCH_INSERT
|
||||
retval = create_result(
|
||||
items[0].id, items[0].appid, items[0].name,
|
||||
rtfpath, suffix, key, config.upload_url
|
||||
rtfpath, suffix, key, config.upload_url, value_buf
|
||||
);
|
||||
if (retval) {
|
||||
log_messages.printf(
|
||||
|
@ -248,9 +255,41 @@ void handle_wu(
|
|||
"[WU#%d %s] create_result() %d\n",
|
||||
items[0].id, items[0].name, retval
|
||||
);
|
||||
break;
|
||||
return retval;
|
||||
}
|
||||
if (i==0) {
|
||||
values = value_buf;
|
||||
} else {
|
||||
values += ",";
|
||||
values += value_buf;
|
||||
}
|
||||
#else
|
||||
retval = create_result(
|
||||
items[0].id, items[0].appid, items[0].name,
|
||||
rtfpath, suffix, key, config.upload_url, 0
|
||||
);
|
||||
if (retval) {
|
||||
log_messages.printf(
|
||||
SCHED_MSG_LOG::CRITICAL,
|
||||
"[WU#%d %s] create_result() %d\n",
|
||||
items[0].id, items[0].name, retval
|
||||
);
|
||||
return retval;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#ifdef BATCH_INSERT
|
||||
DB_RESULT r;
|
||||
retval = r.insert_batch(values.c_str());
|
||||
if (retval) {
|
||||
log_messages.printf(
|
||||
SCHED_MSG_LOG::CRITICAL,
|
||||
"[WU#%d %s] insert_batch() %d\n",
|
||||
items[0].id, items[0].name, retval
|
||||
);
|
||||
return retval;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -359,7 +398,9 @@ void handle_wu(
|
|||
SCHED_MSG_LOG::CRITICAL,
|
||||
"[WU#%d %s] workunit.update() == %d\n", items[0].id, items[0].name, retval
|
||||
);
|
||||
return retval;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
bool do_pass() {
|
||||
|
@ -375,12 +416,13 @@ bool do_pass() {
|
|||
while (!transitioner.enumerate((int)time(0), mod_n, mod_i, SELECT_LIMIT, items)) {
|
||||
did_something = true;
|
||||
|
||||
#ifdef USE_TRANSACTIONS
|
||||
log_messages.printf(
|
||||
SCHED_MSG_LOG::DEBUG,
|
||||
"[WU#%d %s] Starting Transaction...\n",
|
||||
items[0].id, items[0].name
|
||||
);
|
||||
retval = transitioner.start_transaction();
|
||||
);
|
||||
retval = boinc_db.start_transaction();
|
||||
if (retval) {
|
||||
log_messages.printf(
|
||||
SCHED_MSG_LOG::CRITICAL,
|
||||
|
@ -388,15 +430,25 @@ bool do_pass() {
|
|||
items[0].id, items[0].name, retval
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
handle_wu(transitioner, items);
|
||||
retval = handle_wu(transitioner, items);
|
||||
if (retval) {
|
||||
log_messages.printf(
|
||||
SCHED_MSG_LOG::CRITICAL,
|
||||
"[WU#%d %s] handle_wu: %d; quitting\n",
|
||||
items[0].id, items[0].name, retval
|
||||
);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
#ifdef USE_TRANSACTIONS
|
||||
log_messages.printf(
|
||||
SCHED_MSG_LOG::DEBUG,
|
||||
"[WU#%d %s] Committing Transaction...\n",
|
||||
items[0].id, items[0].name
|
||||
);
|
||||
retval = transitioner.commit_transaction();
|
||||
retval = boinc_db.commit_transaction();
|
||||
if (retval) {
|
||||
log_messages.printf(
|
||||
SCHED_MSG_LOG::CRITICAL,
|
||||
|
@ -410,6 +462,7 @@ bool do_pass() {
|
|||
items[0].id, items[0].name
|
||||
);
|
||||
}
|
||||
#endif
|
||||
|
||||
check_stop_daemons();
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <ctime>
|
||||
#include <cassert>
|
||||
#include <unistd.h>
|
||||
#include <cmath>
|
||||
|
||||
#include "boinc_db.h"
|
||||
#include "crypt.h"
|
||||
|
@ -36,6 +37,12 @@
|
|||
#include "fcgi_stdio.h"
|
||||
#endif
|
||||
|
||||
static struct random_init {
|
||||
random_init() {
|
||||
srand48(getpid() + time(0));
|
||||
}
|
||||
} random_init;
|
||||
|
||||
int read_file(FILE* f, char* buf, int len) {
|
||||
int n = fread(buf, 1, len, f);
|
||||
buf[n] = 0;
|
||||
|
@ -212,7 +219,9 @@ int create_result(
|
|||
char* result_template_filename,
|
||||
char* result_name_suffix,
|
||||
R_RSA_PRIVATE_KEY& key,
|
||||
char* upload_url
|
||||
char* upload_url,
|
||||
char* query_string
|
||||
// if nonzero, write value list here; else do insert
|
||||
) {
|
||||
DB_RESULT result;
|
||||
char base_outfile_name[256];
|
||||
|
@ -226,8 +235,10 @@ int create_result(
|
|||
|
||||
retval = read_filename(result_template_filename, result_template, sizeof(result_template));
|
||||
if (retval) {
|
||||
fprintf(stderr, "Failed to read result template file '%s': %d\n",
|
||||
result_template_filename, retval);
|
||||
fprintf(stderr,
|
||||
"Failed to read result template file '%s': %d\n",
|
||||
result_template_filename, retval
|
||||
);
|
||||
return retval;
|
||||
}
|
||||
|
||||
|
@ -246,12 +257,16 @@ int create_result(
|
|||
}
|
||||
safe_strncpy(result.xml_doc_in, result_template, sizeof(result.xml_doc_in));
|
||||
|
||||
// NOTE: result::insert() sets random
|
||||
result.random = lrand48();
|
||||
|
||||
retval = result.insert();
|
||||
if (retval) {
|
||||
fprintf(stderr, "result.insert(): %d\n", retval);
|
||||
return retval;
|
||||
if (query_string) {
|
||||
result.db_print_values(query_string);
|
||||
} else {
|
||||
retval = result.insert();
|
||||
if (retval) {
|
||||
fprintf(stderr, "result.insert(): %d\n", retval);
|
||||
return retval;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -45,7 +45,8 @@ extern int create_result(
|
|||
char* result_template_filename,
|
||||
char* suffix,
|
||||
R_RSA_PRIVATE_KEY& key,
|
||||
char* upload_url
|
||||
char* upload_url,
|
||||
char* query_string=0
|
||||
);
|
||||
|
||||
extern int create_work(
|
||||
|
|
Loading…
Reference in New Issue