Selaa lähdekoodia

Patch from Muni and Mark to properly calculate the header size
field so that the totem delivery assertion doesn't assert when
using ckpt services.

(Logical change 1.171)


git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@580 fd59a12c-fef9-0310-b244-a6a79926bd2f

Steven Dake 21 vuotta sitten
vanhempi
commit
50f9bbdf24
1 muutettua tiedostoa jossa 13 lisäystä ja 7 poistoa
  1. 13 7
      exec/ckpt.c

+ 13 - 7
exec/ckpt.c

@@ -531,6 +531,7 @@ static int ckpt_recovery_process (void)
 					 */
 					 */
 					iovecs[1].iov_base = ((char*)ckptCheckpointSection->sectionDescriptor.sectionId.id);
 					iovecs[1].iov_base = ((char*)ckptCheckpointSection->sectionDescriptor.sectionId.id);
 					iovecs[1].iov_len = ckptCheckpointSection->sectionDescriptor.sectionId.idLen;
 					iovecs[1].iov_len = ckptCheckpointSection->sectionDescriptor.sectionId.idLen;
+					request_exec_sync_state.header.size += iovecs[1].iov_len;	
 					 
 					 
 					/*
 					/*
 					 * Check to see if we can queue the new message and if you can
 					 * Check to see if we can queue the new message and if you can
@@ -568,7 +569,7 @@ static int ckpt_recovery_process (void)
 					* Create and save a new Sync Section message.
 					* Create and save a new Sync Section message.
 					*/			
 					*/			
 								
 								
-					request_exec_sync_section.header.size =	sizeof (struct req_exec_ckpt_synchronize_section);
+					request_exec_sync_section.header.size =	sizeof (struct req_exec_ckpt_synchronize_section); 
 					request_exec_sync_section.header.id = MESSAGE_REQ_EXEC_CKPT_SYNCHRONIZESECTION;    
 					request_exec_sync_section.header.id = MESSAGE_REQ_EXEC_CKPT_SYNCHRONIZESECTION;    
 					memcpy (&request_exec_sync_section.previous_ring_id, &saved_ring_id, sizeof(struct memb_ring_id));
 					memcpy (&request_exec_sync_section.previous_ring_id, &saved_ring_id, sizeof(struct memb_ring_id));
 					memcpy (&request_exec_sync_section.checkpointName, &checkpoint->name, sizeof(SaNameT));
 					memcpy (&request_exec_sync_section.checkpointName, &checkpoint->name, sizeof(SaNameT));
@@ -588,19 +589,21 @@ static int ckpt_recovery_process (void)
 					* Populate the Sync Section Request
 					* Populate the Sync Section Request
 					*/
 					*/
 				    iovecs[0].iov_base = (char *)&request_exec_sync_section;
 				    iovecs[0].iov_base = (char *)&request_exec_sync_section;
-					iovecs[0].iov_len = sizeof (struct req_exec_ckpt_synchronize_section);
+					iovecs[0].iov_len = sizeof (struct req_exec_ckpt_synchronize_section);					
 					
 					
 					/*
 					/*
 					 * Populate the Section ID
 					 * Populate the Section ID
 					 */
 					 */
 					iovecs[1].iov_base = ((char*)ckptCheckpointSection->sectionDescriptor.sectionId.id);
 					iovecs[1].iov_base = ((char*)ckptCheckpointSection->sectionDescriptor.sectionId.id);
 					iovecs[1].iov_len = ckptCheckpointSection->sectionDescriptor.sectionId.idLen;
 					iovecs[1].iov_len = ckptCheckpointSection->sectionDescriptor.sectionId.idLen;
+					request_exec_sync_section.header.size += iovecs[1].iov_len;
 					
 					
 					/*
 					/*
 					 * Populate the Section Data.
 					 * Populate the Section Data.
 					 */
 					 */
 					iovecs[2].iov_base = ((char*)ckptCheckpointSection->sectionData + recovery_section_data_offset);
 					iovecs[2].iov_base = ((char*)ckptCheckpointSection->sectionData + recovery_section_data_offset);
 					iovecs[2].iov_len = newSectionSize;
 					iovecs[2].iov_len = newSectionSize;
+					request_exec_sync_section.header.size += iovecs[2].iov_len;
 					/*
 					/*
 					 * Check to see if we can queue the new message and if you can
 					 * Check to see if we can queue the new message and if you can
 					 * then mcast the message else break and create callback.
 					 * then mcast the message else break and create callback.
@@ -2350,6 +2353,7 @@ static int message_handler_req_lib_ckpt_sectioncreate (struct conn_info *conn_in
 	 */
 	 */
 	iovecs[1].iov_base = ((char *)req_lib_ckpt_sectioncreate) + sizeof (struct req_lib_ckpt_sectioncreate);
 	iovecs[1].iov_base = ((char *)req_lib_ckpt_sectioncreate) + sizeof (struct req_lib_ckpt_sectioncreate);
 	iovecs[1].iov_len = req_lib_ckpt_sectioncreate->header.size - sizeof (struct req_lib_ckpt_sectioncreate);
 	iovecs[1].iov_len = req_lib_ckpt_sectioncreate->header.size - sizeof (struct req_lib_ckpt_sectioncreate);
