Страница 1 из 1

pvpgn 1.8.5 & mysql 5.0.77

Добавлено: 2009-04-20 8:35:04
thefree
Проблема заключается в том, что pvpgn не успевает подключится к серверу mysql т.к. не успевает загрузится mysql.
rc.d отвергаем сразу
# rcorder /etc/rc.d/* /usr/local/etc/rc.d/*
...
/etc/rc.d/LOGIN
/usr/local/etc/rc.d/viperhive
/usr/local/etc/rc.d/rsyncd
/usr/local/etc/rc.d/mysql-server
/usr/local/etc/rc.d/lighttpd
/usr/local/etc/rc.d/bnetd -< pvpgn
...
Вот задался я вопросом, в mysql же есть реконнект.
Открыл исходники

Код: Выделить всё

#if MYSQL_VERSION_ID >= 50003
  #if MYSQL_VERSION_ID < 50013
    eventlog(eventlog_level_warn,__FUNCTION__,"Your mySQL client lib version does not support reconnecting after a timeout.");
    eventlog(eventlog_level_warn,__FUNCTION__,"If this causes you any trouble you are advices to upgrade");
    eventlog(eventlog_level_warn,__FUNCTION__,"your mySQL client libs to at least mySQL 5.0.13 to resolve this problem.");
    // we might try a dirty hack like the following, but I'm not sure if it will work
    // mysql->reconnect = 1;
  #endif
  #if MYSQL_VERSION_ID >= 50019
    my_bool my_true = (my_bool)1;
    if (mysql_options(mysql, MYSQL_OPT_RECONNECT, &my_true)){
      eventlog(eventlog_level_warn,__FUNCTION__,"Failed to turn on MYSQL_OPT_RECONNECT.");
    }else{
      eventlog(eventlog_level_info,__FUNCTION__,"Successfully turned on MYSQL_OPT_RECONNECT.");
    }
  #endif
#endif


    if (mysql_real_connect(mysql, host, user, pass, name, port ? atoi(port) : 0, socket, CLIENT_FOUND_ROWS) == NULL) {
        eventlog(eventlog_level_error, __FUNCTION__, "error connecting to database (db said: '%s')", mysql_error(mysql));
	mysql_close(mysql);
        return -1;
    }

#if MYSQL_VERSION_ID >= 50013
  #if MYSQL_VERSION_ID < 50019
    my_bool my_true = (my_bool)1;
    if (mysql_options(mysql, MYSQL_OPT_RECONNECT, &my_true)){
      eventlog(eventlog_level_warn,__FUNCTION__,"Failed to turn on MYSQL_OPT_RECONNECT.");
    }else{
      eventlog(eventlog_level_info,__FUNCTION__,"Successfully turned on MYSQL_OPT_RECONNECT.");
    }
  #endif
#endif
вот описан реконект mysql у меня mysql-server-5.0.77_1, возможность MYSQL_OPT_RECONNECT поддерживает.
в логах вижу

Код: Выделить всё

