Commit Graph

290 Commits

Author SHA1 Message Date
A.J. Beamon 2d8a6d1fd8
fix: cache databases by cluster file and DB name in golang bindings. 2018-07-30 10:10:03 -07:00
A.J. Beamon d8ca7a766c Change tree node state to have references to parent nodes and update merge logic accordinly. 2018-06-27 14:12:51 -07:00
A.J. Beamon a7158f96aa Address some review comments 2018-06-26 15:06:15 -07:00
A.J. Beamon 2ed452353f Merge branch 'release-5.2' into directory-tester-cleanup 2018-06-26 14:56:09 -07:00
A.J. Beamon 1dbe24a6e8 In the Java directory layer, DirectoryLayer.exists returns true unconditionally when not passed a path. This is different than the other bindings, which run through the normal exists check, but which I believe will still ultimately return true. The major difference is that in Java, no read version is obtained, which can cause behavior differences in the binding tester. This adds a call to get the read version to the Java testers when processing the DIRECTORY_EXISTS instruction. 2018-05-30 15:38:50 -07:00
Alec Grieser 0c2e801d40
Merge remote-tracking branch 'upstream/release-5.1' into merge-release-5.1 2018-05-30 11:49:29 -07:00
A.J. Beamon e172a7f6f1 Fix spacing in build file 2018-05-23 15:01:13 -07:00
A.J. Beamon 48bf339843 Add indirection in the directory state tree so that merged nodes would continue sharing state through future merges. 2018-05-23 14:59:18 -07:00
A.J. Beamon 0b1bd4f765 Close transactions in ON_ERROR if the replace didn't succeed 2018-05-23 14:00:45 -07:00
A.J. Beamon 989a51e4a3 Java tester was failing to create new transactions properly in some cases 2018-05-23 13:05:15 -07:00
A.J. Beamon f52da485a9 Don't merge directory state tree entries that have the same ID. When merged, two entries should always take the smaller ID. 2018-05-23 12:20:05 -07:00
A.J. Beamon 1a39cd4a81 The directory state tree currently relies on some static members that need to be reset when rerunning the test. 2018-05-23 12:19:21 -07:00
A.J. Beamon addb822b91 Fix call to random.random() 2018-05-23 12:18:34 -07:00
A.J. Beamon fc69c34138 Extract directory state tree, add some tests, and fix up a couple things 2018-05-22 11:53:19 -07:00
A.J. Beamon f96b95a878 Ensure random prefixes for partitions and directory layer subspaces when doing comparison tests 2018-05-22 11:52:38 -07:00
A.J. Beamon 997d3eae80 Rework how the directory hierarchy state is maintained, add tracking for partitions and deleted directories, and don't allow using directories that are deleted partitions. 2018-05-18 16:24:59 -07:00
A.J. Beamon 5db549c203 Changes to print output 2018-05-18 16:24:03 -07:00
A.J. Beamon ce3623978e Merging children of DirListEntries now unifies the entries rather than just copying has_know_prefix 2018-05-18 09:41:54 -07:00
A.J. Beamon 9e9a81c96d DIRECTORY_MOVE and DIRECTORY_OPEN use the existing DirListEntries, if present 2018-05-18 09:39:27 -07:00
A.J. Beamon 7159dd5ce2 DIRECTORY_MOVE_TO reuses the same DirListEntry rather than creating a new one 2018-05-18 09:38:03 -07:00
A.J. Beamon 82821d17af Have the two copies of the default directory layer share the same DirListEntry. 2018-05-18 09:36:24 -07:00
A.J. Beamon b94fa1ddb0 Add missing COMMIT instruction after logging directories. 2018-05-18 09:34:46 -07:00
A.J. Beamon fd4312454b Some changes to debugging print statements 2018-05-18 09:33:28 -07:00
Alvin Moore 83c1754181 Modified the groupId to org.foundationdb 2018-05-17 12:53:57 -07:00
Alec Grieser e4cb178083
update api version to 520 in some flow tests 2018-05-10 18:12:41 -07:00
Alec Grieser a3e52424da
actually pass along new versionstamp position in nested versionstamp
addresses #356
2018-05-10 16:11:42 -07:00
Alec Grieser e5378083ec
honor length in Tuple.fromBytes when passed in
addresses #362
2018-05-10 15:27:01 -07:00
Alec Grieser 5ec391695b
regenerate generated.go with new TLS options 2018-05-10 15:26:25 -07:00
Alec Grieser b7f0e358b3
Merge pull request #340 from ajbeamon/move-thread-shutdown-hook-to-iclientapi
Move addNetworkThreadCompletionHook to IClientApi.
2018-05-09 14:45:50 -07:00
A.J. Beamon cfd50d83d4 Add comment and remove whitespace 2018-05-09 14:38:11 -07:00
A.J. Beamon 499a3c78dc Line ending fix 2018-05-09 10:32:02 -07:00
A.J. Beamon 33ba98c82c Fix indent 2018-05-09 10:12:37 -07:00
A.J. Beamon 330ac4875c Add flag to disable directory snapshot ops in the binding tester and use it in the flow bindings. 2018-05-09 10:12:37 -07:00
Alec Grieser f3093642b3
Merge pull request #242 from alecgrieser/32437306-better-versionstamped-value
Unify SET_VERSIONSTAMPED_KEY and SET_VERSIONSTAMPED_VALUE API
2018-05-09 09:04:07 -07:00
A.J. Beamon 01a3360982 Move addNetworkThreadCompletionHook to IClientApi. 2018-05-08 16:33:43 -07:00
Evan Tschannen 1f6c6a886b Merge branch 'release-5.1' into release-5.2 2018-05-08 13:08:11 -07:00
Alec Grieser 47c9e4f923
update bindings and bindingtester that uses versionstamps to use new protocol
issue #148
2018-05-08 08:57:09 -07:00
Alec Grieser 6ee14bbb93
expose second versionstamp value type through vexillographer and add support in bindings and bindingtester 2018-05-08 08:57:09 -07:00
A.J. Beamon 6502d790b9 Remove extra call to create transaction. Cleanup created transactions. 2018-05-04 09:06:47 -07:00
A.J. Beamon d5f69ff596
Merge pull request #296 from apple/release-5.1
Merge Release 5.1 Into Release 5.2
2018-05-03 12:05:35 -07:00
John Brownlee 1739c82c1b Fixes the links to download the client libraries in our documentation and packages. 2018-05-01 16:10:51 -07:00
Alec Grieser 8c47e0a086
Merge pull request #278 from vmg/vmg/tuple
bindings/go: Reduce memory allocations when packing tuples
2018-05-01 15:46:20 -07:00
A.J. Beamon 060b655257
Add another line of description to synchronization comment. 2018-05-01 10:00:49 -07:00
A.J. Beamon a8c083509c Add a note about why the high-contention allocator synchronizes on HighContentionAllocator.class rather than Transaction. 2018-05-01 09:31:40 -07:00
Vicent Marti a19af9921e bindings/go: Reduce memory allocations when packing tuples
Memory profiling a FoundationDB layer implemented in Go shows high
memory pressure and increased GC times when performing highly-concurrent
multi-key transactions on the database. Further digging displays that
the source of the memory pressure happens when packing the keys for the
transaction into byte slices: the most salient issue is that memory
during the packing process is allocated based on the number of elements
to pack and not on the total size of the resulting byte slice.

