static SaAisErrorT checkpoint_write_seq(ClUint32T seq) { SaAisErrorT rc = SA_AIS_OK; SaUint32T seq_no; /* Putting data in network byte order */ seq_no = htonl(seq); // clOsalPrintf("checkpoint_write_seq: seq_no = %lu, seq = %lu\n", seq_no, seq); fflush(stdout); /* Write checkpoint */ rc = saCkptSectionOverwrite(ckpt_handle, &ckpt_sid, &seq_no, sizeof(SaUint32T)); if (rc != SA_AIS_OK) { clprintf(CL_LOG_SEV_ERROR,"Failed [0x%x] to write to section\n", rc); } else { rc = saCkptCheckpointSynchronize(ckpt_handle, SA_TIME_END ); if (rc != SA_AIS_OK) { clprintf(CL_LOG_SEV_ERROR,"Failed [0x%x] to synchronize the checkpoint\n", rc); } } return rc; }
SaAisErrorT checkpoint_write_seq(ClUint32T seq) { SaAisErrorT rc = SA_AIS_OK; ClUint32T seq_no; /* Putting data in network byte order */ seq_no = htonl(seq); /* Write checkpoint */ rc = saCkptSectionOverwrite(ckpt_handle, &ckpt_sid, &seq_no, sizeof(ClUint32T)); if (rc != SA_AIS_OK) { /* The error SA_AIS_ERROR_NOT_EXIST can occur either because we are not the active replica OR if the overwrite failed because the section did not exist then try to create the section. But in this case we know our application will not attempt to write unless it has set itself as the active replica so the problem MUST be a missing section. */ if ((rc == 0x1000a) || (rc == SA_AIS_ERR_NOT_EXIST)) { SaCkptSectionCreationAttributesT section_cr_attr; /* Expiration time for section can also be varied * once parameters are read from a configuration file */ section_cr_attr.expirationTime = SA_TIME_END; section_cr_attr.sectionId = &ckpt_sid; rc = saCkptSectionCreate(ckpt_handle,§ion_cr_attr,(SaUint8T*) &seq_no, sizeof(ClUint32T)); } if (rc != SA_AIS_OK) { clprintf(CL_LOG_SEV_ERROR,"Failed [0x%x] to write to section", rc); } } if (rc == SA_AIS_OK) { /* * Synchronize the checkpoint to all the replicas. */ #if 0 /* Synchronous synchronize example */ rc = saCkptCheckpointSynchronize(ckpt_handle, SA_TIME_END ); if (rc != SA_AIS_OK) { clprintf(CL_LOG_SEV_ERROR,"Failed [0x%x] to synchronize the checkpoint", rc); } #else rc = saCkptCheckpointSynchronizeAsync(ckpt_handle,syncCount); syncCount++; #endif } return rc; }
int ckpt_write(void *hp, const char *secid, void *buf, size_t maxlen) { ckpt_handle *h = (ckpt_handle *)hp; SaCkptIOVectorElementT iov = {SA_CKPT_DEFAULT_SECTION_ID, NULL, 0, 0, 0}; SaAisErrorT err; SaCkptSectionCreationAttributesT attrs; VALIDATE(h); /* Set section ID here */ iov.sectionId.id = (uint8_t *)secid; iov.sectionId.idLen = strlen(secid); iov.dataBuffer = buf; iov.dataSize = (SaSizeT)maxlen; iov.dataOffset = 0; iov.readSize = 0; err = saCkptCheckpointWrite(h->ck_checkpoint, &iov, 1, NULL); if (err == SA_AIS_ERR_NOT_EXIST) { attrs.sectionId = &iov.sectionId; attrs.expirationTime = SA_TIME_END; err = saCkptSectionCreate(h->ck_checkpoint, &attrs, buf, maxlen); } if (err == SA_AIS_OK) saCkptCheckpointSynchronize(h->ck_checkpoint, h->ck_timeout); errno = ais_to_posix(err); if (errno) return -1; return maxlen; /* XXX */ }
/**************************************************************************** * Name : cpsv_test_sync_app_process * * Description : This is the function which is given as the input to the * Application task. * * Arguments : info - This is the information which is passed during * spawing Application task. * * Return Values : None. * * Notes : None. *****************************************************************************/ void cpsv_test_sync_app_process(void *info) { SaCkptHandleT ckptHandle; SaCkptCheckpointHandleT checkpointHandle; SaCkptCallbacksT callbk; SaVersionT version; SaNameT ckptName; SaAisErrorT rc; SaCkptCheckpointCreationAttributesT ckptCreateAttr; SaCkptCheckpointOpenFlagsT ckptOpenFlags; SaCkptSectionCreationAttributesT sectionCreationAttributes; SaCkptIOVectorElementT writeVector, readVector; SaUint32T erroneousVectorIndex; void *initialData = "Default data in the section"; unsigned char read_buff[100] = {0}; SaTimeT timeout = 1000000000; unsigned int temp_var = (unsigned int)(long)info; memset(&ckptName, 0, 255); ckptName.length = strlen(DEMO_CKPT_NAME); memcpy(ckptName.value,DEMO_CKPT_NAME,strlen(DEMO_CKPT_NAME)); callbk.saCkptCheckpointOpenCallback = AppCkptOpenCallback; callbk.saCkptCheckpointSynchronizeCallback = AppCkptSyncCallback; version.releaseCode= 'B'; version.majorVersion = 2; version.minorVersion = 2; printf("*******************************************************************\n"); printf("Demonstrating Checkpoint Service Usage with a collocated Checkpoint \n"); printf("*******************************************************************\n"); sleep(2); printf("Initialising With Checkpoint Service....\n"); rc = saCkptInitialize(&ckptHandle,&callbk,&version); if(rc == SA_AIS_OK) printf("PASSED \n"); else printf("Failed \n"); ckptCreateAttr.creationFlags = SA_CKPT_CHECKPOINT_COLLOCATED|SA_CKPT_WR_ACTIVE_REPLICA; ckptCreateAttr.checkpointSize = 1024; ckptCreateAttr.retentionDuration= 100000; ckptCreateAttr.maxSections= 2; ckptCreateAttr.maxSectionSize = 700; ckptCreateAttr.maxSectionIdSize = 4; ckptOpenFlags = SA_CKPT_CHECKPOINT_CREATE|SA_CKPT_CHECKPOINT_READ|SA_CKPT_CHECKPOINT_WRITE; printf("Opening Collocated Checkpoint = %s with create flags....\n",ckptName.value); rc = saCkptCheckpointOpen(ckptHandle,&ckptName,&ckptCreateAttr,ckptOpenFlags,timeout,&checkpointHandle); if(rc == SA_AIS_OK) printf("PASSED \n"); else printf("Failed \n"); if(temp_var == 1) { printf("Setting the Active Replica for my checkpoint ....\t"); rc = saCkptActiveReplicaSet(checkpointHandle); if(rc == SA_AIS_OK) printf("PASSED \n"); else printf("Failed \n"); sectionCreationAttributes.sectionId = (SaCkptSectionIdT*) malloc(sizeof \ (SaCkptSectionIdT)); sectionCreationAttributes.sectionId->id = (unsigned char *)"11"; sectionCreationAttributes.sectionId->idLen = 2; sectionCreationAttributes.expirationTime = 3600000000000ll; /* One Hour */ printf("Created Section ....\t"); rc = saCkptSectionCreate(checkpointHandle,§ionCreationAttributes,initialData,28); if(rc == SA_AIS_OK) printf("PASSED \n"); else printf("Failed \n"); writeVector.sectionId.id = (unsigned char *)"11"; writeVector.sectionId.idLen = 2; writeVector.dataBuffer = "The Checkpoint Service provides a facility for processes to store checkpoint data"; writeVector.dataSize = strlen(writeVector.dataBuffer); writeVector.dataOffset = 0; writeVector.readSize = 0; printf("Writing to Checkpoint %s ....\n",DEMO_CKPT_NAME); printf("Section-Id = %s ....\n",writeVector.sectionId.id); printf("CheckpointData being written = \"%s\"\n",(char *)writeVector.dataBuffer); printf("DataOffset = %llu ....\n",writeVector.dataOffset); rc = saCkptCheckpointWrite(checkpointHandle,&writeVector,1,&erroneousVectorIndex); if(rc == SA_AIS_OK) printf("PASSED \n"); else printf("Failed \n"); sleep(1); printf("Press <Enter> key to continue...\n"); getchar(); } else { sleep(4); readVector.sectionId.id = (unsigned char *)"11"; readVector.sectionId.idLen = 2; readVector.dataBuffer = read_buff; readVector.dataSize = 90; readVector.dataOffset = 0; printf("Waiting to Read from Checkpoint %s....\n",DEMO_CKPT_NAME); printf("Press <Enter> key to continue...\n"); getchar(); rc = saCkptCheckpointRead(checkpointHandle,&readVector,1,&erroneousVectorIndex); printf("Checkpoint Data Read = \"%s\"\n",(char *)readVector.dataBuffer); if(rc == SA_AIS_OK) printf("PASSED \n"); else printf("Failed \n"); } printf("Synchronizing My Checkpoint being called ....\n"); rc = saCkptCheckpointSynchronize(checkpointHandle,timeout); if(rc == SA_AIS_OK) printf("PASSED \n"); else printf("Failed \n"); if(temp_var==1) { printf("Unlink My Checkpoint ....\t"); rc = saCkptCheckpointUnlink(ckptHandle,&ckptName); if(rc == SA_AIS_OK) printf("PASSED \n"); else printf("Failed \n"); } printf("Ckpt Closed ....\t"); rc = saCkptCheckpointClose(checkpointHandle); if(rc == SA_AIS_OK) printf("PASSED \n"); else printf("Failed \n"); printf("Ckpt Finalize being called ....\t"); rc = saCkptFinalize(ckptHandle); if(rc == SA_AIS_OK) printf("PASSED \n"); else printf("Failed \n"); sleep(2); return; }