浏览代码

presence: be more resilient doing clean up of presentity values

previously if an error was found we were bailing out and the value
was kept so at next round the value will be there and no more values
where removed
Victor Seva 3 年之前
父节点
当前提交
444adb0b27
共有 1 个文件被更改,包括 58 次插入39 次删除
  1. 58 39
      src/modules/presence/publish.c

+ 58 - 39
src/modules/presence/publish.c

@@ -69,6 +69,7 @@ void ps_presentity_db_timer_clean(unsigned int ticks, void *param)
 	int n_db_cols = 0, n_result_cols = 0;
 	int n_db_cols = 0, n_result_cols = 0;
 	int event_col, etag_col, user_col, domain_col;
 	int event_col, etag_col, user_col, domain_col;
 	int i = 0, num_watchers = 0;
 	int i = 0, num_watchers = 0;
+	pres_ev_t fake;
 	presentity_t pres;
 	presentity_t pres;
 	str uri = {0, 0}, event, *rules_doc = NULL;
 	str uri = {0, 0}, event, *rules_doc = NULL;
 	static str query_str;
 	static str query_str;
@@ -121,6 +122,7 @@ void ps_presentity_db_timer_clean(unsigned int ticks, void *param)
 		rows = RES_ROWS(result);
 		rows = RES_ROWS(result);
 
 
 		for(i = 0; i < RES_ROW_N(result); i++) {
 		for(i = 0; i < RES_ROW_N(result); i++) {
+			num_watchers = 0;
 			values = ROW_VALUES(&rows[i]);
 			values = ROW_VALUES(&rows[i]);
 			memset(&pres, 0, sizeof(presentity_t));
 			memset(&pres, 0, sizeof(presentity_t));
 
 
@@ -134,28 +136,33 @@ void ps_presentity_db_timer_clean(unsigned int ticks, void *param)
 			event.len = strlen(event.s);
 			event.len = strlen(event.s);
 			pres.event = contains_event(&event, NULL);
 			pres.event = contains_event(&event, NULL);
 			if(pres.event == NULL || pres.event->evp == NULL) {
 			if(pres.event == NULL || pres.event->evp == NULL) {
-				LM_ERR("event not found\n");
-				goto error;
+				LM_ERR("event[%.*s] not found\n", STR_FMT(&event));
+				memset(&fake, 0, sizeof(pres_ev_t));
+				fake.name = event;
+				pres.event = &fake;
+				goto simple_error;
 			}
 			}
 
 
 			if(uandd_to_uri(pres.user, pres.domain, &uri) < 0) {
 			if(uandd_to_uri(pres.user, pres.domain, &uri) < 0) {
-				LM_ERR("constructing uri\n");
-				goto error;
+				LM_ERR("constructing uri from [user]=%.*s  [domain]=%.*s\n",
+					STR_FMT(&pres.user), STR_FMT(&pres.domain));
+				goto simple_error;
 			}
 			}
 
 
 			/* delete from hash table */
 			/* delete from hash table */
 			if(publ_cache_mode==PS_PCACHE_HYBRID
 			if(publ_cache_mode==PS_PCACHE_HYBRID
 					&& delete_phtable(&uri, pres.event->evp->type) < 0) {
 					&& delete_phtable(&uri, pres.event->evp->type) < 0) {
-				LM_ERR("deleting from presentity hash table\n");
-				goto error;
+				LM_ERR("deleting uri[%.*s] event[%.*s] from presentity hash table\n",
+					STR_FMT(&uri), STR_FMT(&event));
+				goto simple_error;
 			}
 			}
 
 
-			LM_DBG("found expired publish for [user]=%.*s  [domanin]=%.*s\n",
+			LM_DBG("found expired publish for [user]=%.*s  [domain]=%.*s\n",
 					pres.user.len, pres.user.s, pres.domain.len, pres.domain.s);
 					pres.user.len, pres.user.s, pres.domain.len, pres.domain.s);
 
 
 			if(pres_force_delete == 1) {
 			if(pres_force_delete == 1) {
 				if(delete_presentity(&pres, NULL) < 0) {
 				if(delete_presentity(&pres, NULL) < 0) {
-					LM_ERR("Deleting presentity\n");
+					LM_ERR("Deleting presentity uri[%.*s]\n", STR_FMT(&uri));
 					goto error;
 					goto error;
 				}
 				}
 			} else if(pres_notifier_processes > 0) {
 			} else if(pres_notifier_processes > 0) {
@@ -171,7 +178,7 @@ void ps_presentity_db_timer_clean(unsigned int ticks, void *param)
 						if(pa_dbf.abort_transaction(pa_db) < 0)
 						if(pa_dbf.abort_transaction(pa_db) < 0)
 							LM_ERR("in abort_transaction\n");
 							LM_ERR("in abort_transaction\n");
 					}
 					}
-					goto error;
+					goto next;
 				}
 				}
 
 
 				if(num_watchers > 0) {
 				if(num_watchers > 0) {
@@ -181,12 +188,12 @@ void ps_presentity_db_timer_clean(unsigned int ticks, void *param)
 							if(pa_dbf.abort_transaction(pa_db) < 0)
 							if(pa_dbf.abort_transaction(pa_db) < 0)
 								LM_ERR("in abort_transaction\n");
 								LM_ERR("in abort_transaction\n");
 						}
 						}