+	req_exec_ckpt_sectioncreate.header.size += iovecs[1].iov_len;
 
 
 #ifdef DEBUG
 #ifdef DEBUG
 printf ("LIBRARY SECTIONCREATE string is %s len is %d\n", (unsigned char *)iovecs[1].iov_base,
 printf ("LIBRARY SECTIONCREATE string is %s len is %d\n", (unsigned char *)iovecs[1].iov_base,
@@ -2403,6 +2407,7 @@ static int message_handler_req_lib_ckpt_sectiondelete (struct conn_info *conn_in
 	 */
 	 */
 	iovecs[1].iov_base = ((char *)req_lib_ckpt_sectiondelete) + sizeof (struct req_lib_ckpt_sectiondelete);
 	iovecs[1].iov_base = ((char *)req_lib_ckpt_sectiondelete) + sizeof (struct req_lib_ckpt_sectiondelete);
 	iovecs[1].iov_len = req_lib_ckpt_sectiondelete->header.size - sizeof (struct req_lib_ckpt_sectiondelete);
 	iovecs[1].iov_len = req_lib_ckpt_sectiondelete->header.size - sizeof (struct req_lib_ckpt_sectiondelete);
+	req_exec_ckpt_sectiondelete.header.size += iovecs[1].iov_len; 
 
 
 	if (iovecs[1].iov_len > 0) {
 	if (iovecs[1].iov_len > 0) {
 		assert (totempg_mcast (iovecs, 2, TOTEMPG_AGREED) == 0);
 		assert (totempg_mcast (iovecs, 2, TOTEMPG_AGREED) == 0);
@@ -2441,6 +2446,7 @@ static int message_handler_req_lib_ckpt_sectionexpirationtimeset (struct conn_in
 	 */
 	 */
 	iovecs[1].iov_base = ((char *)req_lib_ckpt_sectionexpirationtimeset) + sizeof (struct req_lib_ckpt_sectionexpirationtimeset);
 	iovecs[1].iov_base = ((char *)req_lib_ckpt_sectionexpirationtimeset) + sizeof (struct req_lib_ckpt_sectionexpirationtimeset);
 	iovecs[1].iov_len = req_lib_ckpt_sectionexpirationtimeset->header.size - sizeof (struct req_lib_ckpt_sectionexpirationtimeset);
 	iovecs[1].iov_len = req_lib_ckpt_sectionexpirationtimeset->header.size - sizeof (struct req_lib_ckpt_sectionexpirationtimeset);
+	req_exec_ckpt_sectionexpirationtimeset.header.size += iovecs[1].iov_len;
 
 
 	if (iovecs[1].iov_len > 0) {
 	if (iovecs[1].iov_len > 0) {
 		log_printf (LOG_LEVEL_DEBUG, "IOV_BASE is %p\n", iovecs[1].iov_base);
 		log_printf (LOG_LEVEL_DEBUG, "IOV_BASE is %p\n", iovecs[1].iov_base);
@@ -2467,7 +2473,7 @@ static int message_handler_req_lib_ckpt_sectionwrite (struct conn_info *conn_inf
 	 * checkpoint opened is writeable mode so send message to cluster
 	 * checkpoint opened is writeable mode so send message to cluster
 	 */
 	 */
 	req_exec_ckpt_sectionwrite.header.id = MESSAGE_REQ_EXEC_CKPT_SECTIONWRITE;
 	req_exec_ckpt_sectionwrite.header.id = MESSAGE_REQ_EXEC_CKPT_SECTIONWRITE;
-	req_exec_ckpt_sectionwrite.header.size = sizeof (struct req_exec_ckpt_sectionwrite);
+	req_exec_ckpt_sectionwrite.header.size = sizeof (struct req_exec_ckpt_sectionwrite); 
 
 
 	memcpy (&req_exec_ckpt_sectionwrite.req_lib_ckpt_sectionwrite,
 	memcpy (&req_exec_ckpt_sectionwrite.req_lib_ckpt_sectionwrite,
 		req_lib_ckpt_sectionwrite,
 		req_lib_ckpt_sectionwrite,
@@ -2486,10 +2492,8 @@ static int message_handler_req_lib_ckpt_sectionwrite (struct conn_info *conn_inf
 	 */
 	 */
 	iovecs[1].iov_base = ((char *)req_lib_ckpt_sectionwrite) + sizeof (struct req_lib_ckpt_sectionwrite);
 	iovecs[1].iov_base = ((char *)req_lib_ckpt_sectionwrite) + sizeof (struct req_lib_ckpt_sectionwrite);
 	iovecs[1].iov_len = req_lib_ckpt_sectionwrite->header.size - sizeof (struct req_lib_ckpt_sectionwrite);
 	iovecs[1].iov_len = req_lib_ckpt_sectionwrite->header.size - sizeof (struct req_lib_ckpt_sectionwrite);
+	req_exec_ckpt_sectionwrite.header.size += iovecs[1].iov_len;
 
 
-/*
-	printf ("LIB writing checkpoint section is %s\n", ((char *)req_lib_ckpt_sectionwrite) + sizeof (struct req_lib_ckpt_sectionwrite));
-*/
 	if (iovecs[1].iov_len > 0) {
 	if (iovecs[1].iov_len > 0) {
 		assert (totempg_mcast (iovecs, 2, TOTEMPG_AGREED) == 0);
 		assert (totempg_mcast (iovecs, 2, TOTEMPG_AGREED) == 0);
 	} else {
 	} else {
@@ -2513,7 +2517,7 @@ static int message_handler_req_lib_ckpt_sectionoverwrite (struct conn_info *conn
 	 * checkpoint opened is writeable mode so send message to cluster
 	 * checkpoint opened is writeable mode so send message to cluster
 	 */
 	 */
 	req_exec_ckpt_sectionoverwrite.header.id = MESSAGE_REQ_EXEC_CKPT_SECTIONOVERWRITE;
 	req_exec_ckpt_sectionoverwrite.header.id = MESSAGE_REQ_EXEC_CKPT_SECTIONOVERWRITE;
-	req_exec_ckpt_sectionoverwrite.header.size = sizeof (struct req_exec_ckpt_sectionoverwrite);
+	req_exec_ckpt_sectionoverwrite.header.size = sizeof (struct req_exec_ckpt_sectionoverwrite); 
 
 
 	memcpy (&req_exec_ckpt_sectionoverwrite.req_lib_ckpt_sectionoverwrite,
 	memcpy (&req_exec_ckpt_sectionoverwrite.req_lib_ckpt_sectionoverwrite,
 		req_lib_ckpt_sectionoverwrite,
 		req_lib_ckpt_sectionoverwrite,
@@ -2532,6 +2536,7 @@ static int message_handler_req_lib_ckpt_sectionoverwrite (struct conn_info *conn
 	 */
 	 */
 	iovecs[1].iov_base = ((char *)req_lib_ckpt_sectionoverwrite) + sizeof (struct req_lib_ckpt_sectionoverwrite);
 	iovecs[1].iov_base = ((char *)req_lib_ckpt_sectionoverwrite) + sizeof (struct req_lib_ckpt_sectionoverwrite);
 	iovecs[1].iov_len = req_lib_ckpt_sectionoverwrite->header.size - sizeof (struct req_lib_ckpt_sectionoverwrite);
 	iovecs[1].iov_len = req_lib_ckpt_sectionoverwrite->header.size - sizeof (struct req_lib_ckpt_sectionoverwrite);
+	req_exec_ckpt_sectionoverwrite.header.size += iovecs[1].iov_len;
 
 
 	if (iovecs[1].iov_len > 0) {
 	if (iovecs[1].iov_len > 0) {
 		assert (totempg_mcast (iovecs, 2, TOTEMPG_AGREED) == 0);
 		assert (totempg_mcast (iovecs, 2, TOTEMPG_AGREED) == 0);
@@ -2575,6 +2580,7 @@ static int message_handler_req_lib_ckpt_sectionread (struct conn_info *conn_info
 	 */
 	 */
 	iovecs[1].iov_base = ((char *)req_lib_ckpt_sectionread) + sizeof (struct req_lib_ckpt_sectionread);
 	iovecs[1].iov_base = ((char *)req_lib_ckpt_sectionread) + sizeof (struct req_lib_ckpt_sectionread);
 	iovecs[1].iov_len = req_lib_ckpt_sectionread->header.size - sizeof (struct req_lib_ckpt_sectionread);
 	iovecs[1].iov_len = req_lib_ckpt_sectionread->header.size - sizeof (struct req_lib_ckpt_sectionread);
+	req_exec_ckpt_sectionread.header.size += iovecs[1].iov_len;
 
 
 	if (iovecs[1].iov_len > 0) {
 	if (iovecs[1].iov_len > 0) {
 		assert (totempg_mcast (iovecs, 2, TOTEMPG_AGREED) == 0);
 		assert (totempg_mcast (iovecs, 2, TOTEMPG_AGREED) == 0);