ccan
9 years agoccanlint: license_depends_compat checks dependencies are compatible.
Rusty Russell [Thu, 21 Jul 2011 05:14:46 +0000 (14:44 +0930)]
ccanlint: license_depends_compat checks dependencies are compatible.

We don't check external dependencies, but internal ccan deps are
pretty easy.

9 years agoccanlint: move license tag matching into common code.
Rusty Russell [Thu, 21 Jul 2011 04:59:06 +0000 (14:29 +0930)]
ccanlint: move license tag matching into common code.

Refactoring helps the next patch.

9 years agowwviaudio: fix license in _info, symlink (LGPL -> GPL)
Rusty Russell [Thu, 21 Jul 2011 04:59:06 +0000 (14:29 +0930)]
wwviaudio: fix license in _info, symlink (LGPL -> GPL)

Comments in code indicate this is actually GPL version 2 or later.

9 years agoogg_to_pcm: fix license in _info, symlink (LGPL -> GPLv2)
Rusty Russell [Thu, 21 Jul 2011 04:59:06 +0000 (14:29 +0930)]
ogg_to_pcm: fix license in _info, symlink (LGPL -> GPLv2)

Comments in code indicate this is actually GPL version 2 only.

9 years agomd4: fix license
Rusty Russell [Thu, 21 Jul 2011 04:59:06 +0000 (14:29 +0930)]
md4: fix license

As ccanlint now says:
  Source files don't contain incompatible licenses (license_file_compat): FAIL
  /home/rusty/devel/cvs/ccan/ccan/md4/md4.c:Found boilerplate for license 'GPLv2+' which is incompatible with 'LGPLv2+'

This is actually GPL code!

Add LICENSE link, too.

9 years agoccanlint: check for incompatible license boilerplates within subfiles.
Rusty Russell [Thu, 21 Jul 2011 04:59:03 +0000 (14:29 +0930)]
ccanlint: check for incompatible license boilerplates within subfiles.

This checks to make sure you're not accidentally relicensing code;
eg. it's OK (though a bit impolite) to turn a BSD-licensed file into a
GPL module, but not the other way around.

9 years agoccanlint: add simple check for comment referring to LICENSE file.
Rusty Russell [Thu, 21 Jul 2011 03:32:27 +0000 (13:02 +0930)]
ccanlint: add simple check for comment referring to LICENSE file.

After discussion with various developers (particularly the Samba
team), there's a consensus that a reference to the license in each
source file is useful.  Since CCAN modules are designed to be cut and
paste, this helps avoid any confusion should the LICENSE file go
missing.

We also detect standard boilerplates, in which case a one-line summary
isn't necessary.

9 years agonoerr: relicense to public domain.
Rusty Russell [Thu, 21 Jul 2011 03:32:04 +0000 (13:02 +0930)]
noerr: relicense to public domain.

We really want everyone to be using these; establishing conventions
helps all code, so make it the most liberal license possible.  It's
all my code, so I can do this unilaterally.

9 years agoalignof: relicense to public domain.
Rusty Russell [Thu, 21 Jul 2011 03:31:54 +0000 (13:01 +0930)]
alignof: relicense to public domain.

Trivial code, all mine.

9 years agobuild_assert: relicense to public domain.
Rusty Russell [Thu, 21 Jul 2011 03:31:49 +0000 (13:01 +0930)]
build_assert: relicense to public domain.

Trivial code, all mine.

9 years agoshort_types: relicense to public domain.
Rusty Russell [Thu, 21 Jul 2011 03:31:45 +0000 (13:01 +0930)]
short_types: relicense to public domain.

We really want everyone to be using these; establishing conventions
helps all code, so make it the most liberal license possible.  It's
all my code, so I can do this unilaterally.

9 years agocompiler: relicense to public domain.
Rusty Russell [Thu, 21 Jul 2011 03:31:39 +0000 (13:01 +0930)]
compiler: relicense to public domain.

We really want everyone to be using these; establishing conventions
helps all code, so make it the most liberal license possible.  It's
all my code, so I can do this unilaterally.

9 years agoccanlint: tighten license check.
Rusty Russell [Thu, 21 Jul 2011 02:26:15 +0000 (11:56 +0930)]
ccanlint: tighten license check.

Now we've made GPL wording uniform, use it everywhere.  There's no
point allowing variants which might be unclear.

We still have some non-conformant licenses in the tree (eg. just "BSD"),
so we only warn on unknown license strings for now.

9 years agovarious: make the _info License: wording uniform for GPL variants.
Rusty Russell [Tue, 19 Jul 2011 08:02:40 +0000 (17:32 +0930)]
various: make the _info License: wording uniform for GPL variants.

GPL versions 2 and 3 both specifically mention "any later version" as
the phrase which allows the user to choose to upgrade the license.
Make sure we use that phrase, and make the format consistent across
modules.

9 years agoccanlint: make a license enum, and parse the license string to set it.
Rusty Russell [Tue, 19 Jul 2011 08:00:49 +0000 (17:30 +0930)]
ccanlint: make a license enum, and parse the license string to set it.

This improves on the current ad-hoc methods, and also fixes a bug where
we mapped "GPLv2" to the GPLv3 symlink.

9 years agoMerge branch 'master' of ozlabs.org:ccan
Rusty Russell [Wed, 6 Jul 2011 05:21:54 +0000 (14:51 +0930)]
Merge branch 'master' of ozlabs.org:ccan

9 years agotally: don't use SIZE_MAX.
Rusty Russell [Wed, 6 Jul 2011 05:11:17 +0000 (14:41 +0930)]
tally: don't use SIZE_MAX.

Turns out it's not standard (thanks Samba build farm!)
And the previous test had a hole in it anyway.  This one is more conservative.

9 years agotap: WANT_PTHREAD not HAVE_PTHREAD
Rusty Russell [Mon, 4 Jul 2011 07:27:03 +0000 (16:57 +0930)]
tap: WANT_PTHREAD not HAVE_PTHREAD

I'm not sure that a "pthread-safe" tap library is very useful; how many
people have multiple threads calling ok()?

Kirill Shutemov noted that it gives a warning with -Wundef; indeed, we
should ask in this case whether they want pthread support, not whether the
system has pthread support to offer.

9 years agojson: Deleted the "notes" file.
Joey Adams [Sat, 2 Jul 2011 16:33:00 +0000 (12:33 -0400)]
json: Deleted the "notes" file.

