Sebastian Messmer
|
317088e449
|
Rename unique_ref::isValid to is_valid to comply with naming scheme of other functions
|
2017-04-10 14:16:30 -07:00 |
|
Sebastian Messmer
|
d8efcbb144
|
Merge branch 'develop' into next
|
2017-04-06 01:02:13 +01:00 |
|
Sebastian Messmer
|
3d56b97052
|
Make unique_ref constructor explicit
|
2017-04-05 21:02:03 +01:00 |
|
Sebastian Messmer
|
636ed437aa
|
Improve unique_ref tests
|
2017-04-05 20:48:00 +01:00 |
|
Sebastian Messmer
|
ed9f224f19
|
Further unique_ref improvements
|
2017-04-03 19:08:41 +01:00 |
|
Sebastian Messmer
|
2fb61e7c71
|
Further improve unique_ref
|
2017-04-03 15:43:27 +01:00 |
|
Sebastian Messmer
|
9ada10db4d
|
Improve unique_ref
|
2017-04-03 14:43:32 +01:00 |
|
Sebastian Messmer
|
590cd92de5
|
Install man page
|
2017-03-26 14:08:47 +01:00 |
|
Sebastian Messmer
|
dbf54b9563
|
Add test cases for BlockStore2 and fix existing BlockStore2 implementations
|
2017-02-21 22:27:46 +00:00 |
|
Sebastian Messmer
|
d84e65ad76
|
Merge from develop
|
2017-02-18 13:22:43 +00:00 |
|
Sebastian Messmer
|
19bfe97d52
|
du reports correct space usage
|
2017-02-18 13:21:54 +00:00 |
|
Sebastian Messmer
|
70bfc47a2f
|
Start implementing new blockstore
|
2017-02-14 08:16:38 +00:00 |
|
Sebastian Messmer
|
1ec5df98d6
|
Compile cryfs-stats executable
|
2017-02-14 08:15:11 +00:00 |
|
Sebastian Messmer
|
5350a14a4a
|
Add stats tool to build
|
2017-02-11 13:28:34 +00:00 |
|
Sebastian Messmer
|
cab1c71cac
|
Merge from develop
|
2017-02-04 19:18:00 +00:00 |
|
Sebastian Messmer
|
59afd50c28
|
Fix clang build
|
2017-02-04 19:17:17 +00:00 |
|
Sebastian Messmer
|
54e0ffce2e
|
Merge branch 'develop' of github.com:cryfs/cryfs into develop
|
2017-02-04 19:03:32 +00:00 |
|
Sebastian Messmer
|
9a304fc52b
|
Upgrade spdlog to 0.11.0
|
2017-02-04 19:03:20 +00:00 |
|
Sebastian Messmer
|
596d9d0426
|
Merge from develop
|
2017-02-04 14:38:14 +00:00 |
|
Sebastian Messmer
|
7267bb5be4
|
Fix buid on Mac OS X
|
2017-02-04 14:21:00 +00:00 |
|
Nicolas Schneider
|
ffc2fe8eef
|
print defaults for cipher and blocksize in cli help (#124)
Closes #94.
|
2017-01-23 00:23:51 +00:00 |
|
Sebastian Messmer
|
92776fe507
|
Merge branch 'develop' into next
|
2017-01-22 21:24:46 +00:00 |
|
Sebastian Meßmer
|
013be34150
|
Remove unneeded method
|
2017-01-22 19:46:47 +00:00 |
|
Sebastian Messmer
|
af24fa5402
|
Merge branch 'develop' into next
|
2017-01-22 01:11:36 +00:00 |
|
Sebastian Messmer
|
bbdfc5c234
|
Simplify FsppNodeTest
|
2017-01-22 01:11:26 +00:00 |
|
Sebastian Messmer
|
42765c6be6
|
Merge from develop
|
2017-01-21 20:24:09 +00:00 |
|
Sebastian Messmer
|
e37d84a3d6
|
fspp::Dir, fspp::File and fspp::Symlink don't inherit from fspp::Node anymore. This allows file systems to return a generic fspp::Node instead of a concrete subclass when the operation doesn't need to know what type of node it is.
|
2017-01-21 19:16:35 +00:00 |
|
Sebastian Messmer
|
8c9cea6413
|
Fix nullversion recognition in gitversion
|
2016-12-31 16:22:57 +01:00 |
|
Sebastian Messmer
|
681f415272
|
Use curl_global_init/curl_global_cleanup for cleaner shutdown of executable
|
2016-10-26 13:50:20 -07:00 |
|
Sebastian Messmer
|
abae027538
|
Fix compiler error on FreeBSD
|
2016-10-20 10:35:29 +02:00 |
|
Sebastian Messmer
|
fb123f8fd0
|
Removed fixed TODOs
|
2016-10-14 12:34:42 +02:00 |
|
Sebastian Messmer
|
9d05b8571c
|
Merge from develop
|
2016-10-13 18:30:27 +02:00 |
|
Sebastian Messmer
|
bd74a5b762
|
More detailed error reporting if key derivation fails
|
2016-10-02 11:01:14 +02:00 |
|
Sebastian Messmer
|
ce218f264a
|
Silence a static analysis warning
|
2016-09-25 20:36:35 +02:00 |
|
Sebastian Messmer
|
58d6a454d7
|
Merge branch 'develop' into next
|
2016-09-25 11:41:33 +02:00 |
|
Sebastian Messmer
|
6464bfb4b7
|
Disable update checks in noninteractive mode
|
2016-09-25 11:40:01 +02:00 |
|
Sebastian Messmer
|
e009040264
|
Merge from develop
|
2016-09-25 02:53:35 +02:00 |
|
Sebastian Messmer
|
443298844e
|
Fix test cases
|
2016-09-25 02:50:28 +02:00 |
|
Sebastian Messmer
|
b027f8c007
|
Merge from develop
|
2016-09-24 20:43:54 +02:00 |
|
Sebastian Messmer
|
1e9fdc9aa7
|
Refactor noninteractive mode. All yes/no questions are forced to define a default that will be used in noninteractive mode.
|
2016-09-24 20:28:56 +02:00 |
|
Sebastian Messmer
|
1cf52b307d
|
Fix locking in LockPool
|
2016-09-24 17:02:23 +02:00 |
|
Sebastian Messmer
|
11a85ed29f
|
Allow building with -DCRYFS_UPDATE_CHECKS=off, which will create an executable with disabled update checks (the alternative to disable them in the environment also still works).
|
2016-09-24 13:16:26 +02:00 |
|
Sebastian Messmer
|
1c34c88709
|
Remove warning that CryFS is experimental
|
2016-09-24 12:33:22 +02:00 |
|
Sebastian Messmer
|
789bfc7527
|
Fix warning from static analysis tool about std::moving a large CryConfig object
|
2016-09-24 11:42:57 +02:00 |
|
Sebastian Messmer
|
46a2251e9d
|
Fix potential (although improbable) deadlock
|
2016-09-24 11:01:22 +02:00 |
|
Sebastian Messmer
|
b4a609459b
|
When an exception escalates to main, exit with an error code
|
2016-09-24 09:52:19 +02:00 |
|
Sebastian Messmer
|
a1c3079a68
|
Catch exceptions from main
|
2016-09-24 09:51:29 +02:00 |
|
Sebastian Messmer
|
e30656797b
|
Add compatibility with Crypto++ 5.6.4
|
2016-09-24 09:39:37 +02:00 |
|
Sebastian Messmer
|
46183976ee
|
Fix missing virtual destructor and potential integer overflow
|
2016-09-21 20:07:20 +02:00 |
|
Sebastian Meßmer
|
e414f0a20f
|
Switch to LGPL
|
2016-09-13 19:23:08 +02:00 |
|
Sebastian Messmer
|
32f06f288a
|
Fix tree traversal and add test case for it
|
2016-09-07 22:25:18 +02:00 |
|
Sebastian Messmer
|
904e3dd7a1
|
Merge
|
2016-09-07 22:07:56 +02:00 |
|
Sebastian Messmer
|
ea349cf79b
|
Fix traversal bug and add test case for it
|
2016-09-07 19:02:41 +02:00 |
|
Sebastian Messmer
|
0cbb13ffbe
|
Compatibility with older libcurl versions
|
2016-08-27 13:23:25 +02:00 |
|
Sebastian Messmer
|
b315154f08
|
Merge from develop
|
2016-07-23 10:17:42 +02:00 |
|
Sebastian Messmer
|
6360d452fe
|
Make compatible with libcurl >= 7.50
|
2016-07-23 09:04:50 +02:00 |
|
Sebastian Messmer
|
d2cecb4ecc
|
Disable large_read fuse option, since it's not used in new fuse versions anyhow and makes problems when fuse is run in user mode linux.
|
2016-07-22 20:44:06 +02:00 |
|
Sebastian Messmer
|
a4ce49aef4
|
Fix unique_ref test cases
|
2016-07-22 14:07:06 +02:00 |
|
Sebastian Messmer
|
64d26c2f6e
|
Fix compiler error on older gcc
|
2016-07-22 12:58:59 +02:00 |
|
Sebastian Messmer
|
f069733650
|
Fix warning on older gcc versions
|
2016-07-22 02:57:03 +02:00 |
|
Sebastian Messmer
|
e38c0f1e8b
|
Fix isRightBorderNode when growing trees
|
2016-07-17 10:32:59 +02:00 |
|
Sebastian Messmer
|
bbdd8a548b
|
Special case treatment for traversals until exactly the last leaf has to load the last leaf to grow it. Before this commit, we just always loaded the last traversed leaf and checked its size. Now we only do so if it's the right border leaf. This saves us loading some leaves.
|
2016-07-17 10:16:09 +02:00 |
|
Sebastian Messmer
|
b339261924
|
Merge branch 'next' into lessio
|
2016-07-16 17:14:07 +02:00 |
|
Sebastian Messmer
|
f6141f515b
|
TODOs
|
2016-07-16 17:08:53 +02:00 |
|
Sebastian Messmer
|
dc40d61595
|
Merge branch 'next' into lessio
|
2016-07-16 16:47:36 +02:00 |
|
Sebastian Messmer
|
e3690e2f6b
|
Add comment
|
2016-07-16 16:47:27 +02:00 |
|
Sebastian Messmer
|
9c42703c70
|
Merge branch 'next' into lessio
|
2016-07-16 16:10:03 +02:00 |
|
Sebastian Messmer
|
143c3b3b4f
|
Use large reads and large write
|
2016-07-16 16:09:47 +02:00 |
|
Sebastian Messmer
|
eab7cb1df4
|
Implement BlockStore::overwrite(). This is the last step in ensuring that the write() call doen't have to load leaves if they're only overwritten anyhow.
|
2016-07-16 11:42:06 +02:00 |
|
Sebastian Messmer
|
eb792daefc
|
More preparations for not loading blocks in write() calls
|
2016-07-15 21:06:41 +02:00 |
|
Sebastian Messmer
|
d80b95514e
|
Traversal doesn't load leaves, but returns the key. This way, the write() call can (after a future commit) write to full leaves without loading them beforehand.
|
2016-07-15 20:12:24 +02:00 |
|
Sebastian Messmer
|
582917c1f5
|
Improve code decreasing tree depth
|
2016-07-15 16:23:00 +02:00 |
|
Sebastian Messmer
|
b1b90b8c3d
|
Further reduce number of nodes loaded when deleting a tree and write test cases for it
|
2016-07-15 15:42:34 +02:00 |
|
Sebastian Messmer
|
c428d5642a
|
Minimize number of Block::write() calls when creating new nodes in a traversal. Also add test cases for it.
|
2016-07-15 12:48:20 +02:00 |
|
Sebastian Messmer
|
d626349802
|
Finish MockBlockStore to also collect other performance metrics, and implement the standard block store tests for it.
|
2016-07-15 10:23:09 +02:00 |
|
Sebastian Messmer
|
f42e08a5f6
|
Fix DataTree::key() when called while traversing
|
2016-07-14 17:56:47 +02:00 |
|
Sebastian Messmer
|
6ff0839e90
|
Add locking to blob
|
2016-07-14 16:36:30 +02:00 |
|
Sebastian Messmer
|
457ca52eb3
|
Add assertions to unique_ref
|
2016-07-14 16:29:02 +02:00 |
|
Sebastian Messmer
|
7ea08fc2b0
|
Add test cases for removing nodes
|
2016-07-14 16:12:51 +02:00 |
|
Sebastian Messmer
|
91bf6c3647
|
Keep resource destructor in ParallelAccessStore under mutex
|
2016-07-14 15:10:52 +02:00 |
|
Sebastian Messmer
|
3f04a7411c
|
If tree depth increases, and we already traversed the old tree, don't go into it again to grow its last leaf.
|
2016-07-14 14:23:15 +02:00 |
|
Sebastian Messmer
|
cbe122cb5f
|
Add assertions
|
2016-07-14 13:23:36 +02:00 |
|
Sebastian Messmer
|
0bb6b320d4
|
Add asserts
|
2016-07-14 12:58:42 +02:00 |
|
Sebastian Messmer
|
0dbfdf3e2b
|
When shrinking a tree, LeafTraverser takes care of decreasing tree depth, not DataTree anymore. This way, LeafTraverser is now responsible for increasing and decreasing depth as necessary.
|
2016-07-14 12:55:54 +02:00 |
|
Sebastian Messmer
|
35a4e42ba5
|
Small fixes in traversal algorithm
|
2016-07-14 12:38:25 +02:00 |
|
Sebastian Messmer
|
fce81f47ff
|
Simplify code a bit and add assertions
|
2016-07-14 12:03:15 +02:00 |
|
Sebastian Messmer
|
9e9369b9ed
|
Performance optimization: When removing or shrinking a tree, we don't load/read leaves anymore. Loading inner nodes is enough to get all block IDs and then we can delete the leaves from their IDs without loading them.
|
2016-07-13 11:27:31 +02:00 |
|
Sebastian Messmer
|
7a68757599
|
Remove unneeded subtrees when shrinking tree
|
2016-07-13 07:08:53 +02:00 |
|
Sebastian Messmer
|
cf38eb0eb3
|
Use tree traversal to remove data tree.
|
2016-07-13 00:29:36 +02:00 |
|
Sebastian Messmer
|
508766d2f2
|
Fix traversal and add test cases
|
2016-07-13 00:22:35 +02:00 |
|
Sebastian Messmer
|
845b0b5239
|
Use LeafTraversor for resizing blobs
|
2016-07-12 20:36:12 +02:00 |
|
Sebastian Messmer
|
a19d79361c
|
If a tree is grown by a traversal, the tree is kept in a balanced state as long as possible during the traversal
|
2016-07-12 09:57:56 +02:00 |
|
Sebastian Messmer
|
1bf20277e4
|
Removed unnecessary code
|
2016-07-12 01:10:27 +02:00 |
|
Sebastian Messmer
|
58f2212043
|
Don't query size on traversal
|
2016-07-12 01:09:30 +02:00 |
|
Sebastian Messmer
|
582c9c1a4c
|
Fix traversal
|
2016-07-12 01:04:33 +02:00 |
|
Sebastian Messmer
|
98b85ea8b6
|
Started rewriting traversal
|
2016-07-10 22:57:39 +02:00 |
|
Sebastian Messmer
|
2bc3b641aa
|
Allow Data::FillWithZeroes on rvalue
|
2016-07-10 22:43:07 +02:00 |
|
Sebastian Messmer
|
dde89da556
|
Improve traverseLeaves
|
2016-07-10 08:38:02 +02:00 |
|
Sebastian Messmer
|
0d860fa4f0
|
Speed up block loading/storing by issuing only one read/write syscall to the base file system
|
2016-07-06 15:35:51 -07:00 |
|
Sebastian Messmer
|
7348f7c64d
|
Add checks to Data::LoadFromFile() and Data::StoreToFile()
|
2016-07-06 15:28:14 -07:00 |
|
Sebastian Messmer
|
e85019e95b
|
Cache value of DataTree.numLeaves(). This should make read()/write() faster.
|
2016-07-05 23:56:44 -07:00 |
|
Sebastian Messmer
|
a242076ecc
|
Performance improvement: Allow more parallelity when getting read()/write() syscalls to the same blob
|
2016-07-05 23:02:59 -07:00 |
|
Sebastian Messmer
|
ff0ba06846
|
Add mutex to fix race condition
|
2016-06-29 16:42:43 -07:00 |
|
Sebastian Messmer
|
b7b5dfba2a
|
Fix generation of new file systems
|
2016-06-27 22:31:06 -07:00 |
|
Sebastian Messmer
|
3425760daf
|
Implement migration for old filesystems that don't have parent pointers.
|
2016-06-27 20:03:44 -07:00 |
|
Sebastian Messmer
|
bfb397f44e
|
Tell user to not interrupt migration process
|
2016-06-27 20:01:02 -07:00 |
|
Sebastian Messmer
|
397de9372f
|
Each blob stores a parent pointer (i.e. the ID of the directory that contains this blob). This stores the directory structure in a conflict-proof way and can be used to resolve such conflicts.
|
2016-06-27 18:22:13 -07:00 |
|
Sebastian Messmer
|
a7f13ad7c1
|
When creating a file system, the user can choose whether to choose missing blocks as integrity violations.
|
2016-06-26 23:24:32 -07:00 |
|
Sebastian Messmer
|
2451a8c46f
|
Add --missing-block-is-integrity-violation option. The option doesn't have an effect yet though.
|
2016-06-26 22:16:44 -07:00 |
|
Sebastian Messmer
|
be8dffb24d
|
MyClientId is generated outside of CryDevice to give the CryConfigCreator access to it.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
7b56706c1a
|
Be explicit about types stored in config file
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
b838046246
|
Add a 'exclusive client' option to the config file
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
514dbcb6c7
|
ClientId is not loaded/generated inside of KnownBlockVersions, but in CryDevice. This way, CryDevice also has access to the ClientID. This is later needed to recognize whether we're in a single-client or in a multi-client setting.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
1c654305a8
|
In integrity violations, use individual messages saying which check exactly failed.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
f066b45954
|
VersionCountingBlockStore::forEachBlock() has an integrity check checking that all expected blocks are still existing.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
491b277cee
|
In case of an integrity violation, tell the user how they can reset integrity data.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
839a511c4d
|
When an integrity violation is detected, any further access to the file system is blocked. This ensures that the user notices the integrity violation.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
c84a230afd
|
VersionCountingBlockStore is initialized with a flag, saying whether missing blocks are integrity errors. This flag is meant to be activated in a single-client scenario to have this additional integrity check.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
e02021ecdc
|
Throw an IntegrityViolationError exception instead of just logging integrity violations. This makes sure the user notices.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
d306f4872e
|
Fix merge error
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
fd5dd2c6e1
|
New way of handling block deletions: Set last-update-client-id to zero instead of increasing version number. This has the same effect (i.e. invalidates all known block versions) and it additionally allows for checking in a local list whether a block is deleted or not.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
ee1f0f4d3a
|
Warn in migration that it might take a while
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
86c2144a37
|
Implement migration from file systems without version numbers
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
f9a10eea4d
|
Fix VersionCountingBlock::resize()
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
473e9cc8bb
|
Fix compiler errors
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
1a72d3c226
|
Deleting a block doesn't set the version number to MAX_UINT64, but just increases it by one. This makes sure, that if (in case of a synchronization conflict) the block is reintroduced by another client, this is accepted.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
5534b56ce3
|
When increasing the version number, don't only look at the version number in the block, but also at the last version number given to it by the current client. Ensure, the new version number is higher than both.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
577c697856
|
When a client deletes a block, it will never again accept it as a valid block.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
9c1a12c063
|
Fix merge
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
e7ac9bec57
|
Implement BlockStore::forEachBlock
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
4d1f7a46b9
|
* Prevent rollback to the "newest" version of a client when this version was superseded by a version from a different client.
* Use mutex/locks to secure access to KnownBlockVersions
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
263c540cd0
|
Make sure, ClientIdAndBlockKey.h includes all its dependencies
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
ea3de7360c
|
* Block versions don't have to be globally nondecreasing, but only per client id. This solves potential synchronization conflicts in a multi-client setting.
* Use cpputils::Serializer and cpputils::Deserializer instead of std::ifstream for storing/loading the block version list
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
de692c1ee4
|
Store number of entries at beginning of integrity file, so loading can be faster using unordered_map::reserve()
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
adb10343d2
|
Only hash key once if key not found, i.e. use [] instead of find() and then emplace()
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
389273a24f
|
Test cases use a fake home directory for their configuration, so they don't clutter the actual home directory.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
9da30e3c17
|
Remove redundant nullbyte
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
57af168cfd
|
Store own client id into the block next to the version number. This will be used to fix synchronization conflicts where the version number on one clients progresses slower than on another client, but synchronizes later.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
a5391a854d
|
Use VersionCountingBlockStore
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
13411c4e59
|
Integrity data from KnownBlockVersions is persisted to a file
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
d7f547dd47
|
Implement a VersionCountingBlockStore that checks that version numbers are nondecreasing. Currently, the block store is not used yet and the state is not stored over different runs of CryFS. This comes with future commits.
|
2016-06-26 22:15:52 -07:00 |
|
Sebastian Messmer
|
f4a7878e37
|
Compatibility with GCC 6
|
2016-06-26 21:26:08 -07:00 |
|
Sebastian Messmer
|
0a61987594
|
Be explicit about types stored in config file
|
2016-06-26 15:34:53 -07:00 |
|
Sebastian Messmer
|
f6a80a4651
|
Remove default config values for mandatory values
|
2016-06-26 15:26:05 -07:00 |
|
Sebastian Messmer
|
acedbbd0c4
|
Fix EncryptedBlock::resize() and add test cases for it
|
2016-06-23 21:20:36 -07:00 |
|
Sebastian Messmer
|
fcbca9ddea
|
Improve performance of InMemoryBlockStore and FakeBlockStore by using std::unordered_map instead of std::map and the direct representation of a block Key as Key instead of a string representation.
|
2016-06-23 12:26:47 -07:00 |
|
Sebastian Messmer
|
3db931c54d
|
Fix mount information reported to operating system
|
2016-06-22 17:57:00 -07:00 |
|
Sebastian Messmer
|
e4501d51e5
|
Each file system gets a unique ID. This ID will later be used to store local configuration of a client for that file system.
|
2016-06-20 16:14:07 -07:00 |
|
Sebastian Messmer
|
b3c5d4b5e3
|
Refactor TimestampTestUtils
|
2016-06-09 17:47:29 -07:00 |
|
Sebastian Messmer
|
c5ccd9c2d1
|
Set cache entry to dirty when timestamps are changed. Otherwise, it wouldn't be written back.
|
2016-06-09 17:32:35 -07:00 |
|