LINUX.ORG.RU

VirtualBox Shared Folder: write блокирует read

 , , ,


0

2

Есть программа, копирующая файл в 6.5 GiB в N потоках. В VirtualBox стоит Ubuntu 12.04 и подключены общие папки.

Суть проблемы такова (псевдокод):

read(f1);

lseek(f2);
write(f2);

Когда данный код выполняется в нескольких потоках и один из потоков начинает писать в файл (в общей папке), скажем, в позиции в 1.4 GiB, то запись будет идти несколько секунд и остальные потоки, вызвавшие read для исходного файла будут ждать. Если файл копировать в родную ext4 фс, то данной проблемы нету.

В чём может быть дело и реально ли это исправить?

Ответ на: комментарий от DELIRIUM

Часть функции потоков:

	if(tinfo->i == 0)//потоки создаются в цикле, если первый поток
	{
		if(lseek(tinfo->fdst, 6317494272, SEEK_SET) == -1)
		{
			report_fatal_error("Cannot set destination file pointer"); //вывод strerror и exit
		}
		writed = write(tinfo->fdst, buff, 4096);
		if(writed == -1)
		{
			report_fatal_error("Cannot write to destination file");
		}
	}

	if(lseek(fsrc, 0, SEEK_SET) == -1)
	{
		report_fatal_error("Cannot set source file pointer");
	}
	
	printf("before read\n"); fflush(stdout);
	readed = read(fsrc, buff, 4096);
	printf("after read\n"); fflush(stdout);
	if(readed == -1)
	{
		report_fatal_error("Cannot read from source file");
	}

Вызовы strace(1 — ext4, 2 — vboxsf) (./test file1 file2 <number_of_threads>)

strace -T -f -tt -e trace=read,write -o res2.txt ./test 'The Boat That Rocked.mkv' ~/1.mkv 4
strace -T -f -tt -e trace=read,write -o res.txt ./test 'The Boat That Rocked.mkv' 1.mkv 4

2748  15:53:11.761348 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p[\0\0004\0\0\0"..., 512) = 512 <0.000179>
2748  15:53:11.784201 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000\226\1\0004\0\0\0"..., 512) = 512 <0.000138>
2749  15:53:11.795131 write(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096 <0.000310>
2749  15:53:11.797300 write(1, "before read\n", 12) = 12 <0.000428>
2751  15:53:11.798657 write(1, "before read\n", 12) = 12 <0.000198>
2750  15:53:11.799368 write(1, "before read\n", 12) = 12 <0.000091>
2751  15:53:11.800404 read(6,  <unfinished ...>
2750  15:53:11.800725 read(5,  <unfinished ...>
2751  15:53:11.800972 <... read resumed> "\32E\337\243\223B\202\210matroskaB\207\201\2B\205\201\2\30S\200g\1\0\0\1"..., 4096) = 4096 <0.000298>
2750  15:53:11.801241 <... read resumed> "\32E\337\243\223B\202\210matroskaB\207\201\2B\205\201\2\30S\200g\1\0\0\1"..., 4096) = 4096 <0.000302>
2751  15:53:11.801466 write(1, "after read\n", 11 <unfinished ...>
2749  15:53:11.801845 read(4,  <unfinished ...>
2751  15:53:11.801994 <... write resumed> ) = 11 <0.000333>
2749  15:53:11.802288 <... read resumed> "\32E\337\243\223B\202\210matroskaB\207\201\2B\205\201\2\30S\200g\1\0\0\1"..., 4096) = 4096 <0.000314>
2749  15:53:11.803004 write(1, "after read\n", 11) = 11 <0.000182>
2750  15:53:11.804208 write(1, "after read\n", 11) = 11 <0.000296>
2752  15:53:11.805321 write(1, "before read\n", 12) = 12 <0.000238>
2752  15:53:11.806290 read(7, "\32E\337\243\223B\202\210matroskaB\207\201\2B\205\201\2\30S\200g\1\0\0\1"..., 4096) = 4096 <0.000345>
2752  15:53:11.807166 write(1, "after read\n", 11) = 11 <0.000239>
2755  15:58:47.134358 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0p[\0\0004\0\0\0"..., 512) = 512 <0.000306>
2755  15:58:47.138576 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0000\226\1\0004\0\0\0"..., 512) = 512 <0.000260>
2756  15:58:47.210276 write(3, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 4096) = 4096 <102.452502>
2758  16:00:29.665657 write(1, "before read\n", 12) = 12 <0.000198>
2758  16:00:29.666770 read(5,  <unfinished ...>
2756  16:00:29.667052 write(1, "before read\n", 12 <unfinished ...>
2758  16:00:29.667474 <... read resumed> "\32E\337\243\223B\202\210matroskaB\207\201\2B\205\201\2\30S\200g\1\0\0\1"..., 4096) = 4096 <0.000460>
2756  16:00:29.667715 <... write resumed> ) = 12 <0.000413>
2758  16:00:29.668412 write(1, "after read\n", 11) = 11 <0.000202>
2757  16:00:29.669572 write(1, "before read\n", 12) = 12 <0.000205>
2759  16:00:29.670690 write(1, "before read\n", 12) = 12 <0.000219>
2759  16:00:29.671968 read(7, "\32E\337\243\223B\202\210matroskaB\207\201\2B\205\201\2\30S\200g\1\0\0\1"..., 4096) = 4096 <0.000393>
2759  16:00:29.672943 write(1, "after read\n", 11 <unfinished ...>
2756  16:00:29.673149 read(4,  <unfinished ...>
2757  16:00:29.673443 read(6,  <unfinished ...>
2759  16:00:29.673667 <... write resumed> ) = 11 <0.000552>
2756  16:00:29.673817 <... read resumed> "\32E\337\243\223B\202\210matroskaB\207\201\2B\205\201\2\30S\200g\1\0\0\1"..., 4096) = 4096 <0.000397>
2757  16:00:29.674141 <... read resumed> "\32E\337\243\223B\202\210matroskaB\207\201\2B\205\201\2\30S\200g\1\0\0\1"..., 4096) = 4096 <0.000553>
2756  16:00:29.674351 write(1, "after read\n", 11) = 11 <0.065832>
2757  16:00:29.741225 write(1, "after read\n", 11) = 11 <0.000159>
mr6a6kin ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.