This file contains my private ramblings about the JSON module,
and was not meant to be included in the public release.

9 years agojson: new module for parsing and generating JSON
Joey Adams [Thu, 30 Jun 2011 06:39:16 +0000 (02:39 -0400)]
json: new module for parsing and generating JSON

9 years agotally: fix FreeBSD compile, memleak in tests.
Rusty Russell [Tue, 21 Jun 2011 01:13:31 +0000 (10:43 +0930)]
tally: fix FreeBSD compile, memleak in tests.

Posix says ssize_t is in sys/types.h; on Linux stdlib.h is enough.

9 years agoantithread: patch to antithread arabella example
Russell Steicke [Fri, 17 Jun 2011 07:42:13 +0000 (15:42 +0800)]
antithread: patch to antithread arabella example

I've been using the antithread arabella example to generate some
"arty" portraits for decoration.  I've made a few changes to it
(triangle sizes and number of generations before giving up), and may
send those as patches later.

Because some of the images I'm generating have taken quite a while
(many days) I've needed to restart the run after rebooting machines
for other reasons, and noticed that arabella restarted the generation
count from zero.  I wanted to continue the generation count, so here's
a patch to do just that.

9 years agotdb2: Add tools/tdb2dump, tools/tdb2restore, use "tdb2.h" includes.
Rusty Russell [Fri, 17 Jun 2011 05:13:25 +0000 (14:43 +0930)]
tdb2: Add tools/tdb2dump, tools/tdb2restore, use "tdb2.h" includes.

Simple port from the TDB1 versions.  Also, change to "tdb2.h" includes
so they can be built even in other directories in future.

9 years agotdb2: rename the tools to tdb2torture, tdb2tool and mktdb2
Rusty Russell [Fri, 17 Jun 2011 05:11:55 +0000 (14:41 +0930)]
tdb2: rename the tools to tdb2torture, tdb2tool and mktdb2

This means they can be installed in parallel with tdb1's tools.

9 years agotdb2: use ccan/endian
Rusty Russell [Fri, 17 Jun 2011 02:57:44 +0000 (12:27 +0930)]
tdb2: use ccan/endian

This is where we should be getting bswap_64 from.

9 years agotools: trim leading whitespace in documentation extract.
Rusty Russell [Thu, 16 Jun 2011 03:03:23 +0000 (12:33 +0930)]
tools: trim leading whitespace in documentation extract.

Take some care to preserve formatting, even with mixed tabs and spaces.

9 years agocharset: Added utf8_validate_char (factored out of utf8_validate).
Joey Adams [Wed, 15 Jun 2011 02:13:01 +0000 (22:13 -0400)]
charset: Added utf8_validate_char (factored out of utf8_validate).

9 years agocharset: Rewrote utf8_validate, and added four new functions:
Joey Adams [Sat, 11 Jun 2011 07:58:10 +0000 (03:58 -0400)]
charset: Rewrote utf8_validate, and added four new functions:

 * utf8_read_char
 * utf8_write_char
 * from_surrogate_pair
 * to_surrogate_pair

9 years agohash: remove VALGRIND #ifdef - always run clean.
Rusty Russell [Wed, 8 Jun 2011 07:44:36 +0000 (17:14 +0930)]
hash: remove VALGRIND #ifdef - always run clean.

My simple test program on my laptop showed that with modern 32 bit Intel
CPUs and modern GCC, there's no measurable penalty for the clean version.

Andrew Bartlett complained that the valgrind noise was grating.  Agreed.

9 years agolbalance: add examples.
Rusty Russell [Sun, 5 Jun 2011 00:42:41 +0000 (10:12 +0930)]
lbalance: add examples.

9 years agolbalance: new module for load balancing
Rusty Russell [Tue, 31 May 2011 04:14:48 +0000 (13:44 +0930)]
lbalance: new module for load balancing

9 years agotime: new module for dealing with time.
Rusty Russell [Tue, 31 May 2011 04:14:36 +0000 (13:44 +0930)]
time: new module for dealing with time.

9 years agocast, container_of, tlist: Fix warning with GCC 4.6: -Wunused-but-set-variable
Joey Adams [Sun, 29 May 2011 02:23:55 +0000 (22:23 -0400)]
cast, container_of, tlist: Fix warning with GCC 4.6: -Wunused-but-set-variable

9 years agottxml: new module.
Rusty Russell [Fri, 20 May 2011 07:12:45 +0000 (16:42 +0930)]
ttxml: new module.

9 years agotdb2: fix O_RDONLY opens.
Rusty Russell [Fri, 20 May 2011 06:23:12 +0000 (15:53 +0930)]
tdb2: fix O_RDONLY opens.

We tried to get a F_WRLCK on the open lock; we shouldn't do that for a
read-only tdb.  (TDB1 gets away with it because a read-only open skips
all locking).

We also avoid leaking the fd in two tdb_open() failure paths revealed
by this extra testing.

9 years agofailtest: failtest_has_failed()
Rusty Russell [Fri, 20 May 2011 06:21:33 +0000 (15:51 +0930)]
failtest: failtest_has_failed()

Allows tests to explicitly avoid continuing when a failure has been
injected.

9 years agofailtest: override getpid() as well.
Rusty Russell [Fri, 20 May 2011 06:20:58 +0000 (15:50 +0930)]
failtest: override getpid() as well.

TDB2 tracks locks using getpid(), and gets upset when we fork behind
its back.

9 years agotypesafe_cb: don't use HAVE_CAST_TO_UNION in tests.
Rusty Russell [Tue, 10 May 2011 04:38:59 +0000 (14:08 +0930)]
typesafe_cb: don't use HAVE_CAST_TO_UNION in tests.

This crept in, it should be the same as the tests in typesafe_cb.h.

9 years agotdb2: more stats
Rusty Russell [Tue, 10 May 2011 00:33:50 +0000 (10:03 +0930)]
tdb2: more stats

More recording of interesting events.  As we don't have an ABI yet, we
don't need to put these at the end.

9 years agotdb2: check pid before unlock.
Rusty Russell [Tue, 10 May 2011 01:37:21 +0000 (11:07 +0930)]
tdb2: check pid before unlock.

The original code assumed that unlocking would fail if we didn't have a lock;
this isn't true (at least, on my machine).  So we have to always check the
pid before unlocking.

9 years agotdb2: fix msync() arg
Rusty Russell [Wed, 27 Apr 2011 13:30:25 +0000 (23:00 +0930)]
tdb2: fix msync() arg

