Commit Graph

58 Commits

Author SHA1 Message Date
Benjamin Kalman
abacc7644a Propagate the ChunkSource through modifications to Set and Map.
It's already propagated for List.

The problem occurs when accessing/modifying chunked Sets and Maps that
have read from the DB then modified. For example:

  set := ds.Head().(Set)
  set = set.Remove(42)
  // These will both crash:
  set.Has(43)
  set.Insert(43)

If |set| is a compoundSet then the new Set returned from Remove won't
have a ChunkSource.
- When Has is called, the set will attempt to read in chunks, but there
  is no longer a ChunkSource to read from.
- When Insert is called, the set will re-chunk, which may require
  reading in more chunks.
2016-02-24 16:14:22 -08:00
Rafael Weinstein
6c3239a1d0 Collections no longer need a ChunkStore on creation 2016-02-02 13:39:26 -08:00
Benjamin Kalman
232492003d Lazily write sequence chunks.
Instead of writing sequence chunks as soon as they're are created (as a
result of hitting chunk boundaries), only write them once they're
referenced - which only happens if those chunks are themselves chunked.

The effect of this is root chunks of collections/blobs aren't written
until they're committed, which makes the XML importer run twice as fast
on a month of MLB data - 60s instead of 120s, with --ldb-dump-stats
showing a PutCount of 21,272 instead of 342,254.

In the future it should be possible to avoid writing *any* chunks until
the root is committed, which will improve incremental update
performance, but that's a larger change (issue #710). This change fixes
issue #832.
2016-01-05 15:57:45 +11:00
Erik Arvidsson
dad5dda1ec Add runtime type checks to compound map
Fixes #812
2015-12-21 13:44:55 -08:00
Rafael Weinstein
27d5f0d240 Ensure sequenceChunker.Done() returns an internal type so that callers dont have to 2015-12-17 06:20:28 -08:00
Rafael Weinstein
d198036618 Compound Map & Set 2015-12-08 16:25:02 -08:00
Rafael Weinstein
7caa08bc5c Complex Types embed a ChunkStore 2015-12-01 10:40:47 -08:00
Rafael Weinstein
e75f5097c7 Allow Map & Set to order by natural ordering of element type if available. 2015-11-16 14:30:30 -08:00
Erik Arvidsson
a72ce41a1d Go: TypeRef -> Type
Remaining identifiers
2015-11-13 17:54:53 -05:00
Chris Masone
eda9b92870 Rename types.TypeRef to types.Type
There are probably still a lot of variable names and comments to fix,
but this updates all the Go code.

Towards #441
2015-11-09 08:26:32 -08:00
Aaron Boodman
69a86f3036 Rewrite walk() to walk value tree instead of chunks
Also fix quad_tree to take advantage of that to be generic again.

Fixes #445, #497
2015-11-05 16:12:02 -08:00
Chris Masone
4e79367d1a IterAllP for typed Maps
Fixes #564
2015-11-05 12:06:10 -08:00
Erik Arvidsson
460841e3ed Clean up registration of Ref values
Ref values use the TargetRef to get the internal implementation

RegisterFromValFunction and ToNomsValueFromTypeRef were only used by
ref values at this point so these were renamed and simplified to be
more specific for ref values
2015-11-05 14:32:45 -05:00
Chris Masone
d66151b4c1 Add IterAllP() to all typed Lists and Sets
Also added IterAllP() to types.Set so it could be used by generated
set code.

Towards #564
2015-11-05 08:42:22 -08:00
Erik Arvidsson
756b893e8f Remove FromVal functions
The generated objects are all type.Values now so FromVal is not needed
2015-11-04 12:13:55 -05:00
Erik Arvidsson
eeaac87d5f Make Chunks return all reachable Refs from the current Value
We now do a recursive call which bottoms out with a ref.Ref for RefKind
Values. This means that we traverse into nested structures consistently.

The effect of this is that we get all the refs that the current chunk
references.
2015-11-03 17:13:20 -05:00
Aaron Boodman
0622c8c860 Remove Future 2015-11-02 13:44:47 -08:00
Erik Arvidsson
89734aae9e Add runtime type assertions for the basic compound types
If we have a List, Map, Set or Ref with a non Value element type we
now check the type of the params to functions that "mutate" these.
2015-11-02 11:57:49 -05:00
Erik Arvidsson
30cc7d518f Make Equals compare by Ref (after comparing TypeRef)
This changes equal to compare by ref. Since computing the ref can be
expensive we first check that the type refs are equal.

Fixes #532
2015-10-30 16:50:49 -04:00
Aaron Boodman
a9bc416a2f Change Chunks() to return []ref.Ref 2015-10-30 09:24:58 -07:00
Erik Arvidsson
66fd0881c7 Make Map TypeRef per instance
This is so that we can use type.Map for "unknown" map types when
decoding chunks.
2015-10-29 18:13:44 -04:00
Erik Arvidsson
ba85881fa3 Remove future from Map
The mapEntry is now using Values instead of Futures
2015-10-29 12:23:19 -04:00
Erik Arvidsson
cdcf952270 Update TypeRef comment and get rid of useless param
The name param of MakeCompoundTypeRef is always the empty string.

I didn't change the underlying storage or serialization.

Fixes #436, #477
2015-10-26 15:35:45 -04:00
Erik Arvidsson
8c4bc79fcd NomDL: Remove $type from struct impl
The implementation of structs is a Map and we used to reserve a key
with the name "$type" for the TypeRef. This is no longer needed since
the TypeRef is a constant per struct and needs no storage.

