From 1ff6f56a4821eba8a4cee40e9c607d0f92328ecb Mon Sep 17 00:00:00 2001 From: Steven Dake Date: Mon, 11 Apr 2005 21:25:27 +0000 Subject: [PATCH] Add default section support to checkpoints. (Logical change 1.172) git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@584 fd59a12c-fef9-0310-b244-a6a79926bd2f --- exec/ckpt.c | 119 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 84 insertions(+), 35 deletions(-) diff --git a/exec/ckpt.c b/exec/ckpt.c index f4ae241b..db57b791 100644 --- a/exec/ckpt.c +++ b/exec/ckpt.c @@ -496,16 +496,14 @@ static int ckpt_recovery_process (void) * so lets start with sending the sync_msg */ if (recovery_section_send_flag == 0) { - if (ckptCheckpointSection->sectionDescriptor.sectionId.id == 0) { - /* - * This is the default section forget sending this. - */ - recovery_ckpt_section_next = recovery_ckpt_section_next->next; - continue; - } - log_printf (LOG_LEVEL_DEBUG, "CKPT: New Sync State Message for ckpt = %s, section = %s.\n", + if ((int)ckptCheckpointSection->sectionDescriptor.sectionId.id) { + log_printf (LOG_LEVEL_DEBUG, "CKPT: New Sync State Message for ckpt = %s, section = %s.\n", (char*)&checkpoint->name.value, ((char*)ckptCheckpointSection->sectionDescriptor.sectionId.id)); + } else { + log_printf (LOG_LEVEL_DEBUG, "CKPT: New Sync State Message for ckpt = %s, section = default section.\n", + (char*)&checkpoint->name.value); + } request_exec_sync_state.header.size = sizeof (struct req_exec_ckpt_synchronize_state); request_exec_sync_state.header.id = MESSAGE_REQ_EXEC_CKPT_SYNCHRONIZESTATE; memcpy(&request_exec_sync_state.previous_ring_id, &saved_ring_id, sizeof(struct memb_ring_id)); @@ -579,12 +577,15 @@ static int ckpt_recovery_process (void) request_exec_sync_section.sectionId.id = 0; memcpy (&request_exec_sync_section.dataOffSet, &recovery_section_data_offset, sizeof(SaUint32T)); memcpy (&request_exec_sync_section.dataSize, &newSectionSize, sizeof(SaUint32T)); - - log_printf (LOG_LEVEL_DEBUG, "CKPT: New Sync Section Message for ckpt = %s, section = %s, Data size = %d.\n", + if (ckptCheckpointSection->sectionDescriptor.sectionId.id) { + log_printf (LOG_LEVEL_DEBUG, "CKPT: New Sync Section Message for ckpt = %s, section = %s, Data size = %d.\n", (char*)&checkpoint->name.value, ((char*)ckptCheckpointSection->sectionDescriptor.sectionId.id), newSectionSize); - + } else { + log_printf (LOG_LEVEL_DEBUG, "CKPT: New Sync Section Message for ckpt = %s, default section, Data size = %d.\n", + (char*)&checkpoint->name.value,newSectionSize); + } /* * Populate the Sync Section Request */ @@ -856,19 +857,42 @@ static struct saCkptCheckpointSection *ckpt_checkpoint_find_globalSection ( struct list_head *checkpoint_section_list; struct saCkptCheckpointSection *ckptCheckpointSection; - log_printf (LOG_LEVEL_DEBUG, "Finding checkpoint section id %s %d\n", (char*)id, idLen); + if (idLen != 0) { + log_printf (LOG_LEVEL_DEBUG, "Finding checkpoint section id %s %d\n", (char*)id, idLen); + } + else { + log_printf (LOG_LEVEL_DEBUG, "Finding default checkpoint section\n"); + } for (checkpoint_section_list = ckptCheckpoint->checkpointSectionsListHead.next; checkpoint_section_list != &ckptCheckpoint->checkpointSectionsListHead; checkpoint_section_list = checkpoint_section_list->next) { ckptCheckpointSection = list_entry (checkpoint_section_list, struct saCkptCheckpointSection, list); - - log_printf (LOG_LEVEL_DEBUG, "Checking section id %*s\n", - (int)ckptCheckpointSection->sectionDescriptor.sectionId.idLen, - ckptCheckpointSection->sectionDescriptor.sectionId.id); + if (ckptCheckpointSection->sectionDescriptor.sectionId.idLen) { + log_printf (LOG_LEVEL_DEBUG, "Checking section id %*s\n", + ckptCheckpointSection->sectionDescriptor.sectionId.idLen, + ckptCheckpointSection->sectionDescriptor.sectionId.id); + } + else { + log_printf (LOG_LEVEL_DEBUG, "Checking default section id\n"); + } + /* + All 3 of these values being checked MUST be = 0 to return + The default section. If even one of them is NON zero follow + the normal route + */ + if ((idLen || + ckptCheckpointSection->sectionDescriptor.sectionId.id || + ckptCheckpointSection->sectionDescriptor.sectionId.idLen) == 0) { + log_printf (LOG_LEVEL_DEBUG, "Returning default section\n"); + return (ckptCheckpointSection); + } + if (ckptCheckpointSection->sectionDescriptor.sectionId.idLen == idLen && + (ckptCheckpointSection->sectionDescriptor.sectionId.id)&& + (id)&& (memcmp (ckptCheckpointSection->sectionDescriptor.sectionId.id, id, idLen) == 0)) { @@ -881,8 +905,12 @@ static struct saCkptCheckpointSection *ckpt_checkpoint_find_globalSection ( void checkpoint_section_release (struct saCkptCheckpointSection *section) { list_del (§ion->list); - free (section->sectionDescriptor.sectionId.id); - free (section->sectionData); + if (section->sectionDescriptor.sectionId.id) { + free (section->sectionDescriptor.sectionId.id); + } + if (section->sectionData) { + free (section->sectionData); + } poll_timer_delete (aisexec_poll_handle, section->expiration_timer); free (section); } @@ -1061,11 +1089,13 @@ static int message_handler_req_exec_ckpt_checkpointopen (void *message, struct i */ ckptCheckpointSection->sectionDescriptor.sectionId.id = 0; ckptCheckpointSection->sectionDescriptor.sectionId.idLen = 0; - ckptCheckpointSection->sectionDescriptor.sectionSize = 0; ckptCheckpointSection->sectionDescriptor.expirationTime = SA_TIME_END; ckptCheckpointSection->sectionDescriptor.sectionState = SA_CKPT_SECTION_VALID; ckptCheckpointSection->sectionDescriptor.lastUpdate = 0; /*current time*/ - ckptCheckpointSection->sectionData = 0; + ckptCheckpointSection->sectionDescriptor.sectionSize = strlen("Factory installed data\0")+1; + ckptCheckpointSection->sectionData = malloc(strlen("Factory installed data\0")+1); + assert(ckptCheckpointSection->sectionData); + memcpy(ckptCheckpointSection->sectionData, "Factory installed data\0", strlen("Factory installed data\0")+1); ckptCheckpointSection->expiration_timer = 0; } @@ -1194,11 +1224,13 @@ static int recovery_checkpoint_open(SaNameT *checkpointName, */ ckptCheckpointSection->sectionDescriptor.sectionId.id = 0; ckptCheckpointSection->sectionDescriptor.sectionId.idLen = 0; - ckptCheckpointSection->sectionDescriptor.sectionSize = 0; ckptCheckpointSection->sectionDescriptor.expirationTime = SA_TIME_END; ckptCheckpointSection->sectionDescriptor.sectionState = SA_CKPT_SECTION_VALID; ckptCheckpointSection->sectionDescriptor.lastUpdate = 0; /*current time*/ - ckptCheckpointSection->sectionData = 0; + ckptCheckpointSection->sectionDescriptor.sectionSize = strlen("Factory installed data\0")+1; + ckptCheckpointSection->sectionData = malloc(strlen("Factory installed data\0")+1); + assert(ckptCheckpointSection->sectionData); + memcpy(ckptCheckpointSection->sectionData, "Factory installed data\0", strlen("Factory installed data\0")+1); ckptCheckpointSection->expiration_timer = 0; } @@ -1533,8 +1565,14 @@ static int recovery_section_create (SaCkptSectionDescriptorT *sectionDescriptor, void *sectionId; SaErrorT error = SA_AIS_OK; - log_printf (LOG_LEVEL_DEBUG, "CKPT: recovery_section_create for checkpoint %s, section %s.\n", - &checkpointName->value, SectionId); + if ((int)sectionDescriptor->sectionId.idLen) { + log_printf (LOG_LEVEL_DEBUG, "CKPT: recovery_section_create for checkpoint %s, section %s.\n", + &checkpointName->value, SectionId); + } else { + log_printf (LOG_LEVEL_DEBUG, "CKPT: recovery_section_create for checkpoint %s, default section.\n", + &checkpointName->value); + } + ckptCheckpoint = ckpt_checkpoint_find_global (checkpointName); if (ckptCheckpoint == 0) { error = SA_AIS_ERR_NOT_EXIST; @@ -1572,19 +1610,25 @@ static int recovery_section_create (SaCkptSectionDescriptorT *sectionDescriptor, /* * Allocate checkpoint section id */ - sectionId = malloc ((int)sectionDescriptor->sectionId.idLen); - if (sectionId == 0) { - free (ckptCheckpointSection); - free (initialData); - error = SA_AIS_ERR_NO_MEMORY; - goto error_exit; + if (sectionDescriptor->sectionId.idLen) { + sectionId = malloc ((int)sectionDescriptor->sectionId.idLen); + if (sectionId == 0) { + free (ckptCheckpointSection); + free (initialData); + error = SA_AIS_ERR_NO_MEMORY; + goto error_exit; + } + } else { + sectionId = 0; } /* * Copy checkpoint section ID and initialize data. */ - memcpy ((char*)sectionId, SectionId, - (int)sectionDescriptor->sectionId.idLen); - + if (SectionId) { + memcpy ((char*)sectionId, (char*)SectionId, (int)sectionDescriptor->sectionId.idLen); + } else { + sectionId = 0; + } memset (initialData, 0, sectionDescriptor->sectionSize); /* @@ -1923,8 +1967,13 @@ static int message_handler_req_exec_ckpt_sectionwrite (void *message, struct in_ ((char *)req_lib_ckpt_sectionwrite) + sizeof (struct req_lib_ckpt_sectionwrite), req_lib_ckpt_sectionwrite->idLen); if (ckptCheckpointSection == 0) { -printf ("CANT FIND SECTION '%s'\n", - ((char *)req_lib_ckpt_sectionwrite) + sizeof (struct req_lib_ckpt_sectionwrite)); + if (req_lib_ckpt_sectionwrite->idLen == 0) { + log_printf (LOG_LEVEL_ERROR, "CANT FIND DEFAULT SECTION.\n"); + } + else { + printf ("CANT FIND SECTION '%s'\n", + ((char *)req_lib_ckpt_sectionwrite) + sizeof (struct req_lib_ckpt_sectionwrite)); + } error = SA_AIS_ERR_NOT_EXIST; goto error_exit; }