PAGESIZE used to be defined to getpagesize(); we changed it to a
constant in b556ef1f, which broke the msync() call.

9 years agotdb2: use direct access functions when creating recovery blob
Rusty Russell [Wed, 27 Apr 2011 13:41:02 +0000 (23:11 +0930)]
tdb2: use direct access functions when creating recovery blob

We don't need to copy into a buffer to examine the old data: in the
common case, it's mmaped already.  It's made a bit trickier because
the tdb_access_read() function uses the current I/O methods, so we
need to restore that temporarily.

The difference was in the noise, however (the sync no-doubt
dominates).

Before:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 0m45.021s
user 0m16.261s
sys 0m2.432s
-rw------- 1 rusty rusty 364469344 2011-04-27 22:55 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m10.144s
user 0m0.480s
sys 0m0.460s
-rw------- 1 rusty rusty 391992 2011-04-27 22:56 torture.tdb
Adding 2000000 records:  863 ns (110601144 bytes)
Finding 2000000 records:  565 ns (110601144 bytes)
Missing 2000000 records:  383 ns (110601144 bytes)
Traversing 2000000 records:  409 ns (110601144 bytes)
Deleting 2000000 records:  676 ns (225354680 bytes)
Re-adding 2000000 records:  784 ns (225354680 bytes)
Appending 2000000 records:  1191 ns (247890168 bytes)
Churning 2000000 records:  2166 ns (423133432 bytes)

After:
real 0m47.141s
user 0m16.073s
sys 0m2.460s
-rw------- 1 rusty rusty 364469344 2011-04-27 22:58 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m4.207s
user 0m0.416s
sys 0m0.504s
-rw------- 1 rusty rusty 313576 2011-04-27 22:59 torture.tdb
Adding 2000000 records:  874 ns (110601144 bytes)
Finding 2000000 records:  565 ns (110601144 bytes)
Missing 2000000 records:  393 ns (110601144 bytes)
Traversing 2000000 records:  404 ns (110601144 bytes)
Deleting 2000000 records:  684 ns (225354680 bytes)
Re-adding 2000000 records:  792 ns (225354680 bytes)
Appending 2000000 records:  1212 ns (247890168 bytes)
Churning 2000000 records:  2191 ns (423133432 bytes)

9 years agotdb2: enlarge transaction pagesize to 64k
Rusty Russell [Wed, 27 Apr 2011 13:40:24 +0000 (23:10 +0930)]
tdb2: enlarge transaction pagesize to 64k

We don't need to use 4k for our transaction pages; we can use any
value.  For the tools/speed benchmark, any value between about 4k and
64M makes no difference, but that's probably because the entire
database is touched in each transaction.

So instead, I looked at tdbtorture to try to find an optimum value, as
it uses smaller transactions.  4k and 64k were equivalent.  16M was
almost three times slower, 1M was 5-10% slower.  1024 was also 5-10%
slower.

There's a slight advantage of having larger pages, both for allowing
direct access to the database (if it's all in one page we can sometimes
grant direct access even inside a transaction) and for the compactness
of our recovery area (since our code is naive and won't combine one
run across pages).

Before:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 0m47.127s
user 0m17.125s
sys 0m2.456s
-rw------- 1 rusty rusty 366680288 2011-04-27 21:34 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m16.049s
user 0m0.300s
sys 0m0.492s
-rw------- 1 rusty rusty 244472 2011-04-27 21:35 torture.tdb
Adding 2000000 records:  894 ns (110551992 bytes)
Finding 2000000 records:  564 ns (110551992 bytes)
Missing 2000000 records:  398 ns (110551992 bytes)
Traversing 2000000 records:  399 ns (110551992 bytes)
Deleting 2000000 records:  711 ns (225633208 bytes)
Re-adding 2000000 records:  819 ns (225633208 bytes)
Appending 2000000 records:  1252 ns (248196544 bytes)
Churning 2000000 records:  2319 ns (424005056 bytes)

After:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 0m45.021s
user 0m16.261s
sys 0m2.432s
-rw------- 1 rusty rusty 364469344 2011-04-27 22:55 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m10.144s
user 0m0.480s
sys 0m0.460s
-rw------- 1 rusty rusty 391992 2011-04-27 22:56 torture.tdb
Adding 2000000 records:  863 ns (110601144 bytes)
Finding 2000000 records:  565 ns (110601144 bytes)
Missing 2000000 records:  383 ns (110601144 bytes)
Traversing 2000000 records:  409 ns (110601144 bytes)
Deleting 2000000 records:  676 ns (225354680 bytes)
Re-adding 2000000 records:  784 ns (225354680 bytes)
Appending 2000000 records:  1191 ns (247890168 bytes)
Churning 2000000 records:  2166 ns (423133432 bytes)

9 years agotdb2: try to fit transactions in existing space before we expand.
Rusty Russell [Wed, 27 Apr 2011 13:26:27 +0000 (22:56 +0930)]
tdb2: try to fit transactions in existing space before we expand.

Currently we use the worst-case-possible size for the recovery area.
Instead, prepare the recovery data, then see whether it's too large.

Note that this currently works out to make the database *larger* on
our speed benchmark, since we happen to need to enlarge the recovery
area at the wrong time now, rather than the old case where its already
hugely oversized.

Before:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 0m50.366s
user 0m17.109s
sys 0m2.468s
-rw------- 1 rusty rusty 564215952 2011-04-27 21:31 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m23.818s
user 0m0.304s
sys 0m0.508s
-rw------- 1 rusty rusty 669856 2011-04-27 21:32 torture.tdb
Adding 2000000 records:  887 ns (110556088 bytes)
Finding 2000000 records:  556 ns (110556088 bytes)
Missing 2000000 records:  385 ns (110556088 bytes)
Traversing 2000000 records:  401 ns (110556088 bytes)
Deleting 2000000 records:  710 ns (244003768 bytes)
Re-adding 2000000 records:  825 ns (244003768 bytes)
Appending 2000000 records:  1255 ns (268404160 bytes)
Churning 2000000 records:  2299 ns (268404160 bytes)

After:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 0m47.127s
user 0m17.125s
sys 0m2.456s
-rw------- 1 rusty rusty 366680288 2011-04-27 21:34 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m16.049s
user 0m0.300s
sys 0m0.492s
-rw------- 1 rusty rusty 244472 2011-04-27 21:35 torture.tdb
Adding 2000000 records:  894 ns (110551992 bytes)
Finding 2000000 records:  564 ns (110551992 bytes)
Missing 2000000 records:  398 ns (110551992 bytes)
Traversing 2000000 records:  399 ns (110551992 bytes)
Deleting 2000000 records:  711 ns (225633208 bytes)
Re-adding 2000000 records:  819 ns (225633208 bytes)
Appending 2000000 records:  1252 ns (248196544 bytes)
Churning 2000000 records:  2319 ns (424005056 bytes)

9 years agotdb2: reduce transaction before writing to recovery area.
Rusty Russell [Wed, 27 Apr 2011 12:17:58 +0000 (21:47 +0930)]
tdb2: reduce transaction before writing to recovery area.

We don't need to write the whole page to the recovery area if it
hasn't all changed.  Simply skipping the start and end of the pages
which are similar saves us about 20% on growtdb-bench 250000, and 45%
on tdbtorture.  The more thorough examination of page differences
gives us a saving of 90% on growtdb-bench and 98% on tdbtorture!

And we do win a bit on timings for transaction commit:

Before:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 1m4.844s
user 0m15.537s
sys 0m3.796s
-rw------- 1 rusty rusty 626693096 2011-04-27 21:28 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m17.021s
user 0m0.272s
sys 0m0.540s
-rw------- 1 rusty rusty 458800 2011-04-27 21:29 torture.tdb
Adding 2000000 records:  894 ns (110556088 bytes)
Finding 2000000 records:  569 ns (110556088 bytes)
Missing 2000000 records:  390 ns (110556088 bytes)
Traversing 2000000 records:  403 ns (110556088 bytes)
Deleting 2000000 records:  710 ns (244003768 bytes)
Re-adding 2000000 records:  825 ns (244003768 bytes)
Appending 2000000 records:  1262 ns (268404160 bytes)
Churning 2000000 records:  2311 ns (268404160 bytes)

After:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 0m50.366s
user 0m17.109s
sys 0m2.468s
-rw------- 1 rusty rusty 564215952 2011-04-27 21:31 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m23.818s
user 0m0.304s
sys 0m0.508s
-rw------- 1 rusty rusty 669856 2011-04-27 21:32 torture.tdb
Adding 2000000 records:  887 ns (110556088 bytes)
Finding 2000000 records:  556 ns (110556088 bytes)
Missing 2000000 records:  385 ns (110556088 bytes)
Traversing 2000000 records:  401 ns (110556088 bytes)
Deleting 2000000 records:  710 ns (244003768 bytes)
Re-adding 2000000 records:  825 ns (244003768 bytes)
Appending 2000000 records:  1255 ns (268404160 bytes)
Churning 2000000 records:  2299 ns (268404160 bytes)

9 years agotdb2: handle non-transaction-page-aligned sizes in recovery.
Rusty Russell [Thu, 21 Apr 2011 01:46:35 +0000 (11:16 +0930)]
tdb2: handle non-transaction-page-aligned sizes in recovery.

tdb1 always makes the tdb a multiple of the transaction page size,
tdb2 doesn't.  This means that if a transaction hits the exact end of
the file, we might need to save off a partial page.

So that we don't have to rewrite tdb_recovery_size() too, we simply do
a short read and memset the unused section to 0 (to keep valgrind
happy).

9 years agotdb2: remove tailer from transaction record.
Rusty Russell [Thu, 21 Apr 2011 02:10:25 +0000 (11:40 +0930)]
tdb2: remove tailer from transaction record.

We don't have tailers in tdb2, so it's just 8 bytes of confusing wastage.

9 years agotdb2: limit coalescing based on how successful we are.
Rusty Russell [Wed, 27 Apr 2011 12:16:20 +0000 (21:46 +0930)]
tdb2: limit coalescing based on how successful we are.

Instead of walking the entire free list, walk 8 entries, or more if we
are successful: the reward is scaled by the size coalesced.

We also move previously-examined records to the end of the list.

This reduces file size with very little speed penalty.

Before:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 1m17.022s
user 0m27.206s
sys 0m3.920s
-rw------- 1 rusty rusty 570130576 2011-04-27 21:17 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m27.355s
user 0m0.296s
sys 0m0.516s
-rw------- 1 rusty rusty 617352 2011-04-27 21:18 torture.tdb
Adding 2000000 records:  890 ns (110556088 bytes)
Finding 2000000 records:  565 ns (110556088 bytes)
Missing 2000000 records:  390 ns (110556088 bytes)
Traversing 2000000 records:  410 ns (110556088 bytes)
Deleting 2000000 records:  8623 ns (244003768 bytes)
Re-adding 2000000 records:  7089 ns (244003768 bytes)
Appending 2000000 records:  33708 ns (244003768 bytes)
Churning 2000000 records:  2029 ns (268404160 bytes)

After:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 1m7.096s
user 0m15.637s
sys 0m3.812s
-rw------- 1 rusty rusty 561270928 2011-04-27 21:22 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m13.850s
user 0m0.268s
sys 0m0.492s
-rw------- 1 rusty rusty 429768 2011-04-27 21:23 torture.tdb
Adding 2000000 records:  892 ns (110556088 bytes)
Finding 2000000 records:  570 ns (110556088 bytes)
Missing 2000000 records:  390 ns (110556088 bytes)
Traversing 2000000 records:  407 ns (110556088 bytes)
Deleting 2000000 records:  706 ns (244003768 bytes)
Re-adding 2000000 records:  822 ns (244003768 bytes)
Appending 2000000 records:  1262 ns (268404160 bytes)
Churning 2000000 records:  2320 ns (268404160 bytes)

9 years agotdb2: use counters to decide when to coalesce records.
Rusty Russell [Wed, 27 Apr 2011 12:14:16 +0000 (21:44 +0930)]
tdb2: use counters to decide when to coalesce records.

This simply uses a 7 bit counter which gets incremented on each addition
to the list (but not decremented on removals).  When it wraps, we walk the
entire list looking for things to coalesce.

This causes performance problems, especially when appending records, so
we limit it in the next patch:

Before:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 0m59.687s
user 0m11.593s
sys 0m4.100s
-rw------- 1 rusty rusty 752004064 2011-04-27 21:14 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m17.738s
user 0m0.348s
sys 0m0.580s
-rw------- 1 rusty rusty 663360 2011-04-27 21:15 torture.tdb
Adding 2000000 records:  926 ns (110556088 bytes)
Finding 2000000 records:  592 ns (110556088 bytes)
Missing 2000000 records:  416 ns (110556088 bytes)
Traversing 2000000 records:  422 ns (110556088 bytes)
Deleting 2000000 records:  741 ns (244003768 bytes)
Re-adding 2000000 records:  799 ns (244003768 bytes)
Appending 2000000 records:  1147 ns (295244592 bytes)
Churning 2000000 records:  1827 ns (568411440 bytes)

After:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 1m17.022s
user 0m27.206s
sys 0m3.920s
-rw------- 1 rusty rusty 570130576 2011-04-27 21:17 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m27.355s
user 0m0.296s
sys 0m0.516s
-rw------- 1 rusty rusty 617352 2011-04-27 21:18 torture.tdb
Adding 2000000 records:  890 ns (110556088 bytes)
Finding 2000000 records:  565 ns (110556088 bytes)
Missing 2000000 records:  390 ns (110556088 bytes)
Traversing 2000000 records:  410 ns (110556088 bytes)
Deleting 2000000 records:  8623 ns (244003768 bytes)
Re-adding 2000000 records:  7089 ns (244003768 bytes)
Appending 2000000 records:  33708 ns (244003768 bytes)
Churning 2000000 records:  2029 ns (268404160 bytes)

9 years agotdb2: overallocate the recovery area.
Rusty Russell [Wed, 27 Apr 2011 12:12:58 +0000 (21:42 +0930)]
tdb2: overallocate the recovery area.

I noticed a counter-intuitive phenomenon as I tweaked the coalescing
code: the more coalescing we did, the larger the tdb grew!  This was
measured using "growtdb-bench 250000 10".

The cause: more coalescing means larger transactions, and every time
we do a larger transaction, we need to allocate a larger recovery
area.  The only way to do this is to append to the file, so the file
keeps growing, even though it's mainly unused!

Overallocating by 25% seems reasonable, and gives better results in
such benchmarks.

The real fix is to reduce the transaction to a run-length based format
rather then the naive block system used now.

Before:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 0m57.403s
user 0m11.361s
sys 0m4.056s
-rw------- 1 rusty rusty 689536976 2011-04-27 21:10 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m24.901s
user 0m0.380s
sys 0m0.512s
-rw------- 1 rusty rusty 655368 2011-04-27 21:12 torture.tdb
Adding 2000000 records:  941 ns (110551992 bytes)
Finding 2000000 records:  603 ns (110551992 bytes)
Missing 2000000 records:  428 ns (110551992 bytes)
Traversing 2000000 records:  416 ns (110551992 bytes)
Deleting 2000000 records:  741 ns (199517112 bytes)
Re-adding 2000000 records:  819 ns (199517112 bytes)
Appending 2000000 records:  1228 ns (376542552 bytes)
Churning 2000000 records:  2042 ns (553641304 bytes)

After:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 0m59.687s
user 0m11.593s
sys 0m4.100s
-rw------- 1 rusty rusty 752004064 2011-04-27 21:14 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m17.738s
user 0m0.348s
sys 0m0.580s
-rw------- 1 rusty rusty 663360 2011-04-27 21:15 torture.tdb
Adding 2000000 records:  926 ns (110556088 bytes)
Finding 2000000 records:  592 ns (110556088 bytes)
Missing 2000000 records:  416 ns (110556088 bytes)
Traversing 2000000 records:  422 ns (110556088 bytes)
Deleting 2000000 records:  741 ns (244003768 bytes)
Re-adding 2000000 records:  799 ns (244003768 bytes)
Appending 2000000 records:  1147 ns (295244592 bytes)
Churning 2000000 records:  1827 ns (568411440 bytes)

9 years agotdb2: don't start again when we coalesce a record.
Rusty Russell [Wed, 27 Apr 2011 12:13:23 +0000 (21:43 +0930)]
tdb2: don't start again when we coalesce a record.

We currently start walking the free list again when we coalesce any record;
this is overzealous, as we only care about the next record being blatted,
or the record we currently consider "best".

We can also opportunistically try to add the coalesced record into the
new free list: if it fails, we go back to the old "mark record,
unlock, re-lock" code.

Before:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 1m0.243s
user 0m13.677s
sys 0m4.336s
-rw------- 1 rusty rusty 683302864 2011-04-27 21:03 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m24.074s
user 0m0.344s
sys 0m0.468s
-rw------- 1 rusty rusty 836040 2011-04-27 21:04 torture.tdb
Adding 2000000 records:  1015 ns (110551992 bytes)
Finding 2000000 records:  641 ns (110551992 bytes)
Missing 2000000 records:  445 ns (110551992 bytes)
Traversing 2000000 records:  439 ns (110551992 bytes)
Deleting 2000000 records:  807 ns (199517112 bytes)
Re-adding 2000000 records:  851 ns (199517112 bytes)
Appending 2000000 records:  1301 ns (376542552 bytes)
Churning 2000000 records:  2423 ns (553641304 bytes)

After:
$ time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
real 0m57.403s
user 0m11.361s
sys 0m4.056s
-rw------- 1 rusty rusty 689536976 2011-04-27 21:10 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m24.901s
user 0m0.380s
sys 0m0.512s
-rw------- 1 rusty rusty 655368 2011-04-27 21:12 torture.tdb
Adding 2000000 records:  941 ns (110551992 bytes)
Finding 2000000 records:  603 ns (110551992 bytes)
Missing 2000000 records:  428 ns (110551992 bytes)
Traversing 2000000 records:  416 ns (110551992 bytes)
Deleting 2000000 records:  741 ns (199517112 bytes)
Re-adding 2000000 records:  819 ns (199517112 bytes)
Appending 2000000 records:  1228 ns (376542552 bytes)
Churning 2000000 records:  2042 ns (553641304 bytes)

9 years agotdb2: make internal coalesce() function return length coalesced.
Rusty Russell [Fri, 25 Mar 2011 04:23:23 +0000 (14:53 +1030)]
tdb2: make internal coalesce() function return length coalesced.

This makes life easier for the next patch.

9 years agotdb2: expand more slowly.
Rusty Russell [Wed, 27 Apr 2011 12:09:27 +0000 (21:39 +0930)]
tdb2: expand more slowly.

We took the original expansion heuristic from TDB1, and they just
fixed theirs, so copy that.

Before:

After:
time ./growtdb-bench 250000 10 > /dev/null && ls -l /tmp/growtdb.tdb && time ./tdbtorture -s 0 && ls -l torture.tdb && ./speed --transaction 2000000
growtdb-bench.c: In function ‘main’:
growtdb-bench.c:74:8: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result
growtdb-bench.c:108:9: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result

real 1m0.243s
user 0m13.677s
sys 0m4.336s
-rw------- 1 rusty rusty 683302864 2011-04-27 21:03 /tmp/growtdb.tdb
testing with 3 processes, 5000 loops, seed=0
OK

real 1m24.074s
user 0m0.344s
sys 0m0.468s
-rw------- 1 rusty rusty 836040 2011-04-27 21:04 torture.tdb
Adding 2000000 records:  1015 ns (110551992 bytes)
Finding 2000000 records:  641 ns (110551992 bytes)
Missing 2000000 records:  445 ns (110551992 bytes)
Traversing 2000000 records:  439 ns (110551992 bytes)
Deleting 2000000 records:  807 ns (199517112 bytes)
Re-adding 2000000 records:  851 ns (199517112 bytes)
Appending 2000000 records:  1301 ns (376542552 bytes)
Churning 2000000 records:  2423 ns (553641304 bytes)

9 years agotdb2: use 64 bit file offsets on 32 bit systems if available.
Rusty Russell [Tue, 19 Apr 2011 07:24:41 +0000 (16:54 +0930)]
tdb2: use 64 bit file offsets on 32 bit systems if available.

And testing reveals a latent bug on 32 bit systems.

9 years agotdb2: test lock timeout plugin code.
Rusty Russell [Thu, 21 Apr 2011 04:04:13 +0000 (13:34 +0930)]
tdb2: test lock timeout plugin code.

9 years agotdb2: allow transaction to nest.
Rusty Russell [Thu, 7 Apr 2011 01:29:45 +0000 (10:59 +0930)]
tdb2: allow transaction to nest.

This is definitely a bad idea in general, but SAMBA uses nested transactions
in many and varied ways (some of them probably reflect real bugs) and it's
far easier to support them inside tdb2 with a flag.

We already have part of the TDB1 infrastructure in place, so this patch
just completes it and fixes one place where I'd messed it up.

9 years agotdb2: allow multiple chain locks.
Rusty Russell [Wed, 27 Apr 2011 11:18:39 +0000 (20:48 +0930)]
tdb2: allow multiple chain locks.

It's probably not a good idea, because it's a recipe for deadlocks if
anyone else grabs any *other* two chainlocks, or the allrecord lock,
but SAMBA definitely does it, so allow it as TDB1 does.

9 years agotdb2: TDB_ATTRIBUTE_STATS access via tdb_get_attribute.
Rusty Russell [Wed, 27 Apr 2011 13:51:32 +0000 (23:21 +0930)]
tdb2: TDB_ATTRIBUTE_STATS access via tdb_get_attribute.

Now we have tdb_get_attribute, it makes sense to make that the method
of accessing statistics.  That way they are always available, and it's
probably cheaper doing the direct increment than even the unlikely()
branch.

9 years agotdb2: make tdb_name() valid early in tdb_open()
Rusty Russell [Thu, 7 Apr 2011 11:18:33 +0000 (20:48 +0930)]
tdb2: make tdb_name() valid early in tdb_open()

Otherwise tdb_name() can be NULL in log functions.  And we might as
well allocate it with the tdb, as well.

9 years agotdb2: fix an error message misspelling.
Rusty Russell [Thu, 7 Apr 2011 11:18:27 +0000 (20:48 +0930)]
tdb2: fix an error message misspelling.

9 years agotdb2: tdb_set_attribute, tdb_unset_attribute and tdb_get_attribute
Rusty Russell [Thu, 7 Apr 2011 07:22:35 +0000 (16:52 +0930)]
tdb2: tdb_set_attribute, tdb_unset_attribute and tdb_get_attribute

It makes sense for some attributes to be manipulated after tdb_open,
so allow that.

9 years agotdb2: TDB_ATTRIBUTE_FLOCK support
Rusty Russell [Thu, 7 Apr 2011 07:18:43 +0000 (16:48 +0930)]
tdb2: TDB_ATTRIBUTE_FLOCK support

This allows overriding of low-level locking functions.  This allows
special effects such as non-blocking operations, and lock proxying.

We rename some local lock vars to l to avoid -Wshadow warnings.

9 years agotdb2: don't cancel transaction when tdb_transaction_prepare_commit fails
Rusty Russell [Wed, 6 Apr 2011 23:00:39 +0000 (08:30 +0930)]
tdb2: don't cancel transaction when tdb_transaction_prepare_commit fails

And don't double-log.  Both of these cause problems if we want to do
tdb_transaction_prepare_commit non-blocking (and have it fail so we can
try again).

9 years agotdb2: open hook for implementing TDB_CLEAR_IF_FIRST
Rusty Russell [Thu, 7 Apr 2011 04:21:54 +0000 (13:51 +0930)]
tdb2: open hook for implementing TDB_CLEAR_IF_FIRST

This allows the caller to implement clear-if-first semantics as per
TDB1.  The flag was removed for good reasons: performance and
unreliability, but SAMBA3 still uses it widely, so this allows them to
reimplement it themselves.

(There is no way to do it without help like this from tdb2, since it has
 to be done under the open lock).

9 years agotdb2: cleanups for tools/speed.c
Rusty Russell [Tue, 10 May 2011 01:45:04 +0000 (11:15 +0930)]
tdb2: cleanups for tools/speed.c

1) The logging function needs to append a \n.
2) The transaction start code should be after the comment and print.
3) We should run tdb_check to make sure the database is OK after each op.

9 years agotdb2: rearrange log function to put data arg at the end.
Rusty Russell [Thu, 7 Apr 2011 03:46:35 +0000 (13:16 +0930)]
tdb2: rearrange log function to put data arg at the end.

Also, rename private logfn to log_fn for consistency with other members.

9 years agotdb2: rename internal hashfn and logfn to hash_fn and log_fn.
Rusty Russell [Thu, 7 Apr 2011 05:35:58 +0000 (15:05 +0930)]
tdb2: rename internal hashfn and logfn to hash_fn and log_fn.

We use underscores everywhere else, so be consistent.