Fixes #450
2015-10-22 12:33:39 -04:00
Erik Arvidsson
16353f38f8 NomDL: Make the new serialization default
This makes the new typed serialization the default (the old
serialization is not used but the code has not been cleaned up yet).

Some things are no working in the new world:

Chunking -  The compound list is not working correctly any more. The
Chunks method is having issues because it assumed things based on the
old implicit chunking.

Commit - uses a `Set(Commit)` which means that the parent commit is
embedded. We need to change that to be `Set(Ref(Commit))` so that the
parent commit is referenced instead.
2015-10-21 19:04:22 -04:00
Erik Arvidsson
8565f175ee Make sure Chunks includes type.Refs and the TypeRef
Chunks shold return the futures for types.Ref values.

For typed values that have a TypeRef which has a package ref, also
include that.
2015-10-13 11:00:51 -04:00
Erik Arvidsson
2dec53453e NomDL: Add new serialization format
The new serialization format use "t " as in typed. The rest of the
message is a JSON array describing the typed data. The type is
described by types.TypeRef

Fixes #384
Issues #281, #304
2015-10-06 15:56:10 -07:00
Erik Arvidsson
ede5f43204 Value should also have a TypeRef
This is so that we can get the runtime type of a value
2015-09-30 16:15:13 -04:00
Erik Arvidsson
c254a1391a Codegen for optional fields in structs 2015-09-25 17:08:57 -04:00
Erik Arvidsson
1a4bdae624 Make types.Ref explicit
No more implicit Get or Equals
2015-09-18 14:03:19 -04:00
Erik Arvidsson
f64f6ae81c NomDL: CodeGen for Map extras
This adds Iter, IterAll and Filter to Maps

Issue #303
2015-09-17 17:20:49 -04:00
Erik Arvidsson
5a83b23f29 NomDL: Codegen for List extras
Adds Iter, IterAll and Filter to the List(T) types

Depends on PR #298

Issue #303
2015-09-17 14:24:36 -04:00
Aaron Boodman
91df15a12a nomgen: stabilize the order types are generated in 2015-09-16 17:26:31 -07:00
Rafael Weinstein
0555d7a3c1 Remove errors from read/write/encode/decode 2015-08-18 16:37:04 -07:00
Aaron Boodman
214b37eccf Remove global imports of dbg package
Fixes #179
2015-08-08 23:57:37 -07:00
Aaron Boodman
7944c1b3af Revert "Make WriteValue return a "skinny" copy of input value" 2015-07-30 09:23:35 -07:00
Aaron Boodman
a84893c0d8 Make WriteValue return a "skinny" copy of input value
Fixes #141
2015-07-29 16:06:54 -07:00
Chris Masone
4fe00d4f81 Address aa's comments
- Return factory methods to privacy
- use tighter syntax inside Chunks() methods
- Rename Futures() -> Chunks()
2015-07-23 15:32:38 -07:00
Chris Masone
a560139d73 Make types.future public
This will enable us to walk the chunk graph without having to go
through weird contortions to figure out which values don't have
chunks in any chunkstore (because they were inlined).

Towards issue #82
2015-07-23 15:32:26 -07:00
cmasone-attic
f229396931 Merge pull request #117 from cmasone-attic/revert
Revert Walk() and GetReachabilitySetDiff()
2015-07-23 12:40:53 -07:00
Chris Masone
d12dde500d Revert Walk() and GetReachabilitySetDiff()
It turns out these functions aren't actually generally useful,
because they deal in Values and Refs, while what we actually
want is to deal in chunks. So...

Revert "Settle big/small vs to/from ONCE AND FOR ALL"

This reverts commit f51c575cd2.

Revert "Add a naive Diff() function between two Values."

This reverts commit 662bc5e3c4.
2015-07-23 11:49:55 -07:00
Aaron Boodman
df1263e5d2 Merge pull request #107 from arv/codegen-map
Add Map codegen
2015-07-22 16:19:32 -07:00
Erik Arvidsson
a3b3bb1090 Add Map codegen 2015-07-22 14:36:34 -07:00
Chris Masone
662bc5e3c4 Add a naive Diff() function between two Values.
Given two refs, we need to be able to determine the set of chunks
reachable from one that cannot be reached from the other. This patch
adds a naive implementation of this functionality that essentially walks
the value tree down from the values pointed to by two refs and compares them.

It also has a little command-line driver, but this may be removed.

Fixes issue #82
2015-07-22 14:35:36 -07:00
Erik Arvidsson
3fdc008f5c Codegen: Add support for noms types
This makes it possible to do a List of Bool or Map of Int32 etc
2015-07-22 12:24:27 -07:00
Aaron Boodman
470d5bb4cd Fix duplicate map inserts.
Also happened to uncover a nasty bug with Map.Remove() O_o.
2015-07-21 13:45:27 -07:00
Aaron Boodman
409fd1b076 Map and Set: Compare using future.Val() when possible.
This can be more efficient than comparing by ref for primitives.
2015-07-21 09:26:38 -07:00
Aaron Boodman
2bd7cd2781 Map: Optimize adding multiple values at once. 2015-07-20 11:01:48 -07:00
Aaron Boodman
69cef43527 Switch Map from using a hashtable to a sorted list internally. 2015-07-20 09:28:38 -07:00
Chris Masone
4632a73bc2 Performance improvements, given the xml_importer workload
1) Get rid of temp file usage in FileStore. Instead, write to a buffer and then
   dump to disk on Close().
2) Chk.Equals() uses reflection even if you call it on primitive types, which
   can be surprisingly costly. Switch to a Chk.True() in a couple of hot paths.
2015-07-17 14:14:42 -07:00