Index: /branches/rel_apv_10_7_4/usr/click/lib/libhc/hc_functions.c
===================================================================
--- /branches/rel_apv_10_7_4/usr/click/lib/libhc/hc_functions.c	(revision 40189)
+++ /branches/rel_apv_10_7_4/usr/click/lib/libhc/hc_functions.c	(working copy)
@@ -1020,6 +1020,15 @@
 		}
 	}
 
+	int *health_records = malloc(sizeof(int) * hc_slb_rs_limit);
+	if (!health_records) return;
+
+	for (i = 0; i < hc_slb_rs_limit; i++) {
+		health_records[i] = 0;
+		if (slb_hc_array[i].hc_general_info.is_server_active)
+			health_records[i] = map_for_servers[i];
+	}
+
 	/*Additional health check*/
 	for (j = hc_slb_rs_limit; j < hc_slb_rs_limit + SLB_RS_HC_MAX_COUNT; j++) {
 		if (slb_hc_array[j].hc_general_info.is_server_active &&
@@ -1048,8 +1057,18 @@
 						map_for_servers[parent_rs] = 0;
 					}
 				} else {
-					if (slb_hc_array[j].hc_general_info.view_server_health == RS_UNHEALTHY) {
-						map_for_servers[parent_rs] = 0;
+					/* TWSD-1624,
+					health check logic of relation `or and`:
+					if hc_type is None, health = (add1 && add2 && add3 ...)
+					else, health = (parent || (add1 && add2 && add3 ...)) */
+					if (health_records[parent_rs] != 1) {
+						if (health_records[parent_rs] != -1) {
+							// if `j` is first additional,`add1`, and hc_type is None or parent is 0, health = add1
+							map_for_servers[parent_rs] = slb_hc_array[j].hc_general_info.view_server_health == RS_HEALTHY? 1: 0;
+							health_records[parent_rs] = -1;
+						} else if (map_for_servers[parent_rs] == 1 && slb_hc_array[j].hc_general_info.view_server_health == RS_UNHEALTHY) {
+							map_for_servers[parent_rs] = 0;
+						}
 					}
 				}
 			} else if (slb_hc_array[parent_rs].hc_conf_info.hc_relation == HC_AND) {
@@ -1079,6 +1098,7 @@
 			}
 		}
 	}
+	free(health_records);
 
 	/* Group health check*/
 	bzero(ghc_parent_rs_up_count, sizeof(ghc_parent_rs_up_count));