9 years agotdb2: shorten attribute members.
Rusty Russell [Thu, 7 Apr 2011 03:36:11 +0000 (13:06 +0930)]
tdb2: shorten attribute members.

It's redundant calling hash.hash_fn for example.  Standardize on fn
and data as names (private conflicts with C++).

9 years agotdb2: extend start of hash locks.
Rusty Russell [Tue, 29 Mar 2011 05:24:13 +0000 (15:54 +1030)]
tdb2: extend start of hash locks.

This gives us more locks for future use, plus allows a clear-if-first-style
hack to be implemented.

9 years agotdb2: implement tdb_chainlock_read/tdb_chainunlock_read.
Rusty Russell [Tue, 29 Mar 2011 05:23:36 +0000 (15:53 +1030)]
tdb2: implement tdb_chainlock_read/tdb_chainunlock_read.

9 years agotdb2: fix tdb_summary reports
Rusty Russell [Tue, 19 Apr 2011 13:34:13 +0000 (23:04 +0930)]
tdb2: fix tdb_summary reports

1) Fix the bogus reporting of uncoalesced runs: there has to be more than 1
   free record to make a "run", and any other record interrups the run.
2) Fix the bogus data count in the top line (which was number of records,
   not bytes).
3) Remove the count of free buckets: it's now a constant.

9 years agoconfigurator: make it BSD-MIT licensed.
Rusty Russell [Thu, 28 Apr 2011 04:19:32 +0000 (13:49 +0930)]
configurator: make it BSD-MIT licensed.

Douglas Bagnell noted that it didn't specify.

9 years agocompiler: don't override existing definitions.
Rusty Russell [Thu, 28 Apr 2011 03:52:07 +0000 (13:22 +0930)]
compiler: don't override existing definitions.

It's common when integrating CCAN into existing projects that they define
such constants for themselves.  In an ideal world, the entire project
switches to one set of definitions, but for large projects (eg SAMBA)
that's not realistic and conflicts with the aim of making CCAN modules
easy to "drop in" to existing code.

(This is a generalization of Douglas Bagnell's patch sent in Message-ID:
<4DB8D00D.8000800@paradise.net.nz>).

9 years agotools: don't unnecessarily redefine _GNU_SOURCE in config.h
Douglas Bagnall [Wed, 20 Apr 2011 14:50:23 +0000 (02:50 +1200)]
tools: don't unnecessarily redefine _GNU_SOURCE in config.h

Makes it easier to reuse this code in other projects.

9 years agoilog: credit Tim Terriberry as author in ccan/ilog/_info
Douglas Bagnall [Sat, 23 Apr 2011 13:55:26 +0000 (01:55 +1200)]
ilog: credit Tim Terriberry as author in ccan/ilog/_info

9 years agoMakefile: don't define -Werror for ccanlint.
Rusty Russell [Wed, 27 Apr 2011 07:05:07 +0000 (16:35 +0930)]
Makefile: don't define -Werror for ccanlint.

It's useful for developers, but not so much for casual users.  For example,
RHEL 5.6 has qsort_r, but no prototype, which causes a warning.

9 years agotools: always include config.h before anything else.
Rusty Russell [Wed, 27 Apr 2011 07:04:04 +0000 (16:34 +0930)]
tools: always include config.h before anything else.

Otherwise, _GNU_SOURCE isn't defined (for example) so prototypes such as
isblank can be missing.

9 years agostr: fix tests on unsigned chars, and !HAVE_ISBLANK.
Rusty Russell [Wed, 27 Apr 2011 06:35:43 +0000 (16:05 +0930)]
str: fix tests on unsigned chars, and !HAVE_ISBLANK.

9 years agociniparser: Add a check that len remains within bounds.
Andreas Schlick [Tue, 26 Apr 2011 15:07:49 +0000 (17:07 +0200)]
ciniparser: Add a check that len remains within bounds.

If the line is made solely of whitespaces, they get removed and we end up with len
set to -1. Therefore we need an additional check to avoid dereferencing line[-1].

9 years agoccanlint: Add more C++ keywords.
Andreas Schlick [Tue, 26 Apr 2011 13:19:04 +0000 (15:19 +0200)]
ccanlint: Add more C++ keywords.

9 years agostr_talloc: make strjoin much more efficient.
Rusty Russell [Tue, 19 Apr 2011 10:53:59 +0000 (20:23 +0930)]
str_talloc: make strjoin much more efficient.

Inspired by patch from Volker.

9 years agostr_talloc: avoid const warnings on test/run.c
Rusty Russell [Tue, 19 Apr 2011 10:53:35 +0000 (20:23 +0930)]
str_talloc: avoid const warnings on test/run.c

9 years agotypesafe_cb: simplify, preserve namespace.
Rusty Russell [Wed, 6 Apr 2011 22:54:41 +0000 (08:24 +0930)]
typesafe_cb: simplify, preserve namespace.

Get rid of many variants, which were just confusing for most people.
Keep typesafe_cb(), typesafe_cb_preargs() and typesafe_cb_postarts(),
and rework cast_if_type() into typesafe_cb_cast() so we stay in our
namespace.

I should have done this as soon as I discovered the limitation that
the types have to be defined if I want const-taking callbacks.

9 years agoccanlint: test for C++ reserved words in headers.
Rusty Russell [Tue, 19 Apr 2011 10:56:13 +0000 (20:26 +0930)]
ccanlint: test for C++ reserved words in headers.

Don't check the whole source, but it's nice for headers to be C++-clean.

9 years agoconfigurator: HAVE_FILE_OFFSET_BITS
Rusty Russell [Tue, 19 Apr 2011 07:23:39 +0000 (16:53 +0930)]
configurator: HAVE_FILE_OFFSET_BITS

Defines whether it's useful to do #define _FILE_OFFSET_BITS 64 to get a
larger off_t.

9 years agojunkcode: upload via website.
Rusty Russell [Tue, 19 Apr 2011 00:54:27 +0000 (10:24 +0930)]
junkcode: upload via website.

9 years agoconfigurator: Remove the now unneeded test for nested functions.
Andreas Schlick [Sat, 2 Apr 2011 01:31:51 +0000 (12:01 +1030)]
configurator: Remove the now unneeded test for nested functions.

9 years agoasort: Remove the trampoline version.
Andreas Schlick [Sat, 2 Apr 2011 01:30:36 +0000 (12:00 +1030)]
asort: Remove the trampoline version.

