Commit 2f76e403 authored by Rich Prohaska's avatar Rich Prohaska Committed by Yoni Fogel

2738 refs[t:2738] test case for the double buffer hang

git-svn-id: file:///svn/toku/tokudb@21217 c7de825b-a66e-492c-adef-691d508d4ae1
parent f7baa1a0
#include "dbufio.h"
#include <stdio.h>
#include <fcntl.h>
#include <toku_assert.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
enum { N = 5 };
enum { M = 10 };
static void test1 (size_t chars_per_file, size_t bytes_per_read) {
int fds[N];
char fnames[N][100];
size_t n_read[N];
int still_live[N];
int n_live=N;
for (int i=0; i<N; i++) {
snprintf(fnames[i], 100, "dbufio-test-file%d.data", i);
unlink(fnames[i]);
fds[i] = open(fnames[i], O_CREAT|O_RDWR, S_IRWXU);
//printf("fds[%d]=%d is %s\n", i, fds[i], fnames[i]);
assert(fds[i]>=0);
n_read[i]=0;
still_live[i]=i;
for (size_t j=0; j<chars_per_file; j++) {
unsigned char c = (i+j)%256;
int r = toku_os_write(fds[i], &c, 1);
if (r!=0) printf("fds[%d]=%d r=%d errno=%d (%s)\n", i, fds[i], r, errno, strerror(errno));
assert(r==0);
}
{
int r = lseek(fds[i], 0, SEEK_SET);
assert(r==0);
}
}
DBUFIO_FILESET bfs;
{
int r = create_dbufio_fileset(&bfs, N, fds, M);
assert(r==0);
}
#if 0
while (n_live>0) {
int indirectnum = random()%n_live;
int filenum = still_live[indirectnum];
char buf[bytes_per_read];
size_t n_read_here=0;
int r = dbufio_fileset_read(bfs, filenum, buf, bytes_per_read, &n_read_here);
//printf("read(%d) -> %d (%ld) (old n_read=%ld)\n", filenum, r, n_read_here, n_read[filenum]);
if (r==0) {
// did read something
assert(n_read_here==bytes_per_read);
n_read[filenum]+=n_read_here;
//printf(" new n_read=%ld\n", n_read[filenum]);
assert(n_read[filenum]<=chars_per_file);
} else {
assert(r==EOF);
assert(n_read[filenum]==chars_per_file);
still_live[indirectnum] = still_live[n_live-1];
n_live--;
}
}
#else
n_live = n_live; bytes_per_read = bytes_per_read;
#endif
{
int r = destroy_dbufio_fileset(bfs);
assert(r==0);
}
for (int i=0; i<N; i++) {
{
int r = unlink(fnames[i]);
assert(r==0);
}
{
int r = close(fds[i]);
assert(r==0);
}
assert(n_read[i]==chars_per_file);
}
}
int main (int argc __attribute__((__unused__)), char *argv[]__attribute__((__unused__))) {
// test1(0, 1);
// test1(1, 1);
// test1(15, 1);
// test1(100, 1);
test1(30, 3); // 3 and M are relatively prime. But 3 divides the file size.
return 0;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment