|
发表于 2018-4-9 10:53:09
|
显示全部楼层
仔细对比了一下LZ和我的日志,只有最后一句“Couldn't create host record in database”最可疑。在代码中查了查,发现是在对 MySql 执行 insert 的时候出错了。函数:sched/handle_request.cpp#authenticate_user()- host = g_request->host;
- host.id = 0;
- host.create_time = time(0);
- host.userid = g_reply->user.id;
- host.rpc_seqno = 0;
- host.expavg_time = time(0);
- safe_strcpy(host.venue, g_reply->user.venue);
- host.fix_nans();
- retval = host.insert();
- if (retval) {
- g_reply->insert_message(
- "Couldn't create host record in database", "low"
- );
- boinc_db.print_error("host.insert()");
- log_messages.printf(MSG_CRITICAL, "host.insert() failed\n");
- return retval;
- }
复制代码 这个 host 正是 class DB_HOST,DB_HOST 继承自 DB_BASE,于是 host.insert() 调用到了 db/db_base.cpp#insert():- int DB_BASE::insert() {
- char vals[MAX_QUERY_LEN*2], query[MAX_QUERY_LEN*2];
- db_print(vals);
- sprintf(query, "insert into %s set %s", table_name, vals);
- return db->do_query(query);
- }
复制代码 而此处的 db_print() 是由 DB_HOST 实现的,用来拼装 insert 所需的参数,比较长,这里就不展开了。看看下面的关键地方 db->do_query():- int DB_CONN::do_query(const char* p) {
- int retval;
- if (g_print_queries) {
- #ifdef _USING_FCGI_
- log_messages.printf(MSG_NORMAL, "query: %s\n", p);
- #else
- fprintf(stderr, "query: %s\n", p);
- #endif
- }
- retval = mysql_query(mysql, p);
- if (retval) {
- fprintf(stderr, "Database error: %s\nquery=%s\n", error_string(), p);
- }
- return retval;
- }
复制代码 应该就是 mysql_query() 这里出错了,但是看不到详细的log,所以没法断定为什么会插入出错。
还有一个疑点,mysql_query() 是在哪里实现的没有找到,我不记得安装 boinc 的时候安装过 mysql,看 boinc 也没有带 mysql 相关的库,甚至在 db/db_base.h 里引用的 mysql.h 也没有找到,莫非追错地方了。。
还有一种可能是某个类继承了 DB_CONN 并且重写了 insert(),但是我并没有找到这样的地方。
我怀疑 LZ 的安装包有没有问题,我的安装包 MD5 值是:22a01b830c145133a8cabe5b55048c94 boinc_7.8.3_windows_x86_64.exe
LZ 可以校验下 MD5 值与我的是否相同。
也可以换一个安装包试试。
或者把这个安装包装到其它电脑上试试。
|
|