Przeglądaj źródła

modules_k/presence: Fixed bug - calling child_init in process main

	Process main calls child_init with process type PROC_MAIN before
	forking the TCP children. Since presence module opens database
	connection in child_init, this resulted in connection being
	inherited by the TCP children and wierd things happening when doing
	DB operations.
	Since there is no place in main() where child_init is
	called after all the forks, for the subs_db_mode=WRITE_BACK when
	process main needs to dump the subscribe table in database at
	shutdown, the solution was to open the database connection in
	mod_destroy().
Anca Vamanu 13 lat temu
rodzic
commit
7f54aacb74
1 zmienionych plików z 9 dodań i 3 usunięć
  1. 9 3
      modules_k/presence/presence.c

+ 9 - 3
modules_k/presence/presence.c

@@ -369,7 +369,7 @@ static int mod_init(void)
  */
 static int child_init(int rank)
 {
-	if (rank==PROC_INIT || rank==PROC_TCP_MAIN)
+	if (rank==PROC_INIT || rank==PROC_MAIN || rank==PROC_TCP_MAIN)
 		return 0; /* do nothing for the main process */
 
 	pid = my_pid();
@@ -462,8 +462,14 @@ static int mi_child_init(void)
  */
 static void destroy(void)
 {
-	if(subs_htable && pa_db)
-		timer_db_update(0, 0);
+	if(subs_htable && subs_dbmode == WRITE_BACK) {
+		/* open database connection */
+		pa_db = pa_dbf.init(&db_url);
+		if (!pa_db) {
+			LM_ERR("mod_destroy: unsuccessful connecting to database\n");
+		} else
+			timer_db_update(0, 0);
+	}
 
 	if(subs_htable)
 		destroy_shtable(subs_htable, shtable_size);