This commit attempts to reduce the amount of memory allocated when
calling `Tuple.Pack` for most (all?) usage patterns, both in number of
allocations and in total allocated size.

The following optimizations have been implemented:

- Remove `bytes.Buffer` usage in `encodeTuple`: the `Buffer` struct is
quite expensive for the key sizes we're looking to generate, both
allocation and performance-wise. A `packer` struct has been implemented
that builds the keys "naively" by using `append` on a slice. Slice
growth in Go is also amortized just like in `bytes.Buffer`.

- Do not use `bytes.Replace` in `encodeBytes`: this function is
particularly expensive because it always allocates a copy of the byte
slice, even when it doesn't contain nil bytes. Instead, the replacement
step has been implemented manually in `packer.putbytesNil`, where it can
perform the replacement optimally into the output byte slice without
allocating memory. By having this local function we also allow the
compiler to not duplicate any input `string`s when casting them to
`[]byte`; previously, a copy of every string to pack was always being
allocated because the compiler couldn't prove that `bytes.Replace`
wouldn't modify the slice.

- Use stack space in `encode[Float|Double|Int]`: all the numerical
packing functions were allocating huge amounts of memory because of the
usage of temporary `bytes.Buffer` objects and `binary.Write` calls. The
sizes for all the packed data are always known (either 4 or 8 bytes
depending on type), so the big endian packing can be performed directly
on the stack with `binary.BigEndian.PutUint[32|64]`, which doesn't
require the `interface{}` conversion for the `binary.Write` API and in
x64 compiles to a `mov + bswap` instruction pair.