Apr 19 22:54:49 [info ] sql_mysql_init: Successfully turned on MYSQL_OPT_RECONNECT.
Apr 19 22:54:49 [error] sql_mysql_init: error connecting to database (db said: 'Can't connect to MySQL server on '127.0.0.1' (61)')
Apr 19 22:54:49 [error] sql_init: got error init db
Apr 19 22:54:49 [error] pre_server_startup: storage init failed
Теперь вопрос, скажите как подправить исходный код, что бы работал реконект, по логам видно что он не отрабатывается.
Не программист, скажите куда копать ... сам доделаю.
Пока думаю добавить while

Re: pvpgn 1.8.5 & mysql 5.0.77

Добавлено: 2009-04-20 8:44:00
zg
thefree писал(а):Проблема заключается в том, что pvpgn не успевает подключится к серверу mysql т.к. не успевает загрузится mysql.
проблема известная, уже решённая
thefree писал(а):rc.d отвергаем сразу
ну и смысл тогда темы создавать?
thefree писал(а):вот описан реконект mysql у меня mysql-server-5.0.77_1, возможность MYSQL_OPT_RECONNECT поддерживает.
ну какбэ я так понимаю это для уже установленного соединения, если вдруг оборвётся, а не для того, чтобы заддосить сервер.

Re: pvpgn 1.8.5 & mysql 5.0.77

Добавлено: 2009-04-20 9:35:37
thefree
zg писал(а):проблема известная, уже решённая
Решение это вставить sleep?
Вы считаете правильным, что rc.d имеет sleep? То есть пока у меня не отработает /usr/local/etc/rc.d/bnetd дальше у меня загрузка не пойдёт. Мне кажется это в корни не верно.
zg писал(а):ну и смысл тогда темы создавать?
Что бы не советовали копать в сторону rc.d, т.к. идея уже отработано.
zg писал(а): ну какбэ я так понимаю это для уже установленного соединения, если вдруг оборвётся, а не для того, чтобы заддосить сервер.
Ну о каком ддосе идёт речь? Возможна же сделать цыкл из 5и попыток с интервалом в 5-10ть секунд. Если не получилось то к чертям.

Re: pvpgn 1.8.5 & mysql 5.0.77

Добавлено: 2009-04-20 11:01:50
paradox
ну давай исходник того файла где там мускуль коннектиться

Re: pvpgn 1.8.5 & mysql 5.0.77

Добавлено: 2009-04-20 11:06:57
thefree
paradox писал(а):ну давай исходник того файла где там мускуль коннектиться
человек ...

Re: pvpgn 1.8.5 & mysql 5.0.77

Добавлено: 2009-04-20 11:15:19
paradox

Код: Выделить всё

+ int i;
+for (i = 0; i < 6; i++)
    if (mysql_real_connect(mysql, host, user, pass, name, port ? atoi(port) : 0, socket, CLIENT_FOUND_ROWS) == NULL) {
        eventlog(eventlog_level_error, __FUNCTION__, "error connecting to database (db said: '%s')", mysql_error(mysql));
+	//mysql_close(mysql);
+        //return -1;
+        sleep(5);
    }

+  if (i == 6)
+  {
+       mysql_close(mysql);
+       return -1;
+ }

Re: pvpgn 1.8.5 & mysql 5.0.77

Добавлено: 2009-04-20 11:33:16
thefree
а если вот так сделать?

Код: Выделить всё

--- sql_mysql.c.orig	2009-04-20 12:21:17.000000000 +0400
+++ sql_mysql.c	2009-04-20 12:31:57.000000000 +0400
@@ -73,6 +73,19 @@
         return -1;
     }
 
+    int i;
+    while ((mysql_real_connect(mysql, host, user, pass, name, port ? atoi(port) : 0, socket, CLIENT_FOUND_ROWS) == NULL) && (i <= 5)) {
+	mysql_close(mysql);
+	sleep(5);
+	i++;
+    }
+
+    if (mysql_error(mysql) != NULL) {
+        eventlog(eventlog_level_error, __FUNCTION__, "error connecting to database (db said: '%s')", mysql_error(mysql));
+	mysql_close(mysql);
+        return -1;
+    }
+
 #if MYSQL_VERSION_ID >= 50003
   #if MYSQL_VERSION_ID < 50013
     eventlog(eventlog_level_warn,__FUNCTION__,"Your mySQL client lib version does not support reconnecting after a timeout.");
@@ -91,24 +104,6 @@
   #endif
 #endif
 
-
-    if (mysql_real_connect(mysql, host, user, pass, name, port ? atoi(port) : 0, socket, CLIENT_FOUND_ROWS) == NULL) {
-        eventlog(eventlog_level_error, __FUNCTION__, "error connecting to database (db said: '%s')", mysql_error(mysql));
-	mysql_close(mysql);
-        return -1;
-    }
-
-#if MYSQL_VERSION_ID >= 50013
-  #if MYSQL_VERSION_ID < 50019
-    my_bool my_true = (my_bool)1;
-    if (mysql_options(mysql, MYSQL_OPT_RECONNECT, &my_true)){
-      eventlog(eventlog_level_warn,__FUNCTION__,"Failed to turn on MYSQL_OPT_RECONNECT.");
-    }else{
-      eventlog(eventlog_level_info,__FUNCTION__,"Successfully turned on MYSQL_OPT_RECONNECT.");
-    }
-  #endif
-#endif
-
     return 0;
 }

