예제 #1
0
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;
}
예제 #2
0
파일: rvm.cpp 프로젝트: aneesh-mulye/rvm
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());
}
예제 #3
0
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;
}
예제 #4
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;

}
예제 #5
0
파일: rvm.cpp 프로젝트: aneesh-mulye/rvm
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;
}