As a result of these optimizations, the "average" case of key packing
can now create a key with a single allocation.  More complex key packing
operations, even those that contain strings/byte slices with nil bytes,
now allocate memory in a constant way (i.e. amortized based on the
amount of growth of the output buffer and not the number of Tuple
elements to pack).

Additionally, the reduction of memory allocations and the better usage
of the `binary` APIs produce a very significant reduction in runtime for
key packing: between 2x and 6x faster for all packing operations.

Before/after benchmarks are as follows:

benchmark                                  old ns/op     new ns/op     delta
BenchmarkTuplePacking/Simple-4             310           76.4          -75.35%
BenchmarkTuplePacking/Namespaces-4         495           137           -72.32%
BenchmarkTuplePacking/ManyStrings-4        960           255           -73.44%
BenchmarkTuplePacking/ManyStringsNil-4     1090          392           -64.04%
BenchmarkTuplePacking/ManyBytes-4          1409          399           -71.68%
BenchmarkTuplePacking/ManyBytesNil-4       1364          533           -60.92%
BenchmarkTuplePacking/LargeBytes-4         319           107           -66.46%
BenchmarkTuplePacking/LargeBytesNil-4      638           306           -52.04%
BenchmarkTuplePacking/Integers-4           2764          455           -83.54%
BenchmarkTuplePacking/Floats-4             3478          482           -86.14%
BenchmarkTuplePacking/Doubles-4            3654          575           -84.26%
BenchmarkTuplePacking/UUIDs-4              366           211           -42.35%

benchmark                                  old allocs     new allocs     delta
BenchmarkTuplePacking/Simple-4             6              1              -83.33%
BenchmarkTuplePacking/Namespaces-4         11             1              -90.91%
BenchmarkTuplePacking/ManyStrings-4        18             2              -88.89%
BenchmarkTuplePacking/ManyStringsNil-4     18             2              -88.89%
BenchmarkTuplePacking/ManyBytes-4          23             3              -86.96%
BenchmarkTuplePacking/ManyBytesNil-4       22             2              -90.91%
BenchmarkTuplePacking/LargeBytes-4         3              2              -33.33%
BenchmarkTuplePacking/LargeBytesNil-4      3              2              -33.33%
BenchmarkTuplePacking/Integers-4           63             3              -95.24%
BenchmarkTuplePacking/Floats-4             62             2              -96.77%
BenchmarkTuplePacking/Doubles-4            63             3              -95.24%
BenchmarkTuplePacking/UUIDs-4              2              2              +0.00%

benchmark                                  old bytes     new bytes     delta
BenchmarkTuplePacking/Simple-4             272           64            -76.47%
BenchmarkTuplePacking/Namespaces-4         208           64            -69.23%
BenchmarkTuplePacking/ManyStrings-4        512           192           -62.50%
BenchmarkTuplePacking/ManyStringsNil-4     512           192           -62.50%
BenchmarkTuplePacking/ManyBytes-4          864           448           -48.15%
BenchmarkTuplePacking/ManyBytesNil-4       336           192           -42.86%
BenchmarkTuplePacking/LargeBytes-4         400           192           -52.00%
BenchmarkTuplePacking/LargeBytesNil-4      400           192           -52.00%
BenchmarkTuplePacking/Integers-4           3104          448           -85.57%
BenchmarkTuplePacking/Floats-4             2656          192           -92.77%
BenchmarkTuplePacking/Doubles-4            3104          448           -85.57%
BenchmarkTuplePacking/UUIDs-4              256           192           -25.00%
2018-05-01 10:52:08 +02:00
Vicent Marti 5bab1e8e4e bindings/go: Add tuple packing tests and benchmark
Although the Go bindings to FoundationDB are thoroughly tested as part
of the `bindingtester` operation, this commit implements a more-or-less
complete test case using golden files for the serialized output of
`Tuple.Pack` operations. This will make implementing optimizations and
refactoring the packing operation much simpler.

The same test cases used to verify correctness are also used as a
benchmark suite to measure the amount of memory allocated in the
different operations.
2018-05-01 10:51:57 +02:00
Iuri Sitinschi d52f8eb255 java binding: remove unnecessary collection wrapper 2018-04-30 10:05:53 -07:00
Alec Grieser a1faaafca3
Merge remote-tracking branch 'upstream/release-5.1' into merge-release-5.1 2018-04-27 16:38:18 -07:00
Evan Tschannen 9fb31b3e47 updated generated.go 2018-04-27 16:33:57 -07:00
Evan Tschannen 434d896627 removed dev null is web scale from flow tester 2018-04-27 16:14:26 -07:00