-						goto error;
+						goto next;
 					}
 					}
 				} else {
 				} else {
 					if(delete_presentity(&pres, NULL) < 0) {
 					if(delete_presentity(&pres, NULL) < 0) {
-						LM_ERR("Deleting presentity\n");
-						goto error;
+						LM_ERR("Deleting presentity uri[%.*s]\n", STR_FMT(&uri));
+						goto next;
 					}
 					}
 				}
 				}
 				if(pa_dbf.end_transaction) {
 				if(pa_dbf.end_transaction) {
@@ -201,22 +208,30 @@ void ps_presentity_db_timer_clean(unsigned int ticks, void *param)
 								   &pres.user, &pres.domain, &rules_doc)
 								   &pres.user, &pres.domain, &rules_doc)
 								   < 0) {
 								   < 0) {
 					LM_ERR("getting rules doc\n");
 					LM_ERR("getting rules doc\n");
-					goto error;
+					goto simple_error;
 				}
 				}
 				if(publ_notify(&pres, uri, NULL, &pres.etag, rules_doc) < 0) {
 				if(publ_notify(&pres, uri, NULL, &pres.etag, rules_doc) < 0) {
 					LM_ERR("sending Notify request\n");
 					LM_ERR("sending Notify request\n");
-					goto error;
-				}
-				if(rules_doc) {
-					if(rules_doc->s)
-						pkg_free(rules_doc->s);
-					pkg_free(rules_doc);
-					rules_doc = NULL;
+					goto simple_error;
 				}
 				}
 			}
 			}
 
 
-			pkg_free(uri.s);
-			uri.s = NULL;
+simple_error:
+			if(num_watchers == 0 && delete_presentity(&pres, NULL) < 0) {
+				LM_ERR("Deleting presentity\n");
+			}
+next:
+			if(uri.s) {
+				pkg_free(uri.s);
+				uri.s = NULL;
+			}
+			if(rules_doc) {
+				if(rules_doc->s) {
+					pkg_free(rules_doc->s);
+				}
+				pkg_free(rules_doc);
+				rules_doc = NULL;
+			}
 		}
 		}
 	} while(db_fetch_next(&pa_dbf, pres_fetch_rows, pa_db, &result) == 1
 	} while(db_fetch_next(&pa_dbf, pres_fetch_rows, pa_db, &result) == 1
 			&& RES_ROW_N(result) > 0);
 			&& RES_ROW_N(result) > 0);
@@ -277,22 +292,23 @@ void ps_ptable_timer_clean(unsigned int ticks, void *param)
 		pres.etag = ptn->etag;
 		pres.etag = ptn->etag;
 		pres.event = contains_event(&ptn->event, NULL);
 		pres.event = contains_event(&ptn->event, NULL);
 		if(pres.event == NULL || pres.event->evp == NULL) {
 		if(pres.event == NULL || pres.event->evp == NULL) {
-			LM_ERR("event not found\n");
-			goto error;
+			LM_ERR("event[%.*s] not found\n", STR_FMT(&ptn->event));
+			goto next;
 		}
 		}
 
 
 		if(uandd_to_uri(pres.user, pres.domain, &uri) < 0) {
 		if(uandd_to_uri(pres.user, pres.domain, &uri) < 0) {
-			LM_ERR("constructing uri\n");
-			goto error;
+			LM_ERR("constructing uri from [user]=%.*s  [domain]=%.*s\n",
+				STR_FMT(&pres.user), STR_FMT(&pres.domain));
+			goto next;
 		}
 		}
 
 
-		LM_DBG("found expired publish for [user]=%.*s  [domanin]=%.*s\n",
+		LM_DBG("found expired publish for [user]=%.*s  [domain]=%.*s\n",
 				pres.user.len, pres.user.s, pres.domain.len, pres.domain.s);
 				pres.user.len, pres.user.s, pres.domain.len, pres.domain.s);
 
 
 		if(pres_force_delete == 1) {
 		if(pres_force_delete == 1) {
 			if(ps_ptable_remove(ptn) <0) {
 			if(ps_ptable_remove(ptn) <0) {
 				LM_ERR("Deleting presentity\n");
 				LM_ERR("Deleting presentity\n");
-				goto error;
+				goto next;
 			}
 			}
 		} else {
 		} else {
 			if(pres.event->get_rules_doc
 			if(pres.event->get_rules_doc
@@ -300,25 +316,28 @@ void ps_ptable_timer_clean(unsigned int ticks, void *param)
 								&pres.user, &pres.domain, &rules_doc)
 								&pres.user, &pres.domain, &rules_doc)
 								< 0) {
 								< 0) {
 				LM_ERR("getting rules doc\n");
 				LM_ERR("getting rules doc\n");
-				goto error;
+				goto next;
 			}
 			}
 			if(publ_notify(&pres, uri, NULL, &pres.etag, rules_doc) < 0) {
 			if(publ_notify(&pres, uri, NULL, &pres.etag, rules_doc) < 0) {
 				LM_ERR("sending Notify request\n");
 				LM_ERR("sending Notify request\n");
-				goto error;
-			}
-			if(rules_doc) {
-				if(rules_doc->s)
-					pkg_free(rules_doc->s);
-				pkg_free(rules_doc);
-				rules_doc = NULL;
+				goto next;
 			}
 			}
 		}
 		}
 
 
-		pkg_free(uri.s);
-		uri.s = NULL;
+next:
+		if(uri.s) {
+			pkg_free(uri.s);
+			uri.s = NULL;
+		}
+		if(rules_doc) {
+			if(rules_doc->s) {
+				pkg_free(rules_doc->s);
+			}
+			pkg_free(rules_doc);
+			rules_doc = NULL;
+		}
 	}
 	}
 
 
-error:
 	for(ptn = ptlist; ptn != NULL; ptn = ptn->next) {
 	for(ptn = ptlist; ptn != NULL; ptn = ptn->next) {
 		if(ps_ptable_remove(ptn) <0) {
 		if(ps_ptable_remove(ptn) <0) {
 			LM_ERR("failed deleting presentity item\n");
 			LM_ERR("failed deleting presentity item\n");