Re: pvpgn 1.8.5 & mysql 5.0.77

Добавлено: 2009-04-20 11:36:40
paradox
я бы его остави на том месте где нужно
а ты его вверх поднял зачемто

к томуже
mysql_close(mysql);
в цикле нельзя закрывать
иначе постоянно будет еррор

Re: pvpgn 1.8.5 & mysql 5.0.77

Добавлено: 2009-04-20 11:44:45
thefree
а зачем MYSQL_OPT_RECONNECT ставить до коннекта? он же срабатывает если произашол разрыв после удачного соединения.

Вот, что у меня получилось в конце, подправьте если не так.

Re: pvpgn 1.8.5 & mysql 5.0.77

Добавлено: 2009-04-20 11:54:47
paradox
MYSQL_OPT_RECONNECT
вообще поудаляй нафиг

Re: pvpgn 1.8.5 & mysql 5.0.77

Добавлено: 2009-04-20 12:10:01
thefree
лажа вышла

Код: Выделить всё

sql_mysql_init: error connecting to database (db said: '')
хотя

Код: Выделить всё

if (mysql_error(mysql)) {
        eventlog(eventlog_level_error, __FUNCTION__, "error connecting to database (db said: '%s')", mysql_erro
r(mysql));
        mysql_close(mysql);
        return -1;
    }
сделаю проверку в духи

Код: Выделить всё

if(mysql_error(mysql)[0] != NULL)

Re: pvpgn 1.8.5 & mysql 5.0.77

Добавлено: 2009-04-20 12:12:49
paradox
то ты что то не то сделал

у меня в биллинге
работает как часы
особенно когда между серверами связь теряеться поскольку находяться на большом растоянии

Код: Выделить всё

/*
 * reconnect to database
 */
MYSQL *
reconnect_sql_db(void){

	int	i = 0;
	MYSQL *mysql = NULL;

		syslog(LOG_INFO, "MYSQL:%s %d", __FUNCTION__, MYSQL_VERSION_ID);
#if MYSQL_VERSION_ID >= 40013
        mysql_init(&real_mysql);
	for (i = 0; i < 6; i++)
	if (!mysql_real_connect(&real_mysql,
				sql_host,
				sql_user,
				sql_pswd,
				sql_name, 0, NULL, CLIENT_FOUND_ROWS)) {
		syslog(LOG_ERR, "MYSQL: Cannot Connect to %s@%s:%s",
			sql_host,sql_user,sql_name);
		mysql = NULL;
		sleep(5);
        } else {
		mysql = &real_mysql;
		break;
	}
#else
	for (i = 0; i < 6; i++)
        if (!mysql_connect(&real_mysql,sql_host,sql_user,sql_pswd)){
		syslog(LOG_ERR, "MYSQL: Cannot Connect to %s@%s:%s",
			sql_host,sql_user,sql_name);
		mysql = NULL;
		sleep(5);
        } else {
		mysql = &real_mysql;
		break;
	}
	if (mysql != NULL)
	      for (i = 0; i < 6; i++)
		if (mysql_select_db(mysql,sql_name)){
			syslog(LOG_ERR, "MYSQL cannot select db %s",sql_name);
			syslog(LOG_ERR, "MYSQL error: %s",mysql_error(mysql));
			sleep(5);
        	} else {
			return mysql;
		}
#endif
	syslog(LOG_ERR, "MYSQL: Giving up on connect");
	return mysql;

}
я тебе давал что изменить
а ты там химичишь....

Re: pvpgn 1.8.5 & mysql 5.0.77

Добавлено: 2009-04-20 12:21:07
thefree
а я хочу своих баранов, победил ...

Код: Выделить всё

Apr 20 13:18:02 [info ] storage_init: initializing storage layer (available drivers: file, sql, sql2)
Apr 20 13:18:02 [warn ] sql_mysql_init: Reconnect to mysql in 5 second, attempts 1 / 5
Apr 20 13:18:07 [info ] sql_mysql_init: Successfully turned on MYSQL_OPT_RECONNECT.
Теперь грузится все при загрузке системы.
Если комуто интересно вечером выкину файлик ...

p.s. 2paradox thx