Most Linux systems use glibc and therefore have qsort_r() and for the others an
implementation is provided, therefore there is no need to have a third case in
asort.

9 years agofailtest: Change mode_t to int.
Andreas Schlick [Sat, 2 Apr 2011 01:13:52 +0000 (11:43 +1030)]
failtest: Change mode_t to int.

This avoids a warning on systems that have a 16bit wide mode_t.

9 years agohash: use config.h settings for endian.
Rusty Russell [Sat, 2 Apr 2011 01:36:49 +0000 (12:06 +1030)]
hash: use config.h settings for endian.

Leave old hacky #ifdef tests there for reference.

9 years agohash: Extend the byte order check to cover x86_64.
Andreas Schlick [Sat, 2 Apr 2011 01:13:52 +0000 (11:43 +1030)]
hash: Extend the byte order check to cover x86_64.

9 years agoTo compile ccan under DragonFly BSD some additional includes are required.
Andreas Schlick [Sat, 2 Apr 2011 01:13:52 +0000 (11:43 +1030)]
To compile ccan under DragonFly BSD some additional includes are required.

9 years agoasort: Use qsort_r if the system provides it.
Andreas Schlick [Sat, 2 Apr 2011 01:30:08 +0000 (12:00 +1030)]
asort: Use qsort_r if the system provides it.

tools/ccanlint/file_analysis.c needs to include config.h to set _GNU_SOURCE
before any other header file includes stdlib.h.

9 years agoconfigurator: Add test for glibc's qsort_r.
Andreas Schlick [Sat, 2 Apr 2011 01:30:51 +0000 (12:00 +1030)]
configurator: Add test for glibc's qsort_r.

9 years agofailtest: fix fascist warn_unused_result warnings
Rusty Russell [Mon, 28 Mar 2011 04:14:40 +0000 (14:44 +1030)]
failtest: fix fascist warn_unused_result warnings

9 years agofailtest: fix void * arithmetic in example.
Rusty Russell [Mon, 28 Mar 2011 04:00:56 +0000 (14:30 +1030)]
failtest: fix void * arithmetic in example.

9 years agofailtest: continue (without failing) if we run off end of --failpath=
Rusty Russell [Mon, 28 Mar 2011 03:58:22 +0000 (14:28 +1030)]
failtest: continue (without failing) if we run off end of --failpath=

This is important because we tell people to use --failpath to reproduce a
failure, but the fail path we list only goes up to the last failure injection
if the child dies, for example.

Thanks to David Gibson for prodding me to fix this...

9 years agotdb2: make head of free list point to last entry.
Rusty Russell [Mon, 28 Mar 2011 03:48:49 +0000 (14:18 +1030)]
tdb2: make head of free list point to last entry.

This allows for access to the end of the list, in case we need it
later (eg. moving free list entries to the end of the list after
failed coalescing?).

9 years agotdb2: speed up transaction code by making page size a constant.
Rusty Russell [Fri, 25 Mar 2011 05:42:03 +0000 (16:12 +1030)]
tdb2: speed up transaction code by making page size a constant.

Turning getpagesize() into a constant 4096 really helps gcc optimize, and
not just on 64 bit.

Here are the results of running "tools/speed --transaction --no-sync 2000000":

i386 with gcc 4.4.5:
Before:
$ ./speed --transaction --no-sync 2000000
Adding 2000000 records:  1195 ns (93594224 bytes)
Finding 2000000 records:  719 ns (93594224 bytes)
Missing 2000000 records:  429 ns (93594224 bytes)
Traversing 2000000 records:  523 ns (93594224 bytes)
Deleting 2000000 records:  901 ns (93594224 bytes)
Re-adding 2000000 records:  1032 ns (93594224 bytes)
Appending 2000000 records:  1711 ns (182801232 bytes)
Churning 2000000 records:  3233 ns (182801232 bytes)

After:
Adding 2000000 records:  868 ns (93594224 bytes)
Finding 2000000 records:  569 ns (93594224 bytes)
Missing 2000000 records:  369 ns (93594224 bytes)
Traversing 2000000 records:  406 ns (93594224 bytes)
Deleting 2000000 records:  674 ns (93594224 bytes)
Re-adding 2000000 records:  730 ns (93594224 bytes)
Appending 2000000 records:  1144 ns (182801232 bytes)
Churning 2000000 records:  2085 ns (182801232 bytes)

Here's the effect (average of 10) on x8664 with gcc 4.1.2, with an earlier
tree and 1000000:
Before:
Adding 830.1ns
Finding 428.3ns
Missing 250.3ns
Traversing 387.4ns
Deleting 588.8ns
Re-adding 737.2ns
Appending 1141.4ns
Churning 1792ns

After:
Adding 562.8ns
Finding 362.1ns
Missing 226.4ns
Traversing 276.5ns
Deleting 426.7ns
Re-adding 489.8ns
Appending 736.4ns
Churning 1112.7ns

9 years agotdb2: fix traversal bug in free list lock_and_alloc()
Rusty Russell [Fri, 25 Mar 2011 05:39:05 +0000 (16:09 +1030)]
tdb2: fix traversal bug in free list lock_and_alloc()

We keep looking even if the current best is exactly right.  This is
really bad, because our smaller free lists hold exactly one size: with
this bug we iterate to the end of the list before hitting the end and
deciding we can use it after all.

Before:
$ ./speed --transaction --no-sync 2000000
Adding 2000000 records:  1179 ns (93594224 bytes)
Finding 2000000 records:  694 ns (93594224 bytes)
Missing 2000000 records:  429 ns (93594224 bytes)
Traversing 2000000 records:  519 ns (93594224 bytes)
Deleting 2000000 records:  896 ns (93594224 bytes)
Re-adding 2000000 records:  1129 ns (93594224 bytes)
Appending 2000000 records:  1713 ns (182801232 bytes)
Churning 2000000 records:  32612 ns (182801232 bytes)

After:
$ ./speed --transaction --no-sync 2000000
Adding 2000000 records:  1195 ns (93594224 bytes)
Finding 2000000 records:  719 ns (93594224 bytes)
Missing 2000000 records:  429 ns (93594224 bytes)
Traversing 2000000 records:  523 ns (93594224 bytes)
Deleting 2000000 records:  901 ns (93594224 bytes)
Re-adding 2000000 records:  1032 ns (93594224 bytes)
Appending 2000000 records:  1711 ns (182801232 bytes)
Churning 2000000 records:  3233 ns (182801232 bytes)