From luis.sanmartin at unix.cl Mon Nov 5 12:07:14 2012 From: luis.sanmartin at unix.cl (Luis San Martin) Date: Mon, 5 Nov 2012 09:07:14 -0300 Subject: varnish 2.1.5 on ia64 Message-ID: Hello, I've been trying to get it up and running varnish 2.1.5 on ia64 without any success. So far I've tried debian package and varnish from source. Both with the same results. I attach strace file if needed. I appreciate any feedback or ideas since I can't find any clue. P.S: Base system is an SGI Altix 450 && Debian 6.0 Squeeze Kind regards # varnishd -V varnishd (varnish-2.1.5 SVN ) Copyright (c) 2006-2009 Linpro AS / Verdens Gang AS # uname -a Linux mansotarro1 2.6.32-5-mckinley #1 SMP Sun Sep 23 11:51:42 UTC 2012 ia64 GNU/Linux # gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/ia64-linux-gnu/4.6/lto-wrapper Target: ia64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.3-12' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libssp --enable-plugin --enable-objc-gc --with-system-libunwind --enable-checking=release --build=ia64-linux-gnu --host=ia64-linux-gnu --target=ia64-linux-gnu Thread model: posix gcc version 4.6.3 (Debian 4.6.3-12) -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- execve("/usr/sbin/varnishd", ["varnishd", "-f", "/usr/etc/varnish/default.vcl"], [/* 16 vars */]) = 0 brk(0) = 0x6000000000020000 uname({sys="Linux", node="mansotarro1", ...}) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=15068, ...}) = 0 mmap(NULL, 15068, PROT_READ, MAP_PRIVATE, 3, 0) = 0x200000000003c000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/usr/lib/libvarnish.so.1", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0\200O\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=285548, ...}) = 0 mmap(NULL, 216208, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2000000000054000 mprotect(0x2000000000078000, 49152, PROT_NONE) = 0 mmap(0x2000000000084000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x20000) = 0x2000000000084000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/usr/lib/libvarnishcompat.so.1", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0@\n\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=16090, ...}) = 0 mmap(NULL, 71608, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x200000000008c000 mprotect(0x2000000000090000, 49152, PROT_NONE) = 0 mmap(0x200000000009c000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0) = 0x200000000009c000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/usr/lib/libvcl.so.1", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0 at K\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=335159, ...}) = 0 mmap(NULL, 259168, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x20000000000a0000 mprotect(0x20000000000d0000, 49152, PROT_NONE) = 0 mmap(0x20000000000dc000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2c000) = 0x20000000000dc000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/ia64-linux-gnu/libdl.so.2", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0\200\24\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0644, st_size=20808, ...}) = 0 mmap(NULL, 83904, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x20000000000e0000 mprotect(0x20000000000e8000, 49152, PROT_NONE) = 0 mmap(0x20000000000f4000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x4000) = 0x20000000000f4000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/ia64-linux-gnu/libpthread.so.0", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0\0z\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=212602, ...}) = 0 mmap(NULL, 260384, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x20000000000f8000 mprotect(0x2000000000124000, 49152, PROT_NONE) = 0 mmap(0x2000000000130000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x28000) = 0x2000000000130000 mmap(0x2000000000134000, 14624, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2000000000134000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/ia64-linux-gnu/libnsl.so.1", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0 at Y\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0644, st_size=165688, ...}) = 0 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2000000000138000 mmap(NULL, 238392, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x200000000013c000 mprotect(0x2000000000164000, 49152, PROT_NONE) = 0 mmap(0x2000000000170000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x24000) = 0x2000000000170000 mmap(0x2000000000174000, 9016, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2000000000174000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/ia64-linux-gnu/libm.so.6.1", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0\300L\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0644, st_size=778720, ...}) = 0 mmap(NULL, 841808, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2000000000178000 mprotect(0x2000000000238000, 49152, PROT_NONE) = 0 mmap(0x2000000000244000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xbc000) = 0x2000000000244000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/usr/lib/libunwind.so.7", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0\240\"\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0644, st_size=116960, ...}) = 0 mmap(NULL, 305640, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2000000000248000 mprotect(0x2000000000264000, 49152, PROT_NONE) = 0 mmap(0x2000000000270000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x18000) = 0x2000000000270000 mmap(0x2000000000278000, 109032, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2000000000278000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/ia64-linux-gnu/libc.so.6.1", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0\200K\2\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=2604480, ...}) = 0 mmap(NULL, 2684936, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2000000000294000 mprotect(0x200000000050c000, 49152, PROT_NONE) = 0 mmap(0x2000000000518000, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x274000) = 0x2000000000518000 mmap(0x2000000000520000, 14344, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2000000000520000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/ia64-linux-gnu/librt.so.1", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0 at .\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0644, st_size=58008, ...}) = 0 mmap(NULL, 123176, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2000000000524000 mprotect(0x2000000000534000, 49152, PROT_NONE) = 0 mmap(0x2000000000540000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xc000) = 0x2000000000540000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/ia64-linux-gnu/libpcre.so.3", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0\0\37\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0644, st_size=519600, ...}) = 0 mmap(NULL, 582848, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2000000000544000 mprotect(0x20000000005c4000, 49152, PROT_NONE) = 0 mmap(0x20000000005d0000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x7c000) = 0x20000000005d0000 close(3) = 0 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x20000000005d4000 mmap(NULL, 32768, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x20000000005d8000 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x20000000005e0000 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x20000000005e4000 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x20000000005e8000 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x20000000005ec000 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x20000000005f0000 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x20000000005f4000 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x20000000005f8000 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x20000000005fc000 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2000000000600000 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2000000000604000 munmap(0x200000000003c000, 15068) = 0 set_tid_address(0x200000000013b0a0) = 5979 get_robust_list(0x200000000013b0b0, 0x18, 0x4000000000000040) = 0 futex(0x60000fffffc9fb90, FUTEX_WAIT_BITSET_PRIVATE|FUTEX_CLOCK_REALTIME, 1, NULL, 60000fffffc9fd00) = -1 EAGAIN (Resource temporarily unavailable) rt_sigaction(SIGRTMIN, {0x200000000004d510, [], SA_SIGINFO}, NULL, 8) = 0 rt_sigaction(SIGRT_1, {0x200000000004d520, [], SA_RESTART|SA_SIGINFO}, NULL, 8) = 0 rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0 getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0 getrlimit(RLIMIT_NOFILE, {rlim_cur=1024, rlim_max=1024}) = 0 close(1024) = -1 EBADF (Bad file descriptor) close(1023) = -1 EBADF (Bad file descriptor) close(1022) = -1 EBADF (Bad file descriptor) close(1021) = -1 EBADF (Bad file descriptor) close(1020) = -1 EBADF (Bad file descriptor) close(1019) = -1 EBADF (Bad file descriptor) close(1018) = -1 EBADF (Bad file descriptor) close(1017) = -1 EBADF (Bad file descriptor) close(1016) = -1 EBADF (Bad file descriptor) close(1015) = -1 EBADF (Bad file descriptor) close(1014) = -1 EBADF (Bad file descriptor) close(1013) = -1 EBADF (Bad file descriptor) close(1012) = -1 EBADF (Bad file descriptor) close(1011) = -1 EBADF (Bad file descriptor) close(1010) = -1 EBADF (Bad file descriptor) close(1009) = -1 EBADF (Bad file descriptor) close(1008) = -1 EBADF (Bad file descriptor) close(1007) = -1 EBADF (Bad file descriptor) close(1006) = -1 EBADF (Bad file descriptor) close(1005) = -1 EBADF (Bad file descriptor) close(1004) = -1 EBADF (Bad file descriptor) close(1003) = -1 EBADF (Bad file descriptor) close(1002) = -1 EBADF (Bad file descriptor) close(1001) = -1 EBADF (Bad file descriptor) close(1000) = -1 EBADF (Bad file descriptor) close(999) = -1 EBADF (Bad file descriptor) close(998) = -1 EBADF (Bad file descriptor) close(997) = -1 EBADF (Bad file descriptor) close(996) = -1 EBADF (Bad file descriptor) close(995) = -1 EBADF (Bad file descriptor) close(994) = -1 EBADF (Bad file descriptor) close(993) = -1 EBADF (Bad file descriptor) close(992) = -1 EBADF (Bad file descriptor) close(991) = -1 EBADF (Bad file descriptor) close(990) = -1 EBADF (Bad file descriptor) close(989) = -1 EBADF (Bad file descriptor) close(988) = -1 EBADF (Bad file descriptor) close(987) = -1 EBADF (Bad file descriptor) close(986) = -1 EBADF (Bad file descriptor) close(985) = -1 EBADF (Bad file descriptor) close(984) = -1 EBADF (Bad file descriptor) close(983) = -1 EBADF (Bad file descriptor) close(982) = -1 EBADF (Bad file descriptor) close(981) = -1 EBADF (Bad file descriptor) close(980) = -1 EBADF (Bad file descriptor) close(979) = -1 EBADF (Bad file descriptor) close(978) = -1 EBADF (Bad file descriptor) close(977) = -1 EBADF (Bad file descriptor) close(976) = -1 EBADF (Bad file descriptor) close(975) = -1 EBADF (Bad file descriptor) close(974) = -1 EBADF (Bad file descriptor) close(973) = -1 EBADF (Bad file descriptor) close(972) = -1 EBADF (Bad file descriptor) close(971) = -1 EBADF (Bad file descriptor) close(970) = -1 EBADF (Bad file descriptor) close(969) = -1 EBADF (Bad file descriptor) close(968) = -1 EBADF (Bad file descriptor) close(967) = -1 EBADF (Bad file descriptor) close(966) = -1 EBADF (Bad file descriptor) close(965) = -1 EBADF (Bad file descriptor) close(964) = -1 EBADF (Bad file descriptor) close(963) = -1 EBADF (Bad file descriptor) close(962) = -1 EBADF (Bad file descriptor) close(961) = -1 EBADF (Bad file descriptor) close(960) = -1 EBADF (Bad file descriptor) close(959) = -1 EBADF (Bad file descriptor) close(958) = -1 EBADF (Bad file descriptor) close(957) = -1 EBADF (Bad file descriptor) close(956) = -1 EBADF (Bad file descriptor) close(955) = -1 EBADF (Bad file descriptor) close(954) = -1 EBADF (Bad file descriptor) close(953) = -1 EBADF (Bad file descriptor) close(952) = -1 EBADF (Bad file descriptor) close(951) = -1 EBADF (Bad file descriptor) close(950) = -1 EBADF (Bad file descriptor) close(949) = -1 EBADF (Bad file descriptor) close(948) = -1 EBADF (Bad file descriptor) close(947) = -1 EBADF (Bad file descriptor) close(946) = -1 EBADF (Bad file descriptor) close(945) = -1 EBADF (Bad file descriptor) close(944) = -1 EBADF (Bad file descriptor) close(943) = -1 EBADF (Bad file descriptor) close(942) = -1 EBADF (Bad file descriptor) close(941) = -1 EBADF (Bad file descriptor) close(940) = -1 EBADF (Bad file descriptor) close(939) = -1 EBADF (Bad file descriptor) close(938) = -1 EBADF (Bad file descriptor) close(937) = -1 EBADF (Bad file descriptor) close(936) = -1 EBADF (Bad file descriptor) close(935) = -1 EBADF (Bad file descriptor) close(934) = -1 EBADF (Bad file descriptor) close(933) = -1 EBADF (Bad file descriptor) close(932) = -1 EBADF (Bad file descriptor) close(931) = -1 EBADF (Bad file descriptor) close(930) = -1 EBADF (Bad file descriptor) close(929) = -1 EBADF (Bad file descriptor) close(928) = -1 EBADF (Bad file descriptor) close(927) = -1 EBADF (Bad file descriptor) close(926) = -1 EBADF (Bad file descriptor) close(925) = -1 EBADF (Bad file descriptor) close(924) = -1 EBADF (Bad file descriptor) close(923) = -1 EBADF (Bad file descriptor) close(922) = -1 EBADF (Bad file descriptor) close(921) = -1 EBADF (Bad file descriptor) close(920) = -1 EBADF (Bad file descriptor) close(919) = -1 EBADF (Bad file descriptor) close(918) = -1 EBADF (Bad file descriptor) close(917) = -1 EBADF (Bad file descriptor) close(916) = -1 EBADF (Bad file descriptor) close(915) = -1 EBADF (Bad file descriptor) close(914) = -1 EBADF (Bad file descriptor) close(913) = -1 EBADF (Bad file descriptor) close(912) = -1 EBADF (Bad file descriptor) close(911) = -1 EBADF (Bad file descriptor) close(910) = -1 EBADF (Bad file descriptor) close(909) = -1 EBADF (Bad file descriptor) close(908) = -1 EBADF (Bad file descriptor) close(907) = -1 EBADF (Bad file descriptor) close(906) = -1 EBADF (Bad file descriptor) close(905) = -1 EBADF (Bad file descriptor) close(904) = -1 EBADF (Bad file descriptor) close(903) = -1 EBADF (Bad file descriptor) close(902) = -1 EBADF (Bad file descriptor) close(901) = -1 EBADF (Bad file descriptor) close(900) = -1 EBADF (Bad file descriptor) close(899) = -1 EBADF (Bad file descriptor) close(898) = -1 EBADF (Bad file descriptor) close(897) = -1 EBADF (Bad file descriptor) close(896) = -1 EBADF (Bad file descriptor) close(895) = -1 EBADF (Bad file descriptor) close(894) = -1 EBADF (Bad file descriptor) close(893) = -1 EBADF (Bad file descriptor) close(892) = -1 EBADF (Bad file descriptor) close(891) = -1 EBADF (Bad file descriptor) close(890) = -1 EBADF (Bad file descriptor) close(889) = -1 EBADF (Bad file descriptor) close(888) = -1 EBADF (Bad file descriptor) close(887) = -1 EBADF (Bad file descriptor) close(886) = -1 EBADF (Bad file descriptor) close(885) = -1 EBADF (Bad file descriptor) close(884) = -1 EBADF (Bad file descriptor) close(883) = -1 EBADF (Bad file descriptor) close(882) = -1 EBADF (Bad file descriptor) close(881) = -1 EBADF (Bad file descriptor) close(880) = -1 EBADF (Bad file descriptor) close(879) = -1 EBADF (Bad file descriptor) close(878) = -1 EBADF (Bad file descriptor) close(877) = -1 EBADF (Bad file descriptor) close(876) = -1 EBADF (Bad file descriptor) close(875) = -1 EBADF (Bad file descriptor) close(874) = -1 EBADF (Bad file descriptor) close(873) = -1 EBADF (Bad file descriptor) close(872) = -1 EBADF (Bad file descriptor) close(871) = -1 EBADF (Bad file descriptor) close(870) = -1 EBADF (Bad file descriptor) close(869) = -1 EBADF (Bad file descriptor) close(868) = -1 EBADF (Bad file descriptor) close(867) = -1 EBADF (Bad file descriptor) close(866) = -1 EBADF (Bad file descriptor) close(865) = -1 EBADF (Bad file descriptor) close(864) = -1 EBADF (Bad file descriptor) close(863) = -1 EBADF (Bad file descriptor) close(862) = -1 EBADF (Bad file descriptor) close(861) = -1 EBADF (Bad file descriptor) close(860) = -1 EBADF (Bad file descriptor) close(859) = -1 EBADF (Bad file descriptor) close(858) = -1 EBADF (Bad file descriptor) close(857) = -1 EBADF (Bad file descriptor) close(856) = -1 EBADF (Bad file descriptor) close(855) = -1 EBADF (Bad file descriptor) close(854) = -1 EBADF (Bad file descriptor) close(853) = -1 EBADF (Bad file descriptor) close(852) = -1 EBADF (Bad file descriptor) close(851) = -1 EBADF (Bad file descriptor) close(850) = -1 EBADF (Bad file descriptor) close(849) = -1 EBADF (Bad file descriptor) close(848) = -1 EBADF (Bad file descriptor) close(847) = -1 EBADF (Bad file descriptor) close(846) = -1 EBADF (Bad file descriptor) close(845) = -1 EBADF (Bad file descriptor) close(844) = -1 EBADF (Bad file descriptor) close(843) = -1 EBADF (Bad file descriptor) close(842) = -1 EBADF (Bad file descriptor) close(841) = -1 EBADF (Bad file descriptor) close(840) = -1 EBADF (Bad file descriptor) close(839) = -1 EBADF (Bad file descriptor) close(838) = -1 EBADF (Bad file descriptor) close(837) = -1 EBADF (Bad file descriptor) close(836) = -1 EBADF (Bad file descriptor) close(835) = -1 EBADF (Bad file descriptor) close(834) = -1 EBADF (Bad file descriptor) close(833) = -1 EBADF (Bad file descriptor) close(832) = -1 EBADF (Bad file descriptor) close(831) = -1 EBADF (Bad file descriptor) close(830) = -1 EBADF (Bad file descriptor) close(829) = -1 EBADF (Bad file descriptor) close(828) = -1 EBADF (Bad file descriptor) close(827) = -1 EBADF (Bad file descriptor) close(826) = -1 EBADF (Bad file descriptor) close(825) = -1 EBADF (Bad file descriptor) close(824) = -1 EBADF (Bad file descriptor) close(823) = -1 EBADF (Bad file descriptor) close(822) = -1 EBADF (Bad file descriptor) close(821) = -1 EBADF (Bad file descriptor) close(820) = -1 EBADF (Bad file descriptor) close(819) = -1 EBADF (Bad file descriptor) close(818) = -1 EBADF (Bad file descriptor) close(817) = -1 EBADF (Bad file descriptor) close(816) = -1 EBADF (Bad file descriptor) close(815) = -1 EBADF (Bad file descriptor) close(814) = -1 EBADF (Bad file descriptor) close(813) = -1 EBADF (Bad file descriptor) close(812) = -1 EBADF (Bad file descriptor) close(811) = -1 EBADF (Bad file descriptor) close(810) = -1 EBADF (Bad file descriptor) close(809) = -1 EBADF (Bad file descriptor) close(808) = -1 EBADF (Bad file descriptor) close(807) = -1 EBADF (Bad file descriptor) close(806) = -1 EBADF (Bad file descriptor) close(805) = -1 EBADF (Bad file descriptor) close(804) = -1 EBADF (Bad file descriptor) close(803) = -1 EBADF (Bad file descriptor) close(802) = -1 EBADF (Bad file descriptor) close(801) = -1 EBADF (Bad file descriptor) close(800) = -1 EBADF (Bad file descriptor) close(799) = -1 EBADF (Bad file descriptor) close(798) = -1 EBADF (Bad file descriptor) close(797) = -1 EBADF (Bad file descriptor) close(796) = -1 EBADF (Bad file descriptor) close(795) = -1 EBADF (Bad file descriptor) close(794) = -1 EBADF (Bad file descriptor) close(793) = -1 EBADF (Bad file descriptor) close(792) = -1 EBADF (Bad file descriptor) close(791) = -1 EBADF (Bad file descriptor) close(790) = -1 EBADF (Bad file descriptor) close(789) = -1 EBADF (Bad file descriptor) close(788) = -1 EBADF (Bad file descriptor) close(787) = -1 EBADF (Bad file descriptor) close(786) = -1 EBADF (Bad file descriptor) close(785) = -1 EBADF (Bad file descriptor) close(784) = -1 EBADF (Bad file descriptor) close(783) = -1 EBADF (Bad file descriptor) close(782) = -1 EBADF (Bad file descriptor) close(781) = -1 EBADF (Bad file descriptor) close(780) = -1 EBADF (Bad file descriptor) close(779) = -1 EBADF (Bad file descriptor) close(778) = -1 EBADF (Bad file descriptor) close(777) = -1 EBADF (Bad file descriptor) close(776) = -1 EBADF (Bad file descriptor) close(775) = -1 EBADF (Bad file descriptor) close(774) = -1 EBADF (Bad file descriptor) close(773) = -1 EBADF (Bad file descriptor) close(772) = -1 EBADF (Bad file descriptor) close(771) = -1 EBADF (Bad file descriptor) close(770) = -1 EBADF (Bad file descriptor) close(769) = -1 EBADF (Bad file descriptor) close(768) = -1 EBADF (Bad file descriptor) close(767) = -1 EBADF (Bad file descriptor) close(766) = -1 EBADF (Bad file descriptor) close(765) = -1 EBADF (Bad file descriptor) close(764) = -1 EBADF (Bad file descriptor) close(763) = -1 EBADF (Bad file descriptor) close(762) = -1 EBADF (Bad file descriptor) close(761) = -1 EBADF (Bad file descriptor) close(760) = -1 EBADF (Bad file descriptor) close(759) = -1 EBADF (Bad file descriptor) close(758) = -1 EBADF (Bad file descriptor) close(757) = -1 EBADF (Bad file descriptor) close(756) = -1 EBADF (Bad file descriptor) close(755) = -1 EBADF (Bad file descriptor) close(754) = -1 EBADF (Bad file descriptor) close(753) = -1 EBADF (Bad file descriptor) close(752) = -1 EBADF (Bad file descriptor) close(751) = -1 EBADF (Bad file descriptor) close(750) = -1 EBADF (Bad file descriptor) close(749) = -1 EBADF (Bad file descriptor) close(748) = -1 EBADF (Bad file descriptor) close(747) = -1 EBADF (Bad file descriptor) close(746) = -1 EBADF (Bad file descriptor) close(745) = -1 EBADF (Bad file descriptor) close(744) = -1 EBADF (Bad file descriptor) close(743) = -1 EBADF (Bad file descriptor) close(742) = -1 EBADF (Bad file descriptor) close(741) = -1 EBADF (Bad file descriptor) close(740) = -1 EBADF (Bad file descriptor) close(739) = -1 EBADF (Bad file descriptor) close(738) = -1 EBADF (Bad file descriptor) close(737) = -1 EBADF (Bad file descriptor) close(736) = -1 EBADF (Bad file descriptor) close(735) = -1 EBADF (Bad file descriptor) close(734) = -1 EBADF (Bad file descriptor) close(733) = -1 EBADF (Bad file descriptor) close(732) = -1 EBADF (Bad file descriptor) close(731) = -1 EBADF (Bad file descriptor) close(730) = -1 EBADF (Bad file descriptor) close(729) = -1 EBADF (Bad file descriptor) close(728) = -1 EBADF (Bad file descriptor) close(727) = -1 EBADF (Bad file descriptor) close(726) = -1 EBADF (Bad file descriptor) close(725) = -1 EBADF (Bad file descriptor) close(724) = -1 EBADF (Bad file descriptor) close(723) = -1 EBADF (Bad file descriptor) close(722) = -1 EBADF (Bad file descriptor) close(721) = -1 EBADF (Bad file descriptor) close(720) = -1 EBADF (Bad file descriptor) close(719) = -1 EBADF (Bad file descriptor) close(718) = -1 EBADF (Bad file descriptor) close(717) = -1 EBADF (Bad file descriptor) close(716) = -1 EBADF (Bad file descriptor) close(715) = -1 EBADF (Bad file descriptor) close(714) = -1 EBADF (Bad file descriptor) close(713) = -1 EBADF (Bad file descriptor) close(712) = -1 EBADF (Bad file descriptor) close(711) = -1 EBADF (Bad file descriptor) close(710) = -1 EBADF (Bad file descriptor) close(709) = -1 EBADF (Bad file descriptor) close(708) = -1 EBADF (Bad file descriptor) close(707) = -1 EBADF (Bad file descriptor) close(706) = -1 EBADF (Bad file descriptor) close(705) = -1 EBADF (Bad file descriptor) close(704) = -1 EBADF (Bad file descriptor) close(703) = -1 EBADF (Bad file descriptor) close(702) = -1 EBADF (Bad file descriptor) close(701) = -1 EBADF (Bad file descriptor) close(700) = -1 EBADF (Bad file descriptor) close(699) = -1 EBADF (Bad file descriptor) close(698) = -1 EBADF (Bad file descriptor) close(697) = -1 EBADF (Bad file descriptor) close(696) = -1 EBADF (Bad file descriptor) close(695) = -1 EBADF (Bad file descriptor) close(694) = -1 EBADF (Bad file descriptor) close(693) = -1 EBADF (Bad file descriptor) close(692) = -1 EBADF (Bad file descriptor) close(691) = -1 EBADF (Bad file descriptor) close(690) = -1 EBADF (Bad file descriptor) close(689) = -1 EBADF (Bad file descriptor) close(688) = -1 EBADF (Bad file descriptor) close(687) = -1 EBADF (Bad file descriptor) close(686) = -1 EBADF (Bad file descriptor) close(685) = -1 EBADF (Bad file descriptor) close(684) = -1 EBADF (Bad file descriptor) close(683) = -1 EBADF (Bad file descriptor) close(682) = -1 EBADF (Bad file descriptor) close(681) = -1 EBADF (Bad file descriptor) close(680) = -1 EBADF (Bad file descriptor) close(679) = -1 EBADF (Bad file descriptor) close(678) = -1 EBADF (Bad file descriptor) close(677) = -1 EBADF (Bad file descriptor) close(676) = -1 EBADF (Bad file descriptor) close(675) = -1 EBADF (Bad file descriptor) close(674) = -1 EBADF (Bad file descriptor) close(673) = -1 EBADF (Bad file descriptor) close(672) = -1 EBADF (Bad file descriptor) close(671) = -1 EBADF (Bad file descriptor) close(670) = -1 EBADF (Bad file descriptor) close(669) = -1 EBADF (Bad file descriptor) close(668) = -1 EBADF (Bad file descriptor) close(667) = -1 EBADF (Bad file descriptor) close(666) = -1 EBADF (Bad file descriptor) close(665) = -1 EBADF (Bad file descriptor) close(664) = -1 EBADF (Bad file descriptor) close(663) = -1 EBADF (Bad file descriptor) close(662) = -1 EBADF (Bad file descriptor) close(661) = -1 EBADF (Bad file descriptor) close(660) = -1 EBADF (Bad file descriptor) close(659) = -1 EBADF (Bad file descriptor) close(658) = -1 EBADF (Bad file descriptor) close(657) = -1 EBADF (Bad file descriptor) close(656) = -1 EBADF (Bad file descriptor) close(655) = -1 EBADF (Bad file descriptor) close(654) = -1 EBADF (Bad file descriptor) close(653) = -1 EBADF (Bad file descriptor) close(652) = -1 EBADF (Bad file descriptor) close(651) = -1 EBADF (Bad file descriptor) close(650) = -1 EBADF (Bad file descriptor) close(649) = -1 EBADF (Bad file descriptor) close(648) = -1 EBADF (Bad file descriptor) close(647) = -1 EBADF (Bad file descriptor) close(646) = -1 EBADF (Bad file descriptor) close(645) = -1 EBADF (Bad file descriptor) close(644) = -1 EBADF (Bad file descriptor) close(643) = -1 EBADF (Bad file descriptor) close(642) = -1 EBADF (Bad file descriptor) close(641) = -1 EBADF (Bad file descriptor) close(640) = -1 EBADF (Bad file descriptor) close(639) = -1 EBADF (Bad file descriptor) close(638) = -1 EBADF (Bad file descriptor) close(637) = -1 EBADF (Bad file descriptor) close(636) = -1 EBADF (Bad file descriptor) close(635) = -1 EBADF (Bad file descriptor) close(634) = -1 EBADF (Bad file descriptor) close(633) = -1 EBADF (Bad file descriptor) close(632) = -1 EBADF (Bad file descriptor) close(631) = -1 EBADF (Bad file descriptor) close(630) = -1 EBADF (Bad file descriptor) close(629) = -1 EBADF (Bad file descriptor) close(628) = -1 EBADF (Bad file descriptor) close(627) = -1 EBADF (Bad file descriptor) close(626) = -1 EBADF (Bad file descriptor) close(625) = -1 EBADF (Bad file descriptor) close(624) = -1 EBADF (Bad file descriptor) close(623) = -1 EBADF (Bad file descriptor) close(622) = -1 EBADF (Bad file descriptor) close(621) = -1 EBADF (Bad file descriptor) close(620) = -1 EBADF (Bad file descriptor) close(619) = -1 EBADF (Bad file descriptor) close(618) = -1 EBADF (Bad file descriptor) close(617) = -1 EBADF (Bad file descriptor) close(616) = -1 EBADF (Bad file descriptor) close(615) = -1 EBADF (Bad file descriptor) close(614) = -1 EBADF (Bad file descriptor) close(613) = -1 EBADF (Bad file descriptor) close(612) = -1 EBADF (Bad file descriptor) close(611) = -1 EBADF (Bad file descriptor) close(610) = -1 EBADF (Bad file descriptor) close(609) = -1 EBADF (Bad file descriptor) close(608) = -1 EBADF (Bad file descriptor) close(607) = -1 EBADF (Bad file descriptor) close(606) = -1 EBADF (Bad file descriptor) close(605) = -1 EBADF (Bad file descriptor) close(604) = -1 EBADF (Bad file descriptor) close(603) = -1 EBADF (Bad file descriptor) close(602) = -1 EBADF (Bad file descriptor) close(601) = -1 EBADF (Bad file descriptor) close(600) = -1 EBADF (Bad file descriptor) close(599) = -1 EBADF (Bad file descriptor) close(598) = -1 EBADF (Bad file descriptor) close(597) = -1 EBADF (Bad file descriptor) close(596) = -1 EBADF (Bad file descriptor) close(595) = -1 EBADF (Bad file descriptor) close(594) = -1 EBADF (Bad file descriptor) close(593) = -1 EBADF (Bad file descriptor) close(592) = -1 EBADF (Bad file descriptor) close(591) = -1 EBADF (Bad file descriptor) close(590) = -1 EBADF (Bad file descriptor) close(589) = -1 EBADF (Bad file descriptor) close(588) = -1 EBADF (Bad file descriptor) close(587) = -1 EBADF (Bad file descriptor) close(586) = -1 EBADF (Bad file descriptor) close(585) = -1 EBADF (Bad file descriptor) close(584) = -1 EBADF (Bad file descriptor) close(583) = -1 EBADF (Bad file descriptor) close(582) = -1 EBADF (Bad file descriptor) close(581) = -1 EBADF (Bad file descriptor) close(580) = -1 EBADF (Bad file descriptor) close(579) = -1 EBADF (Bad file descriptor) close(578) = -1 EBADF (Bad file descriptor) close(577) = -1 EBADF (Bad file descriptor) close(576) = -1 EBADF (Bad file descriptor) close(575) = -1 EBADF (Bad file descriptor) close(574) = -1 EBADF (Bad file descriptor) close(573) = -1 EBADF (Bad file descriptor) close(572) = -1 EBADF (Bad file descriptor) close(571) = -1 EBADF (Bad file descriptor) close(570) = -1 EBADF (Bad file descriptor) close(569) = -1 EBADF (Bad file descriptor) close(568) = -1 EBADF (Bad file descriptor) close(567) = -1 EBADF (Bad file descriptor) close(566) = -1 EBADF (Bad file descriptor) close(565) = -1 EBADF (Bad file descriptor) close(564) = -1 EBADF (Bad file descriptor) close(563) = -1 EBADF (Bad file descriptor) close(562) = -1 EBADF (Bad file descriptor) close(561) = -1 EBADF (Bad file descriptor) close(560) = -1 EBADF (Bad file descriptor) close(559) = -1 EBADF (Bad file descriptor) close(558) = -1 EBADF (Bad file descriptor) close(557) = -1 EBADF (Bad file descriptor) close(556) = -1 EBADF (Bad file descriptor) close(555) = -1 EBADF (Bad file descriptor) close(554) = -1 EBADF (Bad file descriptor) close(553) = -1 EBADF (Bad file descriptor) close(552) = -1 EBADF (Bad file descriptor) close(551) = -1 EBADF (Bad file descriptor) close(550) = -1 EBADF (Bad file descriptor) close(549) = -1 EBADF (Bad file descriptor) close(548) = -1 EBADF (Bad file descriptor) close(547) = -1 EBADF (Bad file descriptor) close(546) = -1 EBADF (Bad file descriptor) close(545) = -1 EBADF (Bad file descriptor) close(544) = -1 EBADF (Bad file descriptor) close(543) = -1 EBADF (Bad file descriptor) close(542) = -1 EBADF (Bad file descriptor) close(541) = -1 EBADF (Bad file descriptor) close(540) = -1 EBADF (Bad file descriptor) close(539) = -1 EBADF (Bad file descriptor) close(538) = -1 EBADF (Bad file descriptor) close(537) = -1 EBADF (Bad file descriptor) close(536) = -1 EBADF (Bad file descriptor) close(535) = -1 EBADF (Bad file descriptor) close(534) = -1 EBADF (Bad file descriptor) close(533) = -1 EBADF (Bad file descriptor) close(532) = -1 EBADF (Bad file descriptor) close(531) = -1 EBADF (Bad file descriptor) close(530) = -1 EBADF (Bad file descriptor) close(529) = -1 EBADF (Bad file descriptor) close(528) = -1 EBADF (Bad file descriptor) close(527) = -1 EBADF (Bad file descriptor) close(526) = -1 EBADF (Bad file descriptor) close(525) = -1 EBADF (Bad file descriptor) close(524) = -1 EBADF (Bad file descriptor) close(523) = -1 EBADF (Bad file descriptor) close(522) = -1 EBADF (Bad file descriptor) close(521) = -1 EBADF (Bad file descriptor) close(520) = -1 EBADF (Bad file descriptor) close(519) = -1 EBADF (Bad file descriptor) close(518) = -1 EBADF (Bad file descriptor) close(517) = -1 EBADF (Bad file descriptor) close(516) = -1 EBADF (Bad file descriptor) close(515) = -1 EBADF (Bad file descriptor) close(514) = -1 EBADF (Bad file descriptor) close(513) = -1 EBADF (Bad file descriptor) close(512) = -1 EBADF (Bad file descriptor) close(511) = -1 EBADF (Bad file descriptor) close(510) = -1 EBADF (Bad file descriptor) close(509) = -1 EBADF (Bad file descriptor) close(508) = -1 EBADF (Bad file descriptor) close(507) = -1 EBADF (Bad file descriptor) close(506) = -1 EBADF (Bad file descriptor) close(505) = -1 EBADF (Bad file descriptor) close(504) = -1 EBADF (Bad file descriptor) close(503) = -1 EBADF (Bad file descriptor) close(502) = -1 EBADF (Bad file descriptor) close(501) = -1 EBADF (Bad file descriptor) close(500) = -1 EBADF (Bad file descriptor) close(499) = -1 EBADF (Bad file descriptor) close(498) = -1 EBADF (Bad file descriptor) close(497) = -1 EBADF (Bad file descriptor) close(496) = -1 EBADF (Bad file descriptor) close(495) = -1 EBADF (Bad file descriptor) close(494) = -1 EBADF (Bad file descriptor) close(493) = -1 EBADF (Bad file descriptor) close(492) = -1 EBADF (Bad file descriptor) close(491) = -1 EBADF (Bad file descriptor) close(490) = -1 EBADF (Bad file descriptor) close(489) = -1 EBADF (Bad file descriptor) close(488) = -1 EBADF (Bad file descriptor) close(487) = -1 EBADF (Bad file descriptor) close(486) = -1 EBADF (Bad file descriptor) close(485) = -1 EBADF (Bad file descriptor) close(484) = -1 EBADF (Bad file descriptor) close(483) = -1 EBADF (Bad file descriptor) close(482) = -1 EBADF (Bad file descriptor) close(481) = -1 EBADF (Bad file descriptor) close(480) = -1 EBADF (Bad file descriptor) close(479) = -1 EBADF (Bad file descriptor) close(478) = -1 EBADF (Bad file descriptor) close(477) = -1 EBADF (Bad file descriptor) close(476) = -1 EBADF (Bad file descriptor) close(475) = -1 EBADF (Bad file descriptor) close(474) = -1 EBADF (Bad file descriptor) close(473) = -1 EBADF (Bad file descriptor) close(472) = -1 EBADF (Bad file descriptor) close(471) = -1 EBADF (Bad file descriptor) close(470) = -1 EBADF (Bad file descriptor) close(469) = -1 EBADF (Bad file descriptor) close(468) = -1 EBADF (Bad file descriptor) close(467) = -1 EBADF (Bad file descriptor) close(466) = -1 EBADF (Bad file descriptor) close(465) = -1 EBADF (Bad file descriptor) close(464) = -1 EBADF (Bad file descriptor) close(463) = -1 EBADF (Bad file descriptor) close(462) = -1 EBADF (Bad file descriptor) close(461) = -1 EBADF (Bad file descriptor) close(460) = -1 EBADF (Bad file descriptor) close(459) = -1 EBADF (Bad file descriptor) close(458) = -1 EBADF (Bad file descriptor) close(457) = -1 EBADF (Bad file descriptor) close(456) = -1 EBADF (Bad file descriptor) close(455) = -1 EBADF (Bad file descriptor) close(454) = -1 EBADF (Bad file descriptor) close(453) = -1 EBADF (Bad file descriptor) close(452) = -1 EBADF (Bad file descriptor) close(451) = -1 EBADF (Bad file descriptor) close(450) = -1 EBADF (Bad file descriptor) close(449) = -1 EBADF (Bad file descriptor) close(448) = -1 EBADF (Bad file descriptor) close(447) = -1 EBADF (Bad file descriptor) close(446) = -1 EBADF (Bad file descriptor) close(445) = -1 EBADF (Bad file descriptor) close(444) = -1 EBADF (Bad file descriptor) close(443) = -1 EBADF (Bad file descriptor) close(442) = -1 EBADF (Bad file descriptor) close(441) = -1 EBADF (Bad file descriptor) close(440) = -1 EBADF (Bad file descriptor) close(439) = -1 EBADF (Bad file descriptor) close(438) = -1 EBADF (Bad file descriptor) close(437) = -1 EBADF (Bad file descriptor) close(436) = -1 EBADF (Bad file descriptor) close(435) = -1 EBADF (Bad file descriptor) close(434) = -1 EBADF (Bad file descriptor) close(433) = -1 EBADF (Bad file descriptor) close(432) = -1 EBADF (Bad file descriptor) close(431) = -1 EBADF (Bad file descriptor) close(430) = -1 EBADF (Bad file descriptor) close(429) = -1 EBADF (Bad file descriptor) close(428) = -1 EBADF (Bad file descriptor) close(427) = -1 EBADF (Bad file descriptor) close(426) = -1 EBADF (Bad file descriptor) close(425) = -1 EBADF (Bad file descriptor) close(424) = -1 EBADF (Bad file descriptor) close(423) = -1 EBADF (Bad file descriptor) close(422) = -1 EBADF (Bad file descriptor) close(421) = -1 EBADF (Bad file descriptor) close(420) = -1 EBADF (Bad file descriptor) close(419) = -1 EBADF (Bad file descriptor) close(418) = -1 EBADF (Bad file descriptor) close(417) = -1 EBADF (Bad file descriptor) close(416) = -1 EBADF (Bad file descriptor) close(415) = -1 EBADF (Bad file descriptor) close(414) = -1 EBADF (Bad file descriptor) close(413) = -1 EBADF (Bad file descriptor) close(412) = -1 EBADF (Bad file descriptor) close(411) = -1 EBADF (Bad file descriptor) close(410) = -1 EBADF (Bad file descriptor) close(409) = -1 EBADF (Bad file descriptor) close(408) = -1 EBADF (Bad file descriptor) close(407) = -1 EBADF (Bad file descriptor) close(406) = -1 EBADF (Bad file descriptor) close(405) = -1 EBADF (Bad file descriptor) close(404) = -1 EBADF (Bad file descriptor) close(403) = -1 EBADF (Bad file descriptor) close(402) = -1 EBADF (Bad file descriptor) close(401) = -1 EBADF (Bad file descriptor) close(400) = -1 EBADF (Bad file descriptor) close(399) = -1 EBADF (Bad file descriptor) close(398) = -1 EBADF (Bad file descriptor) close(397) = -1 EBADF (Bad file descriptor) close(396) = -1 EBADF (Bad file descriptor) close(395) = -1 EBADF (Bad file descriptor) close(394) = -1 EBADF (Bad file descriptor) close(393) = -1 EBADF (Bad file descriptor) close(392) = -1 EBADF (Bad file descriptor) close(391) = -1 EBADF (Bad file descriptor) close(390) = -1 EBADF (Bad file descriptor) close(389) = -1 EBADF (Bad file descriptor) close(388) = -1 EBADF (Bad file descriptor) close(387) = -1 EBADF (Bad file descriptor) close(386) = -1 EBADF (Bad file descriptor) close(385) = -1 EBADF (Bad file descriptor) close(384) = -1 EBADF (Bad file descriptor) close(383) = -1 EBADF (Bad file descriptor) close(382) = -1 EBADF (Bad file descriptor) close(381) = -1 EBADF (Bad file descriptor) close(380) = -1 EBADF (Bad file descriptor) close(379) = -1 EBADF (Bad file descriptor) close(378) = -1 EBADF (Bad file descriptor) close(377) = -1 EBADF (Bad file descriptor) close(376) = -1 EBADF (Bad file descriptor) close(375) = -1 EBADF (Bad file descriptor) close(374) = -1 EBADF (Bad file descriptor) close(373) = -1 EBADF (Bad file descriptor) close(372) = -1 EBADF (Bad file descriptor) close(371) = -1 EBADF (Bad file descriptor) close(370) = -1 EBADF (Bad file descriptor) close(369) = -1 EBADF (Bad file descriptor) close(368) = -1 EBADF (Bad file descriptor) close(367) = -1 EBADF (Bad file descriptor) close(366) = -1 EBADF (Bad file descriptor) close(365) = -1 EBADF (Bad file descriptor) close(364) = -1 EBADF (Bad file descriptor) close(363) = -1 EBADF (Bad file descriptor) close(362) = -1 EBADF (Bad file descriptor) close(361) = -1 EBADF (Bad file descriptor) close(360) = -1 EBADF (Bad file descriptor) close(359) = -1 EBADF (Bad file descriptor) close(358) = -1 EBADF (Bad file descriptor) close(357) = -1 EBADF (Bad file descriptor) close(356) = -1 EBADF (Bad file descriptor) close(355) = -1 EBADF (Bad file descriptor) close(354) = -1 EBADF (Bad file descriptor) close(353) = -1 EBADF (Bad file descriptor) close(352) = -1 EBADF (Bad file descriptor) close(351) = -1 EBADF (Bad file descriptor) close(350) = -1 EBADF (Bad file descriptor) close(349) = -1 EBADF (Bad file descriptor) close(348) = -1 EBADF (Bad file descriptor) close(347) = -1 EBADF (Bad file descriptor) close(346) = -1 EBADF (Bad file descriptor) close(345) = -1 EBADF (Bad file descriptor) close(344) = -1 EBADF (Bad file descriptor) close(343) = -1 EBADF (Bad file descriptor) close(342) = -1 EBADF (Bad file descriptor) close(341) = -1 EBADF (Bad file descriptor) close(340) = -1 EBADF (Bad file descriptor) close(339) = -1 EBADF (Bad file descriptor) close(338) = -1 EBADF (Bad file descriptor) close(337) = -1 EBADF (Bad file descriptor) close(336) = -1 EBADF (Bad file descriptor) close(335) = -1 EBADF (Bad file descriptor) close(334) = -1 EBADF (Bad file descriptor) close(333) = -1 EBADF (Bad file descriptor) close(332) = -1 EBADF (Bad file descriptor) close(331) = -1 EBADF (Bad file descriptor) close(330) = -1 EBADF (Bad file descriptor) close(329) = -1 EBADF (Bad file descriptor) close(328) = -1 EBADF (Bad file descriptor) close(327) = -1 EBADF (Bad file descriptor) close(326) = -1 EBADF (Bad file descriptor) close(325) = -1 EBADF (Bad file descriptor) close(324) = -1 EBADF (Bad file descriptor) close(323) = -1 EBADF (Bad file descriptor) close(322) = -1 EBADF (Bad file descriptor) close(321) = -1 EBADF (Bad file descriptor) close(320) = -1 EBADF (Bad file descriptor) close(319) = -1 EBADF (Bad file descriptor) close(318) = -1 EBADF (Bad file descriptor) close(317) = -1 EBADF (Bad file descriptor) close(316) = -1 EBADF (Bad file descriptor) close(315) = -1 EBADF (Bad file descriptor) close(314) = -1 EBADF (Bad file descriptor) close(313) = -1 EBADF (Bad file descriptor) close(312) = -1 EBADF (Bad file descriptor) close(311) = -1 EBADF (Bad file descriptor) close(310) = -1 EBADF (Bad file descriptor) close(309) = -1 EBADF (Bad file descriptor) close(308) = -1 EBADF (Bad file descriptor) close(307) = -1 EBADF (Bad file descriptor) close(306) = -1 EBADF (Bad file descriptor) close(305) = -1 EBADF (Bad file descriptor) close(304) = -1 EBADF (Bad file descriptor) close(303) = -1 EBADF (Bad file descriptor) close(302) = -1 EBADF (Bad file descriptor) close(301) = -1 EBADF (Bad file descriptor) close(300) = -1 EBADF (Bad file descriptor) close(299) = -1 EBADF (Bad file descriptor) close(298) = -1 EBADF (Bad file descriptor) close(297) = -1 EBADF (Bad file descriptor) close(296) = -1 EBADF (Bad file descriptor) close(295) = -1 EBADF (Bad file descriptor) close(294) = -1 EBADF (Bad file descriptor) close(293) = -1 EBADF (Bad file descriptor) close(292) = -1 EBADF (Bad file descriptor) close(291) = -1 EBADF (Bad file descriptor) close(290) = -1 EBADF (Bad file descriptor) close(289) = -1 EBADF (Bad file descriptor) close(288) = -1 EBADF (Bad file descriptor) close(287) = -1 EBADF (Bad file descriptor) close(286) = -1 EBADF (Bad file descriptor) close(285) = -1 EBADF (Bad file descriptor) close(284) = -1 EBADF (Bad file descriptor) close(283) = -1 EBADF (Bad file descriptor) close(282) = -1 EBADF (Bad file descriptor) close(281) = -1 EBADF (Bad file descriptor) close(280) = -1 EBADF (Bad file descriptor) close(279) = -1 EBADF (Bad file descriptor) close(278) = -1 EBADF (Bad file descriptor) close(277) = -1 EBADF (Bad file descriptor) close(276) = -1 EBADF (Bad file descriptor) close(275) = -1 EBADF (Bad file descriptor) close(274) = -1 EBADF (Bad file descriptor) close(273) = -1 EBADF (Bad file descriptor) close(272) = -1 EBADF (Bad file descriptor) close(271) = -1 EBADF (Bad file descriptor) close(270) = -1 EBADF (Bad file descriptor) close(269) = -1 EBADF (Bad file descriptor) close(268) = -1 EBADF (Bad file descriptor) close(267) = -1 EBADF (Bad file descriptor) close(266) = -1 EBADF (Bad file descriptor) close(265) = -1 EBADF (Bad file descriptor) close(264) = -1 EBADF (Bad file descriptor) close(263) = -1 EBADF (Bad file descriptor) close(262) = -1 EBADF (Bad file descriptor) close(261) = -1 EBADF (Bad file descriptor) close(260) = -1 EBADF (Bad file descriptor) close(259) = -1 EBADF (Bad file descriptor) close(258) = -1 EBADF (Bad file descriptor) close(257) = -1 EBADF (Bad file descriptor) close(256) = -1 EBADF (Bad file descriptor) close(255) = -1 EBADF (Bad file descriptor) close(254) = -1 EBADF (Bad file descriptor) close(253) = -1 EBADF (Bad file descriptor) close(252) = -1 EBADF (Bad file descriptor) close(251) = -1 EBADF (Bad file descriptor) close(250) = -1 EBADF (Bad file descriptor) close(249) = -1 EBADF (Bad file descriptor) close(248) = -1 EBADF (Bad file descriptor) close(247) = -1 EBADF (Bad file descriptor) close(246) = -1 EBADF (Bad file descriptor) close(245) = -1 EBADF (Bad file descriptor) close(244) = -1 EBADF (Bad file descriptor) close(243) = -1 EBADF (Bad file descriptor) close(242) = -1 EBADF (Bad file descriptor) close(241) = -1 EBADF (Bad file descriptor) close(240) = -1 EBADF (Bad file descriptor) close(239) = -1 EBADF (Bad file descriptor) close(238) = -1 EBADF (Bad file descriptor) close(237) = -1 EBADF (Bad file descriptor) close(236) = -1 EBADF (Bad file descriptor) close(235) = -1 EBADF (Bad file descriptor) close(234) = -1 EBADF (Bad file descriptor) close(233) = -1 EBADF (Bad file descriptor) close(232) = -1 EBADF (Bad file descriptor) close(231) = -1 EBADF (Bad file descriptor) close(230) = -1 EBADF (Bad file descriptor) close(229) = -1 EBADF (Bad file descriptor) close(228) = -1 EBADF (Bad file descriptor) close(227) = -1 EBADF (Bad file descriptor) close(226) = -1 EBADF (Bad file descriptor) close(225) = -1 EBADF (Bad file descriptor) close(224) = -1 EBADF (Bad file descriptor) close(223) = -1 EBADF (Bad file descriptor) close(222) = -1 EBADF (Bad file descriptor) close(221) = -1 EBADF (Bad file descriptor) close(220) = -1 EBADF (Bad file descriptor) close(219) = -1 EBADF (Bad file descriptor) close(218) = -1 EBADF (Bad file descriptor) close(217) = -1 EBADF (Bad file descriptor) close(216) = -1 EBADF (Bad file descriptor) close(215) = -1 EBADF (Bad file descriptor) close(214) = -1 EBADF (Bad file descriptor) close(213) = -1 EBADF (Bad file descriptor) close(212) = -1 EBADF (Bad file descriptor) close(211) = -1 EBADF (Bad file descriptor) close(210) = -1 EBADF (Bad file descriptor) close(209) = -1 EBADF (Bad file descriptor) close(208) = -1 EBADF (Bad file descriptor) close(207) = -1 EBADF (Bad file descriptor) close(206) = -1 EBADF (Bad file descriptor) close(205) = -1 EBADF (Bad file descriptor) close(204) = -1 EBADF (Bad file descriptor) close(203) = -1 EBADF (Bad file descriptor) close(202) = -1 EBADF (Bad file descriptor) close(201) = -1 EBADF (Bad file descriptor) close(200) = -1 EBADF (Bad file descriptor) close(199) = -1 EBADF (Bad file descriptor) close(198) = -1 EBADF (Bad file descriptor) close(197) = -1 EBADF (Bad file descriptor) close(196) = -1 EBADF (Bad file descriptor) close(195) = -1 EBADF (Bad file descriptor) close(194) = -1 EBADF (Bad file descriptor) close(193) = -1 EBADF (Bad file descriptor) close(192) = -1 EBADF (Bad file descriptor) close(191) = -1 EBADF (Bad file descriptor) close(190) = -1 EBADF (Bad file descriptor) close(189) = -1 EBADF (Bad file descriptor) close(188) = -1 EBADF (Bad file descriptor) close(187) = -1 EBADF (Bad file descriptor) close(186) = -1 EBADF (Bad file descriptor) close(185) = -1 EBADF (Bad file descriptor) close(184) = -1 EBADF (Bad file descriptor) close(183) = -1 EBADF (Bad file descriptor) close(182) = -1 EBADF (Bad file descriptor) close(181) = -1 EBADF (Bad file descriptor) close(180) = -1 EBADF (Bad file descriptor) close(179) = -1 EBADF (Bad file descriptor) close(178) = -1 EBADF (Bad file descriptor) close(177) = -1 EBADF (Bad file descriptor) close(176) = -1 EBADF (Bad file descriptor) close(175) = -1 EBADF (Bad file descriptor) close(174) = -1 EBADF (Bad file descriptor) close(173) = -1 EBADF (Bad file descriptor) close(172) = -1 EBADF (Bad file descriptor) close(171) = -1 EBADF (Bad file descriptor) close(170) = -1 EBADF (Bad file descriptor) close(169) = -1 EBADF (Bad file descriptor) close(168) = -1 EBADF (Bad file descriptor) close(167) = -1 EBADF (Bad file descriptor) close(166) = -1 EBADF (Bad file descriptor) close(165) = -1 EBADF (Bad file descriptor) close(164) = -1 EBADF (Bad file descriptor) close(163) = -1 EBADF (Bad file descriptor) close(162) = -1 EBADF (Bad file descriptor) close(161) = -1 EBADF (Bad file descriptor) close(160) = -1 EBADF (Bad file descriptor) close(159) = -1 EBADF (Bad file descriptor) close(158) = -1 EBADF (Bad file descriptor) close(157) = -1 EBADF (Bad file descriptor) close(156) = -1 EBADF (Bad file descriptor) close(155) = -1 EBADF (Bad file descriptor) close(154) = -1 EBADF (Bad file descriptor) close(153) = -1 EBADF (Bad file descriptor) close(152) = -1 EBADF (Bad file descriptor) close(151) = -1 EBADF (Bad file descriptor) close(150) = -1 EBADF (Bad file descriptor) close(149) = -1 EBADF (Bad file descriptor) close(148) = -1 EBADF (Bad file descriptor) close(147) = -1 EBADF (Bad file descriptor) close(146) = -1 EBADF (Bad file descriptor) close(145) = -1 EBADF (Bad file descriptor) close(144) = -1 EBADF (Bad file descriptor) close(143) = -1 EBADF (Bad file descriptor) close(142) = -1 EBADF (Bad file descriptor) close(141) = -1 EBADF (Bad file descriptor) close(140) = -1 EBADF (Bad file descriptor) close(139) = -1 EBADF (Bad file descriptor) close(138) = -1 EBADF (Bad file descriptor) close(137) = -1 EBADF (Bad file descriptor) close(136) = -1 EBADF (Bad file descriptor) close(135) = -1 EBADF (Bad file descriptor) close(134) = -1 EBADF (Bad file descriptor) close(133) = -1 EBADF (Bad file descriptor) close(132) = -1 EBADF (Bad file descriptor) close(131) = -1 EBADF (Bad file descriptor) close(130) = -1 EBADF (Bad file descriptor) close(129) = -1 EBADF (Bad file descriptor) close(128) = -1 EBADF (Bad file descriptor) close(127) = -1 EBADF (Bad file descriptor) close(126) = -1 EBADF (Bad file descriptor) close(125) = -1 EBADF (Bad file descriptor) close(124) = -1 EBADF (Bad file descriptor) close(123) = -1 EBADF (Bad file descriptor) close(122) = -1 EBADF (Bad file descriptor) close(121) = -1 EBADF (Bad file descriptor) close(120) = -1 EBADF (Bad file descriptor) close(119) = -1 EBADF (Bad file descriptor) close(118) = -1 EBADF (Bad file descriptor) close(117) = -1 EBADF (Bad file descriptor) close(116) = -1 EBADF (Bad file descriptor) close(115) = -1 EBADF (Bad file descriptor) close(114) = -1 EBADF (Bad file descriptor) close(113) = -1 EBADF (Bad file descriptor) close(112) = -1 EBADF (Bad file descriptor) close(111) = -1 EBADF (Bad file descriptor) close(110) = -1 EBADF (Bad file descriptor) close(109) = -1 EBADF (Bad file descriptor) close(108) = -1 EBADF (Bad file descriptor) close(107) = -1 EBADF (Bad file descriptor) close(106) = -1 EBADF (Bad file descriptor) close(105) = -1 EBADF (Bad file descriptor) close(104) = -1 EBADF (Bad file descriptor) close(103) = -1 EBADF (Bad file descriptor) close(102) = -1 EBADF (Bad file descriptor) close(101) = -1 EBADF (Bad file descriptor) close(100) = -1 EBADF (Bad file descriptor) close(99) = -1 EBADF (Bad file descriptor) close(98) = -1 EBADF (Bad file descriptor) close(97) = -1 EBADF (Bad file descriptor) close(96) = -1 EBADF (Bad file descriptor) close(95) = -1 EBADF (Bad file descriptor) close(94) = -1 EBADF (Bad file descriptor) close(93) = -1 EBADF (Bad file descriptor) close(92) = -1 EBADF (Bad file descriptor) close(91) = -1 EBADF (Bad file descriptor) close(90) = -1 EBADF (Bad file descriptor) close(89) = -1 EBADF (Bad file descriptor) close(88) = -1 EBADF (Bad file descriptor) close(87) = -1 EBADF (Bad file descriptor) close(86) = -1 EBADF (Bad file descriptor) close(85) = -1 EBADF (Bad file descriptor) close(84) = -1 EBADF (Bad file descriptor) close(83) = -1 EBADF (Bad file descriptor) close(82) = -1 EBADF (Bad file descriptor) close(81) = -1 EBADF (Bad file descriptor) close(80) = -1 EBADF (Bad file descriptor) close(79) = -1 EBADF (Bad file descriptor) close(78) = -1 EBADF (Bad file descriptor) close(77) = -1 EBADF (Bad file descriptor) close(76) = -1 EBADF (Bad file descriptor) close(75) = -1 EBADF (Bad file descriptor) close(74) = -1 EBADF (Bad file descriptor) close(73) = -1 EBADF (Bad file descriptor) close(72) = -1 EBADF (Bad file descriptor) close(71) = -1 EBADF (Bad file descriptor) close(70) = -1 EBADF (Bad file descriptor) close(69) = -1 EBADF (Bad file descriptor) close(68) = -1 EBADF (Bad file descriptor) close(67) = -1 EBADF (Bad file descriptor) close(66) = -1 EBADF (Bad file descriptor) close(65) = -1 EBADF (Bad file descriptor) close(64) = -1 EBADF (Bad file descriptor) close(63) = -1 EBADF (Bad file descriptor) close(62) = -1 EBADF (Bad file descriptor) close(61) = -1 EBADF (Bad file descriptor) close(60) = -1 EBADF (Bad file descriptor) close(59) = -1 EBADF (Bad file descriptor) close(58) = -1 EBADF (Bad file descriptor) close(57) = -1 EBADF (Bad file descriptor) close(56) = -1 EBADF (Bad file descriptor) close(55) = -1 EBADF (Bad file descriptor) close(54) = -1 EBADF (Bad file descriptor) close(53) = -1 EBADF (Bad file descriptor) close(52) = -1 EBADF (Bad file descriptor) close(51) = -1 EBADF (Bad file descriptor) close(50) = -1 EBADF (Bad file descriptor) close(49) = -1 EBADF (Bad file descriptor) close(48) = -1 EBADF (Bad file descriptor) close(47) = -1 EBADF (Bad file descriptor) close(46) = -1 EBADF (Bad file descriptor) close(45) = -1 EBADF (Bad file descriptor) close(44) = -1 EBADF (Bad file descriptor) close(43) = -1 EBADF (Bad file descriptor) close(42) = -1 EBADF (Bad file descriptor) close(41) = -1 EBADF (Bad file descriptor) close(40) = -1 EBADF (Bad file descriptor) close(39) = -1 EBADF (Bad file descriptor) close(38) = -1 EBADF (Bad file descriptor) close(37) = -1 EBADF (Bad file descriptor) close(36) = -1 EBADF (Bad file descriptor) close(35) = -1 EBADF (Bad file descriptor) close(34) = -1 EBADF (Bad file descriptor) close(33) = -1 EBADF (Bad file descriptor) close(32) = -1 EBADF (Bad file descriptor) close(31) = -1 EBADF (Bad file descriptor) close(30) = -1 EBADF (Bad file descriptor) close(29) = -1 EBADF (Bad file descriptor) close(28) = -1 EBADF (Bad file descriptor) close(27) = -1 EBADF (Bad file descriptor) close(26) = -1 EBADF (Bad file descriptor) close(25) = -1 EBADF (Bad file descriptor) close(24) = -1 EBADF (Bad file descriptor) close(23) = -1 EBADF (Bad file descriptor) close(22) = -1 EBADF (Bad file descriptor) close(21) = -1 EBADF (Bad file descriptor) close(20) = -1 EBADF (Bad file descriptor) close(19) = -1 EBADF (Bad file descriptor) close(18) = -1 EBADF (Bad file descriptor) close(17) = -1 EBADF (Bad file descriptor) close(16) = -1 EBADF (Bad file descriptor) close(15) = -1 EBADF (Bad file descriptor) close(14) = -1 EBADF (Bad file descriptor) close(13) = -1 EBADF (Bad file descriptor) close(12) = -1 EBADF (Bad file descriptor) close(11) = -1 EBADF (Bad file descriptor) close(10) = -1 EBADF (Bad file descriptor) close(9) = -1 EBADF (Bad file descriptor) close(8) = -1 EBADF (Bad file descriptor) close(7) = -1 EBADF (Bad file descriptor) close(6) = -1 EBADF (Bad file descriptor) close(5) = -1 EBADF (Bad file descriptor) close(4) = -1 EBADF (Bad file descriptor) close(3) = -1 EBADF (Bad file descriptor) open("/proc/cpuinfo", O_RDONLY) = 3 read(3, "p", 1) = 1 read(3, "r", 1) = 1 read(3, "o", 1) = 1 read(3, "c", 1) = 1 read(3, "e", 1) = 1 read(3, "s", 1) = 1 read(3, "s", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "v", 1) = 1 read(3, "e", 1) = 1 read(3, "n", 1) = 1 read(3, "d", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "G", 1) = 1 read(3, "e", 1) = 1 read(3, "n", 1) = 1 read(3, "u", 1) = 1 read(3, "i", 1) = 1 read(3, "n", 1) = 1 read(3, "e", 1) = 1 read(3, "I", 1) = 1 read(3, "n", 1) = 1 read(3, "t", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, "\n", 1) = 1 read(3, "a", 1) = 1 read(3, "r", 1) = 1 read(3, "c", 1) = 1 read(3, "h", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "I", 1) = 1 read(3, "A", 1) = 1 read(3, "-", 1) = 1 read(3, "6", 1) = 1 read(3, "4", 1) = 1 read(3, "\n", 1) = 1 read(3, "f", 1) = 1 read(3, "a", 1) = 1 read(3, "m", 1) = 1 read(3, "i", 1) = 1 read(3, "l", 1) = 1 read(3, "y", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "3", 1) = 1 read(3, "2", 1) = 1 read(3, "\n", 1) = 1 read(3, "m", 1) = 1 read(3, "o", 1) = 1 read(3, "d", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "\n", 1) = 1 read(3, "m", 1) = 1 read(3, "o", 1) = 1 read(3, "d", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, " ", 1) = 1 read(3, "n", 1) = 1 read(3, "a", 1) = 1 read(3, "m", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "D", 1) = 1 read(3, "u", 1) = 1 read(3, "a", 1) = 1 read(3, "l", 1) = 1 read(3, "-", 1) = 1 read(3, "C", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, "I", 1) = 1 read(3, "n", 1) = 1 read(3, "t", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, "(", 1) = 1 read(3, "R", 1) = 1 read(3, ")", 1) = 1 read(3, " ", 1) = 1 read(3, "I", 1) = 1 read(3, "t", 1) = 1 read(3, "a", 1) = 1 read(3, "n", 1) = 1 read(3, "i", 1) = 1 read(3, "u", 1) = 1 read(3, "m", 1) = 1 read(3, "(", 1) = 1 read(3, "R", 1) = 1 read(3, ")", 1) = 1 read(3, " ", 1) = 1 read(3, "2", 1) = 1 read(3, " ", 1) = 1 read(3, "P", 1) = 1 read(3, "r", 1) = 1 read(3, "o", 1) = 1 read(3, "c", 1) = 1 read(3, "e", 1) = 1 read(3, "s", 1) = 1 read(3, "s", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, "9", 1) = 1 read(3, "1", 1) = 1 read(3, "4", 1) = 1 read(3, "0", 1) = 1 read(3, "M", 1) = 1 read(3, "\n", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "v", 1) = 1 read(3, "i", 1) = 1 read(3, "s", 1) = 1 read(3, "i", 1) = 1 read(3, "o", 1) = 1 read(3, "n", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "\n", 1) = 1 read(3, "a", 1) = 1 read(3, "r", 1) = 1 read(3, "c", 1) = 1 read(3, "h", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "v", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "f", 1) = 1 read(3, "e", 1) = 1 read(3, "a", 1) = 1 read(3, "t", 1) = 1 read(3, "u", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "s", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "b", 1) = 1 read(3, "r", 1) = 1 read(3, "a", 1) = 1 read(3, "n", 1) = 1 read(3, "c", 1) = 1 read(3, "h", 1) = 1 read(3, "l", 1) = 1 read(3, "o", 1) = 1 read(3, "n", 1) = 1 read(3, "g", 1) = 1 read(3, ",", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "6", 1) = 1 read(3, "-", 1) = 1 read(3, "b", 1) = 1 read(3, "y", 1) = 1 read(3, "t", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, "a", 1) = 1 read(3, "t", 1) = 1 read(3, "o", 1) = 1 read(3, "m", 1) = 1 read(3, "i", 1) = 1 read(3, "c", 1) = 1 read(3, " ", 1) = 1 read(3, "o", 1) = 1 read(3, "p", 1) = 1 read(3, "s", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "p", 1) = 1 read(3, "u", 1) = 1 read(3, " ", 1) = 1 read(3, "n", 1) = 1 read(3, "u", 1) = 1 read(3, "m", 1) = 1 read(3, "b", 1) = 1 read(3, "e", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "p", 1) = 1 read(3, "u", 1) = 1 read(3, " ", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "g", 1) = 1 read(3, "s", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "4", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "p", 1) = 1 read(3, "u", 1) = 1 read(3, " ", 1) = 1 read(3, "M", 1) = 1 read(3, "H", 1) = 1 read(3, "z", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "6", 1) = 1 read(3, "6", 1) = 1 read(3, "9", 1) = 1 read(3, ".", 1) = 1 read(3, "5", 1) = 1 read(3, "0", 1) = 1 read(3, "3", 1) = 1 read(3, "\n", 1) = 1 read(3, "i", 1) = 1 read(3, "t", 1) = 1 read(3, "c", 1) = 1 read(3, " ", 1) = 1 read(3, "M", 1) = 1 read(3, "H", 1) = 1 read(3, "z", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "4", 1) = 1 read(3, "1", 1) = 1 read(3, "6", 1) = 1 read(3, ".", 1) = 1 read(3, "8", 1) = 1 read(3, "7", 1) = 1 read(3, "5", 1) = 1 read(3, "0", 1) = 1 read(3, "0", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "B", 1) = 1 read(3, "o", 1) = 1 read(3, "g", 1) = 1 read(3, "o", 1) = 1 read(3, "M", 1) = 1 read(3, "I", 1) = 1 read(3, "P", 1) = 1 read(3, "S", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "3", 1) = 1 read(3, "3", 1) = 1 read(3, "2", 1) = 1 read(3, "5", 1) = 1 read(3, ".", 1) = 1 read(3, "9", 1) = 1 read(3, "5", 1) = 1 read(3, "\n", 1) = 1 read(3, "s", 1) = 1 read(3, "i", 1) = 1 read(3, "b", 1) = 1 read(3, "l", 1) = 1 read(3, "i", 1) = 1 read(3, "n", 1) = 1 read(3, "g", 1) = 1 read(3, "s", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "2", 1) = 1 read(3, "\n", 1) = 1 read(3, "p", 1) = 1 read(3, "h", 1) = 1 read(3, "y", 1) = 1 read(3, "s", 1) = 1 read(3, "i", 1) = 1 read(3, "c", 1) = 1 read(3, "a", 1) = 1 read(3, "l", 1) = 1 read(3, " ", 1) = 1 read(3, "i", 1) = 1 read(3, "d", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, "i", 1) = 1 read(3, "d", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "t", 1) = 1 read(3, "h", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "a", 1) = 1 read(3, "d", 1) = 1 read(3, " ", 1) = 1 read(3, "i", 1) = 1 read(3, "d", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "\n", 1) = 1 read(3, "p", 1) = 1 read(3, "r", 1) = 1 read(3, "o", 1) = 1 read(3, "c", 1) = 1 read(3, "e", 1) = 1 read(3, "s", 1) = 1 read(3, "s", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "\n", 1) = 1 read(3, "v", 1) = 1 read(3, "e", 1) = 1 read(3, "n", 1) = 1 read(3, "d", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "G", 1) = 1 read(3, "e", 1) = 1 read(3, "n", 1) = 1 read(3, "u", 1) = 1 read(3, "i", 1) = 1 read(3, "n", 1) = 1 read(3, "e", 1) = 1 read(3, "I", 1) = 1 read(3, "n", 1) = 1 read(3, "t", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, "\n", 1) = 1 read(3, "a", 1) = 1 read(3, "r", 1) = 1 read(3, "c", 1) = 1 read(3, "h", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "I", 1) = 1 read(3, "A", 1) = 1 read(3, "-", 1) = 1 read(3, "6", 1) = 1 read(3, "4", 1) = 1 read(3, "\n", 1) = 1 read(3, "f", 1) = 1 read(3, "a", 1) = 1 read(3, "m", 1) = 1 read(3, "i", 1) = 1 read(3, "l", 1) = 1 read(3, "y", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "3", 1) = 1 read(3, "2", 1) = 1 read(3, "\n", 1) = 1 read(3, "m", 1) = 1 read(3, "o", 1) = 1 read(3, "d", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "\n", 1) = 1 read(3, "m", 1) = 1 read(3, "o", 1) = 1 read(3, "d", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, " ", 1) = 1 read(3, "n", 1) = 1 read(3, "a", 1) = 1 read(3, "m", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "D", 1) = 1 read(3, "u", 1) = 1 read(3, "a", 1) = 1 read(3, "l", 1) = 1 read(3, "-", 1) = 1 read(3, "C", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, "I", 1) = 1 read(3, "n", 1) = 1 read(3, "t", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, "(", 1) = 1 read(3, "R", 1) = 1 read(3, ")", 1) = 1 read(3, " ", 1) = 1 read(3, "I", 1) = 1 read(3, "t", 1) = 1 read(3, "a", 1) = 1 read(3, "n", 1) = 1 read(3, "i", 1) = 1 read(3, "u", 1) = 1 read(3, "m", 1) = 1 read(3, "(", 1) = 1 read(3, "R", 1) = 1 read(3, ")", 1) = 1 read(3, " ", 1) = 1 read(3, "2", 1) = 1 read(3, " ", 1) = 1 read(3, "P", 1) = 1 read(3, "r", 1) = 1 read(3, "o", 1) = 1 read(3, "c", 1) = 1 read(3, "e", 1) = 1 read(3, "s", 1) = 1 read(3, "s", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, "9", 1) = 1 read(3, "1", 1) = 1 read(3, "4", 1) = 1 read(3, "0", 1) = 1 read(3, "M", 1) = 1 read(3, "\n", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "v", 1) = 1 read(3, "i", 1) = 1 read(3, "s", 1) = 1 read(3, "i", 1) = 1 read(3, "o", 1) = 1 read(3, "n", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "\n", 1) = 1 read(3, "a", 1) = 1 read(3, "r", 1) = 1 read(3, "c", 1) = 1 read(3, "h", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "v", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "f", 1) = 1 read(3, "e", 1) = 1 read(3, "a", 1) = 1 read(3, "t", 1) = 1 read(3, "u", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "s", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "b", 1) = 1 read(3, "r", 1) = 1 read(3, "a", 1) = 1 read(3, "n", 1) = 1 read(3, "c", 1) = 1 read(3, "h", 1) = 1 read(3, "l", 1) = 1 read(3, "o", 1) = 1 read(3, "n", 1) = 1 read(3, "g", 1) = 1 read(3, ",", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "6", 1) = 1 read(3, "-", 1) = 1 read(3, "b", 1) = 1 read(3, "y", 1) = 1 read(3, "t", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, "a", 1) = 1 read(3, "t", 1) = 1 read(3, "o", 1) = 1 read(3, "m", 1) = 1 read(3, "i", 1) = 1 read(3, "c", 1) = 1 read(3, " ", 1) = 1 read(3, "o", 1) = 1 read(3, "p", 1) = 1 read(3, "s", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "p", 1) = 1 read(3, "u", 1) = 1 read(3, " ", 1) = 1 read(3, "n", 1) = 1 read(3, "u", 1) = 1 read(3, "m", 1) = 1 read(3, "b", 1) = 1 read(3, "e", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "p", 1) = 1 read(3, "u", 1) = 1 read(3, " ", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "g", 1) = 1 read(3, "s", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "4", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "p", 1) = 1 read(3, "u", 1) = 1 read(3, " ", 1) = 1 read(3, "M", 1) = 1 read(3, "H", 1) = 1 read(3, "z", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "6", 1) = 1 read(3, "6", 1) = 1 read(3, "9", 1) = 1 read(3, ".", 1) = 1 read(3, "5", 1) = 1 read(3, "0", 1) = 1 read(3, "3", 1) = 1 read(3, "\n", 1) = 1 read(3, "i", 1) = 1 read(3, "t", 1) = 1 read(3, "c", 1) = 1 read(3, " ", 1) = 1 read(3, "M", 1) = 1 read(3, "H", 1) = 1 read(3, "z", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "4", 1) = 1 read(3, "1", 1) = 1 read(3, "6", 1) = 1 read(3, ".", 1) = 1 read(3, "8", 1) = 1 read(3, "7", 1) = 1 read(3, "5", 1) = 1 read(3, "0", 1) = 1 read(3, "0", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "B", 1) = 1 read(3, "o", 1) = 1 read(3, "g", 1) = 1 read(3, "o", 1) = 1 read(3, "M", 1) = 1 read(3, "I", 1) = 1 read(3, "P", 1) = 1 read(3, "S", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "3", 1) = 1 read(3, "3", 1) = 1 read(3, "2", 1) = 1 read(3, "5", 1) = 1 read(3, ".", 1) = 1 read(3, "9", 1) = 1 read(3, "5", 1) = 1 read(3, "\n", 1) = 1 read(3, "s", 1) = 1 read(3, "i", 1) = 1 read(3, "b", 1) = 1 read(3, "l", 1) = 1 read(3, "i", 1) = 1 read(3, "n", 1) = 1 read(3, "g", 1) = 1 read(3, "s", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "2", 1) = 1 read(3, "\n", 1) = 1 read(3, "p", 1) = 1 read(3, "h", 1) = 1 read(3, "y", 1) = 1 read(3, "s", 1) = 1 read(3, "i", 1) = 1 read(3, "c", 1) = 1 read(3, "a", 1) = 1 read(3, "l", 1) = 1 read(3, " ", 1) = 1 read(3, "i", 1) = 1 read(3, "d", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, "i", 1) = 1 read(3, "d", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "\n", 1) = 1 read(3, "t", 1) = 1 read(3, "h", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "a", 1) = 1 read(3, "d", 1) = 1 read(3, " ", 1) = 1 read(3, "i", 1) = 1 read(3, "d", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "\n", 1) = 1 read(3, "p", 1) = 1 read(3, "r", 1) = 1 read(3, "o", 1) = 1 read(3, "c", 1) = 1 read(3, "e", 1) = 1 read(3, "s", 1) = 1 read(3, "s", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "2", 1) = 1 read(3, "\n", 1) = 1 read(3, "v", 1) = 1 read(3, "e", 1) = 1 read(3, "n", 1) = 1 read(3, "d", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "G", 1) = 1 read(3, "e", 1) = 1 read(3, "n", 1) = 1 read(3, "u", 1) = 1 read(3, "i", 1) = 1 read(3, "n", 1) = 1 read(3, "e", 1) = 1 read(3, "I", 1) = 1 read(3, "n", 1) = 1 read(3, "t", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, "\n", 1) = 1 read(3, "a", 1) = 1 read(3, "r", 1) = 1 read(3, "c", 1) = 1 read(3, "h", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "I", 1) = 1 read(3, "A", 1) = 1 read(3, "-", 1) = 1 read(3, "6", 1) = 1 read(3, "4", 1) = 1 read(3, "\n", 1) = 1 read(3, "f", 1) = 1 read(3, "a", 1) = 1 read(3, "m", 1) = 1 read(3, "i", 1) = 1 read(3, "l", 1) = 1 read(3, "y", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "3", 1) = 1 read(3, "2", 1) = 1 read(3, "\n", 1) = 1 read(3, "m", 1) = 1 read(3, "o", 1) = 1 read(3, "d", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "\n", 1) = 1 read(3, "m", 1) = 1 read(3, "o", 1) = 1 read(3, "d", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, " ", 1) = 1 read(3, "n", 1) = 1 read(3, "a", 1) = 1 read(3, "m", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "D", 1) = 1 read(3, "u", 1) = 1 read(3, "a", 1) = 1 read(3, "l", 1) = 1 read(3, "-", 1) = 1 read(3, "C", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, "I", 1) = 1 read(3, "n", 1) = 1 read(3, "t", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, "(", 1) = 1 read(3, "R", 1) = 1 read(3, ")", 1) = 1 read(3, " ", 1) = 1 read(3, "I", 1) = 1 read(3, "t", 1) = 1 read(3, "a", 1) = 1 read(3, "n", 1) = 1 read(3, "i", 1) = 1 read(3, "u", 1) = 1 read(3, "m", 1) = 1 read(3, "(", 1) = 1 read(3, "R", 1) = 1 read(3, ")", 1) = 1 read(3, " ", 1) = 1 read(3, "2", 1) = 1 read(3, " ", 1) = 1 read(3, "P", 1) = 1 read(3, "r", 1) = 1 read(3, "o", 1) = 1 read(3, "c", 1) = 1 read(3, "e", 1) = 1 read(3, "s", 1) = 1 read(3, "s", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, "9", 1) = 1 read(3, "1", 1) = 1 read(3, "4", 1) = 1 read(3, "0", 1) = 1 read(3, "M", 1) = 1 read(3, "\n", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "v", 1) = 1 read(3, "i", 1) = 1 read(3, "s", 1) = 1 read(3, "i", 1) = 1 read(3, "o", 1) = 1 read(3, "n", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "\n", 1) = 1 read(3, "a", 1) = 1 read(3, "r", 1) = 1 read(3, "c", 1) = 1 read(3, "h", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "v", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "f", 1) = 1 read(3, "e", 1) = 1 read(3, "a", 1) = 1 read(3, "t", 1) = 1 read(3, "u", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "s", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "b", 1) = 1 read(3, "r", 1) = 1 read(3, "a", 1) = 1 read(3, "n", 1) = 1 read(3, "c", 1) = 1 read(3, "h", 1) = 1 read(3, "l", 1) = 1 read(3, "o", 1) = 1 read(3, "n", 1) = 1 read(3, "g", 1) = 1 read(3, ",", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "6", 1) = 1 read(3, "-", 1) = 1 read(3, "b", 1) = 1 read(3, "y", 1) = 1 read(3, "t", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, "a", 1) = 1 read(3, "t", 1) = 1 read(3, "o", 1) = 1 read(3, "m", 1) = 1 read(3, "i", 1) = 1 read(3, "c", 1) = 1 read(3, " ", 1) = 1 read(3, "o", 1) = 1 read(3, "p", 1) = 1 read(3, "s", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "p", 1) = 1 read(3, "u", 1) = 1 read(3, " ", 1) = 1 read(3, "n", 1) = 1 read(3, "u", 1) = 1 read(3, "m", 1) = 1 read(3, "b", 1) = 1 read(3, "e", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "p", 1) = 1 read(3, "u", 1) = 1 read(3, " ", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "g", 1) = 1 read(3, "s", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "4", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "p", 1) = 1 read(3, "u", 1) = 1 read(3, " ", 1) = 1 read(3, "M", 1) = 1 read(3, "H", 1) = 1 read(3, "z", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "6", 1) = 1 read(3, "6", 1) = 1 read(3, "9", 1) = 1 read(3, ".", 1) = 1 read(3, "5", 1) = 1 read(3, "0", 1) = 1 read(3, "3", 1) = 1 read(3, "\n", 1) = 1 read(3, "i", 1) = 1 read(3, "t", 1) = 1 read(3, "c", 1) = 1 read(3, " ", 1) = 1 read(3, "M", 1) = 1 read(3, "H", 1) = 1 read(3, "z", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "4", 1) = 1 read(3, "1", 1) = 1 read(3, "6", 1) = 1 read(3, ".", 1) = 1 read(3, "8", 1) = 1 read(3, "7", 1) = 1 read(3, "5", 1) = 1 read(3, "0", 1) = 1 read(3, "0", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "B", 1) = 1 read(3, "o", 1) = 1 read(3, "g", 1) = 1 read(3, "o", 1) = 1 read(3, "M", 1) = 1 read(3, "I", 1) = 1 read(3, "P", 1) = 1 read(3, "S", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "3", 1) = 1 read(3, "3", 1) = 1 read(3, "2", 1) = 1 read(3, "5", 1) = 1 read(3, ".", 1) = 1 read(3, "9", 1) = 1 read(3, "5", 1) = 1 read(3, "\n", 1) = 1 read(3, "s", 1) = 1 read(3, "i", 1) = 1 read(3, "b", 1) = 1 read(3, "l", 1) = 1 read(3, "i", 1) = 1 read(3, "n", 1) = 1 read(3, "g", 1) = 1 read(3, "s", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "2", 1) = 1 read(3, "\n", 1) = 1 read(3, "p", 1) = 1 read(3, "h", 1) = 1 read(3, "y", 1) = 1 read(3, "s", 1) = 1 read(3, "i", 1) = 1 read(3, "c", 1) = 1 read(3, "a", 1) = 1 read(3, "l", 1) = 1 read(3, " ", 1) = 1 read(3, "i", 1) = 1 read(3, "d", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "3", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, "i", 1) = 1 read(3, "d", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "t", 1) = 1 read(3, "h", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "a", 1) = 1 read(3, "d", 1) = 1 read(3, " ", 1) = 1 read(3, "i", 1) = 1 read(3, "d", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "\n", 1) = 1 read(3, "p", 1) = 1 read(3, "r", 1) = 1 read(3, "o", 1) = 1 read(3, "c", 1) = 1 read(3, "e", 1) = 1 read(3, "s", 1) = 1 read(3, "s", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "3", 1) = 1 read(3, "\n", 1) = 1 read(3, "v", 1) = 1 read(3, "e", 1) = 1 read(3, "n", 1) = 1 read(3, "d", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "G", 1) = 1 read(3, "e", 1) = 1 read(3, "n", 1) = 1 read(3, "u", 1) = 1 read(3, "i", 1) = 1 read(3, "n", 1) = 1 read(3, "e", 1) = 1 read(3, "I", 1) = 1 read(3, "n", 1) = 1 read(3, "t", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, "\n", 1) = 1 read(3, "a", 1) = 1 read(3, "r", 1) = 1 read(3, "c", 1) = 1 read(3, "h", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "I", 1) = 1 read(3, "A", 1) = 1 read(3, "-", 1) = 1 read(3, "6", 1) = 1 read(3, "4", 1) = 1 read(3, "\n", 1) = 1 read(3, "f", 1) = 1 read(3, "a", 1) = 1 read(3, "m", 1) = 1 read(3, "i", 1) = 1 read(3, "l", 1) = 1 read(3, "y", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "3", 1) = 1 read(3, "2", 1) = 1 read(3, "\n", 1) = 1 read(3, "m", 1) = 1 read(3, "o", 1) = 1 read(3, "d", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "\n", 1) = 1 read(3, "m", 1) = 1 read(3, "o", 1) = 1 read(3, "d", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, " ", 1) = 1 read(3, "n", 1) = 1 read(3, "a", 1) = 1 read(3, "m", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "D", 1) = 1 read(3, "u", 1) = 1 read(3, "a", 1) = 1 read(3, "l", 1) = 1 read(3, "-", 1) = 1 read(3, "C", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, "I", 1) = 1 read(3, "n", 1) = 1 read(3, "t", 1) = 1 read(3, "e", 1) = 1 read(3, "l", 1) = 1 read(3, "(", 1) = 1 read(3, "R", 1) = 1 read(3, ")", 1) = 1 read(3, " ", 1) = 1 read(3, "I", 1) = 1 read(3, "t", 1) = 1 read(3, "a", 1) = 1 read(3, "n", 1) = 1 read(3, "i", 1) = 1 read(3, "u", 1) = 1 read(3, "m", 1) = 1 read(3, "(", 1) = 1 read(3, "R", 1) = 1 read(3, ")", 1) = 1 read(3, " ", 1) = 1 read(3, "2", 1) = 1 read(3, " ", 1) = 1 read(3, "P", 1) = 1 read(3, "r", 1) = 1 read(3, "o", 1) = 1 read(3, "c", 1) = 1 read(3, "e", 1) = 1 read(3, "s", 1) = 1 read(3, "s", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, "9", 1) = 1 read(3, "1", 1) = 1 read(3, "4", 1) = 1 read(3, "0", 1) = 1 read(3, "M", 1) = 1 read(3, "\n", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "v", 1) = 1 read(3, "i", 1) = 1 read(3, "s", 1) = 1 read(3, "i", 1) = 1 read(3, "o", 1) = 1 read(3, "n", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "\n", 1) = 1 read(3, "a", 1) = 1 read(3, "r", 1) = 1 read(3, "c", 1) = 1 read(3, "h", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "v", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "f", 1) = 1 read(3, "e", 1) = 1 read(3, "a", 1) = 1 read(3, "t", 1) = 1 read(3, "u", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "s", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "b", 1) = 1 read(3, "r", 1) = 1 read(3, "a", 1) = 1 read(3, "n", 1) = 1 read(3, "c", 1) = 1 read(3, "h", 1) = 1 read(3, "l", 1) = 1 read(3, "o", 1) = 1 read(3, "n", 1) = 1 read(3, "g", 1) = 1 read(3, ",", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "6", 1) = 1 read(3, "-", 1) = 1 read(3, "b", 1) = 1 read(3, "y", 1) = 1 read(3, "t", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, "a", 1) = 1 read(3, "t", 1) = 1 read(3, "o", 1) = 1 read(3, "m", 1) = 1 read(3, "i", 1) = 1 read(3, "c", 1) = 1 read(3, " ", 1) = 1 read(3, "o", 1) = 1 read(3, "p", 1) = 1 read(3, "s", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "p", 1) = 1 read(3, "u", 1) = 1 read(3, " ", 1) = 1 read(3, "n", 1) = 1 read(3, "u", 1) = 1 read(3, "m", 1) = 1 read(3, "b", 1) = 1 read(3, "e", 1) = 1 read(3, "r", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "p", 1) = 1 read(3, "u", 1) = 1 read(3, " ", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "g", 1) = 1 read(3, "s", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "4", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "p", 1) = 1 read(3, "u", 1) = 1 read(3, " ", 1) = 1 read(3, "M", 1) = 1 read(3, "H", 1) = 1 read(3, "z", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "6", 1) = 1 read(3, "6", 1) = 1 read(3, "9", 1) = 1 read(3, ".", 1) = 1 read(3, "5", 1) = 1 read(3, "0", 1) = 1 read(3, "3", 1) = 1 read(3, "\n", 1) = 1 read(3, "i", 1) = 1 read(3, "t", 1) = 1 read(3, "c", 1) = 1 read(3, " ", 1) = 1 read(3, "M", 1) = 1 read(3, "H", 1) = 1 read(3, "z", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "4", 1) = 1 read(3, "1", 1) = 1 read(3, "6", 1) = 1 read(3, ".", 1) = 1 read(3, "8", 1) = 1 read(3, "7", 1) = 1 read(3, "5", 1) = 1 read(3, "0", 1) = 1 read(3, "0", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "B", 1) = 1 read(3, "o", 1) = 1 read(3, "g", 1) = 1 read(3, "o", 1) = 1 read(3, "M", 1) = 1 read(3, "I", 1) = 1 read(3, "P", 1) = 1 read(3, "S", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "3", 1) = 1 read(3, "3", 1) = 1 read(3, "2", 1) = 1 read(3, "5", 1) = 1 read(3, ".", 1) = 1 read(3, "9", 1) = 1 read(3, "5", 1) = 1 read(3, "\n", 1) = 1 read(3, "s", 1) = 1 read(3, "i", 1) = 1 read(3, "b", 1) = 1 read(3, "l", 1) = 1 read(3, "i", 1) = 1 read(3, "n", 1) = 1 read(3, "g", 1) = 1 read(3, "s", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "2", 1) = 1 read(3, "\n", 1) = 1 read(3, "p", 1) = 1 read(3, "h", 1) = 1 read(3, "y", 1) = 1 read(3, "s", 1) = 1 read(3, "i", 1) = 1 read(3, "c", 1) = 1 read(3, "a", 1) = 1 read(3, "l", 1) = 1 read(3, " ", 1) = 1 read(3, "i", 1) = 1 read(3, "d", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "3", 1) = 1 read(3, "\n", 1) = 1 read(3, "c", 1) = 1 read(3, "o", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, " ", 1) = 1 read(3, "i", 1) = 1 read(3, "d", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "1", 1) = 1 read(3, "\n", 1) = 1 read(3, "t", 1) = 1 read(3, "h", 1) = 1 read(3, "r", 1) = 1 read(3, "e", 1) = 1 read(3, "a", 1) = 1 read(3, "d", 1) = 1 read(3, " ", 1) = 1 read(3, "i", 1) = 1 read(3, "d", 1) = 1 read(3, " ", 1) = 1 read(3, " ", 1) = 1 read(3, ":", 1) = 1 read(3, " ", 1) = 1 read(3, "0", 1) = 1 read(3, "\n", 1) = 1 read(3, "\n", 1) = 1 read(3, "", 1) = 0 close(3) = 0 readlink("/etc/malloc.conf", 0x60000fffffc9c532, 4096) = -1 ENOENT (No such file or directory) mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x200000000003c000 mmap(NULL, 1048576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2000000000608000 mmap(0x2000000000708000, 1015808, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2000000000708000 munmap(0x2000000000608000, 1015808) = 0 uname({sys="Linux", node="mansotarro1", ...}) = 0 syscall_1317(0x60000fffffc9d520, 0x80000, 0xc000000000000491, 0x200000000012af20, 0, 0, 0xc000000000000710, 0x2000000000028bd4, 0x10, 0x200000000006d510, 0x200000000041cd5a, 0x60000fffffc9d3f0, 0x40000000000db110, 0x60000fffffc9d520, 0x20, 0x2000000000354900, 0x288, 0x40000000000db113, 0, 0xfffffffffffffffb, 0, 0, 0, 0, 0x60000fffffc9d9c0, 0, 0, 0, 0, 0, 0x218, 0x60000fffffc9d528) = 0 clone2(child_stack=0, stack_size=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x200000000013b0a0) = 5980 close(4) = 0 fcntl(3, F_SETFD, 0) = 0 fstat(3, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0 mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2000000000608000 read(3, "", 16384) = 0 --- SIGCHLD (Child exited) @ a000000000010721 (175c) --- close(3) = 0 wait4(5980, [{WIFEXITED(s) && WEXITSTATUS(s) == 1}], 0, NULL) = 5980 munmap(0x2000000000608000, 65536) = 0 open("/usr/share/zoneinfo/UTC", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 fstat(3, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2000000000608000 read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\0"..., 4096) = 118 lseek(3, -62, SEEK_CUR) = 56 read(3, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\0"..., 4096) = 62 close(3) = 0 munmap(0x2000000000608000, 65536) = 0 socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3 connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) close(3) = 0 socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3 connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) close(3) = 0 open("/etc/nsswitch.conf", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=475, ...}) = 0 mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2000000000608000 read(3, "# /etc/nsswitch.conf\n#\n# Example"..., 4096) = 475 read(3, "", 4096) = 0 close(3) = 0 munmap(0x2000000000608000, 65536) = 0 open("/etc/ld.so.cache", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=15068, ...}) = 0 mmap(NULL, 15068, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2000000000608000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/ia64-linux-gnu/libnss_compat.so.2", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0\300\30\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0644, st_size=58608, ...}) = 0 mmap(NULL, 121976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x200000000060c000 mprotect(0x200000000061c000, 49152, PROT_NONE) = 0 mmap(0x2000000000628000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xc000) = 0x2000000000628000 close(3) = 0 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x200000000062c000 munmap(0x2000000000608000, 15068) = 0 open("/etc/ld.so.cache", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=15068, ...}) = 0 mmap(NULL, 15068, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2000000000608000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/ia64-linux-gnu/libnss_nis.so.2", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0@(\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0644, st_size=81904, ...}) = 0 mmap(NULL, 145560, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2000000000630000 mprotect(0x2000000000644000, 49152, PROT_NONE) = 0 mmap(0x2000000000650000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x10000) = 0x2000000000650000 close(3) = 0 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) open("/lib/ia64-linux-gnu/libnss_files.so.2", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0002\0\1\0\0\0\200(\0\0\0\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0644, st_size=86896, ...}) = 0 mmap(NULL, 150704, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x2000000000654000 mprotect(0x200000000066c000, 49152, PROT_NONE) = 0 mmap(0x2000000000678000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x14000) = 0x2000000000678000 close(3) = 0 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x200000000067c000 mmap(NULL, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2000000000680000 munmap(0x2000000000608000, 15068) = 0 open("/etc/group", O_RDONLY|O_CLOEXEC) = 3 lseek(3, 0, SEEK_CUR) = 0 fstat(3, {st_mode=S_IFREG|0644, st_size=861, ...}) = 0 mmap(NULL, 861, PROT_READ, MAP_SHARED, 3, 0) = 0x2000000000800000 lseek(3, 861, SEEK_SET) = 861 munmap(0x2000000000800000, 861) = 0 close(3) = 0 socket(PF_NETLINK, SOCK_RAW, 0) = 3 bind(3, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0 getsockname(3, {sa_family=AF_NETLINK, pid=5979, groups=00000000}, [12]) = 0 gettimeofday({1352116726, 893482}, NULL) = 0 sendto(3, "\24\0\0\0\26\0\1\3\366\251\227P\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20 recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0\0\0\0\24\0\2\0\366\251\227P[\27\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 108 recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"@\0\0\0\24\0\2\0\366\251\227P[\27\0\0\n\200\200\376\1\0\0\0\24\0\1\0\0\0\0\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 128 recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0\366\251\227P[\27\0\0\0\0\0\0\1\0\0\0\24\0\1\0\0\0\0\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 20 close(3) = 0 open("/etc/gai.conf", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=2940, ...}) = 0 fstat(3, {st_mode=S_IFREG|0644, st_size=2940, ...}) = 0 mmap(NULL, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2000000000800000 read(3, "# Configuration for getaddrinfo("..., 4096) = 2940 read(3, "", 4096) = 0 close(3) = 0 munmap(0x2000000000800000, 65536) = 0 futex(0x200000000051f77c, FUTEX_WAKE_PRIVATE, 2147483647) = 0 socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3 connect(3, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::b85a:500:0:20", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=337680}, 28) = -1 ENETUNREACH (Network is unreachable) connect(3, {sa_family=AF_UNSPEC, sa_data="\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}, 16) = 0 connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("0.0.0.0")}, 16) = 0 getsockname(3, {sa_family=AF_INET6, sin6_port=htons(53974), inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0 close(3) = 0 socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3 connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) close(3) = 0 socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, 0) = 3 connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) close(3) = 0 open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3 lseek(3, 0, SEEK_CUR) = 0 fstat(3, {st_mode=S_IFREG|0644, st_size=1468, ...}) = 0 mmap(NULL, 1468, PROT_READ, MAP_SHARED, 3, 0) = 0x2000000000800000 lseek(3, 1468, SEEK_SET) = 1468 munmap(0x2000000000800000, 1468) = 0 close(3) = 0 open("/etc/group", O_RDONLY|O_CLOEXEC) = 3 lseek(3, 0, SEEK_CUR) = 0 fstat(3, {st_mode=S_IFREG|0644, st_size=861, ...}) = 0 mmap(NULL, 861, PROT_READ, MAP_SHARED, 3, 0) = 0x2000000000800000 lseek(3, 861, SEEK_SET) = 861 munmap(0x2000000000800000, 861) = 0 close(3) = 0 open("/etc/group", O_RDONLY|O_CLOEXEC) = 3 lseek(3, 0, SEEK_CUR) = 0 fstat(3, {st_mode=S_IFREG|0644, st_size=861, ...}) = 0 mmap(NULL, 861, PROT_READ, MAP_SHARED, 3, 0) = 0x2000000000800000 lseek(3, 861, SEEK_SET) = 861 munmap(0x2000000000800000, 861) = 0 close(3) = 0 open("/etc/group", O_RDONLY|O_CLOEXEC) = 3 lseek(3, 0, SEEK_CUR) = 0 fstat(3, {st_mode=S_IFREG|0644, st_size=861, ...}) = 0 mmap(NULL, 861, PROT_READ, MAP_SHARED, 3, 0) = 0x2000000000800000 lseek(3, 861, SEEK_SET) = 861 munmap(0x2000000000800000, 861) = 0 close(3) = 0 socket(PF_NETLINK, SOCK_RAW, 0) = 3 bind(3, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0 getsockname(3, {sa_family=AF_NETLINK, pid=5979, groups=00000000}, [12]) = 0 gettimeofday({1352116726, 905140}, NULL) = 0 sendto(3, "\24\0\0\0\26\0\1\3\366\251\227P\0\0\0\0\0\0\0\0", 20, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 20 recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0\0\0\0\24\0\2\0\366\251\227P[\27\0\0\2\10\200\376\1\0\0\0\10\0\1\0\177\0\0\1"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 108 recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"@\0\0\0\24\0\2\0\366\251\227P[\27\0\0\n\200\200\376\1\0\0\0\24\0\1\0\0\0\0\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 128 recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"\24\0\0\0\3\0\2\0\366\251\227P[\27\0\0\0\0\0\0\1\0\0\0\24\0\1\0\0\0\0\0"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 20 close(3) = 0 socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3 connect(3, {sa_family=AF_INET6, sin6_port=htons(80), inet_pton(AF_INET6, "::180:adfb:0:0", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=7508870}, 28) = -1 ENETUNREACH (Network is unreachable) connect(3, {sa_family=AF_UNSPEC, sa_data="\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}, 16) = 0 connect(3, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("0.0.0.0")}, 16) = 0 getsockname(3, {sa_family=AF_INET6, sin6_port=htons(36812), inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0 close(3) = 0 open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3 lseek(3, 0, SEEK_CUR) = 0 fstat(3, {st_mode=S_IFREG|0644, st_size=1468, ...}) = 0 mmap(NULL, 1468, PROT_READ, MAP_SHARED, 3, 0) = 0x2000000000800000 lseek(3, 1468, SEEK_SET) = 1468 munmap(0x2000000000800000, 1468) = 0 close(3) = 0 open("/etc/group", O_RDONLY|O_CLOEXEC) = 3 lseek(3, 0, SEEK_CUR) = 0 fstat(3, {st_mode=S_IFREG|0644, st_size=861, ...}) = 0 mmap(NULL, 861, PROT_READ, MAP_SHARED, 3, 0) = 0x2000000000800000 lseek(3, 861, SEEK_SET) = 861 munmap(0x2000000000800000, 861) = 0 close(3) = 0 open("/etc/group", O_RDONLY|O_CLOEXEC) = 3 lseek(3, 0, SEEK_CUR) = 0 fstat(3, {st_mode=S_IFREG|0644, st_size=861, ...}) = 0 mmap(NULL, 861, PROT_READ, MAP_SHARED, 3, 0) = 0x2000000000800000 lseek(3, 861, SEEK_SET) = 861 munmap(0x2000000000800000, 861) = 0 close(3) = 0 open("/usr/etc/varnish/default.vcl", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=2965, ...}) = 0 read(3, "# This is a basic VCL configurat"..., 2965) = 2965 close(3) = 0 uname({sys="Linux", node="mansotarro1", ...}) = 0 mkdir("/usr/local/var/varnish/mansotarro1", 0755) = -1 EEXIST (File exists) chdir("/usr/local/var/varnish/mansotarro1") = 0 open("./vcl.1P9zoqAU.c", O_RDWR|O_CREAT|O_EXCL, 0600) = 3 close(3) = 0 pipe([3, 4]) = 3 clone2(child_stack=0, stack_size=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x200000000013b0a0) = 5982 close(4) = 0 read(3, "", 8191) = 0 --- SIGCHLD (Child exited) @ a000000000010721 (175e) --- close(3) = 0 wait4(5982, [{WIFSIGNALED(s) && WTERMSIG(s) == SIGSEGV}], 0, NULL) = 5982 unlink("./vcl.1P9zoqAU.c") = 0 write(2, "Running VCC-compiler failed, sig"..., 38) = 38 write(2, "\nVCL compilation failed\n", 24) = 24 exit_group(2) = ? From gonzalo.paniagua at acquia.com Mon Nov 5 12:21:05 2012 From: gonzalo.paniagua at acquia.com (Gonzalo Paniagua) Date: Mon, 5 Nov 2012 07:21:05 -0500 Subject: varnish 2.1.5 on ia64 In-Reply-To: References: Message-ID: On Mon, Nov 5, 2012 at 7:07 AM, Luis San Martin wrote: > Hello, > > I've been trying to get it up and running varnish 2.1.5 on ia64 without any > success. So far I've tried debian package and varnish from source. Both with > the same results. I attach strace file if needed. > > I appreciate any feedback or ideas since I can't find any clue. Either there is an error in your default.vcl or it can't be compiled for some other reason. Run varnishd with the -d option and you should see the problem. If you are still unable to figure it out, send your question and your default.vcl to the varnish-misc list. The varnish-dev list is for varnish development topics. -Gonzalo From luis.sanmartin at unix.cl Mon Nov 5 12:27:40 2012 From: luis.sanmartin at unix.cl (Luis San Martin) Date: Mon, 5 Nov 2012 09:27:40 -0300 Subject: varnish 2.1.5 on ia64 In-Reply-To: References: Message-ID: Thank you for the quick reply I'll keep this thread on the suggested list. Kind regards. On Mon, Nov 5, 2012 at 9:21 AM, Gonzalo Paniagua < gonzalo.paniagua at acquia.com> wrote: > On Mon, Nov 5, 2012 at 7:07 AM, Luis San Martin > wrote: > > Hello, > > > > I've been trying to get it up and running varnish 2.1.5 on ia64 without > any > > success. So far I've tried debian package and varnish from source. Both > with > > the same results. I attach strace file if needed. > > > > I appreciate any feedback or ideas since I can't find any clue. > > Either there is an error in your default.vcl or it can't be compiled > for some other reason. > Run varnishd with the -d option and you should see the problem. > > If you are still unable to figure it out, send your question and your > default.vcl to the varnish-misc list. The varnish-dev list is for > varnish development topics. > > -Gonzalo > -------------- next part -------------- An HTML attachment was scrubbed... URL: From phk at phk.freebsd.dk Mon Nov 5 12:49:54 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Mon, 05 Nov 2012 12:49:54 +0000 Subject: varnish 2.1.5 on ia64 In-Reply-To: References: Message-ID: <44001.1352119794@critter.freebsd.dk> -------- In message , Luis San Martin writes: >I've been trying to get it up and running varnish 2.1.5 on ia64 without any >success. So far I've tried debian package and varnish from source. Both >with the same results. I attach strace file if needed. > >I appreciate any feedback or ideas since I can't find any clue. > >P.S: Base system is an SGI Altix 450 && Debian 6.0 Squeeze I don't think I have heard any reports about ia64 before this one. Ia64 has certain restrictions with respect to memory access alignment. I would hope varnish respects those, but absent testing on the actual platform, that may not be the case. If you are willing to do a bit of work to help debug/diagnose what goes wrong, we can try to get it working. The first thing you need to do, is built Varnish from source, pull the -trunk version with svn, and compile using: sh autogen.des make If that fails, we need to fix that before anything else. When it works, then next is a very basic test: cd bin/varnishd ./varnishd -C -b 127.0.0.1 Ideally this should return a bunch of C-code from the compiled default VCL. If you get errors here, we need to get those sorted. Next try to see if it actually can be started: ./varnishd -d -b varnish-cache.org -a :8080 then type start Again, if that works, try to pull some data through it. In a different window: curl -v -o /dev/null http://localhost:8080/ That should give you a 302 reponse back... -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From phk at phk.freebsd.dk Mon Nov 5 12:51:30 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Mon, 05 Nov 2012 12:51:30 +0000 Subject: varnish 2.1.5 on ia64 In-Reply-To: References: Message-ID: <44027.1352119890@critter.freebsd.dk> -------- In message , Gonzalo Paniagua writes: >On Mon, Nov 5, 2012 at 7:07 AM, Luis San Martin wrote: >If you are still unable to figure it out, send your question and your >default.vcl to the varnish-misc list. The varnish-dev list is for >varnish development topics. With all due respect: I don't think we positively know at this point if varnish works on ia64, so I think this could be a valid -dev issue. (See my other reply) -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From luis.sanmartin at unix.cl Mon Nov 5 13:52:09 2012 From: luis.sanmartin at unix.cl (Luis San Martin) Date: Mon, 5 Nov 2012 10:52:09 -0300 Subject: varnish 2.1.5 on ia64 In-Reply-To: <44001.1352119794@critter.freebsd.dk> References: <44001.1352119794@critter.freebsd.dk> Message-ID: I'd be happy to contribute in any possible way, so lets start: (GIT or SVN?) # git clone git://git.varnish-cache.org/varnish-cache Cloning into varnish-cache... remote: Counting objects: 59112, done. remote: Compressing objects: 100% (17797/17797), done. remote: Total 59112 (delta 44996), reused 54866 (delta 41225) Receiving objects: 100% (59112/59112), 9.16 MiB | 141 KiB/s, done. Resolving deltas: 100% (44996/44996), done. # cd varnish-cache/ varnish-cache# sh autogen.des + make -k distclean + true + [ -f /usr/bin/clang -a x = x ] + rm -f configure + . ./autogen.sh + uname -s + LIBTOOLIZE=libtoolize + automake --version + tr \n + egrep ^[0-9]\.[0-9a-z.-]+ + automake_version=1.11.6 + [ -z 1.11.6 ] + set -ex + libtoolize --copy --force libtoolize: putting auxiliary files in `.'. libtoolize: copying file `./ltmain.sh' libtoolize: putting macros in `m4'. libtoolize: copying file `m4/libtool.m4' libtoolize: copying file `m4/ltoptions.m4' libtoolize: copying file `m4/ltsugar.m4' libtoolize: copying file `m4/ltversion.m4' libtoolize: copying file `m4/lt~obsolete.m4' libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree. + aclocal -I m4 configure.ac:21: warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS ../../lib/autoconf/specific.m4:314: AC_GNU_SOURCE is expanded from... configure.ac:21: the top level configure.ac:21: warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS ../../lib/autoconf/specific.m4:314: AC_GNU_SOURCE is expanded from... configure.ac:21: the top level configure.ac:432: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body ../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from... ../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from... ../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from... m4/ld-version-script.m4:18: gl_LD_VERSION_SCRIPT is expanded from... configure.ac:432: the top level + autoheader configure.ac:21: warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS ../../lib/autoconf/specific.m4:314: AC_GNU_SOURCE is expanded from... configure.ac:21: the top level configure.ac:21: warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS ../../lib/autoconf/specific.m4:314: AC_GNU_SOURCE is expanded from... configure.ac:21: the top level configure.ac:432: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body ../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from... ../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from... ../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from... m4/ld-version-script.m4:18: gl_LD_VERSION_SCRIPT is expanded from... configure.ac:432: the top level + automake --add-missing --copy --foreign configure.ac:21: warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS ../../lib/autoconf/specific.m4:314: AC_GNU_SOURCE is expanded from... configure.ac:21: the top level configure.ac:21: warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS ../../lib/autoconf/specific.m4:314: AC_GNU_SOURCE is expanded from... configure.ac:21: the top level configure.ac:432: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body ../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from... ../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from... ../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from... m4/ld-version-script.m4:18: gl_LD_VERSION_SCRIPT is expanded from... configure.ac:432: the top level configure.ac:12: installing `./config.guess' configure.ac:12: installing `./config.sub' configure.ac:15: installing `./install-sh' configure.ac:15: installing `./missing' bin/varnishadm/Makefile.am: installing `./depcomp' + autoconf configure.ac:21: warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS ../../lib/autoconf/specific.m4:314: AC_GNU_SOURCE is expanded from... configure.ac:21: the top level configure.ac:21: warning: AC_RUN_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS ../../lib/autoconf/specific.m4:314: AC_GNU_SOURCE is expanded from... configure.ac:21: the top level configure.ac:432: warning: AC_LANG_CONFTEST: no AC_LANG_SOURCE call detected in body ../../lib/autoconf/lang.m4:193: AC_LANG_CONFTEST is expanded from... ../../lib/autoconf/general.m4:2661: _AC_LINK_IFELSE is expanded from... ../../lib/autoconf/general.m4:2678: AC_LINK_IFELSE is expanded from... m4/ld-version-script.m4:18: gl_LD_VERSION_SCRIPT is expanded from... configure.ac:432: the top level + export CONFIG_SHELL=/bin/sh + ./configure --enable-developer-warnings --enable-debugging-symbols --enable-dependency-tracking --enable-diagnostics --enable-extra-developer-warnings --enable-stack-protector --enable-tests --enable-werror --prefix=/opt/varnish --mandir=/opt/varnish/man checking build system type... ia64-unknown-linux-gnu checking host system type... ia64-unknown-linux-gnu checking target system type... ia64-unknown-linux-gnu checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /bin/mkdir -p checking for gawk... no checking for mawk... mawk checking whether make sets $(MAKE)... yes checking whether make supports nested variables... yes checking how to print strings... printf checking for style of include used by make... GNU checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking dependency style of gcc... gcc3 checking for a sed that does not truncate output... /bin/sed checking for grep that handles long lines and -e... /bin/grep checking for egrep... /bin/grep -E checking for fgrep... /bin/grep -F checking for ld used by gcc... /usr/bin/ld checking if the linker (/usr/bin/ld) is GNU ld... yes checking for BSD- or MS-compatible name lister (nm)... /usr/bin/nm -B checking the name lister (/usr/bin/nm -B) interface... BSD nm checking whether ln -s works... yes checking the maximum length of command line arguments... 1572864 checking whether the shell understands some XSI constructs... yes checking whether the shell understands "+="... no checking how to convert ia64-unknown-linux-gnu file names to ia64-unknown-linux-gnu format... func_convert_file_noop checking how to convert ia64-unknown-linux-gnu file names to toolchain format... func_convert_file_noop checking for /usr/bin/ld option to reload object files... -r checking for objdump... objdump checking how to recognize dependent libraries... pass_all checking for dlltool... no checking how to associate runtime and link libraries... printf %s\n checking for ar... ar checking for archiver @FILE support... @ checking for strip... strip checking for ranlib... ranlib checking command to parse /usr/bin/nm -B output from gcc object... ok checking for sysroot... no checking for mt... mt checking if mt is a manifest tool... no checking how to run the C preprocessor... gcc -E checking for ANSI C header files... yes checking for sys/types.h... yes checking for sys/stat.h... yes checking for stdlib.h... yes checking for string.h... yes checking for memory.h... yes checking for strings.h... yes checking for inttypes.h... yes checking for stdint.h... yes checking for unistd.h... yes checking for dlfcn.h... yes checking for objdir... .libs checking if gcc supports -fno-rtti -fno-exceptions... no checking for gcc option to produce PIC... -fPIC -DPIC checking if gcc PIC flag -fPIC -DPIC works... yes checking if gcc static flag -static works... yes checking if gcc supports -c -o file.o... yes checking if gcc supports -c -o file.o... (cached) yes checking whether the gcc linker (/usr/bin/ld) supports shared libraries... yes checking whether -lc should be explicitly linked in... no checking dynamic linker characteristics... GNU/Linux ld.so checking how to hardcode library paths into programs... immediate checking whether stripping libraries is possible... yes checking if libtool supports shared libraries... yes checking whether to build shared libraries... yes checking whether to build static libraries... no checking minix/config.h usability... no checking minix/config.h presence... no checking for minix/config.h... no checking whether it is safe to define __EXTENSIONS__... yes checking for gcc... (cached) gcc checking whether we are using the GNU C compiler... (cached) yes checking whether gcc accepts -g... (cached) yes checking for gcc option to accept ISO C89... (cached) none needed checking dependency style of gcc... (cached) gcc3 checking for gcc option to accept ISO C99... -std=gnu99 checking for gcc -std=gnu99 option to accept ISO Standard C... (cached) -std=gnu99 checking how to run the C preprocessor... gcc -E checking for the pthreads library -lpthreads... no checking whether pthreads work without any flags... no checking whether pthreads work with -Kthread... no checking whether pthreads work with -kthread... no checking for the pthreads library -llthread... no checking whether pthreads work with -pthread... yes checking for joinable pthread attribute... PTHREAD_CREATE_JOINABLE checking if more special flags are required for pthreads... no checking whether make sets $(MAKE)... (cached) yes checking for rst2man... no checking for rst2man.py... no configure: WARNING: rst2man not found ? not building man pages checking for rst2html... no checking for rst2html.py... no configure: WARNING: rst2html not found ? not building changelog checking for clock_gettime in -lrt... yes checking for dlopen in -ldl... yes checking for library containing initscr... no configure: WARNING: curses not found; some tools will not be built checking ncurses/curses.h usability... no checking ncurses/curses.h presence... no checking for ncurses/curses.h... no checking curses.h usability... no checking curses.h presence... no checking for curses.h... no checking for library containing pthread_create... none required checking for socket in -lsocket... no checking for getaddrinfo in -lnsl... yes checking for cos in -lm... yes checking for pkg-config... /usr/bin/pkg-config checking pkg-config is at least version 0.9.0... yes checking for PCRE... yes checking for LIBEDIT... no checking readline/readline.h usability... no checking readline/readline.h presence... no checking for readline/readline.h... no checking edit/readline/readline.h usability... no checking edit/readline/readline.h presence... no checking for edit/readline/readline.h... no checking for el_init in -ledit... no configure: WARNING: libedit not found, disabling libedit support checking for ANSI C header files... (cached) yes checking for sys/wait.h that is POSIX.1 compatible... yes checking whether time.h and sys/time.h may both be included... yes checking sys/param.h usability... yes checking sys/param.h presence... yes checking for sys/param.h... yes checking for sys/types.h... (cached) yes checking sys/endian.h usability... no checking sys/endian.h presence... no checking for sys/endian.h... no checking sys/filio.h usability... no checking sys/filio.h presence... no checking for sys/filio.h... no checking for sys/mount.h... yes checking sys/socket.h usability... yes checking sys/socket.h presence... yes checking for sys/socket.h... yes checking sys/statvfs.h usability... yes checking sys/statvfs.h presence... yes checking for sys/statvfs.h... yes checking sys/vfs.h usability... yes checking sys/vfs.h presence... yes checking for sys/vfs.h... yes checking endian.h usability... yes checking endian.h presence... yes checking for endian.h... yes checking execinfo.h usability... yes checking execinfo.h presence... yes checking for execinfo.h... yes checking netinet/in.h usability... yes checking netinet/in.h presence... yes checking for netinet/in.h... yes checking pthread_np.h usability... no checking pthread_np.h presence... no checking for pthread_np.h... no checking stddef.h usability... yes checking stddef.h presence... yes checking for stddef.h... yes checking for stdlib.h... (cached) yes checking for unistd.h... (cached) yes checking priv.h usability... no checking priv.h presence... no checking for priv.h... no checking for an ANSI C-conforming const... yes checking for struct sockaddr.sa_len... no checking return type of signal handlers... void checking for size_t... yes checking for vprintf... yes checking for _doprnt... no checking for strerror... yes checking whether strerror_r is declared... yes checking for strerror_r... yes checking whether strerror_r returns char *... yes checking for dladdr... no checking for socket... yes checking for strptime... yes checking for fmtcheck... no checking for getdtablesize... yes checking for timegm... yes checking for nanosleep... yes checking for setppriv... no checking for pthread_set_name_np... no checking for pthread_mutex_isowned_np... no checking for pthread_timedjoin_np... yes checking whether we have support for visibility attributes... yes checking for malloc_conf in -ljemalloc... no configure: No system jemalloc found, using bundled version checking for setproctitle... no checking for srandomdev... no checking for backtrace... yes checking whether daemon() works... checking for daemon... yes checking for special C compiler options needed for large files... no checking for _FILE_OFFSET_BITS value needed for large files... no checking for clock_gettime... yes checking for gethrtime... no checking for kqueue... no checking for epoll_ctl... yes checking for port_create... no checking for python3... no checking for python3.1... no checking for python3.2... no checking for python2.7... no checking for python2.6... no checking for python2.5... no checking for python2... no checking for python... no ./configure.lineno: 15739: is: not found checking whether SO_ACCEPTFILTER is declared... no checking whether SO_RCVTIMEO works... yes checking whether SO_SNDTIMEO works... yes checking if LD -Wl,--version-script works... yes configure: creating ./config.status config.status: creating Makefile config.status: creating bin/Makefile config.status: creating bin/varnishadm/Makefile config.status: creating bin/varnishd/Makefile config.status: creating bin/varnishlog/Makefile config.status: creating bin/varnishhist/Makefile config.status: creating bin/varnishncsa/Makefile config.status: creating bin/varnishreplay/Makefile config.status: creating bin/varnishstat/Makefile config.status: creating bin/varnishtest/Makefile config.status: creating bin/varnishtop/Makefile config.status: creating doc/Makefile config.status: creating doc/sphinx/Makefile config.status: creating doc/sphinx/conf.py config.status: creating etc/Makefile config.status: creating include/Makefile config.status: creating lib/Makefile config.status: creating lib/libvarnish/Makefile config.status: creating lib/libvarnishapi/Makefile config.status: creating lib/libvarnishcompat/Makefile config.status: creating lib/libvcl/Makefile config.status: creating lib/libvgz/Makefile config.status: creating lib/libvmod_debug/Makefile config.status: creating lib/libvmod_std/Makefile config.status: creating lib/libjemalloc/Makefile config.status: creating man/Makefile config.status: creating redhat/Makefile config.status: creating varnishapi.pc config.status: creating varnishapi-uninstalled.pc config.status: creating config.h config.status: executing depfiles commands config.status: executing libtool commands root at mansotarro1:~/work/lsanmartin/varnish-cache# make make all-recursive make[1]: Entering directory `/root/work/lsanmartin/varnish-cache' Making all in include make[2]: Entering directory `/root/work/lsanmartin/varnish-cache/include' make all-am make[3]: Entering directory `/root/work/lsanmartin/varnish-cache/include' mkdir -p tbl ../lib/libvcl/generate.py .. .. make[3]: ../lib/libvcl/generate.py: Command not found make[3]: *** [vcl.h] Error 127 make[3]: Leaving directory `/root/work/lsanmartin/varnish-cache/include' make[2]: *** [all] Error 2 make[2]: Leaving directory `/root/work/lsanmartin/varnish-cache/include' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/root/work/lsanmartin/varnish-cache' make: *** [all] Error 2 varnish-cache# ./lib/libvcl/generate.py -bash: ./lib/libvcl/generate.py: /usr/local/bin/python3.1: bad interpreter: No such file or directory # python3.1 Python 3.1.3 (r313:86834, Nov 28 2010, 11:48:51) [GCC 4.4.5] on linux2 Type "help", "copyright", "credits" or "license" for more information. # ln -s /usr/bin/python3.1 # make make all-recursive make[1]: Entering directory `/root/work/lsanmartin/varnish-cache' Making all in include make[2]: Entering directory `/root/work/lsanmartin/varnish-cache/include' make all-am make[3]: Entering directory `/root/work/lsanmartin/varnish-cache/include' mkdir -p tbl ../lib/libvcl/generate.py .. .. make[3]: Leaving directory `/root/work/lsanmartin/varnish-cache/include' make[2]: Leaving directory `/root/work/lsanmartin/varnish-cache/include' Making all in lib make[2]: Entering directory `/root/work/lsanmartin/varnish-cache/lib' Making all in libvarnishcompat make[3]: Entering directory `/root/work/lsanmartin/varnish-cache/lib/libvarnishcompat' CC daemon.lo daemon.c:1:0: error: -fstack-protector not supported for this target [-Werror] cc1: all warnings being treated as errors make[3]: *** [daemon.lo] Error 1 make[3]: Leaving directory `/root/work/lsanmartin/varnish-cache/lib/libvarnishcompat' make[2]: *** [all-recursive] Error 1 make[2]: Leaving directory `/root/work/lsanmartin/varnish-cache/lib' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/root/work/lsanmartin/varnish-cache' make: *** [all] Error 2 EOF. On Mon, Nov 5, 2012 at 9:49 AM, Poul-Henning Kamp wrote: > -------- > In message < > CAGwUwkGyDOBMqiW_6s9ri7Q_CcQaUbyqpauDaE3xH9qLQGrPMg at mail.gmail.com> > , Luis San Martin writes: > > >I've been trying to get it up and running varnish 2.1.5 on ia64 without > any > >success. So far I've tried debian package and varnish from source. Both > >with the same results. I attach strace file if needed. > > > >I appreciate any feedback or ideas since I can't find any clue. > > > >P.S: Base system is an SGI Altix 450 && Debian 6.0 Squeeze > > I don't think I have heard any reports about ia64 before this one. > > Ia64 has certain restrictions with respect to memory access alignment. > > I would hope varnish respects those, but absent testing on the actual > platform, that may not be the case. > > If you are willing to do a bit of work to help debug/diagnose what > goes wrong, we can try to get it working. > > The first thing you need to do, is built Varnish from source, > pull the -trunk version with svn, and compile using: > > sh autogen.des > make > > If that fails, we need to fix that before anything else. > > When it works, then next is a very basic test: > > cd bin/varnishd > > ./varnishd -C -b 127.0.0.1 > > Ideally this should return a bunch of C-code from the compiled > default VCL. > > If you get errors here, we need to get those sorted. > > Next try to see if it actually can be started: > > ./varnishd -d -b varnish-cache.org -a :8080 > > then type > > start > > Again, if that works, try to pull some data through it. > > In a different window: > > curl -v -o /dev/null http://localhost:8080/ > > That should give you a 302 reponse back... > > > -- > Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 > phk at FreeBSD.ORG | TCP/IP since RFC 956 > FreeBSD committer | BSD since 4.3-tahoe > Never attribute to malice what can adequately be explained by incompetence. > -------------- next part -------------- An HTML attachment was scrubbed... URL: From phk at phk.freebsd.dk Mon Nov 5 14:03:58 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Mon, 05 Nov 2012 14:03:58 +0000 Subject: varnish 2.1.5 on ia64 In-Reply-To: References: <44001.1352119794@critter.freebsd.dk> Message-ID: <60205.1352124238@critter.freebsd.dk> -------- In message , Luis San Martin writes: >daemon.c:1:0: error: -fstack-protector not supported for this target Just remove the line that mentions "enable-stack-protector" in autogen.des and try again (same if it complains about any of the other options there) -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From luis.sanmartin at unix.cl Mon Nov 5 14:13:22 2012 From: luis.sanmartin at unix.cl (Luis San Martin) Date: Mon, 5 Nov 2012 11:13:22 -0300 Subject: varnish 2.1.5 on ia64 In-Reply-To: <60205.1352124238@critter.freebsd.dk> References: <44001.1352119794@critter.freebsd.dk> <60205.1352124238@critter.freebsd.dk> Message-ID: Might be $PYTHON ENV? # make make all-recursive make[1]: Entering directory ` varnish-cache' Making all in include make[2]: Entering directory ` varnish-cache/include' make all-am make[3]: Entering directory ` varnish-cache/include' make[3]: Leaving directory ` varnish-cache/include' make[2]: Leaving directory ` varnish-cache/include' Making all in lib make[2]: Entering directory ` varnish-cache/lib' Making all in libvarnishcompat make[3]: Entering directory ` varnish-cache/lib/libvarnishcompat' make[3]: Nothing to be done for `all'. make[3]: Leaving directory ` varnish-cache/lib/libvarnishcompat' Making all in libvarnish make[3]: Entering directory ` varnish-cache/lib/libvarnish' make[3]: Nothing to be done for `all'. make[3]: Leaving directory ` varnish-cache/lib/libvarnish' Making all in libvarnishapi make[3]: Entering directory ` varnish-cache/lib/libvarnishapi' make[3]: Nothing to be done for `all'. make[3]: Leaving directory ` varnish-cache/lib/libvarnishapi' Making all in libvcl make[3]: Entering directory ` varnish-cache/lib/libvcl' make[3]: Nothing to be done for `all'. make[3]: Leaving directory ` varnish-cache/lib/libvcl' Making all in libvgz make[3]: Entering directory ` varnish-cache/lib/libvgz' make[3]: Nothing to be done for `all'. make[3]: Leaving directory ` varnish-cache/lib/libvgz' Making all in libvmod_debug make[3]: Entering directory ` varnish-cache/lib/libvmod_debug' make[3]: Nothing to be done for `all'. make[3]: Leaving directory ` varnish-cache/lib/libvmod_debug' Making all in libvmod_std make[3]: Entering directory ` varnish-cache/lib/libvmod_std' ======================================== You need rst2man installed to make dist ======================================== make[3]: *** [vmod_std.3] Error 1 make[3]: Leaving directory ` varnish-cache/lib/libvmod_std' make[2]: *** [all-recursive] Error 1 make[2]: Leaving directory ` varnish-cache/lib' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory ` varnish-cache' make: *** [all] Error 2 # dpkg -S rst2man python-docutils: /usr/share/man/man1/rst2man.1.gz python-docutils: /usr/bin/rst2man # file /usr/bin/rst2man /usr/bin/rst2man: a /usr/bin/python script text executable On Mon, Nov 5, 2012 at 11:03 AM, Poul-Henning Kamp wrote: > -------- > In message < > CAGwUwkExKz+2BsJCCHQWLKQ45M9CFdWJ54iu5pK65d_29OH+iw at mail.gmail.com> > , Luis San Martin writes: > > >daemon.c:1:0: error: -fstack-protector not supported for this target > > Just remove the line that mentions "enable-stack-protector" in > autogen.des and try again > > (same if it complains about any of the other options there) > > -- > Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 > phk at FreeBSD.ORG | TCP/IP since RFC 956 > FreeBSD committer | BSD since 4.3-tahoe > Never attribute to malice what can adequately be explained by incompetence. > -------------- next part -------------- An HTML attachment was scrubbed... URL: From phk at phk.freebsd.dk Mon Nov 5 14:15:52 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Mon, 05 Nov 2012 14:15:52 +0000 Subject: varnish 2.1.5 on ia64 In-Reply-To: References: <44001.1352119794@critter.freebsd.dk> <60205.1352124238@critter.freebsd.dk> Message-ID: <60257.1352124952@critter.freebsd.dk> -------- In message , Luis San Martin writes: >--e89a8fb1ef3885a63204cdc016c1 >Content-Type: text/plain; charset=ISO-8859-1 > >Might be $PYTHON ENV? No idea... I'm not very good at all that auto* stuff... try to find some workaround, it's not important for what we're trying to do. -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From luis.sanmartin at unix.cl Mon Nov 5 14:35:51 2012 From: luis.sanmartin at unix.cl (Luis San Martin) Date: Mon, 5 Nov 2012 11:35:51 -0300 Subject: varnish 2.1.5 on ia64 In-Reply-To: <60257.1352124952@critter.freebsd.dk> References: <44001.1352119794@critter.freebsd.dk> <60205.1352124238@critter.freebsd.dk> <60257.1352124952@critter.freebsd.dk> Message-ID: Got it compiled... nevertheless: # ./varnishd -C -b 127.0.0.1 Message from VCC-compiler: /* ... */ comment contains /* ('Default' Line 1 Pos 1) /*/*/*/*opyright (c) 2006 Verdens Gang AS ##--------------------------------------- ('Default' Line 1 Pos 3) /*/*/*/*opyright (c) 2006 Verdens Gang AS --##------------------------------------- Running VCC-compiler failed, exit 1 VCL compilation failed On Mon, Nov 5, 2012 at 11:15 AM, Poul-Henning Kamp wrote: > -------- > In message mHNeCt+bxTw at mail.gmail.com> > , Luis San Martin writes: > >--e89a8fb1ef3885a63204cdc016c1 > >Content-Type: text/plain; charset=ISO-8859-1 > > > >Might be $PYTHON ENV? > > No idea... > > I'm not very good at all that auto* stuff... > > try to find some workaround, it's not important for what we're trying > to do. > > -- > Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 > phk at FreeBSD.ORG | TCP/IP since RFC 956 > FreeBSD committer | BSD since 4.3-tahoe > Never attribute to malice what can adequately be explained by incompetence. > -------------- next part -------------- An HTML attachment was scrubbed... URL: From phk at phk.freebsd.dk Mon Nov 5 14:47:33 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Mon, 05 Nov 2012 14:47:33 +0000 Subject: varnish 2.1.5 on ia64 In-Reply-To: References: <44001.1352119794@critter.freebsd.dk> <60205.1352124238@critter.freebsd.dk> <60257.1352124952@critter.freebsd.dk> Message-ID: <60974.1352126853@critter.freebsd.dk> -------- In message , Luis San Martin writes: ># ./varnishd -C -b 127.0.0.1 >Message from VCC-compiler: >/* ... */ comment contains /* >('Default' Line 1 Pos 1) >/*/*/*/*opyright (c) 2006 Verdens Gang AS >##--------------------------------------- Ok, now we're getting somewhere.... Can you check that the bin/varnishd/default.vcl file does not look like that in the first line ? -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From luis.sanmartin at unix.cl Mon Nov 5 14:53:56 2012 From: luis.sanmartin at unix.cl (Luis San Martin) Date: Mon, 5 Nov 2012 11:53:56 -0300 Subject: varnish 2.1.5 on ia64 In-Reply-To: <60974.1352126853@critter.freebsd.dk> References: <44001.1352119794@critter.freebsd.dk> <60205.1352124238@critter.freebsd.dk> <60257.1352124952@critter.freebsd.dk> <60974.1352126853@critter.freebsd.dk> Message-ID: I already checked, even removed any *comment*. I attach the file anyway. On Mon, Nov 5, 2012 at 11:47 AM, Poul-Henning Kamp wrote: > -------- > In message CmyTxP_9gWRLBz4gg5L8kwXAN1qiaTOg-pc9w at mail.gmail.com> > , Luis San Martin writes: > > ># ./varnishd -C -b 127.0.0.1 > >Message from VCC-compiler: > >/* ... */ comment contains /* > >('Default' Line 1 Pos 1) > >/*/*/*/*opyright (c) 2006 Verdens Gang AS > >##--------------------------------------- > > Ok, now we're getting somewhere.... > > Can you check that the bin/varnishd/default.vcl file does not > look like that in the first line ? > > -- > Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 > phk at FreeBSD.ORG | TCP/IP since RFC 956 > FreeBSD committer | BSD since 4.3-tahoe > Never attribute to malice what can adequately be explained by incompetence. > -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: default.vcl Type: application/octet-stream Size: 2565 bytes Desc: not available URL: From gaurav.the.iiitian at gmail.com Tue Nov 6 11:21:16 2012 From: gaurav.the.iiitian at gmail.com (gaurav singh) Date: Tue, 6 Nov 2012 16:51:16 +0530 Subject: Documentation for developers Message-ID: As i am new to Varnish cache, i would like to know the resources which can help me start contributing to it. Thanks Gaurav Singh -------------- next part -------------- An HTML attachment was scrubbed... URL: From slink at schokola.de Tue Nov 6 18:01:17 2012 From: slink at schokola.de (Nils Goroll) Date: Tue, 06 Nov 2012 19:01:17 +0100 Subject: Documentation for developers In-Reply-To: References: Message-ID: <5099506D.9010008@schokola.de> On 11/ 6/12 12:21 PM, gaurav singh wrote: > As i am new to Varnish cache, i would like to know the resources which can > help me start contributing to it. Two starting points: * https://www.varnish-cache.org/trac/wiki/DeveloperResources * https://www.varnish-cache.org/trac/wiki/Contributing Nils From martin at varnish-software.com Wed Nov 7 11:32:04 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:04 +0100 Subject: [PATCH 01/15] Start the thread pools as the last init item before the main loop. Message-ID: <1352287938-7247-1-git-send-email-martin@varnish-software.com> This should solve the potential race existing now, where the worker threads may start handling connections before a lot of the initialization routines has been done. --- bin/varnishd/cache/cache_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bin/varnishd/cache/cache_main.c b/bin/varnishd/cache/cache_main.c index ac36308..73f965e 100644 --- a/bin/varnishd/cache/cache_main.c +++ b/bin/varnishd/cache/cache_main.c @@ -204,7 +204,6 @@ child_main(void) VBE_InitCfg(); VBP_Init(); WRK_Init(); - Pool_Init(); EXP_Init(); HSH_Init(heritage.hash); @@ -228,6 +227,8 @@ child_main(void) if (FEATURE(FEATURE_WAIT_SILO)) SMP_Ready(); + Pool_Init(); + CLI_Run(); STV_close(); -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:08 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:08 +0100 Subject: [PATCH 05/15] Allow reload of truncated gone bans, which contain only the ban timestamp. In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-5-git-send-email-martin@varnish-software.com> --- bin/varnishd/cache/cache_ban.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index f44d98d..afc9861 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -116,6 +116,7 @@ static int ban_shutdown = 0; #define BANHEAD_O_LEN 8 #define BANHEAD_O_FLAGS 12 #define BANHEAD_LEN 13 +#define BANHEAD_LEN_TS (BANHEAD_O_LEN) /*-------------------------------------------------------------------- * BAN string magic markers @@ -550,8 +551,10 @@ BAN_Reload(const uint8_t *ban, unsigned len) ASSERT_CLI(); AZ(ban_shutdown); + assert(len >= BANHEAD_LEN || len == BANHEAD_LEN_TS); + if (len >= BANHEAD_LEN) + assert(len == ban_len(ban)); t0 = ban_time(ban); - assert(len == ban_len(ban)); Lck_Lock(&ban_mtx); @@ -565,6 +568,9 @@ BAN_Reload(const uint8_t *ban, unsigned len) } if (t1 < t0) break; + if (len == BANHEAD_LEN_TS) + /* Truncated ban - don't check */ + continue; if (!memcmp(b->spec + BANHEAD_O_LEN, ban + BANHEAD_O_LEN, len - BANHEAD_O_LEN)) duplicate = 1; @@ -575,9 +581,19 @@ BAN_Reload(const uint8_t *ban, unsigned len) b2 = BAN_New(); AN(b2); - b2->spec = malloc(len); - AN(b2->spec); - memcpy(b2->spec, ban, len); + if (len == BANHEAD_LEN_TS) { + /* Reload of truncated GONE ban, create an empty ban */ + b2->spec = malloc(BANHEAD_LEN); + AN(b2->spec); + memcpy(b2->spec, ban, len); + b2->spec[BANHEAD_O_FLAGS] = 0; + vbe32enc(b2->spec + BANHEAD_O_LEN, BANHEAD_LEN); + b2->flags |= BAN_F_GONE; + } else { + b2->spec = malloc(len); + AN(b2->spec); + memcpy(b2->spec, ban, len); + } if (duplicate) { VSC_C_main->bans_dups++; b2->flags |= BAN_F_GONE; -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:05 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:05 +0100 Subject: [PATCH 02/15] Add a BAN_Shutdown() routine that is called before STV_Close(), and makes sure that the ban lists will not change until we exit. In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-2-git-send-email-martin@varnish-software.com> This is to give persistent stevedores a chance to clean up their ban lists without having to worry about the lists changing under them (normally the ban callbacks are called under the ban mutex, but not so during exit). Also remove the duplicate drop tail bans code. That is now only done in the main thread loop. --- bin/varnishd/cache/cache.h | 3 +- bin/varnishd/cache/cache_ban.c | 112 ++++++++++++++++++++++++++------------- bin/varnishd/cache/cache_main.c | 1 + bin/varnishd/cache/cache_vrt.c | 8 +-- 4 files changed, 81 insertions(+), 43 deletions(-) diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 6d4fe86..8a73aa7 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -746,8 +746,9 @@ struct ban *BAN_New(void); int BAN_AddTest(struct cli *, struct ban *, const char *, const char *, const char *); void BAN_Free(struct ban *b); -void BAN_Insert(struct ban *b); +int BAN_Insert(struct ban *b); void BAN_Init(void); +void BAN_Shutdown(void); void BAN_NewObjCore(struct objcore *oc); void BAN_DestroyObj(struct objcore *oc); int BAN_CheckObject(struct object *o, struct req *sp); diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index aa8bca9..7f02f90 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -104,6 +104,7 @@ static struct ban *ban_magic; static pthread_t ban_thread; static struct ban * volatile ban_start; static bgthread_t ban_lurker; +static int ban_shutdown = 0; /*-------------------------------------------------------------------- * BAN string magic markers @@ -372,9 +373,14 @@ BAN_AddTest(struct cli *cli, struct ban *b, const char *a1, const char *a2, * as a separate variable from the VTAILQ, to avoid depending on the * internals of the VTAILQ macros. We tacitly assume that a pointer * write is always atomic in doing so. + * + * Returns: + * 0: Ban successfully inserted + * -1: Ban not inserted due to shutdown in progress. Caller should + * free the ban structure */ -void +int BAN_Insert(struct ban *b) { struct ban *bi, *be; @@ -383,6 +389,9 @@ BAN_Insert(struct ban *b) CHECK_OBJ_NOTNULL(b, BAN_MAGIC); + if (ban_shutdown) + return (-1); + AZ(VSB_finish(b->vsb)); ln = VSB_len(b->vsb); assert(ln >= 0); @@ -401,6 +410,11 @@ BAN_Insert(struct ban *b) b->vsb = NULL; Lck_Lock(&ban_mtx); + if (ban_shutdown) { + /* Check again, we might have raced */ + Lck_Unlock(&ban_mtx); + return (-1); + } VTAILQ_INSERT_HEAD(&ban_head, b, list); ban_start = b; VSC_C_main->bans++; @@ -418,7 +432,7 @@ BAN_Insert(struct ban *b) Lck_Unlock(&ban_mtx); if (be == NULL) - return; + return (0); /* Hunt down duplicates, and mark them as gone */ bi = b; @@ -436,6 +450,8 @@ BAN_Insert(struct ban *b) } be->refcount--; Lck_Unlock(&ban_mtx); + + return (0); } /*-------------------------------------------------------------------- @@ -519,6 +535,7 @@ BAN_Reload(const uint8_t *ban, unsigned len) double t0, t1, t2 = 9e99; ASSERT_CLI(); + AZ(ban_shutdown); t0 = ban_time(ban); assert(len == ban_len(ban)); @@ -595,6 +612,7 @@ BAN_Compile(void) { ASSERT_CLI(); + AZ(ban_shutdown); /* Notify stevedores */ STV_BanInfo(BI_NEW, ban_magic->spec, ban_len(ban_magic->spec)); @@ -802,7 +820,7 @@ ban_CheckLast(void) static int ban_lurker_work(struct worker *wrk, struct vsl_log *vsl, unsigned pass) { - struct ban *b, *b0, *b2; + struct ban *b, *b0; struct objhead *oh; struct objcore *oc, *oc2; struct object *o; @@ -811,18 +829,6 @@ ban_lurker_work(struct worker *wrk, struct vsl_log *vsl, unsigned pass) AN(pass & BAN_F_LURK); AZ(pass & ~BAN_F_LURK); - /* First route the last ban(s) */ - do { - Lck_Lock(&ban_mtx); - b2 = ban_CheckLast(); - if (b2 != NULL) - /* Notify stevedores */ - STV_BanInfo(BI_DROP, b2->spec, ban_len(b2->spec)); - Lck_Unlock(&ban_mtx); - if (b2 != NULL) - BAN_Free(b2); - } while (b2 != NULL); - /* * Find out if we have any bans we can do something about * If we find any, tag them with our pass number. @@ -853,6 +859,8 @@ ban_lurker_work(struct worker *wrk, struct vsl_log *vsl, unsigned pass) ban_time(b->spec), b->refcount); while (1) { Lck_Lock(&ban_mtx); + if (ban_shutdown) + break; oc = VTAILQ_FIRST(&b->objcore); if (oc == NULL) break; @@ -938,6 +946,8 @@ ban_lurker_work(struct worker *wrk, struct vsl_log *vsl, unsigned pass) ban_time(b->spec)); } Lck_Unlock(&ban_mtx); + if (ban_shutdown) + break; VTIM_sleep(cache_param->ban_lurker_sleep); if (b == b0) break; @@ -951,18 +961,16 @@ ban_lurker(struct worker *wrk, void *priv) struct ban *bf; unsigned pass = (1 << LURK_SHIFT); struct vsl_log vsl; + double ban_sleep; - int i = 0; VSL_Setup(&vsl, NULL, 0); (void)priv; - while (1) { + while (!ban_shutdown) { + ban_sleep = 1.0; - while (cache_param->ban_lurker_sleep == 0.0) { - /* - * Ban-lurker is disabled: - * Clean the last ban, if possible, and sleep - */ + /* Clear any gone last bans */ + do { Lck_Lock(&ban_mtx); bf = ban_CheckLast(); if (bf != NULL) @@ -972,23 +980,29 @@ ban_lurker(struct worker *wrk, void *priv) Lck_Unlock(&ban_mtx); if (bf != NULL) BAN_Free(bf); - else - VTIM_sleep(1.0); - } + } while (bf != NULL); - i = ban_lurker_work(wrk, &vsl, pass); - VSL_Flush(&vsl, 0); - WRK_SumStat(wrk); - if (i) { - pass += (1 << LURK_SHIFT); - pass &= BAN_F_LURK; - if (pass == 0) + if (cache_param->ban_lurker_sleep != 0.0) { + /* Ban lurker enabled */ + if (ban_lurker_work(wrk, &vsl, pass)) { pass += (1 << LURK_SHIFT); - VTIM_sleep(cache_param->ban_lurker_sleep); - } else { - VTIM_sleep(1.0); + pass &= BAN_F_LURK; + if (pass == 0) + pass += (1 << LURK_SHIFT); + ban_sleep = cache_param->ban_lurker_sleep; + } + VSL_Flush(&vsl, 0); + WRK_SumStat(wrk); } + + if (ban_shutdown) + break; + + VTIM_sleep(ban_sleep); } + + pthread_exit(0); + NEEDLESS_RETURN(NULL); } @@ -1031,7 +1045,12 @@ ccf_ban(struct cli *cli, const char * const *av, void *priv) BAN_Free(b); return; } - BAN_Insert(b); + if (BAN_Insert(b) < 0) { + BAN_Free(b); + VCLI_Out(cli, "Shutdown in progress"); + VCLI_SetResult(cli, CLIS_CANT); + return; + } } static void @@ -1145,3 +1164,24 @@ BAN_Init(void) VSC_C_main->bans_gone++; BAN_Insert(ban_magic); } + +/*-------------------------------------------------------------------- + * Initiate a shutdown of the ban system. + * + * When this function returns, no new bans will be accepted, and no + * bans will be dropped, so that no STV_BanInfo calls will be + * executed. Also shuts down the ban lurker. + */ + +void +BAN_Shutdown(void) +{ + void *status; + + Lck_Lock(&ban_mtx); + ban_shutdown = 1; + Lck_Unlock(&ban_mtx); + + AZ(pthread_join(ban_thread, &status)); + AZ(status); +} diff --git a/bin/varnishd/cache/cache_main.c b/bin/varnishd/cache/cache_main.c index 73f965e..6e4a832 100644 --- a/bin/varnishd/cache/cache_main.c +++ b/bin/varnishd/cache/cache_main.c @@ -231,6 +231,7 @@ child_main(void) CLI_Run(); + BAN_Shutdown(); STV_close(); printf("Child dies\n"); diff --git a/bin/varnishd/cache/cache_vrt.c b/bin/varnishd/cache/cache_vrt.c index ed7ae59..0082bdc 100644 --- a/bin/varnishd/cache/cache_vrt.c +++ b/bin/varnishd/cache/cache_vrt.c @@ -458,11 +458,9 @@ VRT_ban(const struct req *req, char *cmds, ...) a1 = va_arg(ap, char *); good = 1; } - if (!good) + if (!good || BAN_Insert(b) < 0) /* XXX: report error how ? */ BAN_Free(b); - else - BAN_Insert(b); } /*--------------------------------------------------------------------*/ @@ -505,11 +503,9 @@ VRT_ban_string(const struct req *req, const char *str) if (strcmp(av[i++], "&&")) break; } - if (!good) + if (!good || BAN_Insert(b) < 0) /* XXX: report error how ? */ BAN_Free(b); - else - BAN_Insert(b); VAV_Free(av); } -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:09 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:09 +0100 Subject: [PATCH 06/15] Add a BAN_Spec function, to get access to the byte representation of a ban. In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-6-git-send-email-martin@varnish-software.com> Will truncate GONE bans to only contain the timestamp. --- bin/varnishd/cache/cache.h | 1 + bin/varnishd/cache/cache_ban.c | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 8a73aa7..582dc0b 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -758,6 +758,7 @@ void BAN_Compile(void); struct ban *BAN_RefBan(struct objcore *oc, double t0, const struct ban *tail); void BAN_TailDeref(struct ban **ban); double BAN_Time(const struct ban *ban); +void BAN_Spec(const struct ban *ban, const uint8_t **spec, unsigned *len); /* cache_busyobj.c */ void VBO_Init(void); diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index afc9861..d15f6c5 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -637,6 +637,28 @@ BAN_Time(const struct ban *b) } /*-------------------------------------------------------------------- + * + * Get a bans byte spec and length for offline storage purpose + * (e.g. persistent stevedores). Truncates GONE bans to only include + * the timestamp. + */ + +void +BAN_Spec(const struct ban *ban, const uint8_t **spec, unsigned *len) +{ + CHECK_OBJ_NOTNULL(ban, BAN_MAGIC); + AN(spec); + AN(len); + + *spec = ban->spec; + if (ban->flags & BAN_F_GONE) + /* Truncate GONE bans */ + *len = BANHEAD_LEN_TS; + else + *len = ban_len(ban->spec); +} + +/*-------------------------------------------------------------------- * All silos have read their bans, ready for action */ -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:06 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:06 +0100 Subject: [PATCH 03/15] Fix bug in smp_baninfo causing duplicate ban entries. In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-3-git-send-email-martin@varnish-software.com> When generalizing the ban event reporting to the stevedores, where the event was reported first for each stevedore, and then for each silo on the global silos list. Fix this by adding a flag for when the silo is fully opened and ready for accepting ban events, and don't recurse on the global silos list. --- bin/varnishd/storage/storage_persistent.c | 16 +++++++++++----- bin/varnishd/storage/storage_persistent.h | 5 +++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c index 24a4d08..3a6ade5 100644 --- a/bin/varnishd/storage/storage_persistent.c +++ b/bin/varnishd/storage/storage_persistent.c @@ -98,13 +98,16 @@ smp_baninfo(struct stevedore *stv, enum baninfo event, { struct smp_sc *sc; - (void)stv; + CAST_OBJ_NOTNULL(sc, stv->priv, SMP_SC_MAGIC); + + if (!(sc->flags & SMP_SC_OPENED)) + /* Ignore ban events until we have been opened */ + return; + switch (event) { case BI_NEW: - VTAILQ_FOREACH(sc, &silos, list) { - smp_appendban(sc, &sc->ban1, len, ban); - smp_appendban(sc, &sc->ban2, len, ban); - } + smp_appendban(sc, &sc->ban1, len, ban); + smp_appendban(sc, &sc->ban2, len, ban); break; default: /* Ignored */ @@ -360,6 +363,9 @@ smp_open(const struct stevedore *st) if (smp_open_segs(sc, &sc->seg1)) AZ(smp_open_segs(sc, &sc->seg2)); + /* We are now open for business */ + sc->flags |= SMP_SC_OPENED; + /* * Grap a reference to the tail of the ban list, until the thread * has loaded all objects, so we can be sure that all of our diff --git a/bin/varnishd/storage/storage_persistent.h b/bin/varnishd/storage/storage_persistent.h index cb2efb3..6609e78 100644 --- a/bin/varnishd/storage/storage_persistent.h +++ b/bin/varnishd/storage/storage_persistent.h @@ -106,8 +106,9 @@ struct smp_sc { pthread_t bgthread; unsigned flags; -#define SMP_SC_LOADED (1 << 0) -#define SMP_SC_STOP (1 << 1) +#define SMP_SC_OPENED (1 << 0) +#define SMP_SC_LOADED (1 << 1) +#define SMP_SC_STOP (1 << 2) const struct stevedore *stevedore; int fd; -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:10 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:10 +0100 Subject: [PATCH 07/15] Report ban events through struct ban pointers. In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-7-git-send-email-martin@varnish-software.com> Stevedores will use BAN_Spec to get the ban byte string, which will be truncated for GONE bans. --- bin/varnishd/cache/cache.h | 2 +- bin/varnishd/cache/cache_ban.c | 7 +++---- bin/varnishd/storage/stevedore.c | 4 ++-- bin/varnishd/storage/storage.h | 3 ++- bin/varnishd/storage/storage_persistent.c | 10 ++++++---- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 582dc0b..f0bba19 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -1060,7 +1060,7 @@ void STV_free(struct storage *st); void STV_open(void); void STV_close(void); void STV_Freestore(struct object *o); -void STV_BanInfo(enum baninfo event, const uint8_t *ban, unsigned len); +void STV_BanInfo(enum baninfo event, const struct ban *ban); /* storage_synth.c */ struct vsb *SMS_Makesynth(struct object *obj); diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index d15f6c5..4853be3 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -442,7 +442,7 @@ BAN_Insert(struct ban *b) else be = NULL; - STV_BanInfo(BI_NEW, b->spec, ln); /* Notify stevedores */ + STV_BanInfo(BI_NEW, b); /* Notify stevedores */ Lck_Unlock(&ban_mtx); if (be == NULL) @@ -670,7 +670,7 @@ BAN_Compile(void) AZ(ban_shutdown); /* Notify stevedores */ - STV_BanInfo(BI_NEW, ban_magic->spec, ban_len(ban_magic->spec)); + STV_BanInfo(BI_NEW, ban_magic); ban_start = VTAILQ_FIRST(&ban_head); WRK_BgThread(&ban_thread, "ban-lurker", ban_lurker, NULL); @@ -1030,8 +1030,7 @@ ban_lurker(struct worker *wrk, void *priv) bf = ban_CheckLast(); if (bf != NULL) /* Notify stevedores */ - STV_BanInfo(BI_DROP, bf->spec, - ban_len(bf->spec)); + STV_BanInfo(BI_DROP, bf); Lck_Unlock(&ban_mtx); if (bf != NULL) BAN_Free(bf); diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c index 5262b70..c64fb62 100644 --- a/bin/varnishd/storage/stevedore.c +++ b/bin/varnishd/storage/stevedore.c @@ -454,13 +454,13 @@ STV_close(void) } void -STV_BanInfo(enum baninfo event, const uint8_t *ban, unsigned len) +STV_BanInfo(enum baninfo event, const struct ban *ban) { struct stevedore *stv; VTAILQ_FOREACH(stv, &stv_stevedores, list) if (stv->baninfo != NULL) - stv->baninfo(stv, event, ban, len); + stv->baninfo(stv, event, ban); } /*-------------------------------------------------------------------- diff --git a/bin/varnishd/storage/storage.h b/bin/varnishd/storage/storage.h index e9971e7..f54b8c3 100644 --- a/bin/varnishd/storage/storage.h +++ b/bin/varnishd/storage/storage.h @@ -38,6 +38,7 @@ struct busyobj; struct objcore; struct worker; struct lru; +struct ban; typedef void storage_init_f(struct stevedore *, int ac, char * const *av); typedef void storage_open_f(const struct stevedore *); @@ -49,7 +50,7 @@ typedef struct object *storage_allocobj_f(struct stevedore *, struct busyobj *, typedef void storage_close_f(const struct stevedore *); typedef void storage_signal_close_f(const struct stevedore *); typedef void storage_baninfo_f(struct stevedore *, enum baninfo event, - const uint8_t *ban, unsigned len); + const struct ban *ban); /* Prototypes for VCL variable responders */ #define VRTSTVTYPE(ct) typedef ct storage_var_##ct(const struct stevedore *); diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c index 3a6ade5..ec306e6 100644 --- a/bin/varnishd/storage/storage_persistent.c +++ b/bin/varnishd/storage/storage_persistent.c @@ -93,10 +93,11 @@ smp_appendban(struct smp_sc *sc, struct smp_signspace *spc, /* Trust that cache_ban.c takes care of locking */ static void -smp_baninfo(struct stevedore *stv, enum baninfo event, - const uint8_t *ban, unsigned len) +smp_baninfo(struct stevedore *stv, enum baninfo event, const struct ban *ban) { struct smp_sc *sc; + const uint8_t *spec; + unsigned len; CAST_OBJ_NOTNULL(sc, stv->priv, SMP_SC_MAGIC); @@ -106,8 +107,9 @@ smp_baninfo(struct stevedore *stv, enum baninfo event, switch (event) { case BI_NEW: - smp_appendban(sc, &sc->ban1, len, ban); - smp_appendban(sc, &sc->ban2, len, ban); + BAN_Spec(ban, &spec, &len); + smp_appendban(sc, &sc->ban1, len, spec); + smp_appendban(sc, &sc->ban2, len, spec); break; default: /* Ignored */ -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:07 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:07 +0100 Subject: [PATCH 04/15] Add defines for ban header sizes and offsets, and use them In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-4-git-send-email-martin@varnish-software.com> --- bin/varnishd/cache/cache_ban.c | 53 ++++++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index 7f02f90..f44d98d 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -41,7 +41,7 @@ * Bans are compiled into bytestrings as follows: * 8 bytes - double: timestamp XXX: Byteorder ? * 4 bytes - be32: length - * 1 byte - flags: 0x01: BAN_F_REQ + * 1 byte - flags: 0x01: BANHEAD_F_REQ <-> BAN_F_REQ * N tests * A test have this form: * 1 byte - arg (see ban_vars.h col 3 "BAN_ARG_XXX") @@ -107,6 +107,17 @@ static bgthread_t ban_lurker; static int ban_shutdown = 0; /*-------------------------------------------------------------------- + * BANHEAD data markers + */ + +#define BANHEAD_F_REQ (1 << 0) + +#define BANHEAD_O_TS 0 +#define BANHEAD_O_LEN 8 +#define BANHEAD_O_FLAGS 12 +#define BANHEAD_LEN 13 + +/*-------------------------------------------------------------------- * BAN string magic markers */ @@ -221,7 +232,7 @@ ban_len(const uint8_t *banspec) { unsigned u; - u = vbe32dec(banspec + 8); + u = vbe32dec(banspec + BANHEAD_O_LEN); return (u); } @@ -396,15 +407,17 @@ BAN_Insert(struct ban *b) ln = VSB_len(b->vsb); assert(ln >= 0); - b->spec = malloc(ln + 13L); /* XXX */ + b->spec = malloc(ln + BANHEAD_LEN); XXXAN(b->spec); t0 = VTIM_real(); - memcpy(b->spec, &t0, sizeof t0); - b->spec[12] = (b->flags & BAN_F_REQ) ? 1 : 0; - memcpy(b->spec + 13, VSB_data(b->vsb), ln); - ln += 13; - vbe32enc(b->spec + 8, ln); + memcpy(b->spec + BANHEAD_O_TS, &t0, sizeof t0); + b->spec[BANHEAD_O_FLAGS] = 0; + if (b->flags & BAN_F_REQ) + b->spec[BANHEAD_O_FLAGS] |= BANHEAD_F_REQ; + memcpy(b->spec + BANHEAD_LEN, VSB_data(b->vsb), ln); + ln += BANHEAD_LEN; + vbe32enc(b->spec + BANHEAD_O_LEN, ln); VSB_delete(b->vsb); b->vsb = NULL; @@ -531,7 +544,7 @@ void BAN_Reload(const uint8_t *ban, unsigned len) { struct ban *b, *b2; - int gone = 0; + int duplicate = 0; double t0, t1, t2 = 9e99; ASSERT_CLI(); @@ -552,11 +565,9 @@ BAN_Reload(const uint8_t *ban, unsigned len) } if (t1 < t0) break; - if (!memcmp(b->spec + 8, ban + 8, len - 8)) { - gone |= BAN_F_GONE; - VSC_C_main->bans_dups++; - VSC_C_main->bans_gone++; - } + if (!memcmp(b->spec + BANHEAD_O_LEN, ban + BANHEAD_O_LEN, + len - BANHEAD_O_LEN)) + duplicate = 1; } VSC_C_main->bans++; @@ -567,9 +578,14 @@ BAN_Reload(const uint8_t *ban, unsigned len) b2->spec = malloc(len); AN(b2->spec); memcpy(b2->spec, ban, len); - b2->flags |= gone; - if (ban[12]) + if (duplicate) { + VSC_C_main->bans_dups++; + b2->flags |= BAN_F_GONE; + } + if (ban[BANHEAD_O_FLAGS] & BANHEAD_F_REQ) b2->flags |= BAN_F_REQ; + if (b2->flags & BAN_F_GONE) + VSC_C_main->bans_gone++; if (b == NULL) VTAILQ_INSERT_TAIL(&ban_head, b2, list); else @@ -579,7 +595,8 @@ BAN_Reload(const uint8_t *ban, unsigned len) for (b = VTAILQ_NEXT(b2, list); b != NULL; b = VTAILQ_NEXT(b, list)) { if (b->flags & BAN_F_GONE) continue; - if (!memcmp(b->spec + 8, ban + 8, len - 8)) { + if (!memcmp(b->spec + BANHEAD_O_LEN, ban + BANHEAD_O_LEN, + len - BANHEAD_O_LEN)) { b->flags |= BAN_F_GONE; VSC_C_main->bans_dups++; VSC_C_main->bans_gone++; @@ -1075,7 +1092,7 @@ ban_render(struct cli *cli, const uint8_t *bs) const uint8_t *be; be = bs + ban_len(bs); - bs += 13; + bs += BANHEAD_LEN; while (bs < be) { ban_iter(&bs, &bt); switch (bt.arg1) { -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:14 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:14 +0100 Subject: [PATCH 11/15] Recompile the silo ban lists on BanCompile callback In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-11-git-send-email-martin@varnish-software.com> --- bin/varnishd/storage/storage_persistent.c | 49 +++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c index ec306e6..ba7996d 100644 --- a/bin/varnishd/storage/storage_persistent.c +++ b/bin/varnishd/storage/storage_persistent.c @@ -117,6 +117,54 @@ smp_baninfo(struct stevedore *stv, enum baninfo event, const struct ban *ban) } } +/* Write the current ban list from 'tailb' to the head to the + * silo. This will compact the list removing any dropped bans, and + * compacting any gone bans. */ + +static void +smp_recompile_bans(struct smp_sc *sc, const struct ban *tail) +{ + const struct ban *b; + uint8_t *ptr, *ptr2; + const uint8_t *spec; + unsigned len; + + /* Write the list to ban1 */ + smp_reset_signspace(&sc->ban1); + ptr = ptr2 = SIGNSPACE_FRONT(&sc->ban1); + for (b = tail; b != NULL; b = BAN_Prev(b)) { + BAN_Spec(b, &spec, &len); + assert(SIGNSPACE_FREE(&sc->ban1) >= (ptr - ptr2) + 4 + 4 + len); + memcpy(ptr, "BAN", 4); + ptr += 4; + vbe32enc(ptr, len); + ptr += 4; + memcpy(ptr, spec, len); + ptr += len; + } + smp_append_signspace(&sc->ban1, ptr - ptr2); + smp_sync_sign(&sc->ban1.ctx); + + /* Copy to ban2 */ + smp_copy_signspace(&sc->ban2, &sc->ban1); + smp_sync_sign(&sc->ban2.ctx); +} + +/* Recompile the silo ban lists from the live ban list. Trust that + * cache_ban.c takes care of the locking */ +static void +smp_bancompile(const struct stevedore *stv) +{ + struct smp_sc *sc; + const struct ban *tailb; + + ASSERT_CLI(); + CAST_OBJ_NOTNULL(sc, stv->priv, SMP_SC_MAGIC); + + tailb = BAN_Prev(NULL); /* Safe as we are running under ban mtx */ + smp_recompile_bans(sc, tailb); +} + /*-------------------------------------------------------------------- * Attempt to open and read in a ban list */ @@ -611,6 +659,7 @@ const struct stevedore smp_stevedore = { .free = smp_free, .signal_close = smp_signal_close, .baninfo = smp_baninfo, + .bancompile = smp_bancompile, }; /*-------------------------------------------------------------------- -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:13 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:13 +0100 Subject: [PATCH 10/15] Add a BAN_Prev function that can be used to iterate over the live ban list In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-10-git-send-email-martin@varnish-software.com> --- bin/varnishd/cache/cache.h | 1 + bin/varnishd/cache/cache_ban.c | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 40f8388..c38de0a 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -759,6 +759,7 @@ struct ban *BAN_RefBan(struct objcore *oc, double t0, const struct ban *tail); void BAN_TailDeref(struct ban **ban); double BAN_Time(const struct ban *ban); void BAN_Spec(const struct ban *ban, const uint8_t **spec, unsigned *len); +const struct ban *BAN_Prev(const struct ban *ban); /* cache_busyobj.c */ void VBO_Init(void); diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index 1820f94..d13e5a6 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -659,6 +659,23 @@ BAN_Spec(const struct ban *ban, const uint8_t **spec, unsigned *len) } /*-------------------------------------------------------------------- + * Return the ban before 'ban'. Returns the tail if 'ban' is NULL. + * Returns NULL if 'ban' is the first ban. + * + * Note: Caller should have a ref to a ban at 'ban' or later in the + * list, or be running under the ban mtx. + */ + +const struct ban * +BAN_Prev(const struct ban *ban) +{ + if (ban == NULL) + return (VTAILQ_LAST(&ban_head, banhead_s)); + CHECK_OBJ_NOTNULL(ban, BAN_MAGIC); + return (VTAILQ_PREV(ban, banhead_s, list)); +} + +/*-------------------------------------------------------------------- * All silos have read their bans, ready for action */ -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:16 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:16 +0100 Subject: [PATCH 13/15] Report bans transitioning to GONE through STV_BanInfo In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-13-git-send-email-martin@varnish-software.com> --- bin/varnishd/cache/cache_ban.c | 2 ++ bin/varnishd/common/common.h | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index d13e5a6..48bde0e 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -459,6 +459,7 @@ BAN_Insert(struct ban *b) if (memcmp(b->spec + 8, bi->spec + 8, ln - 8)) continue; bi->flags |= BAN_F_GONE; + STV_BanInfo(BI_GONE, bi); VSC_C_main->bans_gone++; VSC_C_main->bans_dups++; } @@ -1016,6 +1017,7 @@ ban_lurker_work(struct worker *wrk, struct vsl_log *vsl, unsigned pass) if (!(b->flags & BAN_F_REQ)) { if (!(b->flags & BAN_F_GONE)) { b->flags |= BAN_F_GONE; + STV_BanInfo(BI_GONE, b); VSC_C_main->bans_gone++; } if (DO_DEBUG(DBG_LURKER)) diff --git a/bin/varnishd/common/common.h b/bin/varnishd/common/common.h index 8140734..d09c1d1 100644 --- a/bin/varnishd/common/common.h +++ b/bin/varnishd/common/common.h @@ -47,7 +47,8 @@ enum baninfo { BI_NEW, - BI_DROP + BI_DROP, + BI_GONE }; struct cli; -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:15 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:15 +0100 Subject: [PATCH 12/15] Recompile the silo ban lists on exit In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-12-git-send-email-martin@varnish-software.com> --- bin/varnishd/storage/storage_persistent.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c index ba7996d..bfa5e0c 100644 --- a/bin/varnishd/storage/storage_persistent.c +++ b/bin/varnishd/storage/storage_persistent.c @@ -462,6 +462,7 @@ static void smp_close(const struct stevedore *st) { struct smp_sc *sc; + struct ban *tailb; void *status; ASSERT_CLI(); @@ -470,6 +471,11 @@ smp_close(const struct stevedore *st) AZ(pthread_join(sc->bgthread, &status)); AZ(status); + + /* Recompile the ban lists to get a compacted version */ + tailb = BAN_TailRef(); + smp_recompile_bans(sc, tailb); + BAN_TailDeref(&tailb); } /*-------------------------------------------------------------------- -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:12 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:12 +0100 Subject: [PATCH 09/15] Add a BanCompile stevedore callback that the ban code will call when the complete ban lists have been compiled. In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-9-git-send-email-martin@varnish-software.com> --- bin/varnishd/cache/cache.h | 1 + bin/varnishd/cache/cache_ban.c | 5 +++++ bin/varnishd/storage/stevedore.c | 13 +++++++++++++ bin/varnishd/storage/storage.h | 2 ++ 4 files changed, 21 insertions(+) diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index f0bba19..40f8388 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -1061,6 +1061,7 @@ void STV_open(void); void STV_close(void); void STV_Freestore(struct object *o); void STV_BanInfo(enum baninfo event, const struct ban *ban); +void STV_BanCompile(void); /* storage_synth.c */ struct vsb *SMS_Makesynth(struct object *obj); diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index 4853be3..1820f94 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -672,6 +672,11 @@ BAN_Compile(void) /* Notify stevedores */ STV_BanInfo(BI_NEW, ban_magic); + /* Notify stevedores that the complete ban lists has been compiled */ + Lck_Lock(&ban_mtx); + STV_BanCompile(); + Lck_Unlock(&ban_mtx); + ban_start = VTAILQ_FIRST(&ban_head); WRK_BgThread(&ban_thread, "ban-lurker", ban_lurker, NULL); } diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c index 01818b1..1fb803f 100644 --- a/bin/varnishd/storage/stevedore.c +++ b/bin/varnishd/storage/stevedore.c @@ -466,6 +466,19 @@ STV_BanInfo(enum baninfo event, const struct ban *ban) stv->baninfo(stv, event, ban); } +void +STV_BanCompile(void) +{ + struct stevedore *stv; + + VTAILQ_FOREACH(stv, &stv_stevedores, list) + if (stv->bancompile != NULL) + stv->bancompile(stv); + stv = stv_transient; + if (stv->bancompile != NULL) + stv->bancompile(stv); +} + /*-------------------------------------------------------------------- * VRT functions for stevedores */ diff --git a/bin/varnishd/storage/storage.h b/bin/varnishd/storage/storage.h index f54b8c3..03dc6ce 100644 --- a/bin/varnishd/storage/storage.h +++ b/bin/varnishd/storage/storage.h @@ -51,6 +51,7 @@ typedef void storage_close_f(const struct stevedore *); typedef void storage_signal_close_f(const struct stevedore *); typedef void storage_baninfo_f(struct stevedore *, enum baninfo event, const struct ban *ban); +typedef void storage_bancompile_f(const struct stevedore *); /* Prototypes for VCL variable responders */ #define VRTSTVTYPE(ct) typedef ct storage_var_##ct(const struct stevedore *); @@ -75,6 +76,7 @@ struct stevedore { storage_allocobj_f *allocobj; /* --//-- */ storage_signal_close_f *signal_close; /* --//-- */ storage_baninfo_f *baninfo; /* --//-- */ + storage_bancompile_f *bancompile; /* --//-- */ struct lru *lru; -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:11 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:11 +0100 Subject: [PATCH 08/15] Also report ban events to the transient stevedore (in case it wants to know) In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-8-git-send-email-martin@varnish-software.com> --- bin/varnishd/storage/stevedore.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c index c64fb62..01818b1 100644 --- a/bin/varnishd/storage/stevedore.c +++ b/bin/varnishd/storage/stevedore.c @@ -461,6 +461,9 @@ STV_BanInfo(enum baninfo event, const struct ban *ban) VTAILQ_FOREACH(stv, &stv_stevedores, list) if (stv->baninfo != NULL) stv->baninfo(stv, event, ban); + stv = stv_transient; + if (stv->baninfo != NULL) + stv->baninfo(stv, event, ban); } /*-------------------------------------------------------------------- -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:17 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:17 +0100 Subject: [PATCH 14/15] Keep track of how many bans we have in the silo ban lists, and how many of these have since been dropped or marked gone. In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-14-git-send-email-martin@varnish-software.com> --- bin/varnishd/storage/storage_persistent.c | 11 +++++++++++ bin/varnishd/storage/storage_persistent.h | 7 +++++++ 2 files changed, 18 insertions(+) diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c index bfa5e0c..86b94f8 100644 --- a/bin/varnishd/storage/storage_persistent.c +++ b/bin/varnishd/storage/storage_persistent.c @@ -110,6 +110,13 @@ smp_baninfo(struct stevedore *stv, enum baninfo event, const struct ban *ban) BAN_Spec(ban, &spec, &len); smp_appendban(sc, &sc->ban1, len, spec); smp_appendban(sc, &sc->ban2, len, spec); + sc->n_ban++; + break; + case BI_DROP: + sc->n_ban_dropped++; + break; + case BI_GONE: + sc->n_ban_gone++; break; default: /* Ignored */ @@ -132,6 +139,7 @@ smp_recompile_bans(struct smp_sc *sc, const struct ban *tail) /* Write the list to ban1 */ smp_reset_signspace(&sc->ban1); ptr = ptr2 = SIGNSPACE_FRONT(&sc->ban1); + sc->n_ban = sc->n_ban_dropped = sc->n_ban_gone = 0; for (b = tail; b != NULL; b = BAN_Prev(b)) { BAN_Spec(b, &spec, &len); assert(SIGNSPACE_FREE(&sc->ban1) >= (ptr - ptr2) + 4 + 4 + len); @@ -141,6 +149,7 @@ smp_recompile_bans(struct smp_sc *sc, const struct ban *tail) ptr += 4; memcpy(ptr, spec, len); ptr += len; + sc->n_ban++; } smp_append_signspace(&sc->ban1, ptr - ptr2); smp_sync_sign(&sc->ban1.ctx); @@ -184,6 +193,7 @@ smp_open_bans(struct smp_sc *sc, struct smp_signspace *spc) ptr = SIGNSPACE_DATA(spc); pe = SIGNSPACE_FRONT(spc); + sc->n_ban = sc->n_ban_dropped = sc->n_ban_gone = 0; while (ptr < pe) { if (memcmp(ptr, "BAN", 4)) { retval = 1001; @@ -200,6 +210,7 @@ smp_open_bans(struct smp_sc *sc, struct smp_signspace *spc) } BAN_Reload(ptr, length); + sc->n_ban++; ptr += length; } diff --git a/bin/varnishd/storage/storage_persistent.h b/bin/varnishd/storage/storage_persistent.h index 6609e78..8a3f145 100644 --- a/bin/varnishd/storage/storage_persistent.h +++ b/bin/varnishd/storage/storage_persistent.h @@ -139,6 +139,13 @@ struct smp_sc { struct smp_signspace seg1; struct smp_signspace seg2; + /* Counters to keep track of how many bans we have in the + * lists, and how many of these that has since been dropped or + * marked gone */ + unsigned n_ban; + unsigned n_ban_dropped; + unsigned n_ban_gone; + struct ban *tailban; struct lock mtx; -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 11:32:18 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 12:32:18 +0100 Subject: [PATCH 15/15] Recompile the ban lists if we don't have enough space to append a new ban. In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <1352287938-7247-15-git-send-email-martin@varnish-software.com> --- bin/varnishd/storage/storage_persistent.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c index 86b94f8..bc11637 100644 --- a/bin/varnishd/storage/storage_persistent.c +++ b/bin/varnishd/storage/storage_persistent.c @@ -68,6 +68,8 @@ static VTAILQ_HEAD(,smp_sc) silos = VTAILQ_HEAD_INITIALIZER(silos); * Add bans to silos */ +static void smp_recompile_bans(struct smp_sc *sc, const struct ban *tail); + static void smp_appendban(struct smp_sc *sc, struct smp_signspace *spc, uint32_t len, const uint8_t *ban) @@ -108,9 +110,18 @@ smp_baninfo(struct stevedore *stv, enum baninfo event, const struct ban *ban) switch (event) { case BI_NEW: BAN_Spec(ban, &spec, &len); - smp_appendban(sc, &sc->ban1, len, spec); - smp_appendban(sc, &sc->ban2, len, spec); - sc->n_ban++; + if (SIGNSPACE_FREE(&sc->ban1) < 4 + 4 + len) { + /* Assert unless the recompiled ban lists + * frees/truncates at least 10% of the + * bans */ + assert(sc->n_ban_dropped + sc->n_ban_gone >= + sc->n_ban / 10); + smp_recompile_bans(sc, BAN_Prev(NULL)); + } else { + smp_appendban(sc, &sc->ban1, len, spec); + smp_appendban(sc, &sc->ban2, len, spec); + sc->n_ban++; + } break; case BI_DROP: sc->n_ban_dropped++; -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 12:01:40 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 13:01:40 +0100 Subject: [PATCH 1/2] Increment bans_req counter when reloading bans that refer to req.* Message-ID: <1352289701-32006-1-git-send-email-martin@varnish-software.com> Fixes: #1225 --- bin/varnishd/cache/cache_ban.c | 4 ++- bin/varnishtest/tests/r01225.vtc | 62 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 bin/varnishtest/tests/r01225.vtc diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index 48bde0e..2acfe80 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -599,8 +599,10 @@ BAN_Reload(const uint8_t *ban, unsigned len) VSC_C_main->bans_dups++; b2->flags |= BAN_F_GONE; } - if (ban[BANHEAD_O_FLAGS] & BANHEAD_F_REQ) + if (ban[BANHEAD_O_FLAGS] & BANHEAD_F_REQ) { b2->flags |= BAN_F_REQ; + VSC_C_main->bans_req++; + } if (b2->flags & BAN_F_GONE) VSC_C_main->bans_gone++; if (b == NULL) diff --git a/bin/varnishtest/tests/r01225.vtc b/bin/varnishtest/tests/r01225.vtc new file mode 100644 index 0000000..a74d125 --- /dev/null +++ b/bin/varnishtest/tests/r01225.vtc @@ -0,0 +1,62 @@ +varnishtest "Test bans_req counter on persistent reload - #1225" + +shell "rm -f ${tmpdir}/_.per" + +server s1 { + rxreq + txresp -hdr "Foo: foo" +} -start + +varnish v1 \ + -arg "-pfeature=+wait_silo" \ + -storage "-spersistent,${tmpdir}/_.per,10m" \ + -arg "-pban_lurker_sleep=0.01" \ + -vcl+backend { } -start + +varnish v1 -cliok ban.list + +client c1 { + txreq -url "/" + rxresp + expect resp.status == 200 + expect resp.http.X-Varnish == "1001" + expect resp.http.foo == "foo" +} -run + +# Count of 1 here (magic ban only) +varnish v1 -expect bans == 1 +varnish v1 -cliok "ban req.url == /" +varnish v1 -cliok ban.list + +# Count of 2 here (our + magic ban) +varnish v1 -expect bans == 2 +varnish v1 -expect bans_req == 1 +varnish v1 -stop +server s1 -wait + +server s1 { + rxreq + txresp -hdr "Foo: bar" +} -start + +varnish v1 -vcl+backend {} -start + +varnish v1 -cliok ban.list + +# Count of 3 here, our pluss magic bans from 2 startups +varnish v1 -expect bans == 3 + +client c1 { + txreq -url "/" + rxresp + expect resp.status == 200 + expect resp.http.X-Varnish == "1001" + expect resp.http.foo == "bar" +} -run + +varnish v1 -cliok ban.list +# Count of 1 here +varnish v1 -expect bans == 1 +varnish v1 -expect bans_req == 0 + +varnish v1 -stop -- 1.7.9.5 From martin at varnish-software.com Wed Nov 7 12:01:41 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 7 Nov 2012 13:01:41 +0100 Subject: [PATCH 2/2] Don't hide the last ban in the list on the CLI ban.list output In-Reply-To: <1352289701-32006-1-git-send-email-martin@varnish-software.com> References: <1352289701-32006-1-git-send-email-martin@varnish-software.com> Message-ID: <1352289701-32006-2-git-send-email-martin@varnish-software.com> --- bin/varnishd/cache/cache_ban.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index 2acfe80..712b095 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -1200,8 +1200,6 @@ ccf_ban_list(struct cli *cli, const char * const *av, void *priv) VCLI_Out(cli, "Present bans:\n"); VTAILQ_FOREACH(b, &ban_head, list) { - if (b == bl && !DO_DEBUG(DBG_LURKER)) - break; VCLI_Out(cli, "%10.6f %5u%s\t", ban_time(b->spec), bl == b ? b->refcount - 1 : b->refcount, b->flags & BAN_F_GONE ? "G" : " "); -- 1.7.9.5 From luis.sanmartin at unix.cl Wed Nov 7 12:34:14 2012 From: luis.sanmartin at unix.cl (Luis San Martin) Date: Wed, 7 Nov 2012 09:34:14 -0300 Subject: varnish 2.1.5 on ia64 In-Reply-To: References: <44001.1352119794@critter.freebsd.dk> <60205.1352124238@critter.freebsd.dk> <60257.1352124952@critter.freebsd.dk> <60974.1352126853@critter.freebsd.dk> Message-ID: Is there any hope? :-( I'd be glad to help or make it easier any debug process. Kind regards On Mon, Nov 5, 2012 at 11:53 AM, Luis San Martin wrote: > I already checked, even removed any *comment*. I attach the file anyway. > > > On Mon, Nov 5, 2012 at 11:47 AM, Poul-Henning Kamp wrote: > >> -------- >> In message > CmyTxP_9gWRLBz4gg5L8kwXAN1qiaTOg-pc9w at mail.gmail.com> >> , Luis San Martin writes: >> >> ># ./varnishd -C -b 127.0.0.1 >> >Message from VCC-compiler: >> >/* ... */ comment contains /* >> >('Default' Line 1 Pos 1) >> >/*/*/*/*opyright (c) 2006 Verdens Gang AS >> >##--------------------------------------- >> >> Ok, now we're getting somewhere.... >> >> Can you check that the bin/varnishd/default.vcl file does not >> look like that in the first line ? >> >> -- >> Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 >> phk at FreeBSD.ORG | TCP/IP since RFC 956 >> FreeBSD committer | BSD since 4.3-tahoe >> Never attribute to malice what can adequately be explained by >> incompetence. >> > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From phk at phk.freebsd.dk Wed Nov 7 12:41:35 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Wed, 07 Nov 2012 12:41:35 +0000 Subject: varnish 2.1.5 on ia64 In-Reply-To: References: <44001.1352119794@critter.freebsd.dk> <60205.1352124238@critter.freebsd.dk> <60257.1352124952@critter.freebsd.dk> <60974.1352126853@critter.freebsd.dk> Message-ID: <16089.1352292095@critter.freebsd.dk> -------- In message , Luis San Martin writes: >Is there any hope? :-( >I'd be glad to help or make it easier any debug process. Sorry, got a bit distracted. Yes, there is certainly hope, we just have to find the problems, but time is a bit tight for me right now. -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From gbordiau at work4labs.com Thu Nov 8 10:41:34 2012 From: gbordiau at work4labs.com (Guilhaume Bordiau) Date: Thu, 8 Nov 2012 11:41:34 +0100 Subject: Passing variable data to ESI requests Message-ID: Hello, We're using Varnish since a few weeks but are facing the issue of using dynamic content inside cached pages. We tried ESI for that but it appears that there's no way to pass some (or all) of the original request elements (headers, cookies) to the ESI request made toward our server. We implemented hacks through cookies read from javascript, triggering ajax requests, but we're facing maintainability issues around browsers refusing cookies (our app run in an iframe and domains are different from the top frame). So we're starting to think of developing the missing part of code in Varnish that could make it do what we need: Allow to pass the original request headers and cookies to the ESI URI contained in a cached page. So my questions are: - Can you confirm that's it's currently not possible? - What would be the amount of work to achieve this? - Any tips to help me getting started with this? Much thanks in advance to all. Guilhaume Bordiau. -------------- next part -------------- An HTML attachment was scrubbed... URL: From Raul.Rangel at disney.com Thu Nov 8 15:38:47 2012 From: Raul.Rangel at disney.com (Rangel, Raul) Date: Thu, 8 Nov 2012 07:38:47 -0800 Subject: Passing variable data to ESI requests In-Reply-To: References: Message-ID: Guilhaume, There are a few tricks you can use to do this. First of all you can extract the cookie that you are interested in and place it in a header. vcl_recv { set req.http.X-Cookie-One = regsub(req.http.Cookie,"^.*?mycookie=([^;]*);*.*$" , "\1"); unset req.http.Cookie; } Then when varnish does the request to the parent page you can completely ignore the X-Cookie-One header. As for the subsequent ESI requests they too should also have the X-Cookie-One header attached to them. In your back end you should be able to read the header and in the response include a Very: X-Cookie-One. This way you get per user caching on the ESI. Raul From: varnish-dev-bounces at varnish-cache.org [mailto:varnish-dev-bounces at varnish-cache.org] On Behalf Of Guilhaume Bordiau Sent: Thursday, November 08, 2012 3:42 AM To: varnish-dev at varnish-cache.org Subject: Passing variable data to ESI requests Hello, We're using Varnish since a few weeks but are facing the issue of using dynamic content inside cached pages. We tried ESI for that but it appears that there's no way to pass some (or all) of the original request elements (headers, cookies) to the ESI request made toward our server. We implemented hacks through cookies read from javascript, triggering ajax requests, but we're facing maintainability issues around browsers refusing cookies (our app run in an iframe and domains are different from the top frame). So we're starting to think of developing the missing part of code in Varnish that could make it do what we need: Allow to pass the original request headers and cookies to the ESI URI contained in a cached page. So my questions are: - Can you confirm that's it's currently not possible? - What would be the amount of work to achieve this? - Any tips to help me getting started with this? Much thanks in advance to all. Guilhaume Bordiau. -------------- next part -------------- An HTML attachment was scrubbed... URL: From gmoniey at gmail.com Fri Nov 9 06:21:28 2012 From: gmoniey at gmail.com (.) Date: Thu, 8 Nov 2012 22:21:28 -0800 Subject: Trouble understanding why Varnish retries on backend timeouts Message-ID: I recently got bit by this functionality, and I was hoping that someone could shed some light on why this is the default behavior for varnish. For context, I have an internal POST call, that only recently became long running, and would timeout (although the actually call would complete), and as a result, varnish apparently retries the POST, which resulted in the action being performed several times. From everything I have read online, the retry should only occur once, but I could have sworn I saw it happen multiple times. I found some forum posts online indicating the retry logic exists: https://www.varnish-cache.org/lists/pipermail/varnish-misc/2010-December/019538.html and even a patch (which doesn't seem to have been applied): https://www.varnish-cache.org/lists/pipermail/varnish-dev/2011-August/006857.html Granted, I should move the long running process to a background job (which I am doing now), but I was hoping to get some understanding as to why this logic exists. Thanks. -------------- next part -------------- An HTML attachment was scrubbed... URL: From jammy.linux at gmail.com Mon Nov 12 06:27:45 2012 From: jammy.linux at gmail.com (Jammy) Date: Mon, 12 Nov 2012 14:27:45 +0800 Subject: Move the call RES_StreamPoll after the testgzip, because the RES_StreamPoll may destroy the store during pass or hit_for_pass. Message-ID: <132EBF5A-B9D7-43B0-AF01-3296C557D656@gmail.com> Issue: https://www.varnish-cache.org/trac/ticket/1220 The fix: Move the call RES_StreamPoll after the testgzip, because the RES_StreamPoll may destroy the store during pass or hit_for_pass. From 43459e5dd1acdc74f40efc3e507ee0035592fd54 Mon Sep 17 00:00:00 2001 From: ijammy Date: Mon, 12 Nov 2012 14:19:13 +0800 Subject: [PATCH] Move the call RES_StreamPoll after the testgzip, because the stream poll may destroy the store during pass or hit_for_pass --- bin/varnishd/cache_gzip.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/varnishd/cache_gzip.c b/bin/varnishd/cache_gzip.c index 07bdcac..165163b 100644 --- a/bin/varnishd/cache_gzip.c +++ b/bin/varnishd/cache_gzip.c @@ -647,8 +647,6 @@ vfp_testgzip_bytes(struct sess *sp, struct http_conn *htc, ssize_t bytes) VGZ_Ibuf(vg, st->ptr + st->len, w); st->len += w; sp->obj->len += w; - if (sp->wrk->do_stream) - RES_StreamPoll(sp); while (!VGZ_IbufEmpty(vg)) { VGZ_Obuf(vg, obuf, sizeof obuf); @@ -660,6 +658,10 @@ vfp_testgzip_bytes(struct sess *sp, struct http_conn *htc, ssize_t bytes) "Invalid Gzip data", vg->vz.msg)); } + + if (sp->wrk->do_stream) + RES_StreamPoll(sp); + } assert(i == VGZ_OK || i == VGZ_END); return (1); -- 1.7.10.2 (Apple Git-33) ---------------------------------- Best wishes, Jammy -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 0001-Move-the-call-RES_StreamPoll-after-the-testgzip-beca.patch Type: application/octet-stream Size: 1121 bytes Desc: not available URL: -------------- next part -------------- An HTML attachment was scrubbed... URL: From phk at phk.freebsd.dk Mon Nov 12 08:51:31 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Mon, 12 Nov 2012 08:51:31 +0000 Subject: [PATCH 2/2] Don't hide the last ban in the list on the CLI ban.list output In-Reply-To: <1352289701-32006-2-git-send-email-martin@varnish-software.com> References: <1352289701-32006-1-git-send-email-martin@varnish-software.com> <1352289701-32006-2-git-send-email-martin@varnish-software.com> Message-ID: <49714.1352710291@critter.freebsd.dk> -------- In message <1352289701-32006-2-git-send-email-martin at varnish-software.com>, Mar tin Blix Grydeland writes: What is the rationale for this patch ? -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From phk at phk.freebsd.dk Mon Nov 12 08:54:59 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Mon, 12 Nov 2012 08:54:59 +0000 Subject: [PATCH 01/15] Start the thread pools as the last init item before the main loop. In-Reply-To: <1352287938-7247-1-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> Message-ID: <49733.1352710499@critter.freebsd.dk> -------- In message <1352287938-7247-1-git-send-email-martin at varnish-software.com>, Mart in Blix Grydeland writes: >This should solve the potential race existing now, where the worker >threads may start handling connections before a lot of the >initialization routines has been done. This may be right in spirit, but I think it is wrong in practice: We want to start the pools as early as we can so they can create their minimum complement of threads. The right thing to do is probably to introduce and raise a flag when when are in business. -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From phk at phk.freebsd.dk Mon Nov 12 09:40:15 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Mon, 12 Nov 2012 09:40:15 +0000 Subject: [PATCH 02/15] Add a BAN_Shutdown() routine that is called before STV_Close(), and makes sure that the ban lists will not change until we exit. In-Reply-To: <1352287938-7247-2-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> <1352287938-7247-2-git-send-email-martin@varnish-software.com> Message-ID: <73627.1352713215@critter.freebsd.dk> -------- In message <1352287938-7247-2-git-send-email-martin at varnish-software.com>, Mart in Blix Grydeland writes: >This is to give persistent stevedores a chance to clean up their ban >lists without having to worry about the lists changing under them >(normally the ban callbacks are called under the ban mutex, but not so >during exit). I don't have a problem with the idea, but I don't like having BAN_Insert() return a failure we don't know how to handle. I think BAN_Insert() should take ownership of the ban even when it fails, but returning a status code is probably a good idea, provided it gets used for something somewhere. I think it should be used in the CLI::ban case, so that a cluster-controller can keep track of which bans have been entered on which varnish instances. >Also remove the duplicate drop tail bans code. That is now only done >in the main thread loop. This breaks r01030.vtc so it should probably be done in its own commit. -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From phk at phk.freebsd.dk Mon Nov 12 10:01:02 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Mon, 12 Nov 2012 10:01:02 +0000 Subject: [PATCH 04/15] Add defines for ban header sizes and offsets, and use them In-Reply-To: <1352287938-7247-4-git-send-email-martin@varnish-software.com> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> <1352287938-7247-4-git-send-email-martin@varnish-software.com> Message-ID: <94024.1352714462@critter.freebsd.dk> -------- In message <1352287938-7247-4-git-send-email-martin at varnish-software.com>, Mart in Blix Grydeland writes: I hadn't seen the #definery you do here when I added my own #defines in a previous commit, sorry about the conflict that introduces. I have committed a more complete #defined version now, but I think there is a substantial change here which needs to be salvaged still ? -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From tfheen at varnish-software.com Mon Nov 12 10:01:57 2012 From: tfheen at varnish-software.com (Tollef Fog Heen) Date: Mon, 12 Nov 2012 11:01:57 +0100 Subject: Trouble understanding why Varnish retries on backend timeouts In-Reply-To: References: Message-ID: <20121112100157.GA1102@err.no> ]] . > I recently got bit by this functionality, and I was hoping that someone > could shed some light on why this is the default behavior for varnish. Because there's a race between when we submit a GET on a connection and when the backend closes it on us because of a timeout. > From everything I have read online, > the retry should only occur once, but I could have sworn I saw it > happen multiple times. If you restart in vcl_error, it can happen multiple times. > and even a patch (which doesn't seem to have been applied): > https://www.varnish-cache.org/lists/pipermail/varnish-dev/2011-August/006857.html We should probably apply this. Martin, do you want to resubmit it (possibly after cleaning it up)? -- Tollef Fog Heen Technical lead | Varnish Software AS t: +47 21 98 92 64 We Make Websites Fly! From gbordiau at work4labs.com Mon Nov 12 15:18:31 2012 From: gbordiau at work4labs.com (Guilhaume Bordiau) Date: Mon, 12 Nov 2012 16:18:31 +0100 Subject: Passing variable data to ESI requests In-Reply-To: References: Message-ID: Thanks Raul, but this doesn't work. Here here is my basic test: /////// default.vcl /////// sub vcl_recv { if (req.url ~ "toto.php") { set req.http.X-toto = "42"; } unset req.http.Cookie; return (pass); } sub vcl_fetch { set beresp.do_esi = true; return (deliver); } //////// toto.php /////////

Parent headers:


//////// esi.php /////////

esi headers:


And as a result, when getting /toto.php, I can find the 'HTTP_X_TOTO' => '42' header in the parent header, but not in the ESI header. Any idea? On Thursday, November 8, 2012, Rangel, Raul wrote: > Guilhaume,**** > > There are a few tricks you can use to do this. First of all you can > extract the cookie that you are interested in and place it in a header.*** > * > > ** ** > > vcl_recv {**** > > set req.http.X-Cookie-One = > regsub(req.http.Cookie,"^.*?mycookie=([^;]*);*.*$" , "\1");**** > > unset req.http.Cookie;**** > > }**** > > ** ** > > Then when varnish does the request to the parent page you can completely > ignore the X-Cookie-One header. As for the subsequent ESI requests they too > should also have the X-Cookie-One header attached to them. In your back end > you should be able to read the header and in the response include a Very: > X-Cookie-One. This way you get per user caching on the ESI.**** > > ** ** > > Raul**** > > ** ** > > *From:* varnish-dev-bounces at varnish-cache.org 'varnish-dev-bounces at varnish-cache.org');> [mailto: > varnish-dev-bounces at varnish-cache.org 'varnish-dev-bounces at varnish-cache.org');>] *On Behalf Of *Guilhaume > Bordiau > *Sent:* Thursday, November 08, 2012 3:42 AM > *To:* varnish-dev at varnish-cache.org 'varnish-dev at varnish-cache.org');> > *Subject:* Passing variable data to ESI requests**** > > ** ** > > Hello,**** > > ** ** > > We're using Varnish since a few weeks but are facing the issue of using > dynamic content inside cached pages.**** > > We tried ESI for that but it appears that there's no way to pass some (or > all) of the original request elements (headers, cookies) to the ESI request > made toward our server.**** > > ** ** > > We implemented hacks through cookies read from javascript, triggering ajax > requests, but we're facing maintainability issues around browsers refusing > cookies (our app run in an iframe and domains are different from the top > frame).**** > > ** ** > > So we're starting to think of developing the missing part of code in > Varnish that could make it do what we need: **** > > Allow to pass the original request headers and cookies to the ESI URI > contained in a cached page.**** > > ** ** > > So my questions are:**** > > - Can you confirm that's it's currently not possible?**** > > - What would be the amount of work to achieve this?**** > > - Any tips to help me getting started with this?**** > > ** ** > > Much thanks in advance to all.**** > > ** ** > > Guilhaume Bordiau.**** > -------------- next part -------------- An HTML attachment was scrubbed... URL: From gmoniey at gmail.com Mon Nov 12 19:30:11 2012 From: gmoniey at gmail.com (.) Date: Mon, 12 Nov 2012 11:30:11 -0800 Subject: Trouble understanding why Varnish retries on backend timeouts In-Reply-To: <20121112100157.GA1102@err.no> References: <20121112100157.GA1102@err.no> Message-ID: Thanks for the explanation. In regards to the race condition, would it make sense to be able to turn off this functionality using some config parameter? I guess with the patch applied, it shouldn't really be much of a problem as it will only occur for GETs, but ideally, it would be nice to control this type of behavior. On Mon, Nov 12, 2012 at 2:01 AM, Tollef Fog Heen < tfheen at varnish-software.com> wrote: > ]] . > > > I recently got bit by this functionality, and I was hoping that someone > > could shed some light on why this is the default behavior for varnish. > > Because there's a race between when we submit a GET on a connection and > when the backend closes it on us because of a timeout. > > > From everything I have read online, > > the retry should only occur once, but I could have sworn I saw it > > happen multiple times. > > If you restart in vcl_error, it can happen multiple times. > > > and even a patch (which doesn't seem to have been applied): > > > https://www.varnish-cache.org/lists/pipermail/varnish-dev/2011-August/006857.html > > We should probably apply this. Martin, do you want to resubmit it > (possibly after cleaning it up)? > > -- > Tollef Fog Heen > Technical lead | Varnish Software AS > t: +47 21 98 92 64 > We Make Websites Fly! > -------------- next part -------------- An HTML attachment was scrubbed... URL: From fgsch at lodoss.net Fri Nov 16 11:07:00 2012 From: fgsch at lodoss.net (Federico G. Schwindt) Date: Fri, 16 Nov 2012 11:07:00 +0000 Subject: PATCH: Add a least-connection director Message-ID: <20121116110700.7c8093ade5704a7ee6053bc5@lodoss.net> Hi, As mentioned on IRC It's not guaranteed that the first request will have a backend assigned before the second request comes in so this is not bulletproof but should be good enough for most usages. Comments? OKs? f.- diff --git a/bin/varnishd/cache/cache_backend.h b/bin/varnishd/cache/cache_backend.h index b84e702..3567cda 100644 --- a/bin/varnishd/cache/cache_backend.h +++ b/bin/varnishd/cache/cache_backend.h @@ -190,3 +190,4 @@ dir_init_f VRT_init_dir_random; dir_init_f VRT_init_dir_round_robin; dir_init_f VRT_init_dir_fallback; dir_init_f VRT_init_dir_client; +dir_init_f VRT_init_dir_least_connection; diff --git a/bin/varnishd/cache/cache_backend_cfg.c b/bin/varnishd/cache/cache_backend_cfg.c index 3f15ada..5800b4a 100644 --- a/bin/varnishd/cache/cache_backend_cfg.c +++ b/bin/varnishd/cache/cache_backend_cfg.c @@ -263,6 +263,8 @@ VRT_init_dir(struct cli *cli, struct director **dir, const char *name, VRT_init_dir_fallback(cli, dir, idx, priv); else if (!strcmp(name, "client")) VRT_init_dir_client(cli, dir, idx, priv); + else if (!strcmp(name, "least-connection")) + VRT_init_dir_least_connection(cli, dir, idx, priv); else INCOMPL(); } diff --git a/bin/varnishd/cache/cache_dir_random.c b/bin/varnishd/cache/cache_dir_random.c index c291fe0..4959eb4 100644 --- a/bin/varnishd/cache/cache_dir_random.c +++ b/bin/varnishd/cache/cache_dir_random.c @@ -26,8 +26,9 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * This code is shared between the random, client and hash directors, because - * they share the same properties and most of the same selection logic. + * This code is shared between the random, client, hash and least-connection + * directors, because they share the same properties and most of the same + * selection logic. * * The random director picks a backend on random. * @@ -35,6 +36,9 @@ * * The client director picks based on client identity or IP-address * + * The least-connection director picks a backend with the least number of + * established connections. + * * In all cases, the choice is by weight of the healthy subset of * configured backends. * @@ -63,7 +67,7 @@ struct vdi_random_host { double weight; }; -enum crit_e {c_random, c_hash, c_client}; +enum crit_e {c_random, c_hash, c_client, c_least_connection}; struct vdi_random { unsigned magic; @@ -195,6 +199,36 @@ vdi_random_getfd(const struct director *d, struct req *req) return (vdi_random_pick_one(req, vs, r, vs->retries)); } +static struct vbc * +vdi_least_connection_getfd(const struct director *d, struct req *req) +{ + int i, m; + struct vdi_random *vs; + struct backend *bi, *bm; + + CHECK_OBJ_NOTNULL(req, REQ_MAGIC); + CHECK_OBJ_NOTNULL(d, DIRECTOR_MAGIC); + CAST_OBJ_NOTNULL(vs, d->priv, VDI_RANDOM_MAGIC); + + for (m = 0; m < vs->nhosts; m++) { + if (!VDI_Healthy(vs->hosts[m].backend, req)) + continue; + bm = vdi_get_backend_if_simple(vs->hosts[m].backend); + for (i = m + 1; i < vs->nhosts; i++) { + if (!VDI_Healthy(vs->hosts[i].backend, req)) + continue; + bi = vdi_get_backend_if_simple(vs->hosts[i].backend); + if (bm->refcount * vs->hosts[i].weight > + bi->refcount * vs->hosts[m].weight) { + bm = bi; + m = i; + } + } + return (VDI_GetFd(vs->hosts[m].backend, req)); + } + return (NULL); +} + /* * Healthy if just a single backend is... * XXX: we should really have a weight param/criteria here @@ -252,7 +286,10 @@ vrt_init(struct cli *cli, struct director **bp, int idx, vs->dir.priv = vs; vs->dir.name = "random"; REPLACE(vs->dir.vcl_name, t->name); - vs->dir.getfd = vdi_random_getfd; + if (criteria == c_least_connection) + vs->dir.getfd = vdi_least_connection_getfd; + else + vs->dir.getfd = vdi_random_getfd; vs->dir.fini = vdi_random_fini; vs->dir.healthy = vdi_random_healthy; @@ -294,3 +331,10 @@ VRT_init_dir_client(struct cli *cli, struct director **bp, int idx, { vrt_init(cli, bp, idx, priv, c_client); } + +void +VRT_init_dir_least_connection(struct cli *cli, struct director **bp, int idx, + const void *priv) +{ + vrt_init(cli, bp, idx, priv, c_least_connection); +} diff --git a/bin/varnishtest/tests/v00038.vtc b/bin/varnishtest/tests/v00038.vtc new file mode 100644 index 0000000..a5c3ae3 --- /dev/null +++ b/bin/varnishtest/tests/v00038.vtc @@ -0,0 +1,92 @@ +varnishtest "Test least-connection director" + +server s1 { + rxreq + sema r1 sync 3 + sema r1 sync 2 + txresp -hdr "be: s1" + close + + accept + rxreq + txresp -hdr "be: s1" +} -start + +server s2 { + rxreq + sema r1 sync 3 + txresp -hdr "be: s2" + close + + accept + rxreq + txresp -hdr "be: s2" +} -start + +server s3 { + rxreq + txresp -hdr "be: s3" + close + + accept + rxreq + txresp -hdr "be: s3" +} -start + +varnish v1 -vcl+backend { + director lc least-connection { + { .backend = s1; .weight = 1; } + { .backend = s2; .weight = 1; } + { .backend = s3; .weight = 1; } + } + sub vcl_recv { + set req.backend = lc; + return (pass); + } +} -start + +client c1 { + txreq + rxresp + expect resp.http.be == "s1" +} -start + +delay .5 + +client c2 { + txreq + rxresp + expect resp.http.be == "s2" +} -start + +delay .5 + +client c3 { + txreq + rxresp + expect resp.http.be == "s3" + + txreq + rxresp + expect resp.http.be == "s3" + + sema r1 sync 3 + + delay .5 + + txreq + rxresp + expect resp.http.be == "s2" + + sema r1 sync 2 + + delay .5 + + txreq + rxresp + expect resp.http.be == "s1" +} -start + +client c1 -wait +client c2 -wait +client c3 -wait diff --git a/doc/sphinx/reference/vcl.rst b/doc/sphinx/reference/vcl.rst index 50c339b..16ccdd2 100644 --- a/doc/sphinx/reference/vcl.rst +++ b/doc/sphinx/reference/vcl.rst @@ -177,6 +177,17 @@ An example of a fallback director: // are unhealthy. } +The least-connection director +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The least-connection director will pick a backend with the least number of +established connections. + +Each backend requires a .weight option which sets the amount of traffic +each backend will get compared to the others. Equal weight means equal +traffic. A backend with lower weight than an other will get proportionally +less traffic. + Backend probes -------------- diff --git a/lib/libvcl/vcc_backend.c b/lib/libvcl/vcc_backend.c index 78cb0b2..df31ac6 100644 --- a/lib/libvcl/vcc_backend.c +++ b/lib/libvcl/vcc_backend.c @@ -688,6 +688,7 @@ static const struct dirlist { { "hash", vcc_ParseRandomDirector }, { "random", vcc_ParseRandomDirector }, { "client", vcc_ParseRandomDirector }, + { "least-connection", vcc_ParseRandomDirector }, { "round-robin", vcc_ParseRoundRobinDirector }, { "fallback", vcc_ParseRoundRobinDirector }, { "dns", vcc_ParseDnsDirector }, From fgsch at lodoss.net Fri Nov 16 13:15:59 2012 From: fgsch at lodoss.net (Federico G. Schwindt) Date: Fri, 16 Nov 2012 13:15:59 +0000 Subject: PATCH: fix some warnings during configure/compilation Message-ID: <20121116131559.9749fcd749e4e6a2c23862d2@lodoss.net> Hi, The diff below fixes one warning during configure and two during compilation on OpenBSD (and maybe elsewhere): checking pthread_np.h usability... no checking pthread_np.h presence... yes configure: WARNING: pthread_np.h: present but cannot be compiled configure: WARNING: pthread_np.h: check for missing prerequisite headers? configure: WARNING: pthread_np.h: see the Autoconf documentation configure: WARNING: pthread_np.h: section "Present But Cannot Be Compiled" configure: WARNING: pthread_np.h: proceeding with the compiler's result configure: WARNING: ## -------------------------------------------- ## configure: WARNING: ## Report this to varnish-dev at varnish-cache.org ## configure: WARNING: ## -------------------------------------------- ## varnishadm.c:190: warning: implicit declaration of function 'add_history' cache/cache_main.c:82: warning: implicit declaration of function 'pthread_set_name_np' Comments? OK? f.- diff --git a/bin/varnishadm/varnishadm.c b/bin/varnishadm/varnishadm.c index 3dc7c79..3e47af2 100644 --- a/bin/varnishadm/varnishadm.c +++ b/bin/varnishadm/varnishadm.c @@ -41,6 +41,9 @@ # else # include # endif +# ifdef HAVE_READLINE_HISTORY_H +# include +# endif #endif #include diff --git a/configure.ac b/configure.ac index 87fdaf6..003f682 100644 --- a/configure.ac +++ b/configure.ac @@ -148,6 +148,7 @@ PKG_CHECK_MODULES([LIBEDIT], [libedit], [AC_DEFINE([HAVE_LIBEDIT], [1], [Define we have libedit])], [AC_CHECK_HEADERS([readline/readline.h]) AC_CHECK_HEADERS([edit/readline/readline.h]) + AC_CHECK_HEADERS([readline/history.h]) AC_CHECK_LIB(edit, el_init, [ AC_DEFINE([HAVE_LIBEDIT], [1], [Define we have libedit]) LIBEDIT_CFLAGS="" @@ -171,7 +172,7 @@ AC_CHECK_HEADERS([sys/vfs.h]) AC_CHECK_HEADERS([endian.h]) AC_CHECK_HEADERS([execinfo.h]) AC_CHECK_HEADERS([netinet/in.h]) -AC_CHECK_HEADERS([pthread_np.h]) +AC_CHECK_HEADERS([pthread_np.h], [], [], [#include ]) AC_CHECK_HEADERS([stddef.h]) AC_CHECK_HEADERS([stdlib.h]) AC_CHECK_HEADERS([unistd.h]) From martin at varnish-software.com Mon Nov 19 10:10:10 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Mon, 19 Nov 2012 11:10:10 +0100 Subject: [PATCH] Do not queue the accept tasks until all initialization has been done. Message-ID: <1353319810-18668-1-git-send-email-martin@varnish-software.com> This resolves the race where the pools might accept connections and start processing them before a lot of the initialization routines has finished. --- bin/varnishd/cache/cache.h | 1 + bin/varnishd/cache/cache_main.c | 3 +++ bin/varnishd/cache/cache_pool.c | 41 +++++++++++++++++++++++++++++++++------ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 6d4fe86..1383ffb 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -940,6 +940,7 @@ void PipeRequest(struct req *req); /* cache_pool.c */ void Pool_Init(void); +void Pool_Accept(void); void Pool_Work_Thread(void *priv, struct worker *w); int Pool_Task(struct pool *pp, struct pool_task *task, enum pool_how how); diff --git a/bin/varnishd/cache/cache_main.c b/bin/varnishd/cache/cache_main.c index ac36308..a7e4260 100644 --- a/bin/varnishd/cache/cache_main.c +++ b/bin/varnishd/cache/cache_main.c @@ -228,6 +228,9 @@ child_main(void) if (FEATURE(FEATURE_WAIT_SILO)) SMP_Ready(); + /* Start the accept tasks */ + Pool_Accept(); + CLI_Run(); STV_close(); diff --git a/bin/varnishd/cache/cache_pool.c b/bin/varnishd/cache/cache_pool.c index 0e0d9dd..fa2248d 100644 --- a/bin/varnishd/cache/cache_pool.c +++ b/bin/varnishd/cache/cache_pool.c @@ -66,6 +66,7 @@ struct pool { struct taskhead idle_queue; struct taskhead front_queue; struct taskhead back_queue; + unsigned accepting; unsigned nthr; unsigned dry; unsigned lqueue; @@ -76,6 +77,7 @@ struct pool { static struct lock pool_mtx; static pthread_t thr_pool_herder; +static unsigned pool_accepting = 0; /*-------------------------------------------------------------------- */ @@ -412,8 +414,6 @@ static struct pool * pool_mkpool(unsigned pool_no) { struct pool *pp; - struct listen_sock *ls; - struct poolsock *ps; ALLOC_OBJ(pp, POOL_MAGIC); if (pp == NULL) @@ -428,6 +428,23 @@ pool_mkpool(unsigned pool_no) AZ(pthread_cond_init(&pp->herder_cond, NULL)); AZ(pthread_create(&pp->herder_thr, NULL, pool_herder, pp)); + return (pp); +} + +/*-------------------------------------------------------------------- + * Queue the acceptor task + */ + +static void +pool_queueaccept(struct pool *pp) +{ + struct listen_sock *ls; + struct poolsock *ps; + + AZ(pp->accepting); + pp->accepting = 1; + + /* Queue accept tasks for the sockets */ VTAILQ_FOREACH(ls, &heritage.socks, list) { if (ls->sock < 0) continue; @@ -438,8 +455,6 @@ pool_mkpool(unsigned pool_no) ps->task.priv = ps; AZ(Pool_Task(pp, &ps->task, POOL_QUEUE_BACK)); } - - return (pp); } /*-------------------------------------------------------------------- @@ -472,11 +487,17 @@ pool_poolherder(void *priv) /* XXX: remove pools */ if (0) SES_DeletePool(NULL); - (void)sleep(1); u = 0; - VTAILQ_FOREACH(pp, &pools, list) + VTAILQ_FOREACH(pp, &pools, list) { + if (pool_accepting && !pp->accepting) + pool_queueaccept(pp); u += pp->lqueue; + } VSC_C_main->thread_queue_len = u; + if (pool_accepting) + VTIM_sleep(1.); + else + VTIM_sleep(.1); } NEEDLESS_RETURN(NULL); } @@ -484,6 +505,14 @@ pool_poolherder(void *priv) /*--------------------------------------------------------------------*/ void +Pool_Accept(void) +{ + + ASSERT_CLI(); + pool_accepting = 1; +} + +void Pool_Init(void) { -- 1.7.9.5 From zhangshuo512 at 126.com Thu Nov 15 15:59:29 2012 From: zhangshuo512 at 126.com (Shuo Zhang) Date: Thu, 15 Nov 2012 23:59:29 +0800 (CST) Subject: Issue on varnishlog command Message-ID: <4b49e375.dd13.13b04cbe3be.Coremail.zhangshuo512@126.com> Hi, I used the latest version of varnish in Ubuntu 12. When I try to use varnishlog, nothing happens and the system is hanging there forever until typing in ctrl+c. Thanks, Shuo Zhang -------------- next part -------------- An HTML attachment was scrubbed... URL: From tfheen at varnish-software.com Mon Nov 19 12:29:58 2012 From: tfheen at varnish-software.com (Tollef Fog Heen) Date: Mon, 19 Nov 2012 13:29:58 +0100 Subject: PATCH: fix some warnings during configure/compilation In-Reply-To: <20121116131559.9749fcd749e4e6a2c23862d2@lodoss.net> References: <20121116131559.9749fcd749e4e6a2c23862d2@lodoss.net> Message-ID: <20121119122958.GB16826@err.no> ]] Federico G. Schwindt > The diff below fixes one warning during configure and two during compilation on OpenBSD (and maybe elsewhere): Thanks, committed. -- Tollef Fog Heen Technical lead | Varnish Software AS t: +47 21 98 92 64 We Make Websites Fly! From phk at phk.freebsd.dk Mon Nov 19 15:49:04 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Mon, 19 Nov 2012 15:49:04 +0000 Subject: PATCH: Add a least-connection director In-Reply-To: <20121116110700.7c8093ade5704a7ee6053bc5@lodoss.net> References: <20121116110700.7c8093ade5704a7ee6053bc5@lodoss.net> Message-ID: <89420.1353340144@critter.freebsd.dk> -------- In message <20121116110700.7c8093ade5704a7ee6053bc5 at lodoss.net>, "Federico G. S chwindt" writes: >As mentioned on IRC It's not guaranteed that the first request >will have a backend assigned before the second request comes in so >this is not bulletproof but should be good enough for most usages. >Comments? OKs? I'm not happy with this patch for a number of reasons. For one thing, we should either not have a .weight for least-conn director, or we should define clearly how .weight works for them. Second, I think this is so far from the random/hash style directors that it should have its own source code, in particular in light of... Three, there is a very nasty problem with least-connection routing which few people realize up front, but which cost AT&T oodles of money until somebody found the simple solution. Imagine you have 4 backends running in least connection mode. One of them goes down Then it comes back up, having zero connections. KaChunk! and it's right back down again. The solution to this is to be sloppy about "least connection" with the typical implementation going something like: Get_New_Connection(): b = first backend on list Increase b.connections (Always!) move b A positions down the list. Move b further down the list if necessary to keep the list sorted by .connections Free_Connection(): Decrease b.connections Move b upwards on list, to keep list sorted on .connections. The crucial thing is the "(Always!) move..." rule, which ensures that a single backend never gets to service the full load. Emperically, chosing A as round(min(2, log2(n_backends))) works pretty well. -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From martin at varnish-software.com Mon Nov 19 16:25:41 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Mon, 19 Nov 2012 17:25:41 +0100 Subject: [PATCH 02/15] Add a BAN_Shutdown() routine that is called before STV_Close(), and makes sure that the ban lists will not change until we exit. In-Reply-To: <73627.1352713215@critter.freebsd.dk> References: <1352287938-7247-1-git-send-email-martin@varnish-software.com> <1352287938-7247-2-git-send-email-martin@varnish-software.com> <73627.1352713215@critter.freebsd.dk> Message-ID: On Mon, Nov 12, 2012 at 10:40 AM, Poul-Henning Kamp wrote: > -------- > In message <1352287938-7247-2-git-send-email-martin at varnish-software.com>, > Mart > in Blix Grydeland writes: > >This is to give persistent stevedores a chance to clean up their ban > >lists without having to worry about the lists changing under them > >(normally the ban callbacks are called under the ban mutex, but not so > >during exit). > > I don't have a problem with the idea, but I don't like having BAN_Insert() > return a failure we don't know how to handle. I think BAN_Insert() should > take ownership of the ban even when it fails, but returning a status code > is probably a good idea, provided it gets used for something somewhere. > Changed to make BAN_Insert() always take ownership of the ban, freeing it on failure. BAN_Insert() will still return the status code. > > I think it should be used in the CLI::ban case, so that a > cluster-controller > can keep track of which bans have been entered on which varnish instances. > CLI will get the error message. > > >Also remove the duplicate drop tail bans code. That is now only done > >in the main thread loop. > > This breaks r01030.vtc so it should probably be done in its own commit. > This has been moved to a separate commit. Though I do not see how the change affects r01030.vtc, nor have I been able to make that test case fail. Martin -- *Martin Blix Grydeland* Senior Developer | Varnish Software AS Cell: +47 21 98 92 60 We Make Websites Fly! -------------- next part -------------- An HTML attachment was scrubbed... URL: From tfheen at varnish-software.com Tue Nov 20 08:51:04 2012 From: tfheen at varnish-software.com (Tollef Fog Heen) Date: Tue, 20 Nov 2012 09:51:04 +0100 Subject: [PATCH] Allow multiple identical backend addresses Message-ID: <1353401464-25551-1-git-send-email-tfheen@varnish-software.com> In some cases, lookups for a given host name returns the same address multiple times. Allow this, but ignore any duplicate addresses. --- lib/libvcl/vcc_backend.c | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/lib/libvcl/vcc_backend.c b/lib/libvcl/vcc_backend.c index 78cb0b2..5cc98ae 100644 --- a/lib/libvcl/vcc_backend.c +++ b/lib/libvcl/vcc_backend.c @@ -106,7 +106,7 @@ Emit_Sockaddr(struct vcc *tl, const struct token *t_host, const char *port) struct addrinfo *res, *res0, *res1, hint; int n4, n6, error, retval, x; const char *emit, *multiple; - char hbuf[NI_MAXHOST]; + char hbuf[NI_MAXHOST], v4[NI_MAXHOST], v6[NI_MAXHOST]; char *hop, *pop; AN(t_host->dec); @@ -145,16 +145,36 @@ Emit_Sockaddr(struct vcc *tl, const struct token *t_host, const char *port) for (res = res0; res; res = res->ai_next) { emit = NULL; + + error = getnameinfo(res->ai_addr, + res->ai_addrlen, hbuf, sizeof hbuf, + NULL, 0, NI_NUMERICHOST); + AZ(error); + if (res->ai_family == PF_INET) { - if (n4++ == 0) + if (n4++ == 0) { emit = "ipv4"; - else - multiple = "IPv4"; + strcpy(v4, hbuf); + } else { + if (strcmp(v4, hbuf) != 0) { + multiple = "IPv4"; + } else { + /* Ignore duplicate address */ + continue; + } + } } else if (res->ai_family == PF_INET6) { - if (n6++ == 0) + if (n6++ == 0) { emit = "ipv6"; - else - multiple = "IPv6"; + strcpy(v6, hbuf); + } else { + if (strcmp(v6, hbuf) != 0) { + multiple = "IPv6"; + } else { + /* Ignore duplicate address */ + continue; + } + } } else continue; @@ -179,10 +199,6 @@ Emit_Sockaddr(struct vcc *tl, const struct token *t_host, const char *port) AN(emit); x = emit_sockaddr(tl, res->ai_addr, res->ai_addrlen); Fb(tl, 0, "\t.%s_sockaddr = sockaddr%u,\n", emit, x); - error = getnameinfo(res->ai_addr, - res->ai_addrlen, hbuf, sizeof hbuf, - NULL, 0, NI_NUMERICHOST); - AZ(error); Fb(tl, 0, "\t.%s_addr = \"%s\",\n", emit, hbuf); retval++; } -- 1.7.10.4 From martin at varnish-software.com Wed Nov 21 10:23:16 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 21 Nov 2012 11:23:16 +0100 Subject: [PATCH 1/4] Remove the duplicate drop tail bans code. Message-ID: <1353493399-21028-1-git-send-email-martin@varnish-software.com> This is now only done in the main ban_lurker thread loop. --- bin/varnishd/cache/cache_ban.c | 50 +++++++++++++++------------------------- 1 file changed, 18 insertions(+), 32 deletions(-) diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index bf671bc..47a8518 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -835,7 +835,7 @@ ban_CheckLast(void) static int ban_lurker_work(struct worker *wrk, struct vsl_log *vsl, unsigned pass) { - struct ban *b, *b0, *b2; + struct ban *b, *b0; struct objhead *oh; struct objcore *oc, *oc2; struct object *o; @@ -844,18 +844,6 @@ ban_lurker_work(struct worker *wrk, struct vsl_log *vsl, unsigned pass) AN(pass & BAN_F_LURK); AZ(pass & ~BAN_F_LURK); - /* First route the last ban(s) */ - do { - Lck_Lock(&ban_mtx); - b2 = ban_CheckLast(); - if (b2 != NULL) - /* Notify stevedores */ - STV_BanInfo(BI_DROP, b2->spec, ban_len(b2->spec)); - Lck_Unlock(&ban_mtx); - if (b2 != NULL) - BAN_Free(b2); - } while (b2 != NULL); - /* * Find out if we have any bans we can do something about * If we find any, tag them with our pass number. @@ -982,18 +970,16 @@ ban_lurker(struct worker *wrk, void *priv) struct ban *bf; unsigned pass = (1 << LURK_SHIFT); struct vsl_log vsl; + double ban_sleep; - int i = 0; VSL_Setup(&vsl, NULL, 0); (void)priv; while (1) { + ban_sleep = 1.0; - while (cache_param->ban_lurker_sleep == 0.0) { - /* - * Ban-lurker is disabled: - * Clean the last ban, if possible, and sleep - */ + /* Clear any gone last bans */ + do { Lck_Lock(&ban_mtx); bf = ban_CheckLast(); if (bf != NULL) @@ -1003,22 +989,22 @@ ban_lurker(struct worker *wrk, void *priv) Lck_Unlock(&ban_mtx); if (bf != NULL) BAN_Free(bf); - else - VTIM_sleep(1.0); - } + } while (bf != NULL); - i = ban_lurker_work(wrk, &vsl, pass); - VSL_Flush(&vsl, 0); - WRK_SumStat(wrk); - if (i) { - pass += (1 << LURK_SHIFT); - pass &= BAN_F_LURK; - if (pass == 0) + if (cache_param->ban_lurker_sleep != 0.0) { + /* Ban lurker enabled */ + if (ban_lurker_work(wrk, &vsl, pass)) { pass += (1 << LURK_SHIFT); - VTIM_sleep(cache_param->ban_lurker_sleep); - } else { - VTIM_sleep(1.0); + pass &= BAN_F_LURK; + if (pass == 0) + pass += (1 << LURK_SHIFT); + ban_sleep = cache_param->ban_lurker_sleep; + } + VSL_Flush(&vsl, 0); + WRK_SumStat(wrk); } + + VTIM_sleep(ban_sleep); } NEEDLESS_RETURN(NULL); } -- 1.7.9.5 From martin at varnish-software.com Wed Nov 21 10:23:17 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 21 Nov 2012 11:23:17 +0100 Subject: [PATCH 2/4] Add a BAN_Shutdown() routine that is called before STV_Close(), and makes sure that the ban lists will not change until we exit. In-Reply-To: <1353493399-21028-1-git-send-email-martin@varnish-software.com> References: <1353493399-21028-1-git-send-email-martin@varnish-software.com> Message-ID: <1353493399-21028-2-git-send-email-martin@varnish-software.com> This is to give persistent stevedores a chance to clean up their ban lists without having to worry about the lists changing under them. --- bin/varnishd/cache/cache.h | 3 +- bin/varnishd/cache/cache_ban.c | 66 ++++++++++++++++++++++++++++++++++++--- bin/varnishd/cache/cache_main.c | 1 + bin/varnishd/cache/cache_vrt.c | 10 +++--- 4 files changed, 68 insertions(+), 12 deletions(-) diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h index 727073b..2571f89 100644 --- a/bin/varnishd/cache/cache.h +++ b/bin/varnishd/cache/cache.h @@ -746,8 +746,9 @@ struct ban *BAN_New(void); int BAN_AddTest(struct cli *, struct ban *, const char *, const char *, const char *); void BAN_Free(struct ban *b); -void BAN_Insert(struct ban *b); +int BAN_Insert(struct ban *b); void BAN_Init(void); +void BAN_Shutdown(void); void BAN_NewObjCore(struct objcore *oc); void BAN_DestroyObj(struct objcore *oc); int BAN_CheckObject(struct object *o, struct req *sp); diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index 47a8518..66369d8 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -105,6 +105,7 @@ static struct ban *ban_magic; static pthread_t ban_thread; static struct ban * volatile ban_start; static bgthread_t ban_lurker; +static int ban_shutdown = 0; /*-------------------------------------------------------------------- * BAN string defines & magic markers @@ -406,9 +407,14 @@ BAN_AddTest(struct cli *cli, struct ban *b, const char *a1, const char *a2, * as a separate variable from the VTAILQ, to avoid depending on the * internals of the VTAILQ macros. We tacitly assume that a pointer * write is always atomic in doing so. + * + * Returns: + * 0: Ban successfully inserted + * -1: Ban not inserted due to shutdown in progress. The ban has been + * deleted. */ -void +int BAN_Insert(struct ban *b) { struct ban *bi, *be; @@ -417,6 +423,11 @@ BAN_Insert(struct ban *b) CHECK_OBJ_NOTNULL(b, BAN_MAGIC); + if (ban_shutdown) { + BAN_Free(b); + return (-1); + } + AZ(VSB_finish(b->vsb)); ln = VSB_len(b->vsb); assert(ln >= 0); @@ -435,6 +446,12 @@ BAN_Insert(struct ban *b) b->vsb = NULL; Lck_Lock(&ban_mtx); + if (ban_shutdown) { + /* Check again, we might have raced */ + Lck_Unlock(&ban_mtx); + BAN_Free(b); + return (-1); + } VTAILQ_INSERT_HEAD(&ban_head, b, list); ban_start = b; VSC_C_main->bans++; @@ -452,12 +469,12 @@ BAN_Insert(struct ban *b) Lck_Unlock(&ban_mtx); if (be == NULL) - return; + return (0); /* Hunt down duplicates, and mark them as gone */ bi = b; Lck_Lock(&ban_mtx); - while(bi != be) { + while(!ban_shutdown && bi != be) { bi = VTAILQ_NEXT(bi, list); if (bi->flags & BAN_F_GONE) continue; @@ -468,6 +485,8 @@ BAN_Insert(struct ban *b) } be->refcount--; Lck_Unlock(&ban_mtx); + + return (0); } /*-------------------------------------------------------------------- @@ -551,6 +570,7 @@ BAN_Reload(const uint8_t *ban, unsigned len) double t0, t1, t2 = 9e99; ASSERT_CLI(); + AZ(ban_shutdown); t0 = ban_time(ban); assert(len == ban_len(ban)); @@ -628,6 +648,7 @@ BAN_Compile(void) { ASSERT_CLI(); + AZ(ban_shutdown); /* Notify stevedores */ STV_BanInfo(BI_NEW, ban_magic->spec, ban_len(ban_magic->spec)); @@ -874,6 +895,8 @@ ban_lurker_work(struct worker *wrk, struct vsl_log *vsl, unsigned pass) ban_time(b->spec), b->refcount); while (1) { Lck_Lock(&ban_mtx); + if (ban_shutdown) + break; oc = VTAILQ_FIRST(&b->objcore); if (oc == NULL) break; @@ -957,6 +980,8 @@ ban_lurker_work(struct worker *wrk, struct vsl_log *vsl, unsigned pass) ban_time(b->spec)); } Lck_Unlock(&ban_mtx); + if (ban_shutdown) + break; VTIM_sleep(cache_param->ban_lurker_sleep); if (b == b0) break; @@ -975,7 +1000,7 @@ ban_lurker(struct worker *wrk, void *priv) VSL_Setup(&vsl, NULL, 0); (void)priv; - while (1) { + while (!ban_shutdown) { ban_sleep = 1.0; /* Clear any gone last bans */ @@ -1004,8 +1029,14 @@ ban_lurker(struct worker *wrk, void *priv) WRK_SumStat(wrk); } + if (ban_shutdown) + break; + VTIM_sleep(ban_sleep); } + + pthread_exit(0); + NEEDLESS_RETURN(NULL); } @@ -1048,7 +1079,11 @@ ccf_ban(struct cli *cli, const char * const *av, void *priv) BAN_Free(b); return; } - BAN_Insert(b); + if (BAN_Insert(b) < 0) { + VCLI_Out(cli, "Shutdown in progress"); + VCLI_SetResult(cli, CLIS_CANT); + return; + } } static void @@ -1160,3 +1195,24 @@ BAN_Init(void) VSC_C_main->bans_gone++; BAN_Insert(ban_magic); } + +/*-------------------------------------------------------------------- + * Shutdown of the ban system. + * + * When this function returns, no new bans will be accepted, and no + * bans will be dropped (ban lurker thread stopped), so that no + * STV_BanInfo calls will be executed. + */ + +void +BAN_Shutdown(void) +{ + void *status; + + Lck_Lock(&ban_mtx); + ban_shutdown = 1; + Lck_Unlock(&ban_mtx); + + AZ(pthread_join(ban_thread, &status)); + AZ(status); +} diff --git a/bin/varnishd/cache/cache_main.c b/bin/varnishd/cache/cache_main.c index 468401b..13c6612 100644 --- a/bin/varnishd/cache/cache_main.c +++ b/bin/varnishd/cache/cache_main.c @@ -232,6 +232,7 @@ child_main(void) CLI_Run(); + BAN_Shutdown(); STV_close(); printf("Child dies\n"); diff --git a/bin/varnishd/cache/cache_vrt.c b/bin/varnishd/cache/cache_vrt.c index ed7ae59..914531e 100644 --- a/bin/varnishd/cache/cache_vrt.c +++ b/bin/varnishd/cache/cache_vrt.c @@ -459,10 +459,9 @@ VRT_ban(const struct req *req, char *cmds, ...) good = 1; } if (!good) - /* XXX: report error how ? */ - BAN_Free(b); + BAN_Free(b); /* XXX: report error how ? */ else - BAN_Insert(b); + (void)BAN_Insert(b); /* XXX: report error how ? */ } /*--------------------------------------------------------------------*/ @@ -506,10 +505,9 @@ VRT_ban_string(const struct req *req, const char *str) break; } if (!good) - /* XXX: report error how ? */ - BAN_Free(b); + BAN_Free(b); /* XXX: report error how ? */ else - BAN_Insert(b); + (void)BAN_Insert(b); /* XXX: report error how ? */ VAV_Free(av); } -- 1.7.9.5 From martin at varnish-software.com Wed Nov 21 10:23:18 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 21 Nov 2012 11:23:18 +0100 Subject: [PATCH 3/4] Allow reload of a series of persisted ban specs in one go. In-Reply-To: <1353493399-21028-1-git-send-email-martin@varnish-software.com> References: <1353493399-21028-1-git-send-email-martin@varnish-software.com> Message-ID: <1353493399-21028-3-git-send-email-martin@varnish-software.com> --- bin/varnishd/cache/cache_ban.c | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index 66369d8..b853daf 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -562,29 +562,25 @@ BAN_RefBan(struct objcore *oc, double t0, const struct ban *tail) * mark any older bans, with the same condition, GONE as well. */ -void -BAN_Reload(const uint8_t *ban, unsigned len) +static void +ban_reload(const uint8_t *ban, unsigned len) { struct ban *b, *b2; int gone = 0; double t0, t1, t2 = 9e99; ASSERT_CLI(); - AZ(ban_shutdown); + Lck_AssertHeld(&ban_mtx); t0 = ban_time(ban); assert(len == ban_len(ban)); - Lck_Lock(&ban_mtx); - VTAILQ_FOREACH(b, &ban_head, list) { t1 = ban_time(b->spec); assert(t1 < t2); t2 = t1; - if (t1 == t0) { - Lck_Unlock(&ban_mtx); + if (t1 == t0) return; - } if (t1 < t0) break; if (ban_equal(b->spec, ban)) { @@ -621,6 +617,30 @@ BAN_Reload(const uint8_t *ban, unsigned len) VSC_C_main->bans_dups++; } } +} + +/*-------------------------------------------------------------------- + * Reload a series of persisted ban specs + */ + +void +BAN_Reload(const uint8_t *ptr, unsigned len) +{ + const uint8_t *pe; + unsigned l; + + AZ(ban_shutdown); + pe = ptr + len; + Lck_Lock(&ban_mtx); + while (ptr < pe) { + /* XXX: This can be optimized by traversing the live + * ban list together with the reload list (combining + * the loops in BAN_Reload and ban_reload). */ + l = ban_len(ptr); + assert(ptr + l <= pe); + ban_reload(ptr, l); + ptr += l; + } Lck_Unlock(&ban_mtx); } -- 1.7.9.5 From martin at varnish-software.com Wed Nov 21 10:23:19 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Wed, 21 Nov 2012 11:23:19 +0100 Subject: [PATCH 4/4] Drop the internal ban delimiters in the persistent ban lists, and reload all the statements in one go. In-Reply-To: <1353493399-21028-1-git-send-email-martin@varnish-software.com> References: <1353493399-21028-1-git-send-email-martin@varnish-software.com> Message-ID: <1353493399-21028-4-git-send-email-martin@varnish-software.com> --- bin/varnishd/storage/storage_persistent.c | 43 +++++------------------------ 1 file changed, 7 insertions(+), 36 deletions(-) diff --git a/bin/varnishd/storage/storage_persistent.c b/bin/varnishd/storage/storage_persistent.c index 24a4d08..1efa24b 100644 --- a/bin/varnishd/storage/storage_persistent.c +++ b/bin/varnishd/storage/storage_persistent.c @@ -72,22 +72,12 @@ static void smp_appendban(struct smp_sc *sc, struct smp_signspace *spc, uint32_t len, const uint8_t *ban) { - uint8_t *ptr, *ptr2; (void)sc; - ptr = ptr2 = SIGNSPACE_FRONT(spc); - assert(SIGNSPACE_FREE(spc) >= 4L + 4 + len); + assert(SIGNSPACE_FREE(spc) >= len); - memcpy(ptr, "BAN", 4); - ptr += 4; - - vbe32enc(ptr, len); - ptr += 4; - - memcpy(ptr, ban, len); - ptr += len; - - smp_append_signspace(spc, ptr - ptr2); + memcpy(SIGNSPACE_FRONT(spc), ban, len); + smp_append_signspace(spc, len); } /* Trust that cache_ban.c takes care of locking */ @@ -120,38 +110,19 @@ static int smp_open_bans(struct smp_sc *sc, struct smp_signspace *spc) { uint8_t *ptr, *pe; - uint32_t length; - int i, retval = 0; + int i; ASSERT_CLI(); (void)sc; i = smp_chk_signspace(spc); if (i) return (i); + ptr = SIGNSPACE_DATA(spc); pe = SIGNSPACE_FRONT(spc); + BAN_Reload(ptr, pe - ptr); - while (ptr < pe) { - if (memcmp(ptr, "BAN", 4)) { - retval = 1001; - break; - } - ptr += 4; - - length = vbe32dec(ptr); - ptr += 4; - - if (ptr + length > pe) { - retval = 1003; - break; - } - - BAN_Reload(ptr, length); - - ptr += length; - } - assert(ptr <= pe); - return (retval); + return (0); } /*-------------------------------------------------------------------- -- 1.7.9.5 From tfheen at varnish-software.com Fri Nov 23 10:06:21 2012 From: tfheen at varnish-software.com (Tollef Fog Heen) Date: Fri, 23 Nov 2012 11:06:21 +0100 Subject: [PATCH] Get rid of ban_url/ban.url Message-ID: <1353665181-23260-1-git-send-email-tfheen@varnish-software.com> ban.url is confusing as it takes a regular expression rather than a fixed string, so get rid of it in favour of people being explicit and using ban req.url ~ /foo --- bin/varnishd/cache/cache_ban.c | 16 ---------------- bin/varnishd/mgt/mgt_param.c | 2 +- bin/varnishtest/tests/c00006.vtc | 2 +- bin/varnishtest/tests/c00019.vtc | 12 ++++++------ bin/varnishtest/tests/v00011.vtc | 2 +- bin/varnishtest/tests/v00018.vtc | 4 ++-- doc/sphinx/reference/varnish-cli.rst | 7 ------- doc/sphinx/reference/vcl.rst | 5 +---- include/vcli.h | 7 ------- lib/libvcl/vcc_action.c | 19 ------------------- 10 files changed, 12 insertions(+), 64 deletions(-) diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c index 688842b..6315798 100644 --- a/bin/varnishd/cache/cache_ban.c +++ b/bin/varnishd/cache/cache_ban.c @@ -1066,21 +1066,6 @@ ccf_ban(struct cli *cli, const char * const *av, void *priv) } static void -ccf_ban_url(struct cli *cli, const char * const *av, void *priv) -{ - const char *aav[6]; - - (void)priv; - aav[0] = NULL; - aav[1] = "ban"; - aav[2] = "req.url"; - aav[3] = "~"; - aav[4] = av[2]; - aav[5] = NULL; - ccf_ban(cli, aav, priv); -} - -static void ban_render(struct cli *cli, const uint8_t *bs) { struct ban_test bt; @@ -1152,7 +1137,6 @@ ccf_ban_list(struct cli *cli, const char * const *av, void *priv) } static struct cli_proto ban_cmds[] = { - { CLI_BAN_URL, "", ccf_ban_url }, { CLI_BAN, "", ccf_ban }, { CLI_BAN_LIST, "", ccf_ban_list }, { NULL } diff --git a/bin/varnishd/mgt/mgt_param.c b/bin/varnishd/mgt/mgt_param.c index 9359800..0e4440d 100644 --- a/bin/varnishd/mgt/mgt_param.c +++ b/bin/varnishd/mgt/mgt_param.c @@ -683,7 +683,7 @@ static const struct parspec input_parspec[] = { "Objects already cached will not be affected by changes " "made until they are fetched from the backend again.\n" "To force an immediate effect at the expense of a total " - "flush of the cache use \"ban.url .\"", + "flush of the cache use \"ban obj.http.date ~ .\"", 0, "120", "seconds" }, { "workspace_client", diff --git a/bin/varnishtest/tests/c00006.vtc b/bin/varnishtest/tests/c00006.vtc index 9342886..83c3ea2 100644 --- a/bin/varnishtest/tests/c00006.vtc +++ b/bin/varnishtest/tests/c00006.vtc @@ -20,7 +20,7 @@ client c1 { client c1 -run -varnish v1 -cli "ban.url foo" +varnish v1 -cli "ban req.url ~ foo" client c1 { txreq -url "/foo" diff --git a/bin/varnishtest/tests/c00019.vtc b/bin/varnishtest/tests/c00019.vtc index 5cc5973..22b5ca1 100644 --- a/bin/varnishtest/tests/c00019.vtc +++ b/bin/varnishtest/tests/c00019.vtc @@ -13,7 +13,7 @@ server s1 { varnish v1 -vcl+backend {} -start -varnish v1 -cliok "ban.url FOO" +varnish v1 -cliok "ban req.url ~ FOO" # There is one "magic" ban from boot varnish v1 -expect bans_added == 2 @@ -35,7 +35,7 @@ varnish v1 -expect bans_tested == 0 varnish v1 -expect bans_tests_tested == 0 # Add another ban -varnish v1 -cliok "ban.url FOO" +varnish v1 -cliok "ban req.url ~ FOO" varnish v1 -expect bans_added == 3 varnish v1 -cliok "ban.list" @@ -60,15 +60,15 @@ client c1 { # Now add another two bans, Kilroy should not be hit -varnish v1 -cliok "ban.url KILROY" -varnish v1 -cliok "ban.url FOO" +varnish v1 -cliok "ban req.url ~ KILROY" +varnish v1 -cliok "ban req.url ~ FOO" varnish v1 -expect bans_added == 5 # Enable dup removal of bans varnish v1 -cliok "param.set ban_dups on" # This should incapacitate the two previous FOO bans. -varnish v1 -cliok "ban.url FOO" +varnish v1 -cliok "ban req.url ~ FOO" varnish v1 -expect bans_added == 6 varnish v1 -expect bans_dups == 3 varnish v1 -cliok "ban.list" @@ -87,4 +87,4 @@ varnish v1 -cliok "ban.list" # Test a bogus regexp -varnish v1 -clierr 106 "ban.url [[[" +varnish v1 -clierr 106 "ban req.url ~ [[[" diff --git a/bin/varnishtest/tests/v00011.vtc b/bin/varnishtest/tests/v00011.vtc index 43ea8c2..dc8bd18 100644 --- a/bin/varnishtest/tests/v00011.vtc +++ b/bin/varnishtest/tests/v00011.vtc @@ -11,7 +11,7 @@ server s1 { varnish v1 -vcl+backend { sub vcl_recv { if (req.request == "PURGE") { - ban_url("^/$"); + ban("req.url ~ ^/$"); error 209 "foo"; } } diff --git a/bin/varnishtest/tests/v00018.vtc b/bin/varnishtest/tests/v00018.vtc index 7a9ccbc..6fe35fb 100644 --- a/bin/varnishtest/tests/v00018.vtc +++ b/bin/varnishtest/tests/v00018.vtc @@ -86,7 +86,7 @@ varnish v1 -errvcl {Only http header variables can be unset.} { varnish v1 -errvcl {Unknown token 'if' when looking for STRING} { backend b { .host = "127.0.0.1"; } - sub vcl_recv { ban_url (if); } + sub vcl_recv { ban (if); } } varnish v1 -errvcl {Expected an action, 'if', '{' or '}'} { @@ -96,7 +96,7 @@ varnish v1 -errvcl {Expected an action, 'if', '{' or '}'} { varnish v1 -vcl { backend b { .host = "127.0.0.1"; } - sub vcl_recv { ban_url ("foo"); } + sub vcl_recv { ban ("req.url ~ foo"); } } varnish v1 -errvcl {Expected an action, 'if', '{' or '}'} { diff --git a/doc/sphinx/reference/varnish-cli.rst b/doc/sphinx/reference/varnish-cli.rst index 43fd590..787c09d 100644 --- a/doc/sphinx/reference/varnish-cli.rst +++ b/doc/sphinx/reference/varnish-cli.rst @@ -118,13 +118,6 @@ ban.list Then follows the actual ban it self. -ban.url regexp - Immediately invalidate all documents whose URL matches the - specified regular expression. Please note that the Host part of - the URL is ignored, so if you have several virtual hosts all of - them will be banned. Use *ban* to specify a complete ban if you - need to narrow it down. - help [command] Display a list of available commands. If the command is specified, display help for this command. diff --git a/doc/sphinx/reference/vcl.rst b/doc/sphinx/reference/vcl.rst index 50c339b..98c1c47 100644 --- a/doc/sphinx/reference/vcl.rst +++ b/doc/sphinx/reference/vcl.rst @@ -327,9 +327,6 @@ regsuball(str, regex, sub) ban(ban expression) Bans all objects in cache that match the expression. -ban_url(regex) - Bans all objects in cache whose URLs match regex. - Subroutines ~~~~~~~~~~~ @@ -574,7 +571,7 @@ Example: sub vcl_recv { if (client.ip ~ admin_network) { if (req.http.Cache-Control ~ "no-cache") { - ban_url(req.url); + ban("req.url ~ " + req.url); } } } diff --git a/include/vcli.h b/include/vcli.h index 04ac11c..3294dd7 100644 --- a/include/vcli.h +++ b/include/vcli.h @@ -58,13 +58,6 @@ "\tReturns the TTL, size and checksum of the object.", \ 1, 1 -#define CLI_BAN_URL \ - "ban.url", \ - "ban.url ", \ - "\tAll objects where the urls matches regexp will be " \ - "marked obsolete.", \ - 1, 1 - #define CLI_BAN \ "ban", \ "ban [&& ]...", \ diff --git a/lib/libvcl/vcc_action.c b/lib/libvcl/vcc_action.c index eae6231..1eec1c4 100644 --- a/lib/libvcl/vcc_action.c +++ b/lib/libvcl/vcc_action.c @@ -195,24 +195,6 @@ parse_ban(struct vcc *tl) /*--------------------------------------------------------------------*/ static void -parse_ban_url(struct vcc *tl) -{ - - vcc_NextToken(tl); - ExpectErr(tl, '('); - vcc_NextToken(tl); - - Fb(tl, 1, "VRT_ban(req, \"req.url\", \"~\", "); - vcc_Expr(tl, STRING); - ERRCHK(tl); - ExpectErr(tl, ')'); - vcc_NextToken(tl); - Fb(tl, 0, ", 0);\n"); -} - -/*--------------------------------------------------------------------*/ - -static void parse_new_syntax(struct vcc *tl) { @@ -324,7 +306,6 @@ static struct action_table { { "call", parse_call }, { "hash_data", parse_hash_data, VCL_MET_HASH }, { "ban", parse_ban }, - { "ban_url", parse_ban_url }, { "remove", parse_unset }, /* backward compatibility */ { "return", parse_return }, { "rollback", parse_rollback }, -- 1.7.10.4 From phk at phk.freebsd.dk Fri Nov 23 20:00:45 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Fri, 23 Nov 2012 20:00:45 +0000 Subject: [PATCH] Get rid of ban_url/ban.url In-Reply-To: <1353665181-23260-1-git-send-email-tfheen@varnish-software.com> References: <1353665181-23260-1-git-send-email-tfheen@varnish-software.com> Message-ID: <13319.1353700845@critter.freebsd.dk> -------- In message <1353665181-23260-1-git-send-email-tfheen at varnish-software.com>, Tol lef Fog Heen writes: >ban.url is confusing as it takes a regular expression rather than a >fixed string, so get rid of it in favour of people being explicit and >using ban req.url ~ /foo My only reservation is that backwards-compat issue. When did we deprecate ban.url ? Was that in 2.x ? If so, go for it... >--- > bin/varnishd/cache/cache_ban.c | 16 ---------------- > bin/varnishd/mgt/mgt_param.c | 2 +- > bin/varnishtest/tests/c00006.vtc | 2 +- > bin/varnishtest/tests/c00019.vtc | 12 ++++++------ > bin/varnishtest/tests/v00011.vtc | 2 +- > bin/varnishtest/tests/v00018.vtc | 4 ++-- > doc/sphinx/reference/varnish-cli.rst | 7 ------- > doc/sphinx/reference/vcl.rst | 5 +---- > include/vcli.h | 7 ------- > lib/libvcl/vcc_action.c | 19 ------------------- > 10 files changed, 12 insertions(+), 64 deletions(-) > >diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c >index 688842b..6315798 100644 >--- a/bin/varnishd/cache/cache_ban.c >+++ b/bin/varnishd/cache/cache_ban.c >@@ -1066,21 +1066,6 @@ ccf_ban(struct cli *cli, const char * const *av, void *priv) > } > > static void >-ccf_ban_url(struct cli *cli, const char * const *av, void *priv) >-{ >- const char *aav[6]; >- >- (void)priv; >- aav[0] = NULL; >- aav[1] = "ban"; >- aav[2] = "req.url"; >- aav[3] = "~"; >- aav[4] = av[2]; >- aav[5] = NULL; >- ccf_ban(cli, aav, priv); >-} >- >-static void > ban_render(struct cli *cli, const uint8_t *bs) > { > struct ban_test bt; >@@ -1152,7 +1137,6 @@ ccf_ban_list(struct cli *cli, const char * const *av, void *priv) > } > > static struct cli_proto ban_cmds[] = { >- { CLI_BAN_URL, "", ccf_ban_url }, > { CLI_BAN, "", ccf_ban }, > { CLI_BAN_LIST, "", ccf_ban_list }, > { NULL } >diff --git a/bin/varnishd/mgt/mgt_param.c b/bin/varnishd/mgt/mgt_param.c >index 9359800..0e4440d 100644 >--- a/bin/varnishd/mgt/mgt_param.c >+++ b/bin/varnishd/mgt/mgt_param.c >@@ -683,7 +683,7 @@ static const struct parspec input_parspec[] = { > "Objects already cached will not be affected by changes " > "made until they are fetched from the backend again.\n" > "To force an immediate effect at the expense of a total " >- "flush of the cache use \"ban.url .\"", >+ "flush of the cache use \"ban obj.http.date ~ .\"", > 0, > "120", "seconds" }, > { "workspace_client", >diff --git a/bin/varnishtest/tests/c00006.vtc b/bin/varnishtest/tests/c00006.vtc >index 9342886..83c3ea2 100644 >--- a/bin/varnishtest/tests/c00006.vtc >+++ b/bin/varnishtest/tests/c00006.vtc >@@ -20,7 +20,7 @@ client c1 { > > client c1 -run > >-varnish v1 -cli "ban.url foo" >+varnish v1 -cli "ban req.url ~ foo" > > client c1 { > txreq -url "/foo" >diff --git a/bin/varnishtest/tests/c00019.vtc b/bin/varnishtest/tests/c00019.vtc >index 5cc5973..22b5ca1 100644 >--- a/bin/varnishtest/tests/c00019.vtc >+++ b/bin/varnishtest/tests/c00019.vtc >@@ -13,7 +13,7 @@ server s1 { > > varnish v1 -vcl+backend {} -start > >-varnish v1 -cliok "ban.url FOO" >+varnish v1 -cliok "ban req.url ~ FOO" > > # There is one "magic" ban from boot > varnish v1 -expect bans_added == 2 >@@ -35,7 +35,7 @@ varnish v1 -expect bans_tested == 0 > varnish v1 -expect bans_tests_tested == 0 > > # Add another ban >-varnish v1 -cliok "ban.url FOO" >+varnish v1 -cliok "ban req.url ~ FOO" > varnish v1 -expect bans_added == 3 > varnish v1 -cliok "ban.list" > >@@ -60,15 +60,15 @@ client c1 { > > > # Now add another two bans, Kilroy should not be hit >-varnish v1 -cliok "ban.url KILROY" >-varnish v1 -cliok "ban.url FOO" >+varnish v1 -cliok "ban req.url ~ KILROY" >+varnish v1 -cliok "ban req.url ~ FOO" > varnish v1 -expect bans_added == 5 > > # Enable dup removal of bans > varnish v1 -cliok "param.set ban_dups on" > > # This should incapacitate the two previous FOO bans. >-varnish v1 -cliok "ban.url FOO" >+varnish v1 -cliok "ban req.url ~ FOO" > varnish v1 -expect bans_added == 6 > varnish v1 -expect bans_dups == 3 > varnish v1 -cliok "ban.list" >@@ -87,4 +87,4 @@ varnish v1 -cliok "ban.list" > > # Test a bogus regexp > >-varnish v1 -clierr 106 "ban.url [[[" >+varnish v1 -clierr 106 "ban req.url ~ [[[" >diff --git a/bin/varnishtest/tests/v00011.vtc b/bin/varnishtest/tests/v00011.vtc >index 43ea8c2..dc8bd18 100644 >--- a/bin/varnishtest/tests/v00011.vtc >+++ b/bin/varnishtest/tests/v00011.vtc >@@ -11,7 +11,7 @@ server s1 { > varnish v1 -vcl+backend { > sub vcl_recv { > if (req.request == "PURGE") { >- ban_url("^/$"); >+ ban("req.url ~ ^/$"); > error 209 "foo"; > } > } >diff --git a/bin/varnishtest/tests/v00018.vtc b/bin/varnishtest/tests/v00018.vtc >index 7a9ccbc..6fe35fb 100644 >--- a/bin/varnishtest/tests/v00018.vtc >+++ b/bin/varnishtest/tests/v00018.vtc >@@ -86,7 +86,7 @@ varnish v1 -errvcl {Only http header variables can be unset.} { > > varnish v1 -errvcl {Unknown token 'if' when looking for STRING} { > backend b { .host = "127.0.0.1"; } >- sub vcl_recv { ban_url (if); } >+ sub vcl_recv { ban (if); } > } > > varnish v1 -errvcl {Expected an action, 'if', '{' or '}'} { >@@ -96,7 +96,7 @@ varnish v1 -errvcl {Expected an action, 'if', '{' or '}'} { > > varnish v1 -vcl { > backend b { .host = "127.0.0.1"; } >- sub vcl_recv { ban_url ("foo"); } >+ sub vcl_recv { ban ("req.url ~ foo"); } > } > > varnish v1 -errvcl {Expected an action, 'if', '{' or '}'} { >diff --git a/doc/sphinx/reference/varnish-cli.rst b/doc/sphinx/reference/varnish-cli.rst >index 43fd590..787c09d 100644 >--- a/doc/sphinx/reference/varnish-cli.rst >+++ b/doc/sphinx/reference/varnish-cli.rst >@@ -118,13 +118,6 @@ ban.list > > Then follows the actual ban it self. > >-ban.url regexp >- Immediately invalidate all documents whose URL matches the >- specified regular expression. Please note that the Host part of >- the URL is ignored, so if you have several virtual hosts all of >- them will be banned. Use *ban* to specify a complete ban if you >- need to narrow it down. >- > help [command] > Display a list of available commands. > If the command is specified, display help for this command. >diff --git a/doc/sphinx/reference/vcl.rst b/doc/sphinx/reference/vcl.rst >index 50c339b..98c1c47 100644 >--- a/doc/sphinx/reference/vcl.rst >+++ b/doc/sphinx/reference/vcl.rst >@@ -327,9 +327,6 @@ regsuball(str, regex, sub) > ban(ban expression) > Bans all objects in cache that match the expression. > >-ban_url(regex) >- Bans all objects in cache whose URLs match regex. >- > Subroutines > ~~~~~~~~~~~ > >@@ -574,7 +571,7 @@ Example: > sub vcl_recv { > if (client.ip ~ admin_network) { > if (req.http.Cache-Control ~ "no-cache") { >- ban_url(req.url); >+ ban("req.url ~ " + req.url); > } > } > } >diff --git a/include/vcli.h b/include/vcli.h >index 04ac11c..3294dd7 100644 >--- a/include/vcli.h >+++ b/include/vcli.h >@@ -58,13 +58,6 @@ > "\tReturns the TTL, size and checksum of the object.", \ > 1, 1 > >-#define CLI_BAN_URL \ >- "ban.url", \ >- "ban.url ", \ >- "\tAll objects where the urls matches regexp will be " \ >- "marked obsolete.", \ >- 1, 1 >- > #define CLI_BAN \ > "ban", \ > "ban [&& ]...", \ >diff --git a/lib/libvcl/vcc_action.c b/lib/libvcl/vcc_action.c >index eae6231..1eec1c4 100644 >--- a/lib/libvcl/vcc_action.c >+++ b/lib/libvcl/vcc_action.c >@@ -195,24 +195,6 @@ parse_ban(struct vcc *tl) > /*--------------------------------------------------------------------*/ > > static void >-parse_ban_url(struct vcc *tl) >-{ >- >- vcc_NextToken(tl); >- ExpectErr(tl, '('); >- vcc_NextToken(tl); >- >- Fb(tl, 1, "VRT_ban(req, \"req.url\", \"~\", "); >- vcc_Expr(tl, STRING); >- ERRCHK(tl); >- ExpectErr(tl, ')'); >- vcc_NextToken(tl); >- Fb(tl, 0, ", 0);\n"); >-} >- >-/*--------------------------------------------------------------------*/ >- >-static void > parse_new_syntax(struct vcc *tl) > { > >@@ -324,7 +306,6 @@ static struct action_table { > { "call", parse_call }, > { "hash_data", parse_hash_data, VCL_MET_HASH }, > { "ban", parse_ban }, >- { "ban_url", parse_ban_url }, > { "remove", parse_unset }, /* backward compatibility */ > { "return", parse_return }, > { "rollback", parse_rollback }, >-- >1.7.10.4 > > >_______________________________________________ >varnish-dev mailing list >varnish-dev at varnish-cache.org >https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev > -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From phk at phk.freebsd.dk Sun Nov 25 21:55:09 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Sun, 25 Nov 2012 21:55:09 +0000 Subject: away mon 2012-11-26 Message-ID: <13464.1353880509@critter.freebsd.dk> I won't be online for the bug-wash tomorrow due to a meeting. Apologies for the late notice. -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From tfheen at varnish-software.com Mon Nov 26 08:28:05 2012 From: tfheen at varnish-software.com (Tollef Fog Heen) Date: Mon, 26 Nov 2012 09:28:05 +0100 Subject: [PATCH] Get rid of ban_url/ban.url In-Reply-To: <13319.1353700845@critter.freebsd.dk> References: <1353665181-23260-1-git-send-email-tfheen@varnish-software.com> <13319.1353700845@critter.freebsd.dk> Message-ID: <20121126082805.GC31012@err.no> ]] Poul-Henning Kamp > -------- > In message <1353665181-23260-1-git-send-email-tfheen at varnish-software.com>, Tol > lef Fog Heen writes: > > >ban.url is confusing as it takes a regular expression rather than a > >fixed string, so get rid of it in favour of people being explicit and > >using ban req.url ~ /foo > > My only reservation is that backwards-compat issue. Yeah, on the other hand, I see people getting confused by it, and the change when upgrading is pure syntax. > When did we deprecate ban.url ? Was that in 2.x ? If so, go for it... It hasn't really been marked as deprecated (so we could still allow it, just remove the docs for it) and then remove the implementation in the next version. ban() (or rather, purge()) got added to some 2.x version, at which point purge.url/ban.url was slightly deprecated. -- Tollef Fog Heen Technical lead | Varnish Software AS t: +47 21 98 92 64 We Make Websites Fly! From phk at phk.freebsd.dk Mon Nov 26 09:22:30 2012 From: phk at phk.freebsd.dk (Poul-Henning Kamp) Date: Mon, 26 Nov 2012 09:22:30 +0000 Subject: [PATCH] Get rid of ban_url/ban.url In-Reply-To: <20121126082805.GC31012@err.no> References: <1353665181-23260-1-git-send-email-tfheen@varnish-software.com> <13319.1353700845@critter.freebsd.dk> <20121126082805.GC31012@err.no> Message-ID: <1562.1353921750@critter.freebsd.dk> -------- In message <20121126082805.GC31012 at err.no>, Tollef Fog Heen writes: >It hasn't really been marked as deprecated well, we removed it from the on-line help... -- Poul-Henning Kamp | UNIX since Zilog Zeus 3.20 phk at FreeBSD.ORG | TCP/IP since RFC 956 FreeBSD committer | BSD since 4.3-tahoe Never attribute to malice what can adequately be explained by incompetence. From tfheen at varnish-software.com Thu Nov 29 12:10:19 2012 From: tfheen at varnish-software.com (Tollef Fog Heen) Date: Thu, 29 Nov 2012 13:10:19 +0100 Subject: [PATCH] Get rid of ban_url/ban.url In-Reply-To: <1562.1353921750@critter.freebsd.dk> References: <1353665181-23260-1-git-send-email-tfheen@varnish-software.com> <13319.1353700845@critter.freebsd.dk> <20121126082805.GC31012@err.no> <1562.1353921750@critter.freebsd.dk> Message-ID: <20121129121019.GD19024@err.no> ]] Poul-Henning Kamp > -------- > In message <20121126082805.GC31012 at err.no>, Tollef Fog Heen writes: > > >It hasn't really been marked as deprecated > > well, we removed it from the on-line help... Seems to still be listed on https://www.varnish-cache.org/docs/3.0/reference/vcl.html?highlight=ban_url#functions for instance. Still, I think we should remove it, and I don't really see a need to give it a grace period. Cheers, -- Tollef Fog Heen Technical lead | Varnish Software AS t: +47 21 98 92 64 We Make Websites Fly! From martin at varnish-software.com Thu Nov 29 12:54:10 2012 From: martin at varnish-software.com (Martin Blix Grydeland) Date: Thu, 29 Nov 2012 13:54:10 +0100 Subject: a6b9848 Eliminated duplicated code for trimming the tail of the banlist. In-Reply-To: References: Message-ID: Hi Poul-Henning, I was looking at this patch, and I believe there is a problem with regard to how you implemented this. I believe the loop in ban_lurker() around successful ban_lurker_work calls when the ban_lurker is enabled, has the potential of running for much longer than intended. So long as there is a new ban added at an interval shorter than 2*ban_lurker_sleep, this loop will continue running, and then no tail bans will ever be dropped. So I believe the structure in the original patch is better, where only the outer loop exists, and any droppable bans are removed on every loop. The return value of ban_lurker_work will then only influence for how long to sleep before looping again. Original patch can be seen here: https://www.varnish-cache.org/patchwork/patch/66/ -Martin On Thu, Nov 22, 2012 at 1:57 PM, Poul-Henning Kamp wrote: > commit a6b98489174224c65357728036ca9f963d47ac86 > Author: Poul-Henning Kamp > Date: Thu Nov 22 12:56:54 2012 +0000 > > Eliminated duplicated code for trimming the tail of the banlist. > > Original patch by: martin > > diff --git a/bin/varnishd/cache/cache_ban.c > b/bin/varnishd/cache/cache_ban.c > index 105a06f..688842b 100644 > --- a/bin/varnishd/cache/cache_ban.c > +++ b/bin/varnishd/cache/cache_ban.c > @@ -846,7 +846,7 @@ ban_CheckLast(void) > static int > ban_lurker_work(struct worker *wrk, struct vsl_log *vsl) > { > - struct ban *b, *b0, *b2; > + struct ban *b, *b0; > struct objhead *oh; > struct objcore *oc, *oc2; > struct object *o; > @@ -856,18 +856,6 @@ ban_lurker_work(struct worker *wrk, struct vsl_log > *vsl) > AN(pass & BAN_F_LURK); > AZ(pass & ~BAN_F_LURK); > > - /* First route the last ban(s) */ > - do { > - Lck_Lock(&ban_mtx); > - b2 = ban_CheckLast(); > - if (b2 != NULL) > - /* Notify stevedores */ > - STV_BanInfo(BI_DROP, b2->spec, ban_len(b2->spec)); > - Lck_Unlock(&ban_mtx); > - if (b2 != NULL) > - BAN_Free(b2); > - } while (b2 != NULL); > - > /* > * Find out if we have any bans we can do something about > * If we find any, tag them with our pass number. > @@ -1004,7 +992,7 @@ ban_lurker(struct worker *wrk, void *priv) > (void)priv; > while (1) { > > - while (cache_param->ban_lurker_sleep == 0.0) { > + do { > /* > * Ban-lurker is disabled: > * Clean the last ban, if possible, and sleep > @@ -1018,18 +1006,19 @@ ban_lurker(struct worker *wrk, void *priv) > Lck_Unlock(&ban_mtx); > if (bf != NULL) > BAN_Free(bf); > - else > - VTIM_sleep(1.0); > - } > - > - i = ban_lurker_work(wrk, &vsl); > - VSL_Flush(&vsl, 0); > - WRK_SumStat(wrk); > - if (i) { > - VTIM_sleep(cache_param->ban_lurker_sleep); > - } else { > - VTIM_sleep(1.0); > + } while (bf != NULL); > + > + if (cache_param->ban_lurker_sleep != 0.0) { > + do { > + i = ban_lurker_work(wrk, &vsl); > + VSL_Flush(&vsl, 0); > + WRK_SumStat(wrk); > + if (i) > + VTIM_sleep( > + cache_param->ban_lurker_sleep); > + } while (i); > } > + VTIM_sleep(0.609); // Random, non-magic > } > NEEDLESS_RETURN(NULL); > } > > _______________________________________________ > varnish-commit mailing list > varnish-commit at varnish-cache.org > https://www.varnish-cache.org/lists/mailman/listinfo/varnish-commit > -- *Martin Blix Grydeland* Senior Developer | Varnish Software AS Cell: +47 21 98 92 60 We Make Websites Fly! -------------- next part -------------- An HTML attachment was scrubbed... URL: