mbligh | b490479 | 2007-01-01 02:15:01 +0000 | [diff] [blame] | 1 | import test |
| 2 | from autotest_utils import * |
mbligh | eb13136 | 2007-01-09 22:24:38 +0000 | [diff] [blame] | 3 | import os, sys |
| 4 | from subprocess import * |
mbligh | b490479 | 2007-01-01 02:15:01 +0000 | [diff] [blame] | 5 | |
| 6 | class disktest(test.test): |
| 7 | version = 1 |
| 8 | |
| 9 | def setup(self): |
| 10 | os.mkdir(self.srcdir) |
| 11 | os.chdir(self.bindir) |
| 12 | system('cp disktest.c src/') |
| 13 | os.chdir(self.srcdir) |
mbligh | eb13136 | 2007-01-09 22:24:38 +0000 | [diff] [blame] | 14 | cflags = '-D_FILE_OFFSET_BITS=64 -D _GNU_SOURCE -static -Wall' |
mbligh | 98e3e01 | 2007-01-03 00:10:38 +0000 | [diff] [blame] | 15 | system('cc disktest.c ' + cflags + ' -o disktest') |
mbligh | b490479 | 2007-01-01 02:15:01 +0000 | [diff] [blame] | 16 | |
| 17 | |
mbligh | eb13136 | 2007-01-09 22:24:38 +0000 | [diff] [blame] | 18 | def test_one_disk_chunk(self, disk, chunk): |
| 19 | print "testing %d MB files on %s in %d MB memory" % \ |
| 20 | (self.chunk_mb, disk, self.memory_mb) |
mbligh | 9a7d4ac | 2007-02-16 00:27:26 +0000 | [diff] [blame] | 21 | cmd = "%s/disktest -m %d -f %s/testfile.%d -i -S" % \ |
| 22 | (self.srcdir, self.chunk_mb, disk, chunk) |
mbligh | eb13136 | 2007-01-09 22:24:38 +0000 | [diff] [blame] | 23 | p = Popen(cmd, shell=True) |
| 24 | return(p.pid) |
| 25 | |
| 26 | |
mbligh | 1dd7332 | 2007-12-19 15:41:45 +0000 | [diff] [blame] | 27 | def execute(self, disks = None, gigabytes = None, |
| 28 | chunk_mb = memtotal() / 1024): |
mbligh | 9a7d4ac | 2007-02-16 00:27:26 +0000 | [diff] [blame] | 29 | os.chdir(self.srcdir) |
mbligh | eb13136 | 2007-01-09 22:24:38 +0000 | [diff] [blame] | 30 | |
mbligh | 1dd7332 | 2007-12-19 15:41:45 +0000 | [diff] [blame] | 31 | if not disks: |
| 32 | disks = [self.tmpdir] |
mbligh | 25bb1e1 | 2007-10-12 23:57:47 +0000 | [diff] [blame] | 33 | if not gigabytes: |
| 34 | free = 100 # cap it at 100GB by default |
| 35 | for disk in disks: |
| 36 | free = min(freespace(disk) / 1024**3, free) |
| 37 | gigabytes = free |
| 38 | print "resizing to %s GB" % gigabytes |
| 39 | sys.stdout.flush() |
| 40 | |
mbligh | eb13136 | 2007-01-09 22:24:38 +0000 | [diff] [blame] | 41 | self.chunk_mb = chunk_mb |
| 42 | self.memory_mb = memtotal()/1024 |
mbligh | 9a7d4ac | 2007-02-16 00:27:26 +0000 | [diff] [blame] | 43 | if self.memory_mb > chunk_mb: |
mbligh | 642b03e | 2008-01-14 16:53:15 +0000 | [diff] [blame^] | 44 | e_msg = "Too much RAM (%dMB) for this test to work" % self.memory_mb |
| 45 | raise TestError(e_msg) |
mbligh | eb13136 | 2007-01-09 22:24:38 +0000 | [diff] [blame] | 46 | |
| 47 | chunks = (1024 * gigabytes) / chunk_mb |
| 48 | |
| 49 | for i in range(chunks): |
| 50 | pids = [] |
| 51 | for disk in disks: |
mbligh | 9a7d4ac | 2007-02-16 00:27:26 +0000 | [diff] [blame] | 52 | pid = self.test_one_disk_chunk(disk, i) |
mbligh | eb13136 | 2007-01-09 22:24:38 +0000 | [diff] [blame] | 53 | pids.append(pid) |
| 54 | errors = [] |
| 55 | for pid in pids: |
| 56 | (junk, retval) = os.waitpid(pid, 0) |
| 57 | if (retval != 0): |
| 58 | errors.append(retval) |
| 59 | if errors: |
mbligh | 642b03e | 2008-01-14 16:53:15 +0000 | [diff] [blame^] | 60 | raise TestError("Errors from children: %s" % errors) |
| 61 | |