int main(int argc, char** argv) { rvm_t rvm; trans_t trans; char* segs[1]; rvm = rvm_init("rvm_segments"); rvm_destroy(rvm, "testseg01"); segs[0] = (char*) rvm_map(rvm, "testseg01", 10000); trans = rvm_begin_trans(rvm, 1, (void**) segs); rvm_about_to_modify(trans, segs[0], 0, 100); sprintf(segs[0], TEST_STRING); rvm_about_to_modify(trans, segs[0], OFFSET2, 100); sprintf(segs[0] + OFFSET2, TEST_STRING); rvm_commit_trans(trans); // This should fail rvm_destroy(rvm, "testseg01"); rvm_unmap(rvm, segs[0]); rvm_truncate_log(rvm); if (file_exists("rvm_segments/seg_testseg01.rvm")) { printf("OK\n"); } else { printf("ERROR: Segment file no longer present"); } return 0; }
void rvm_destroy(rvm_t rvm, const char *segname) { if(debug) fprintf(stderr, "%s called.\n", __func__); rvm_truncate_log(rvm); /* Ensures that the redo log contains no references to invalid segments. */ std::list<segment_t>::iterator segi = isnmapped(rvm, segname); if(segi != rvm->mapped_segs.end()) rvm_unmap(rvm, segi->segbase); system(("rm -rf "+rvm->pathname+"/"+segname+".rvmseg").c_str()); }
int main(int argc, char **argv) { rvm_t rvm; printf("Before Truncation:\n"); system("ls -l rvm_segments"); rvm = rvm_init("rvm_segments"); rvm_truncate_log(rvm); printf("\nAfter Truncation:\n"); system("ls -l rvm_segments"); return 0; }
int main(int argc, char **argv) { #if 1 int pid; pid = fork(); if(pid < 0) { perror("fork"); exit(2); } if(pid == 0) { proc1(); exit(0); } waitpid(pid, NULL, 0); proc2(); #else /* truncate test */ proc1(); rvm_t rvm; printf("Before Truncation:\n"); system("ls -l rvm_segments"); rvm = rvm_init("rvm_segments"); rvm_truncate_log(rvm); printf("\nAfter Truncation:\n"); system("ls -l rvm_segments"); #endif return 0; }
void *rvm_map(rvm_t rvm, const char *segname, int size_to_create) { if(debug) fprintf(stderr, "%s called.\n", __func__); int fd; void * segbuf; struct stat segstat; char buf = 0; rvm_truncate_log(rvm); if(ismapped(rvm, segname)) return 0x0; /* I presume here that size_to_create and the existing file size are * both lower bounds on the final size of the segment. */ system(("touch "+rvm->pathname+"/"+segname+".rvmseg").c_str()); fd = open((rvm->pathname+"/"+segname+".rvmseg").c_str(), O_RDWR); if(-1 == fd) return 0x0; lseek(fd, size_to_create-1, SEEK_SET); read(fd, &buf, 1); lseek(fd, size_to_create-1, SEEK_SET); if(-1 == write(fd, &buf, 1)) { close(fd); return 0x0; } /* The above ensures that the file is AT LEAST as large as * size_to_create. */ if(-1 == fstat(fd, &segstat)) { close(fd); return 0x0; } if(segstat.st_size > size_to_create) size_to_create = segstat.st_size; lseek(fd, 0, SEEK_SET); segbuf = malloc(size_to_create); if(0x0 == segbuf) { close(fd); return 0x0; } if(-1 == read(fd, segbuf, size_to_create)) { close(fd); free(segbuf); return 0x0; } lseek(fd, 0, SEEK_SET); segment_t tempseg; tempseg.segname = std::string(segname); tempseg.size = size_to_create; tempseg.segbase = 0x0; tempseg.busy = 0; rvm->mapped_segs.push_back(tempseg); rvm->mapped_segs.back().segbase = segbuf; return segbuf; }