Compare commits

..
3101 Commits
Author SHA1 Message Date
benschermel 35794e1aff deb12 fix 2022-11-30 12:58:49 -05:00
benschermel b5305909a3 ship packages with flash option 2022-11-30 10:47:14 -05:00
Paul Chen 496bc38fda use debug for logging the message instead 2022-11-18 16:17:16 -05:00
Paul Chen 560d8a839c trigger repl_curr_off!= master_repl_offset assert failure when having pending write case 2022-11-18 16:17:16 -05:00
Paul ChenandPaul Chen e8a85cf56d [BUG] Moves key to another DB, the source key was removed if the move failed due to the key exists in the destination db #497 (#498)
Co-authored-by: Paul Chen <mingchen@Mings-MacBook-Pro.local>
2022-10-20 15:34:29 -07:00
John Sully c1be69f272 Remove unneeded gitlab CI file 2022-09-29 22:25:27 +00:00
John Sully ecdefe1529 Merge pull request #112 from Snapchat/MAKE_FLASH_CONFIGURABLE
Make flash configurable
2022-09-29 17:59:45 -04:00
John Sully c16db92d3e Make building flash optional 2022-09-29 21:27:15 +00:00
John Sully 98b40f7729 Remove incorrect assert that fires when the repl backlog is used fully 2022-09-29 19:07:02 +00:00
John Sully 441cbddb9b Merge remote-tracking branch 'public/main' into OSS_RELEASE_SEP29_2022 2022-09-29 18:54:02 +00:00
John Sully 9fd2bf29ab Fix O(n) algorithm in INFO command 2022-09-29 18:44:44 +00:00
John Sully 5556382a18 Merge pull request #69 from Snapchat/vsaini_psync_test_augment
Verify that partial syncs occur in psync2-reg-multimaster
2022-09-29 14:08:19 -04:00
Vivek Saini 72901934de Verify that partial syncs do indeed occur 2022-09-29 17:51:34 +00:00
John Sully e8b0d6e796 Merge pull request #111 from Snapchat/test_reliability
Improve reliability of machamp tests
2022-09-29 13:50:15 -04:00
John Sully 17131697dd Improve reliability of fragmentation tests 2022-09-29 16:51:38 +00:00
John Sully f980bf7531 Improve reliability of async parts of the soft shutdown tests 2022-09-28 21:05:42 +00:00
John Sully c318c5ef14 Workaround bug in snapshot sync - abort don't crash 2022-09-28 19:00:26 +00:00
John Sully f0db60776b Fix Issue #486 2022-09-14 14:48:28 +00:00
Ilya Shipitsin ea3dbde4d9 src\redis-cli.c: fix potential null pointer dereference found by cppcheck
src\redis-cli.c:5488:35: warning: Either the condition
'!table' is redundant or there is possible null pointer dereference:
table. [nullPointerRedundantCheck]
2022-09-14 10:03:08 -04:00
root 4d3d713e42 avoid from instatiating EpochHolder multiple times to improve performance and cpu utilization 2022-09-14 10:02:02 -04:00
root 5bdc65eb15 avoid from instatiating EpochHolder multiple times to improve performance and cpu utilization 2022-09-14 10:02:02 -04:00
Karthick Ariyaratnam (A) 97d0728850 Remove old assertion which is commented out. 2022-09-14 10:01:21 -04:00
Karthick Ariyaratnam (A) 0e7e05483a Fixes a crash where the server assertion failed when the key exists in DB during RDB load 2022-09-14 10:01:21 -04:00
John Sully 9fb0ce4b3b Prevent crash on load in long running KeyDB instances 2022-09-01 15:26:26 +00:00
John Sully b4ca390069 Fix race removing key cache 2022-09-01 15:16:27 +00:00
John Sully 05423f3196 Merge pull request #99 from Snapchat/atlas_fixes
Atlas fixes
2022-08-29 21:22:52 -04:00
John Sully dde698ce73 Fix P99 latency issue for TLS where we leave work for the next event loop
tlsProcessPendingData() needs to be called before we execute queued commands because it may enqueue more commands
2022-08-26 18:05:00 +00:00
John Sully 2a3e0f7cbf Fix integer overflow of the track changes counter 2022-08-26 17:36:23 +00:00
John Sully e6aa2b3067 Merge pull request #96 from Snapchat/repl_asan_fixes
Repl asan fixes
2022-08-23 13:39:25 -04:00
John Sully 36921bae6a Additional fixes 2022-08-23 17:33:14 +00:00
John Sully a1a7a48fea Fix ASAN use after free 2022-08-23 06:37:26 +00:00
John Sully b1ddacb49b Merge pull request #92 from Snapchat/fix_sync_cancel_race
Fix a race when undoConnectWithMaster changes mi->repl_transfer_s but…
2022-08-22 13:35:29 -04:00
John Sully 749e9eaa35 Merge pull request #93 from Snapchat/fix_race_trackchanges
Fix a race in processChanges/trackChanges with rdbLoadRio by acquirin…
2022-08-22 13:35:10 -04:00
John Sully 1be9f0c585 Fix a race in processChanges/trackChanges with rdbLoadRio by acquiring the lock when trackChanges is set 2022-08-22 03:37:32 +00:00
John Sully b8e948e77c Fix a race when undoConnectWithMaster changes mi->repl_transfer_s but the connection is not yet closed and the event handler runs 2022-08-21 22:35:08 +00:00
Malavan Sotheeswaran 2eca7a740f Merge pull request #87 from Snapchat/fix_ftracking_bug
Check tracking on every db in rdbLoadRio
2022-08-17 15:33:09 -04:00
Malavan Sotheeswaran adc03a3b0d fix warnings 2022-08-17 10:31:30 -07:00
Malavan Sotheeswaran cbabf82873 check tracking per db 2022-08-17 09:50:16 -07:00
John Sully 162515d19b Fix crash running INFO command while a disk based backlog is set 2022-08-01 04:53:56 +00:00
John Sully ebc8d63e97 Fix issue #480 2022-08-01 03:14:09 +00:00
John Sully 982323eb54 Merge pull request #78 from Snapchat/cert_leak_fix
Fix certificate leak during connection when tls-allowlists are used
2022-07-14 12:37:53 -04:00
John Sully 0c3734a46e Fix certificate leak during connection when tls-allowlists are used 2022-07-14 04:36:51 +00:00
John Sully 4c5f81fe76 Do not allow commands to run in background when in eval, Issue #452 2022-07-06 04:26:13 +00:00
John Sully c7625f6d32 Fix issue #454 (BSD build break) 2022-07-06 04:04:47 +00:00
guybe7 c58f26fbbc lpGetInteger returns int64_t, avoid overflow (#10068)
Fix #9410

Crucial for the ms and sequence deltas, but I changed all
calls, just in case (e.g. "flags")

Before this commit:
`ms_delta` and `seq_delta` could have overflown, causing `currid` to be wrong,
which in turn would cause `streamTrim` to trim the entire rax node (see new test)
2022-07-06 03:44:24 +00:00
benschermel f261c4844f Merge pull request #438 from Snapchat/update_pkg
Packaging Updates
2022-06-06 22:38:28 -04:00
benschermel 4ed430dcc6 Merge pull request #443 from Snapchat/update_gem_ref
update gem reference
2022-06-06 22:35:11 -04:00
benschermel 0d43a857de update gem reference 2022-06-06 14:55:24 -04:00
John Sully a2a980c079 Merge branch 'main' into keydbpro 2022-06-05 19:33:49 +00:00
John Sully 46b2d22356 Merge pull request #72 from Snapchat/soft_shutdown
Implements the soft shutdown feature
2022-05-25 15:13:54 -04:00
benschermel 79e97ee31e update deb pkg references and changelog 2022-05-25 01:10:56 -04:00
benschermel d0718889c0 update dockerfiles 2022-05-25 01:08:24 -04:00
John Sully d207bc6612 Ensure clean shutdown with multiple threads 2022-05-24 05:10:18 +00:00
John Sully fef21b9c04 Implements the soft shutdown feature to allow clients to cooperatively disconnect preventing disruption during shutdown 2022-05-24 03:04:57 +00:00
John Sully 0073d8d6c6 Merge pull request #71 from Snapchat/oss_merge_back
Merge OSS back into pro
2022-05-23 23:02:13 -04:00
John Sully 54571108f5 Revert ci.yml to unstable branch version 2022-05-23 14:56:45 -04:00
John Sully f3b8bc74fb On Alpine we must have a reasonable stack size 2022-05-20 16:40:20 -04:00
John Sully 519ce3f7f2 Fix crash in expire when a snapshot is in flight. Caused by a perf optimization getting the expire map out of sync with the val 2022-05-20 13:07:26 -04:00
John Sully afc685aff8 Fix O(n^2) algorithm in the GC cleanup logic 2022-05-19 21:46:55 -04:00
John Sully d5d5eddbd6 Fix unmerged files 2022-05-18 01:36:48 +00:00
John Sully fb7aacec46 Merge OSS back into pro 2022-05-18 01:29:15 +00:00
John Sully 2784bd4430 Fix TSAN warnings on the repl backlog 2022-05-17 15:37:22 -04:00
John Sully ef3091db92 Disable async commands by default 2022-05-17 15:37:22 -04:00
John Sully aaa9f061b8 Silence TSAN errors on ustime and mstime. Every CPU we support is atomic on aligned ints, but correctness matters 2022-05-17 15:37:22 -04:00
John Sully b4aa94a12d Add fence barriers for the repl backlog (important for AARCH64 and other weak memory models) 2022-05-17 15:37:22 -04:00
John Sully 0f79207e72 Dictionary use correct acquire/release semantics 2022-05-17 15:37:22 -04:00
John Sully 30514dbe3c Avoid unnecessary rehashing when a rehash is abandoned 2022-05-17 15:37:22 -04:00
John Sully 357591fa8f Prevent us from starting a rehash when one wasn't already in progress. This can cause severe issues for snapshots 2022-05-17 15:37:22 -04:00
John Sully 2a66d6a57e Initialize noshrink, it was dangling 2022-05-17 15:37:22 -04:00
John Sully 121a4370f3 Prevent crash on shutdown by avoiding dtors (they are unnecessary anyways) 2022-05-17 15:37:22 -04:00
John Sully a7b8f4c82b Fix assertion in async rehash 2022-05-17 15:37:22 -04:00
John Sully d1163de3c0 Fix reference counting failure in the dict. This is caused by std::swap also swapping refcounts 2022-05-17 15:37:22 -04:00
jfinity bb249ccabd Fix Readme typo from github org transition
Replace mention of scratch-file-path with db-s3-object
2022-05-12 16:55:14 -04:00
John Sully ec143055b8 Update license 2022-05-12 13:27:46 -04:00
benschermel e3a4c2dcaa update deb master changelog 2022-05-12 13:27:46 -04:00
John Sully 3a52505eca Delete COPYING to replace with BSD license 2022-05-12 13:16:59 -04:00
John Sully c830365ee5 Limit max overage to 20% during RDB save 2022-05-10 18:30:12 +00:00
John Sully 9626ddc655 Merge pull request #70 from Snapchat/update_readme
Update readme & remove Enterprise references
2022-05-10 14:26:36 -04:00
benschermel faa81c9da2 remove Enterprise references 2022-05-10 12:58:59 -04:00
benschermel e5fde00ab7 update readme 2022-05-10 11:30:00 -04:00
benschermel 7d417315f7 update readme 2022-05-10 11:21:55 -04:00
John Sully ad3e9f2b0e Remove unnecessary libs 2022-05-06 17:34:14 +00:00
John Sully 73020fc8a2 Fix musl/Alpine build failures 2022-05-06 17:05:04 +00:00
John Sully 29e0c9321a Fix crash in save of masterinfo 2022-05-06 16:29:27 +00:00
John Sully a9454db457 Disable FLASH 2022-05-06 01:20:06 +00:00
John Sully f25549f4e0 Disable async for hget commands as it is not ready 2022-05-05 20:50:44 +00:00
John Sully d7e1228cbb Merge pull request #68 from Snapchat/psync_mm_fixes
Fix PSYNC test crashes
2022-05-05 10:32:18 -04:00
John Sully 5449202bad Merge pull request #68 from Snapchat/psync_mm_fixes
Fix PSYNC test crashes
2022-05-05 10:32:18 -04:00
John Sully 93fdf0f6b0 Ensure we force moves not copies when ingesting bulk insert files 2022-05-04 16:51:48 +00:00
John Sully 33432efb52 Ensure we force moves not copies when ingesting bulk insert files 2022-05-04 16:51:48 +00:00
John Sully a2f3682e87 Fix PSYNC test crashes 2022-05-04 01:37:40 +00:00
John Sully dec9fac5fa Fix PSYNC test crashes 2022-05-04 01:37:40 +00:00
John Sully f01ba7369f Merge pull request #67 from Snapchat/vsaini_psync_test_additions
Quick fix to make psync tests work
2022-05-02 23:11:56 -04:00
John Sully 3b1b42292f Merge pull request #67 from Snapchat/vsaini_psync_test_additions
Quick fix to make psync tests work
2022-05-02 23:11:56 -04:00
Vivek Saini e3e52fcffd Quick fix to make psync tests work 2022-05-03 00:41:30 +00:00
Vivek Saini b7837feca7 Quick fix to make psync tests work 2022-05-03 00:41:30 +00:00
John Sully 4a9cf5579a Merge pull request #66 from Snapchat/psync_multimaster_fixes
Psync multimaster fixes
2022-05-02 20:24:28 -04:00
John Sully aa141f95ba Merge pull request #66 from Snapchat/psync_multimaster_fixes
Psync multimaster fixes
2022-05-02 20:24:28 -04:00
John Sully 533465c87e active-rep test reliability 2022-05-03 00:02:22 +00:00
John Sully 3348d8107a active-rep test reliability 2022-05-03 00:02:22 +00:00
John Sully e22e1ddf31 Merge branch 'keydbpro' into psync_multimaster_fixes 2022-05-02 22:19:22 +00:00
John Sully 1ed35a2da8 Merge branch 'keydbpro' into psync_multimaster_fixes 2022-05-02 22:19:22 +00:00
John Sully 630741ed99 Merge branch 'psync_multimaster_fixes' of https://github.sc-corp.net/Snapchat/keydb-internal into psync_multimaster_fixes 2022-05-02 22:17:26 +00:00
John Sully 28a31a8396 Merge branch 'psync_multimaster_fixes' of https://github.sc-corp.net/Snapchat/keydb-internal into psync_multimaster_fixes 2022-05-02 22:17:26 +00:00
John Sully 6044c88375 Merge branch 'keydbpro' of https://github.sc-corp.net/Snapchat/keydb-internal into keydbpro 2022-05-02 22:14:31 +00:00
John Sully 4bbd77e699 Merge branch 'keydbpro' of https://github.sc-corp.net/Snapchat/keydb-internal into keydbpro 2022-05-02 22:14:31 +00:00
Vivek Saini 6f95eae64b Merge pull request #60 from Snapchat/merge_os_apr_13
Merge in changes from Open Source.

For the most part, this encompasses two changes:

- Adding partial sync capabilities to multi-master
- Adding ReadWrite locks to prevent global lock issues when forking threads, specifically with regards to the time thread.
2022-05-02 13:26:21 -04:00
Vivek Saini a247fec487 Merge pull request #60 from Snapchat/merge_os_apr_13
Merge in changes from Open Source.

For the most part, this encompasses two changes:

- Adding partial sync capabilities to multi-master
- Adding ReadWrite locks to prevent global lock issues when forking threads, specifically with regards to the time thread.
2022-05-02 13:26:21 -04:00
Vivek Saini c406d884f3 Updated test replica configs so tests make sense 2022-04-28 21:58:35 +00:00
Vivek Saini 7b13942a6e Updated test replica configs so tests make sense 2022-04-28 21:58:35 +00:00
Vivek Saini 94d802c562 Cleanup test suite 2022-04-28 21:36:01 +00:00
Vivek Saini 86cfcf706a Cleanup test suite 2022-04-28 21:36:01 +00:00
Vivek Saini 3cdaef854f Inclusive language fix 2022-04-28 21:34:10 +00:00
Vivek Saini 842471c9bb Inclusive language fix 2022-04-28 21:34:10 +00:00
Vivek Saini 626c4cccf0 Converted some existing PSYNC tests for multimaster 2022-04-28 21:30:40 +00:00
Vivek Saini 0abb3e04f2 Converted some existing PSYNC tests for multimaster 2022-04-28 21:30:40 +00:00
John Sully a09e5b2e25 Ensure recreated tables use the same settings as ones made at boot 2022-04-27 23:38:55 +00:00
John Sully 096fe49cf4 Ensure recreated tables use the same settings as ones made at boot 2022-04-27 23:38:55 +00:00
John Sully 2c51b0e91b Ensure we are responsive during storagecache clears 2022-04-27 17:32:40 +00:00
John Sully 9d16c6bc52 Ensure we are responsive during storagecache clears 2022-04-27 17:32:40 +00:00
John Sully 802dc7b169 Merge branch 'keydbpro' of https://github.sc-corp.net/Snapchat/keydb-internal into keydbpro 2022-04-27 17:00:35 +00:00
John Sully 1d57900256 Merge branch 'keydbpro' of https://github.sc-corp.net/Snapchat/keydb-internal into keydbpro 2022-04-27 17:00:35 +00:00
Zhaozhen Liang 322e49c5ad Merge pull request #64 from Snapchat/setup-machamp-ci
setup Machamp ci
2022-04-26 16:35:39 -06:00
Zhaozhen Liang 62b426e0a5 Merge pull request #64 from Snapchat/setup-machamp-ci
setup Machamp ci
2022-04-26 16:35:39 -06:00
John Sully 930b375309 PSYNC production fixes 2022-04-26 02:07:28 +00:00
John Sully 2e144ab922 PSYNC production fixes 2022-04-26 02:07:28 +00:00
John Sully 7d123fd150 Merge branch 'merge_os_apr_13' of https://github.sc-corp.net/Snapchat/keydb-internal into merge_os_apr_13 2022-04-26 02:06:43 +00:00
John Sully 3f1b415331 Merge branch 'merge_os_apr_13' of https://github.sc-corp.net/Snapchat/keydb-internal into merge_os_apr_13 2022-04-26 02:06:43 +00:00
John Sully 7c7a1cca91 acceptTLS is threadsafe like the non TLS version 2022-04-26 01:55:22 +00:00
John Sully 9e0832f899 acceptTLS is threadsafe like the non TLS version 2022-04-26 01:55:22 +00:00
John Sully 1025e876f3 With TLS throttle accepts if server is under heavy load - do not change non TLS behavior 2022-04-26 01:55:22 +00:00
John Sully 0ba0362721 With TLS throttle accepts if server is under heavy load - do not change non TLS behavior 2022-04-26 01:55:22 +00:00
John Sully d864e299b3 Make active client balancing a configurable option 2022-04-26 01:55:22 +00:00
John Sully 764a140e18 Make active client balancing a configurable option 2022-04-26 01:55:22 +00:00
Vivek Saini 51aefbb677 Removed mergeReplicationId 2022-04-26 01:55:22 +00:00
Vivek Saini 717770a725 Removed mergeReplicationId 2022-04-26 01:55:22 +00:00
Vivek Saini 65c0375e30 call aeThreadOnline() earlier 2022-04-26 01:55:22 +00:00
Vivek Saini 01fe56bbc1 call aeThreadOnline() earlier 2022-04-26 01:55:22 +00:00
Vivek Saini cebf0fcf64 Inclusive language 2022-04-26 01:55:22 +00:00
Vivek Saini 06c1f62d8e Inclusive language 2022-04-26 01:55:22 +00:00
Vivek Saini 1864c0a2cd Remove asserts, RW lock can go below zero in cases of aeAcquireLock 2022-04-26 01:55:22 +00:00
Vivek Saini 5538829e88 Remove asserts, RW lock can go below zero in cases of aeAcquireLock 2022-04-26 01:55:22 +00:00
Vivek Saini ccfdb2251d placement new instead of memcpy 2022-04-26 01:55:22 +00:00
Vivek Saini 9dbd3391c4 placement new instead of memcpy 2022-04-26 01:55:22 +00:00
Christian Legge d18477c9e3 Save and restore master info in rdb to allow active replica partial sync (#371)
* save replid for all masters in rdb

* expanded rdbSaveInfo to hold multiple master structs

* parse repl-masters from rdb

* recover replid info from rdb in active replica mode, attempt partial sync

* save offset from rdb into correct variable

* don't change replid based on master in active rep

* save and load psync info from correct fields
2022-04-26 01:55:22 +00:00
Christian Legge 631c63884c Save and restore master info in rdb to allow active replica partial sync (#371)
* save replid for all masters in rdb

* expanded rdbSaveInfo to hold multiple master structs

* parse repl-masters from rdb

* recover replid info from rdb in active replica mode, attempt partial sync

* save offset from rdb into correct variable

* don't change replid based on master in active rep

* save and load psync info from correct fields
2022-04-26 01:55:22 +00:00
Vivek Saini f98e4b7113 Defensive asserts for RWLock 2022-04-26 01:55:22 +00:00
Vivek Saini d248a6951a Defensive asserts for RWLock 2022-04-26 01:55:22 +00:00
Vivek Saini 42f38bb523 Integrate readwritelock with Pro Code 2022-04-26 01:55:22 +00:00
Vivek Saini 31698786e4 Integrate readwritelock with Pro Code 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 97d7ace586 use atomic_load for g_pserver->mstime 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran ba8ba9abb0 use atomic_load for g_pserver->mstime 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran f8eb88d920 need to include stdint for uintptr_t 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran c7a67586f2 need to include stdint for uintptr_t 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 3d651c02bf cannot mod a pointer 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 2bb9071095 cannot mod a pointer 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 7ff10e3058 remove nullptr subtraction 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 1acec5c60a remove nullptr subtraction 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 0c306d9dcb check ziplist len to avoid crash on empty ziplist convert 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran d168832e1c check ziplist len to avoid crash on empty ziplist convert 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 1d8cb117a9 remove unused var in networking.cpp 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 49eb583ec6 remove unused var in networking.cpp 2022-04-26 01:55:22 +00:00
John Sully 1950ce5779 Eliminate firewall dialogs on mac for regular and cluster tests. There are still issues with the sentinel tests but attempting to bind only to localhost causes failures 2022-04-26 01:55:22 +00:00
John Sully d02bc67009 Eliminate firewall dialogs on mac for regular and cluster tests. There are still issues with the sentinel tests but attempting to bind only to localhost causes failures 2022-04-26 01:55:22 +00:00
John Sully b9b3a63ad4 Fix module test break 2022-04-26 01:55:22 +00:00
John Sully a30a0d76f8 Fix module test break 2022-04-26 01:55:22 +00:00
John Sully 105f21635e Fix MALLOC=memkind build issues 2022-04-26 01:55:22 +00:00
John Sully 26071c352d Fix MALLOC=memkind build issues 2022-04-26 01:55:22 +00:00
benschermel 4c52dbc62a update README resource links 2022-04-26 01:55:22 +00:00
benschermel 9fe0e8aa38 update README resource links 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 170044cbf3 set thread as offline when waiting for time thread lock 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 0e0b83c048 set thread as offline when waiting for time thread lock 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 9bc6efd443 time thread lock uses fastlock instead of std::mutex 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 59c6db3d0e time thread lock uses fastlock instead of std::mutex 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 3e05f17d30 only need to include readwritelock in ae 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 2bf0d4e9e8 only need to include readwritelock in ae 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 812a671e0d hide forklock object in ae 2022-04-26 01:55:22 +00:00
Malavan Sotheeswaran 88d2f4f0ac hide forklock object in ae 2022-04-26 01:55:22 +00:00
malavan f027c8c761 fork lock for all threads, use fastlock for readwritelock 2022-04-26 01:55:21 +00:00
malavan c3401248d7 fork lock for all threads, use fastlock for readwritelock 2022-04-26 01:55:21 +00:00
John Sully 46d571f45c Update ci.yml
Change min tested version to 18.04
2022-04-26 01:55:21 +00:00
John Sully 6eef90f68b Update ci.yml
Change min tested version to 18.04
2022-04-26 01:55:21 +00:00
Vivek Saini ba087cebb8 Added multimaster test 2022-04-25 20:32:44 +00:00
Vivek Saini 0ee8b01e2a Added multimaster test 2022-04-25 20:32:44 +00:00
zliang 7ede98b5e3 break into tests into steps 2022-04-22 18:03:42 -06:00
zliang dba44cfb58 break into tests into steps 2022-04-22 18:03:42 -06:00
zliang ef645104b8 fix the Machamp build 2022-04-22 16:46:41 -06:00
zliang 24c6b65c6f fix the Machamp build 2022-04-22 16:46:41 -06:00
John Sully bbcf95b346 PSYNC production fixes 2022-04-22 22:43:20 +00:00
John Sully 349acac1dd PSYNC production fixes 2022-04-22 22:43:20 +00:00
zliang d4de960cda make build_test.sh executable 2022-04-22 12:31:13 -06:00
zliang 6b9f8edf62 make build_test.sh executable 2022-04-22 12:31:13 -06:00
zliang 3f06dfa141 setup Machamp ci 2022-04-22 12:08:39 -06:00
zliang 1bd7797a6b setup Machamp ci 2022-04-22 12:08:39 -06:00
John Sully a40b5ed2ca øMerge branch 'keydbpro' into merge_os_apr_13 2022-04-21 19:54:01 +00:00
John Sully 98e317e17d øMerge branch 'keydbpro' into merge_os_apr_13 2022-04-21 19:54:01 +00:00
John Sully 2587e9abd8 acceptTLS is threadsafe like the non TLS version 2022-04-21 19:53:16 +00:00
John Sully 5fe3e26d24 acceptTLS is threadsafe like the non TLS version 2022-04-21 19:53:16 +00:00
Ben Schermel eb973aca17 Merge pull request #63 from Snapchat/pkg_update
Packaging Updates
2022-04-21 13:21:14 -04:00
Ben Schermel 8e48c14201 Merge pull request #63 from Snapchat/pkg_update
Packaging Updates
2022-04-21 13:21:14 -04:00
Vivek Saini 8ccd1bdad6 Removed mergeReplicationId 2022-04-21 01:18:12 +00:00
Vivek Saini d86692affa Removed mergeReplicationId 2022-04-21 01:18:12 +00:00
John Sully 117c9cbaa3 Merge branch 'keydbpro' of https://github.sc-corp.net/Snapchat/keydb-internal into keydbpro 2022-04-20 21:19:34 +00:00
John Sully 64f54d865c Merge branch 'keydbpro' of https://github.sc-corp.net/Snapchat/keydb-internal into keydbpro 2022-04-20 21:19:34 +00:00
Vivek Saini 4da56ec7c6 call aeThreadOnline() earlier 2022-04-20 20:46:48 +00:00
Vivek Saini edf4b24659 call aeThreadOnline() earlier 2022-04-20 20:46:48 +00:00
benschermel 6e1d6f7f79 update deb copyright 2022-04-20 16:17:43 -04:00
benschermel 0a02276879 update deb copyright 2022-04-20 16:17:43 -04:00
benschermel 239651641e update copyright 2022-04-20 16:07:37 -04:00
benschermel 2ddb68d663 update copyright 2022-04-20 16:07:37 -04:00
benschermel dbbc8916d0 update changelog to use replica as terminology 2022-04-20 14:28:18 -04:00
benschermel 94697eb37c update changelog to use replica as terminology 2022-04-20 14:28:18 -04:00
Vivek Saini dac75359df Fix KeyDB not building with TLS < 1.1.1 2022-04-20 14:24:50 -04:00
Vivek Saini 33d22c5350 Fix KeyDB not building with TLS < 1.1.1 2022-04-20 14:24:50 -04:00
Vivek Saini 83dce1ec27 Only run the tls-name-validation test if --tls is passed into runtest 2022-04-20 12:15:19 -04:00
Vivek Saini 9606494925 Only run the tls-name-validation test if --tls is passed into runtest 2022-04-20 12:15:19 -04:00
John Sully 19f37969ca With TLS throttle accepts if server is under heavy load - do not change non TLS behavior 2022-04-18 23:07:36 +00:00
John Sully 469707fa28 With TLS throttle accepts if server is under heavy load - do not change non TLS behavior 2022-04-18 23:07:36 +00:00
John Sully 57ee67ae40 Make active client balancing a configurable option 2022-04-18 23:07:15 +00:00
John Sully 07fa0c025a Make active client balancing a configurable option 2022-04-18 23:07:15 +00:00
benschermel 6008df4a6f modify dockerfile to build within image 2022-04-15 23:10:31 -04:00
benschermel 27ea441bad modify dockerfile to build within image 2022-04-15 23:10:31 -04:00
benschermel e2e062e08c update packaging for OS merge 2022-04-15 23:09:44 -04:00
benschermel 2125c097ef update packaging for OS merge 2022-04-15 23:09:44 -04:00
Vivek Saini 9885ba7e25 Inclusive language 2022-04-14 23:54:05 +00:00
Vivek Saini a46b10c8e2 Inclusive language 2022-04-14 23:54:05 +00:00
Vivek Saini 50f182417f Remove asserts, RW lock can go below zero in cases of aeAcquireLock 2022-04-14 22:34:02 +00:00
Vivek Saini 0ab7068920 Remove asserts, RW lock can go below zero in cases of aeAcquireLock 2022-04-14 22:34:02 +00:00
Vivek Saini f5fc90c035 placement new instead of memcpy 2022-04-14 21:05:10 +00:00
Vivek Saini 0f6d646584 placement new instead of memcpy 2022-04-14 21:05:10 +00:00
Christian Legge eb7a69c07e Save and restore master info in rdb to allow active replica partial sync (#371)
* save replid for all masters in rdb

* expanded rdbSaveInfo to hold multiple master structs

* parse repl-masters from rdb

* recover replid info from rdb in active replica mode, attempt partial sync

* save offset from rdb into correct variable

* don't change replid based on master in active rep

* save and load psync info from correct fields
2022-04-14 20:17:18 +00:00
Christian Legge c75161c557 Save and restore master info in rdb to allow active replica partial sync (#371)
* save replid for all masters in rdb

* expanded rdbSaveInfo to hold multiple master structs

* parse repl-masters from rdb

* recover replid info from rdb in active replica mode, attempt partial sync

* save offset from rdb into correct variable

* don't change replid based on master in active rep

* save and load psync info from correct fields
2022-04-14 20:17:18 +00:00
Vivek Saini 43f445946d Defensive asserts for RWLock 2022-04-14 17:21:50 +00:00
Vivek Saini 37251ee2f3 Defensive asserts for RWLock 2022-04-14 17:21:50 +00:00
Vivek Saini f60c355361 Integrate readwritelock with Pro Code 2022-04-14 17:15:19 +00:00
Vivek Saini 4ef0062ef7 Integrate readwritelock with Pro Code 2022-04-14 17:15:19 +00:00
Malavan Sotheeswaran 2c3a7907d5 use atomic_load for g_pserver->mstime 2022-04-13 14:10:58 -04:00
Malavan Sotheeswaran c2147af8d6 use atomic_load for g_pserver->mstime 2022-04-13 14:10:58 -04:00
Malavan Sotheeswaran 4522751aa0 need to include stdint for uintptr_t 2022-04-13 14:10:58 -04:00
Malavan Sotheeswaran ead8b06366 need to include stdint for uintptr_t 2022-04-13 14:10:58 -04:00
Malavan Sotheeswaran 50e1fbb9fd cannot mod a pointer 2022-04-13 14:10:58 -04:00
Malavan Sotheeswaran e9f592ec00 cannot mod a pointer 2022-04-13 14:10:58 -04:00
Malavan Sotheeswaran 7fb0a3119f remove nullptr subtraction 2022-04-13 14:10:58 -04:00
Malavan Sotheeswaran aa63c38b25 remove nullptr subtraction 2022-04-13 14:10:58 -04:00
Malavan Sotheeswaran 2deb216552 check ziplist len to avoid crash on empty ziplist convert 2022-04-13 14:08:44 -04:00
Malavan Sotheeswaran ae8a391ab2 check ziplist len to avoid crash on empty ziplist convert 2022-04-13 14:08:44 -04:00
Malavan Sotheeswaran ff6fbad564 remove unused var in networking.cpp 2022-04-13 14:08:43 -04:00
Malavan Sotheeswaran 9c533334f1 remove unused var in networking.cpp 2022-04-13 14:08:43 -04:00
John Sully 4aec464d1b Eliminate firewall dialogs on mac for regular and cluster tests. There are still issues with the sentinel tests but attempting to bind only to localhost causes failures 2022-04-13 14:07:14 -04:00
John Sully 5aaed44578 Eliminate firewall dialogs on mac for regular and cluster tests. There are still issues with the sentinel tests but attempting to bind only to localhost causes failures 2022-04-13 14:07:14 -04:00
John Sully 9ba9add4a8 Fix module test break 2022-04-13 14:07:14 -04:00
John Sully c41ed07e54 Fix module test break 2022-04-13 14:07:14 -04:00
John Sully 25e5e60983 Fix MALLOC=memkind build issues 2022-04-13 14:07:14 -04:00
John Sully 7529e0b766 Fix MALLOC=memkind build issues 2022-04-13 14:07:14 -04:00
benschermel ad4840f9df update README resource links 2022-04-13 14:07:14 -04:00
benschermel 79b5c9e0d8 update README resource links 2022-04-13 14:07:14 -04:00
Malavan Sotheeswaran ad4336281b set thread as offline when waiting for time thread lock 2022-04-13 14:06:58 -04:00
Malavan Sotheeswaran e579dfd52d set thread as offline when waiting for time thread lock 2022-04-13 14:06:58 -04:00
Malavan Sotheeswaran ff023a3f5b time thread lock uses fastlock instead of std::mutex 2022-04-13 14:05:26 -04:00
Malavan Sotheeswaran 31fc5f182c time thread lock uses fastlock instead of std::mutex 2022-04-13 14:05:26 -04:00
Malavan Sotheeswaran e0e5ce4416 only need to include readwritelock in ae 2022-04-13 14:04:07 -04:00
Malavan Sotheeswaran af2e94f14d only need to include readwritelock in ae 2022-04-13 14:04:07 -04:00
Malavan Sotheeswaran a15991c2f4 hide forklock object in ae 2022-04-13 14:04:02 -04:00
Malavan Sotheeswaran 6b7ce4dc0b hide forklock object in ae 2022-04-13 14:04:02 -04:00
malavan 9243237519 fork lock for all threads, use fastlock for readwritelock 2022-04-13 13:52:41 -04:00
malavan 74e79a6ab7 fork lock for all threads, use fastlock for readwritelock 2022-04-13 13:52:41 -04:00
John Sully 9b71188b5e Update ci.yml
Change min tested version to 18.04
2022-04-13 13:34:18 -04:00
John Sully dec18fb3a1 Update ci.yml
Change min tested version to 18.04
2022-04-13 13:34:18 -04:00
John Sully c910508d8f Fix leaked reference count to dict 2022-04-13 12:51:00 -04:00
John Sully 056e6f346c Fix leaked reference count to dict 2022-04-13 12:51:00 -04:00
John Sully 4f10d12873 Improve connect performance by reducing lock contention, I'm seeing 50-100% improvements 2022-04-13 12:51:00 -04:00
John Sully 9bc1123988 Improve connect performance by reducing lock contention, I'm seeing 50-100% improvements 2022-04-13 12:51:00 -04:00
John Sully 0acd454ec4 Do not send updates to servers overly frequently during load 2022-04-13 12:51:00 -04:00
John Sully 4b0fe0da3c Do not send updates to servers overly frequently during load 2022-04-13 12:51:00 -04:00
John Sully e31bfb6736 SSL connections are expensive, do not do them overly frequently 2022-04-13 12:51:00 -04:00
John Sully 9630f1dc1a SSL connections are expensive, do not do them overly frequently 2022-04-13 12:51:00 -04:00
John Sully fab17c84b4 Handle RREPLAY errors gracefully 2022-04-13 12:51:00 -04:00
John Sully d08afadb5b Handle RREPLAY errors gracefully 2022-04-13 12:51:00 -04:00
John SullyandJohn Sully 3439bd47a7 Make multithread load configurable and disabled by default (#57)
Co-authored-by: John Sully <john@csquare.ca>
2022-04-07 13:20:38 -04:00
John SullyandJohn Sully ad8fb4f68a Make multithread load configurable and disabled by default (#57)
Co-authored-by: John Sully <john@csquare.ca>
2022-04-07 13:20:38 -04:00
John Sully 9dd19e4e60 Log the connected masters in the INFO command 2022-04-02 01:20:45 -04:00
John Sully cb8e3d8d51 Log the connected masters in the INFO command 2022-04-02 01:20:45 -04:00
John Sully bde3e1bb1e Fix test failures due to async command slip 2022-04-01 05:08:41 +00:00
John Sully 22bfc046ab Fix test failures due to async command slip 2022-04-01 05:08:41 +00:00
John Sully 56274ead49 Do not save while loading 2022-04-01 05:08:08 +00:00
John Sully 4300f4b8d3 Do not save while loading 2022-04-01 05:08:08 +00:00
John Sully a96c2aa66f Fix test failure 2022-03-31 17:48:37 -04:00
John Sully 4d17dc1d5b Fix test failure 2022-03-31 17:48:37 -04:00
John Sully 370785244b Support dynamic runtime modification of tls-allowlist, and add config rewrite support 2022-03-31 17:48:37 -04:00
John Sully b190866094 Support dynamic runtime modification of tls-allowlist, and add config rewrite support 2022-03-31 17:48:37 -04:00
Vivek Saini 300a945ecd Changed term whitelist to allowlist (#54) 2022-03-31 14:15:03 -04:00
Vivek Saini 3b6ec122df Changed term whitelist to allowlist (#54) 2022-03-31 14:15:03 -04:00
John Sully c498f50d6c Merge pull request #53 from Snapchat/freeClientLockFix
Fix lock inversion in freeClientAsync
2022-03-29 12:37:12 -04:00
John Sully bf21da939d Merge pull request #53 from Snapchat/freeClientLockFix
Fix lock inversion in freeClientAsync
2022-03-29 12:37:12 -04:00
John Sully 9c4dfdd875 Fix issue with AE unlocking in beforeSleep 2022-03-29 12:17:13 -04:00
John Sully 01e9a1eaa1 Fix issue with AE unlocking in beforeSleep 2022-03-29 12:17:13 -04:00
John Sully fb2f289e89 Fix lock inversion in freeClientAsync - make it not dependent on the AE Lock 2022-03-29 00:19:49 -04:00
John Sully 4d96f16852 Fix lock inversion in freeClientAsync - make it not dependent on the AE Lock 2022-03-29 00:19:49 -04:00
John Sully a6e701a84e Merge pull request #51 from jsully/keydbpro
KeyDB Pro Collab Bug Fixes and Mac Build
2022-03-08 18:00:28 -05:00
John Sully bfbf02b268 Merge pull request #51 from jsully/keydbpro
KeyDB Pro Collab Bug Fixes and Mac Build
2022-03-08 18:00:28 -05:00
John Sully 4354bd4fe8 Fix mac build warnings 2022-03-07 19:28:39 -05:00
John Sully 1bae7109bc Fix mac build warnings 2022-03-07 19:28:39 -05:00
John Sully 4ad063bdfd Fix spurious warnings about unclean RocksDB databases on startup 2022-03-07 16:42:37 -05:00
John Sully d51f73f2b5 Fix spurious warnings about unclean RocksDB databases on startup 2022-03-07 16:42:37 -05:00
John Sully 3abce05330 Fix FLASH Read performance after data is loaded from fastsync (the rocksdb files have compression enabled when written by the bulkWrite function 2022-03-07 16:41:51 -05:00
John Sully 072cf76bf0 Fix FLASH Read performance after data is loaded from fastsync (the rocksdb files have compression enabled when written by the bulkWrite function 2022-03-07 16:41:51 -05:00
John Sully 9320e10396 Fix test instability caused by MVCC slip with lfence command when async commands are enabled 2022-03-07 16:40:56 -05:00
John Sully 51c3567ded Fix test instability caused by MVCC slip with lfence command when async commands are enabled 2022-03-07 16:40:56 -05:00
John Sully ad19110a5a Fix fast-sync perf issue while server is under load (batch size too small) 2022-03-07 16:40:01 -05:00
John Sully fc4388ac47 Fix fast-sync perf issue while server is under load (batch size too small) 2022-03-07 16:40:01 -05:00
John Sully fb51123090 Fix cluster test fail 2022-03-07 16:39:01 -05:00
John Sully b0fc50494d Fix cluster test fail 2022-03-07 16:39:01 -05:00
John Sully 0329e62d31 Optimize async command snapshot creation, and make slip configurable 2022-03-07 16:00:48 -05:00
John Sully cccf2ca062 Optimize async command snapshot creation, and make slip configurable 2022-03-07 16:00:48 -05:00
John Sully adc66136d9 Fix mac build breaks and remove license checks (won't work on mac) 2022-03-07 14:50:31 -05:00
John Sully 570ed1feb1 Fix mac build breaks and remove license checks (won't work on mac) 2022-03-07 14:50:31 -05:00
Vivek Saini 9a0c765875 TLS Name Validation (#48)
Added TLS Name Validation
2022-03-03 13:59:07 -05:00
Vivek Saini 4e4f08db3e TLS Name Validation (#48)
Added TLS Name Validation
2022-03-03 13:59:07 -05:00
Artem Danilov ab5589be41 enable TLS build by default (#43)
* enable TLS build by default

* move export to src folder

* fix comments
2022-02-11 16:36:42 -08:00
Artem Danilov e8f94d1883 enable TLS build by default (#43)
* enable TLS build by default

* move export to src folder

* fix comments
2022-02-11 16:36:42 -08:00
John Sully bc0b3c3deb Merge pull request #42 from Snapchat/keepttl-failure
fix intermittent KEEPTTL test failure
2022-02-10 12:53:59 -05:00
John Sully 80d376325f Merge pull request #42 from Snapchat/keepttl-failure
fix intermittent KEEPTTL test failure
2022-02-10 12:53:59 -05:00
adanilov 17bd229fce fix intermittent KEEPTTL test failure 2022-02-10 16:37:13 +00:00
adanilov cf459e67b9 fix intermittent KEEPTTL test failure 2022-02-10 16:37:13 +00:00
Vivek Saini 96a7a57f8a Merge pull request #40 from Snapchat/tls_cert_rotation
Added support for TLS certificate rotation.
2022-02-02 17:38:35 -05:00
Vivek Saini 4035ddaecd Merge pull request #40 from Snapchat/tls_cert_rotation
Added support for TLS certificate rotation.
2022-02-02 17:38:35 -05:00
Vivek Saini 3d485e48cf Updated CI to run rotation test 2022-02-02 17:28:55 -05:00
Vivek Saini b029a10bf7 Updated CI to run rotation test 2022-02-02 17:28:55 -05:00
Vivek Saini 3cc79b57fe Updated default config file with TLS rotation config option 2022-02-02 15:49:52 -05:00
Vivek Saini 6c630eddcf Updated default config file with TLS rotation config option 2022-02-02 15:49:52 -05:00
Vivek Saini 97bff49db4 Added TLS rotation support 2022-02-02 14:20:19 -05:00
Vivek Saini 82e56dfaf8 Added TLS rotation support 2022-02-02 14:20:19 -05:00
christianEQ 898191750b Merge remote-tracking branch 'opensource/RELEASE_6' into keydbpro
Former-commit-id: 439c655a543f4d3224d90bcdeb21ba43c2ab8ab7
2022-01-14 22:19:42 +00:00
christianEQ 2d5ff78a3f Merge remote-tracking branch 'opensource/RELEASE_6' into keydbpro
Former-commit-id: 439c655a543f4d3224d90bcdeb21ba43c2ab8ab7
2022-01-14 22:19:42 +00:00
MalavanEQAlpha dfcbba494a Merge pull request #386 from EQ-Alpha/fix_rdb_hang
add readwrite lock for forking

Former-commit-id: 95c2a7e970ce17dd3e35eeaec0b63f7dd96d1cf5
2022-01-14 13:19:33 -08:00
christianEQ 1a65396527 bump version
Former-commit-id: e5c7525b88370d29fafa44245b0e2eecc2081fd8
2022-01-13 00:07:03 +00:00
christianEQ fb82631f48 Merge branch 'unstable' into RELEASE_6
Former-commit-id: 575bcdbf4a58f85d41bf80986bd54922f634d05c
2022-01-10 23:54:30 +00:00
John Sully eb540c7d98 Permit connTLSWrite to handle a zero sized write
Former-commit-id: 4be609ff2c80fd6261edc214bb099d6cf6ab1db3
2022-01-06 19:15:31 -05:00
John Sully 41aab2d66f Permit connTLSWrite to handle a zero sized write
Former-commit-id: 4be609ff2c80fd6261edc214bb099d6cf6ab1db3
2022-01-06 19:15:31 -05:00
John Sully dc38bc8fdb Handle the case where querybuf data is read by the fastsync read handler
Former-commit-id: c4a5b904e941e09132413abc3b4d86c59c342051
2021-12-27 00:15:09 -05:00
John Sully df570b5a53 Handle the case where querybuf data is read by the fastsync read handler
Former-commit-id: c4a5b904e941e09132413abc3b4d86c59c342051
2021-12-27 00:15:09 -05:00
John Sully 07dd648ce2 Fix partial sync failures
Former-commit-id: 7e9f7c0c4f520392a930ab72951e287f52c711ab
2021-12-26 05:16:58 -05:00
John Sully 4e4ac42f20 Fix partial sync failures
Former-commit-id: 7e9f7c0c4f520392a930ab72951e287f52c711ab
2021-12-26 05:16:58 -05:00
John Sully 7391744456 Fix repl-psync-flash test instability
Former-commit-id: 310b0cf5413dbf3e7aa67e9b9c31869f3e994291
2021-12-23 17:30:14 -05:00
John Sully dc337817d4 Fix repl-psync-flash test instability
Former-commit-id: 310b0cf5413dbf3e7aa67e9b9c31869f3e994291
2021-12-23 17:30:14 -05:00
John Sully 68a22350b6 Remove double free in keydb-benchmark
Former-commit-id: 3190dbf57320b1901e3ac75f2e4a25ca335026a1
2021-12-23 14:20:41 -05:00
John Sully 0ddf1a558d Fix deadlock issue #183 cause by lock inversion
Former-commit-id: ab975f6612941bcf3a0609b984256d24e3ae2bea
2021-12-23 13:17:14 -05:00
John Sully 6c8133c8f2 Apple build break fix
Former-commit-id: 7bde9214015efb7dea4cdca98fd87e793bb01d07
2021-12-23 13:12:59 -05:00
John Sully 600e7ce265 Fix module test break
Former-commit-id: 05767cdcb3c45619cdeeebcedbbf55ff1712e366
2021-12-23 13:12:34 -05:00
John Sully f812aafaf7 Fix module test failures with blocked clients
Former-commit-id: 18ec4b8600ea3462843b58a0f0e917824dfd7ff3
2021-12-23 02:10:20 -05:00
John Sully 44cbe57d0a Fix module test failures with blocked clients
Former-commit-id: 18ec4b8600ea3462843b58a0f0e917824dfd7ff3
2021-12-23 02:10:20 -05:00
John Sully cbedcda44a Fix partial sync corruption with FLASH
Former-commit-id: 532f58c0539b775c040c0dd9a2ad3dc349faf87a
2021-12-23 00:04:28 -05:00
John Sully 60b49510a7 Fix partial sync corruption with FLASH
Former-commit-id: 532f58c0539b775c040c0dd9a2ad3dc349faf87a
2021-12-23 00:04:28 -05:00
John Sully df17b0fac8 Reenable TCP No Delay
Former-commit-id: e11211cdfeca46574a03f6f8210bbe1ab3d70961
2021-12-22 18:42:11 -05:00
John Sully 10de1d54bd Reenable TCP No Delay
Former-commit-id: e11211cdfeca46574a03f6f8210bbe1ab3d70961
2021-12-22 18:42:11 -05:00
John Sully 346e652206 Fix memory leak
Former-commit-id: c5b9adf47e30658359071d458cfb16a094dc8e28
2021-12-22 18:41:50 -05:00
John Sully 9bf54df381 Fix memory leak
Former-commit-id: c5b9adf47e30658359071d458cfb16a094dc8e28
2021-12-22 18:41:50 -05:00
VivekSainiEQ 7702c97cdf Merge remote-tracking branch 'mainpro/PRO_RELEASE_6' into keydbpro
Former-commit-id: 5a32d66ee382b6d227a67073afc81ca058d605ed
2021-12-06 20:43:23 +00:00
VivekSainiEQ ba8f044d7b Merge remote-tracking branch 'mainpro/PRO_RELEASE_6' into keydbpro
Former-commit-id: 5a32d66ee382b6d227a67073afc81ca058d605ed
2021-12-06 20:43:23 +00:00
John Sully 273bc25b2b Implent the force-backlog-disk-reserve flag
Former-commit-id: d39f7f4407f8935b1540dd302be3e24ac02c5700
2021-12-04 02:07:03 +00:00
John Sully f85ef42ca6 Implent the force-backlog-disk-reserve flag
Former-commit-id: d39f7f4407f8935b1540dd302be3e24ac02c5700
2021-12-04 02:07:03 +00:00
Malavan Sotheeswaran cd80f5e086 Merge branch 'fix_unlocked_main_db_access_in_async_lookup' into 'keydbpro'
add async to hget and fix bug where a command can hold a key from main db without lock

See merge request external-collab/keydb-pro-6!11

Former-commit-id: 1cf683ef015f7e32fb79fbb5e41a3c3a80a80844
2021-12-02 17:39:27 +00:00
Malavan Sotheeswaran 949b660e50 Merge branch 'fix_unlocked_main_db_access_in_async_lookup' into 'keydbpro'
add async to hget and fix bug where a command can hold a key from main db without lock

See merge request external-collab/keydb-pro-6!11

Former-commit-id: 1cf683ef015f7e32fb79fbb5e41a3c3a80a80844
2021-12-02 17:39:27 +00:00
malavan 5555589247 add async to hget and fix bug where a command can hold a key from main db without lock
Former-commit-id: b0b8f426fda7cdabd3898a2d0b38d0fae47d1e69
2021-12-02 17:11:26 +00:00
malavan b6dea1d287 add async to hget and fix bug where a command can hold a key from main db without lock
Former-commit-id: b0b8f426fda7cdabd3898a2d0b38d0fae47d1e69
2021-12-02 17:11:26 +00:00
malavan 7782d46cb4 fix potential compilation fail on gettid in replication.cpp
Former-commit-id: edb6b240a7785b707652a168d90f46d8744dd4c7
2021-12-01 20:50:18 +00:00
malavan 12beccdd01 fix potential compilation fail on gettid in replication.cpp
Former-commit-id: edb6b240a7785b707652a168d90f46d8744dd4c7
2021-12-01 20:50:18 +00:00
Malavan Sotheeswaran 15d03f6b10 Merge branch 'async_commands' into 'keydbpro'
async commands

See merge request external-collab/keydb-pro-6!10

Former-commit-id: 669987028af582a8561b7959c1b33b84f67c6146
2021-11-30 17:28:17 +00:00
Malavan Sotheeswaran 36390a7d24 Merge branch 'async_commands' into 'keydbpro'
async commands

See merge request external-collab/keydb-pro-6!10

Former-commit-id: 669987028af582a8561b7959c1b33b84f67c6146
2021-11-30 17:28:17 +00:00
Malavan Sotheeswaran 71d21fa2ee missing false for return in prefetchKeysAsync
Former-commit-id: 174dc44acdc1a8cb37b86f27ab056e14fc42770c
2021-11-30 12:20:13 -05:00
Malavan Sotheeswaran 55e30b7b57 missing false for return in prefetchKeysAsync
Former-commit-id: 174dc44acdc1a8cb37b86f27ab056e14fc42770c
2021-11-30 12:20:13 -05:00
Malavan Sotheeswaran a9647ed275 Merge branch 'async_commands' of https://gitlab.eqalpha.com/external-collab/keydb-pro-6 into async_commands
Former-commit-id: 1afa51c4d21d695c052dbec690bf3880b243dbec
2021-11-30 12:17:46 -05:00
Malavan Sotheeswaran 8cea3a6b71 Merge branch 'async_commands' of https://gitlab.eqalpha.com/external-collab/keydb-pro-6 into async_commands
Former-commit-id: 1afa51c4d21d695c052dbec690bf3880b243dbec
2021-11-30 12:17:46 -05:00
Malavan Sotheeswaran a34ed32400 Merge branch 'async_commands' of https://gitlab.eqalpha.com/external-collab/keydb-pro-6 into async_commands
Former-commit-id: 59423294524bb1d093a35084aa0d48989b426961
2021-11-30 11:48:35 -05:00
Malavan Sotheeswaran ce0d680622 Merge branch 'async_commands' of https://gitlab.eqalpha.com/external-collab/keydb-pro-6 into async_commands
Former-commit-id: 59423294524bb1d093a35084aa0d48989b426961
2021-11-30 11:48:35 -05:00
Malavan Sotheeswaran 5233969299 Merge branch 'keydbpro' into async_commands
Former-commit-id: 9eaddb8ca1424ff3225dac9c144d23848228c7d2
2021-11-30 11:47:51 -05:00
Malavan Sotheeswaran 15ea551c8b Merge branch 'keydbpro' into async_commands
Former-commit-id: 9eaddb8ca1424ff3225dac9c144d23848228c7d2
2021-11-30 11:47:51 -05:00
Malavan Sotheeswaran fff3c87882 Merge branch 'fastsync_collab' into 'keydbpro'
Fastsync collab

See merge request external-collab/keydb-pro-6!9

Former-commit-id: 8f410e4b814ea6ac506ab540ee1394834fd1d8a8
2021-11-26 20:53:00 +00:00
Malavan Sotheeswaran 4763ddb9fa Merge branch 'fastsync_collab' into 'keydbpro'
Fastsync collab

See merge request external-collab/keydb-pro-6!9

Former-commit-id: 8f410e4b814ea6ac506ab540ee1394834fd1d8a8
2021-11-26 20:53:00 +00:00
christianEQ 71b3414a4c don't save master if host is null
Former-commit-id: 8238d8da82c483c093f5248b9dac983bc542e20f
2021-11-26 20:36:46 +00:00
christianEQ 617e7f6673 don't save master if host is null
Former-commit-id: 8238d8da82c483c093f5248b9dac983bc542e20f
2021-11-26 20:36:46 +00:00
Malavan Sotheeswaran e809f467a7 Merge branch 'flash-psync' into 'fastsync_collab'
Flash Partial Sync

See merge request external-collab/keydb-pro-6!6

Former-commit-id: 2ebf2a8abd8df5c4cf3a5d759491962d050e8cc5
2021-11-26 18:59:16 +00:00
Malavan Sotheeswaran cf4d90a31c Merge branch 'flash-psync' into 'fastsync_collab'
Flash Partial Sync

See merge request external-collab/keydb-pro-6!6

Former-commit-id: 2ebf2a8abd8df5c4cf3a5d759491962d050e8cc5
2021-11-26 18:59:16 +00:00
christian d4b1b7e131 Merge branch 'fastsync_collab2' into 'fastsync_collab'
fix dataloss on aof load with storage provider

See merge request external-collab/keydb-pro-6!7

Former-commit-id: a3aecc171b45308b68eb922947f8dd31be7e3566
2021-11-26 18:28:08 +00:00
christian 2b1548692e Merge branch 'fastsync_collab2' into 'fastsync_collab'
fix dataloss on aof load with storage provider

See merge request external-collab/keydb-pro-6!7

Former-commit-id: a3aecc171b45308b68eb922947f8dd31be7e3566
2021-11-26 18:28:08 +00:00
malavan 130fb929df client lock for fast sync replbuffer, delay fast sync for next replication cron
Former-commit-id: 9fe7f8328d66f9ec57060934462ad85ef60c36aa
2021-11-26 17:46:41 +00:00
malavan 56d9b59073 client lock for fast sync replbuffer, delay fast sync for next replication cron
Former-commit-id: 9fe7f8328d66f9ec57060934462ad85ef60c36aa
2021-11-26 17:46:41 +00:00
John Sully 10f5eb8908 Implement the disk backed backlog functionality
Former-commit-id: 759cc01c6ba05f9a865c11580cc4975b5f1bd1d6
2021-11-26 03:05:23 +00:00
John Sully 0a7b55bfc9 Implement the disk backed backlog functionality
Former-commit-id: 759cc01c6ba05f9a865c11580cc4975b5f1bd1d6
2021-11-26 03:05:23 +00:00
malavan 6982348ecb Merge remote-tracking branch 'origin/fastsync_collab' into fastsync_collab2
Former-commit-id: 176c00615769e1a73eb44f8fe7a6cacfa2ae539d
2021-11-24 22:00:18 +00:00
malavan 042a08deef Merge remote-tracking branch 'origin/fastsync_collab' into fastsync_collab2
Former-commit-id: 176c00615769e1a73eb44f8fe7a6cacfa2ae539d
2021-11-24 22:00:18 +00:00
malavan 53b9e32058 remove async write from fast sync repl buffer and fix some bugs
Former-commit-id: 6c45706f75d8322281296d9c73a3fac4f7f383a1
2021-11-24 21:59:01 +00:00
malavan e5f9bfde05 remove async write from fast sync repl buffer and fix some bugs
Former-commit-id: 6c45706f75d8322281296d9c73a3fac4f7f383a1
2021-11-24 21:59:01 +00:00
VivekSainiEQ 53594ea73c Initialize snapshots for module thread var
Former-commit-id: c263e0df22bab35d8417eb396d250e00e8853ab3
2021-11-24 01:42:01 +00:00
VivekSainiEQ 452df153ec Initialize snapshots for module thread var
Former-commit-id: c263e0df22bab35d8417eb396d250e00e8853ab3
2021-11-24 01:42:01 +00:00
VivekSainiEQ baba64f7e5 Fix failing cluster test
Former-commit-id: 960503a4710d4379d5ebbb67d7ac82705f312913
2021-11-22 22:21:57 +00:00
VivekSainiEQ 15592291d0 Fix failing cluster test
Former-commit-id: 960503a4710d4379d5ebbb67d7ac82705f312913
2021-11-22 22:21:57 +00:00
benschermel 4be6814018 update conf
Former-commit-id: b5b095c12973cdd3eceea8ad8df3961136464a95
2021-11-19 01:46:05 +00:00
benschermel 7f7fa94215 update conf
Former-commit-id: b5b095c12973cdd3eceea8ad8df3961136464a95
2021-11-19 01:46:05 +00:00
benschermel e2c9062d71 update deb changelog
Former-commit-id: acbfa119ae7af083a0839292ea7b55cae5d0eeb1
2021-11-17 18:22:36 +00:00
benschermel be0d0b1a10 update deb changelog
Former-commit-id: a8b215087e9bccf0d813b4b08974744ba963b31c
2021-11-17 18:20:38 +00:00
benschermel fa91f22223 update deb changelog
Former-commit-id: a8b215087e9bccf0d813b4b08974744ba963b31c
2021-11-17 18:20:38 +00:00
malavan 5c5ff77833 fix dataloss on aof load with storage provider
Former-commit-id: 447c8601b5203346fdd4b956ad1ac87c4a6073c8
2021-11-16 02:13:36 +00:00
malavan 23666861e3 fix dataloss on aof load with storage provider
Former-commit-id: 447c8601b5203346fdd4b956ad1ac87c4a6073c8
2021-11-16 02:13:36 +00:00
VivekSainiEQ 21ca83f64a Removed trial code entirely
Former-commit-id: 540a60eb12d01c2839228f9fdaa6233aed99dc38
2021-11-15 23:56:30 +00:00
VivekSainiEQ effafc9686 Removed trial code entirely
Former-commit-id: 540a60eb12d01c2839228f9fdaa6233aed99dc38
2021-11-15 23:56:30 +00:00
VivekSainiEQ c2a6fd58f2 bump version
Former-commit-id: 733f25e3530282c6cd0e3eaf9e63e1485a24152a
2021-11-15 23:45:46 +00:00
VivekSainiEQ 92b4071529 bump version
Former-commit-id: d6038f0e063579987874b88bf8a11b5b16dfb33a
2021-11-15 23:43:56 +00:00
VivekSainiEQ e2710c2205 bump version
Former-commit-id: d6038f0e063579987874b88bf8a11b5b16dfb33a
2021-11-15 23:43:56 +00:00
VivekSainiEQ fd29199a98 Removed KeyDB Enterprise Trial
Former-commit-id: 0899ede8db54db80a2cc101412e5dbcaedb706b1
2021-11-15 20:33:54 +00:00
VivekSainiEQ d7017eeaab Removed KeyDB Enterprise Trial
Former-commit-id: 0899ede8db54db80a2cc101412e5dbcaedb706b1
2021-11-15 20:33:54 +00:00
VivekSainiEQ d9cd293ca4 Merge branch 'unstable' into RELEASE_6
Former-commit-id: 1e6e8e9fe3e20a1c12d7768b632bf72bc634bd5c
2021-11-15 18:08:01 +00:00
Vivek Saini adb364b829 Merge pull request #375 from VivekSainiEQ/time_thread_backport
Backport the time thread code from the enterprise version of KeyDB.

Also fix an issue with clustering where connections are potentially written to after being closed.

Former-commit-id: 3977314d0cf8505d7e8b1bcd9bcbc1f931a3099e
2021-11-15 12:57:15 -05:00
John Sully 83c04978d7 Prevent GC related crash on force-exit
Former-commit-id: e4d95f83b02786b5a170673709780700def160cb
2021-11-13 19:44:13 +00:00
John Sully b7dbfed962 Prevent GC related crash on force-exit
Former-commit-id: e4d95f83b02786b5a170673709780700def160cb
2021-11-13 19:44:13 +00:00
benschermel 6d26cb5ff4 Merge branch 'systemd_rel' into 'PRO_RELEASE_6'
package updates to release branch

See merge request keydb-dev/KeyDB-Pro!54

Former-commit-id: eef6ec1141aafaa5afe52eb2cf501ca4c1e78b8d
2021-11-13 19:36:18 +00:00
benschermel 27b60ed0cc Merge branch 'systemd_rel' into 'PRO_RELEASE_6'
package updates to release branch

See merge request keydb-dev/KeyDB-Pro!54

Former-commit-id: eef6ec1141aafaa5afe52eb2cf501ca4c1e78b8d
2021-11-13 19:36:18 +00:00
benschermel bb3f7f8515 package updates to release branch
Former-commit-id: 1f198c7ea5926f6f7be630da1e0aadbc8abd10ca
2021-11-13 19:33:45 +00:00
benschermel e0f41f6ec8 package updates to release branch
Former-commit-id: 1f198c7ea5926f6f7be630da1e0aadbc8abd10ca
2021-11-13 19:33:45 +00:00
John Sully 5203be7b1f Allow load at boot to be cancelled with a shutdown command
Former-commit-id: 2897a59e59bed14a67d1d0abcec5cb6a71bbb15b
2021-11-13 18:39:03 +00:00
John Sully 6e7ad79f0c Allow load at boot to be cancelled with a shutdown command
Former-commit-id: 2897a59e59bed14a67d1d0abcec5cb6a71bbb15b
2021-11-13 18:39:03 +00:00
benschermel 7a32f0c6fd Merge pull request #377 from EQ-Alpha/systemd_rel
update release packaging

Former-commit-id: b9d3a1cb686782053e50de2f500fcab113bae109
2021-11-13 13:16:48 -05:00
benschermel 50565bf8b7 update release packaging
Former-commit-id: 4eeda3edae79617bf21ec41f79b526f16efaf299
2021-11-13 17:50:42 +00:00
VivekSainiEQ 1ff6e37d2f Merge remote-tracking branch 'opensource/unstable' into PRO_RELEASE_6
Former-commit-id: 60da86471f68b13e2456e113ecd4aa117d95b134
2021-11-12 21:12:53 +00:00
VivekSainiEQ 3915791d95 Merge remote-tracking branch 'opensource/unstable' into PRO_RELEASE_6
Former-commit-id: 60da86471f68b13e2456e113ecd4aa117d95b134
2021-11-12 21:12:53 +00:00
John Sully 4143ae18da Allow fast sync even if a background save is in progress
Former-commit-id: b98aadfb6875f366a63a9d27d47fb5ca60abaa03
2021-11-12 00:18:32 +00:00
John Sully e3d8c207e5 Allow fast sync even if a background save is in progress
Former-commit-id: b98aadfb6875f366a63a9d27d47fb5ca60abaa03
2021-11-12 00:18:32 +00:00
christianEQ 6aba46e1de removed unused vars
Former-commit-id: e2bb6242e8be53cdad6def6acdd7e90e0f7d9852
2021-11-11 13:43:20 +00:00
christianEQ 4399d299e6 removed unused vars
Former-commit-id: e2bb6242e8be53cdad6def6acdd7e90e0f7d9852
2021-11-11 13:43:20 +00:00
christianEQ 60788b02db removed unnecessary code to check for metadata
Former-commit-id: 69ffc89d7c27a4eef04aa5cb59ffd1c2b9b8eb20
2021-11-11 13:43:00 +00:00
christianEQ c6484102bd removed unnecessary code to check for metadata
Former-commit-id: 69ffc89d7c27a4eef04aa5cb59ffd1c2b9b8eb20
2021-11-11 13:43:00 +00:00
christianEQ d8c2c139e2 added tests for flash psync
Former-commit-id: 79f7376a4fea2de9bd06c06d96f3f98ee7308874
2021-11-11 13:43:00 +00:00
christianEQ b9ba2826b3 added tests for flash psync
Former-commit-id: 79f7376a4fea2de9bd06c06d96f3f98ee7308874
2021-11-11 13:43:00 +00:00
christianEQ b3e83ec445 save replid from storage on load
Former-commit-id: 8e5d0cb7035db30f35ead36aab52df07ab3c9bee
2021-11-11 13:43:00 +00:00
christianEQ e2f210acd1 save replid from storage on load
Former-commit-id: 8e5d0cb7035db30f35ead36aab52df07ab3c9bee
2021-11-11 13:43:00 +00:00
christianEQ 88f8f0f586 retrieve replid from IStorage rather than at load time
Former-commit-id: c25323439ce400ca91b2193aa2f464e7b09978fd
2021-11-11 13:43:00 +00:00
christianEQ ef74d1c497 retrieve replid from IStorage rather than at load time
Former-commit-id: c25323439ce400ca91b2193aa2f464e7b09978fd
2021-11-11 13:43:00 +00:00
christianEQ 9ce7ff976f save master status to storage when masters change
Former-commit-id: 4989926a0028aed7d7700fd1d1f4ed27c20277cc
2021-11-11 13:42:39 +00:00
christianEQ 1a0141013f save master status to storage when masters change
Former-commit-id: 4989926a0028aed7d7700fd1d1f4ed27c20277cc
2021-11-11 13:42:39 +00:00
christianEQ 918559c995 save and recognize metadata table identifier
Former-commit-id: f06ef757c24ecc50df0e7abf5201a5499ff28c53
2021-11-11 13:41:48 +00:00
christianEQ f13e8f4409 save and recognize metadata table identifier
Former-commit-id: f06ef757c24ecc50df0e7abf5201a5499ff28c53
2021-11-11 13:41:48 +00:00
christianEQ 738eafa2d0 add KEYDB_METADATA_ID to metadata tables when created
Former-commit-id: 7fe8a184db62eab171935c20498bdb4f30ee6b1d
2021-11-11 13:41:00 +00:00
christianEQ b2f2f27242 add KEYDB_METADATA_ID to metadata tables when created
Former-commit-id: 7fe8a184db62eab171935c20498bdb4f30ee6b1d
2021-11-11 13:41:00 +00:00
christianEQ 0c5052a2b8 added createMetadataDb to IStorageFactory + implementations
Former-commit-id: a2acf75484d2af93aad9d03a20bd402893044860
2021-11-11 13:41:00 +00:00
christianEQ 229c64349e added createMetadataDb to IStorageFactory + implementations
Former-commit-id: a2acf75484d2af93aad9d03a20bd402893044860
2021-11-11 13:41:00 +00:00
benschermel 577a1391e2 Merge pull request #345 from EQ-Alpha/pkg_update_tools
add keydb-diagnostic-tool to packaging

Former-commit-id: 3b9641e23345334d928989ca27c7bd8c61eef1d3
2021-11-10 22:16:09 -05:00
benschermel bf6f51d1f5 Merge pull request #376 from EQ-Alpha/systemd_build
Systemd build

Former-commit-id: a97bebac906a096c7cf9516c484217461fa6e8ec
2021-11-10 22:14:24 -05:00
benschermel 26ce8feca5 fix typo
Former-commit-id: 316f90674b40c03615111eac401ca2e48ec5de49
2021-11-11 02:36:20 +00:00
benschermel 43cb65e17f update license
Former-commit-id: b35cdc8be980c4edbe69461877958f904f827af4
2021-11-11 02:19:56 +00:00
benschermel 39778ad8b3 Merge branch 'unstable' into systemd_build
Former-commit-id: 78dae7a868c0c8ca66a7c0f03f6cece4a8403b81
2021-11-11 00:59:33 +00:00
malavan 23a42d7817 ignore rdb specific tests when running in --flash mode
Former-commit-id: b44ba3efb21c390c3d199ea1cdd238a57611fd85
2021-11-10 20:46:09 +00:00
malavan 59450d3b59 ignore rdb specific tests when running in --flash mode
Former-commit-id: b44ba3efb21c390c3d199ea1cdd238a57611fd85
2021-11-10 20:46:09 +00:00
John Sully dace3cba1e Fix multiple test failures
Former-commit-id: ba99418643e7b4a12e79bb08e4a7f152da28b861
2021-11-10 18:47:36 +00:00
John Sully d88c9829d3 Fix multiple test failures
Former-commit-id: ba99418643e7b4a12e79bb08e4a7f152da28b861
2021-11-10 18:47:36 +00:00
John Sully 225069ecb1 Fix compile error on some machines
Former-commit-id: 5f491a38cb7eae63fd316c465f317005bbced385
2021-11-10 17:39:00 +00:00
John Sully 41b00b2fa9 Fix compile error on some machines
Former-commit-id: 5f491a38cb7eae63fd316c465f317005bbced385
2021-11-10 17:39:00 +00:00
John Sully f5610c9a2d Prevent track changes from clearing out the cache and misreporting the key count
Former-commit-id: d7ceb59f11bc714e40f208cb8c774a5b762ad41e
2021-11-10 06:40:43 +00:00
John Sully 0dc015353f Prevent track changes from clearing out the cache and misreporting the key count
Former-commit-id: d7ceb59f11bc714e40f208cb8c774a5b762ad41e
2021-11-10 06:40:43 +00:00
John Sully 4890d4fa42 Fix snapshot count mismatch due to race
Former-commit-id: b4175c9bf82cbec047b94403e2a3700f4544b4f1
2021-11-10 05:29:13 +00:00
John Sully e3ec3707cf Fix snapshot count mismatch due to race
Former-commit-id: b4175c9bf82cbec047b94403e2a3700f4544b4f1
2021-11-10 05:29:13 +00:00
Vivek Saini a774d5a0b0 Security fixes (#373)
Fixing potential buffer overflows when using the bitop shift and cron commands, as well as comparing ACL user passwords in constant time.

Former-commit-id: b4722b3af024c5169362a4a0ea441af74c01e683
2021-11-09 19:00:01 -05:00
John Sully d1a7f5ba2c Initial implementation of snapshot fast replication. There are still a few TODOs in progress
Former-commit-id: 0febdcdab8693af443f350968ed3d8c80106675d
2021-11-09 19:36:07 +00:00
John Sully 8ea30a0e65 Initial implementation of snapshot fast replication. There are still a few TODOs in progress
Former-commit-id: 0febdcdab8693af443f350968ed3d8c80106675d
2021-11-09 19:36:07 +00:00
John Sully 6c9d1e47db Smooth out performance fluctuations caused by variance in the rehash calibration
Former-commit-id: 09580dedfef09deace7863bf68ba7e0f9edf3eb3
2021-11-06 15:49:58 +00:00
John Sully 9cf6ffad43 Smooth out performance fluctuations caused by variance in the rehash calibration
Former-commit-id: 09580dedfef09deace7863bf68ba7e0f9edf3eb3
2021-11-06 15:49:58 +00:00
VivekSainiEQ 43d055f68d Backported time thread code from enterprise
Former-commit-id: 3f27b35af74f5bf5e80837d6ce12abc977f1434b
2021-11-05 00:30:34 +00:00
John Sully 6189458033 Merge branch 'keydbpro' of https://gitlab.eqalpha.com/external-collab/keydb-pro-6 into keydbpro_collab
Former-commit-id: eca47e8d19defdc894b9dd09b2500d2e15e5fafa
2021-11-02 19:39:53 +00:00
John Sully 21a93ea629 Merge branch 'keydbpro' of https://gitlab.eqalpha.com/external-collab/keydb-pro-6 into keydbpro_collab
Former-commit-id: eca47e8d19defdc894b9dd09b2500d2e15e5fafa
2021-11-02 19:39:53 +00:00
John Sully 996234bd58 This change fixes out of file descriptor issues with FLASH.
The change does 3 things:
1. It limits RocksDB to 256 file descriptors instead of unlimited
2. It includes the fd limit in its estimation for total file descriptors needed
3. It raises the system fd limit if possible before we open rocksdb but accounting for the 256 limit we added


Former-commit-id: 1447288209c5e7daf8a1203511fc262500ebe5e1
2021-11-02 19:31:53 +00:00
John Sully 9f4830121f This change fixes out of file descriptor issues with FLASH.
The change does 3 things:
1. It limits RocksDB to 256 file descriptors instead of unlimited
2. It includes the fd limit in its estimation for total file descriptors needed
3. It raises the system fd limit if possible before we open rocksdb but accounting for the 256 limit we added


Former-commit-id: 1447288209c5e7daf8a1203511fc262500ebe5e1
2021-11-02 19:31:53 +00:00
malavan eca3cecafc Merge branch 'keydbpro' of https://gitlab.eqalpha.com/external-collab/keydb-pro-6 into keydbpro
Former-commit-id: 5b88af1067d344f121b2d65e34fb40e229722575
2021-11-02 19:14:47 +00:00
malavan 7472d644fe Merge branch 'keydbpro' of https://gitlab.eqalpha.com/external-collab/keydb-pro-6 into keydbpro
Former-commit-id: 5b88af1067d344f121b2d65e34fb40e229722575
2021-11-02 19:14:47 +00:00
malavan d629880543 don't delete db or snapshots on shutdown, still delete storage provider
Former-commit-id: edb840ce10ea77ce654ba27c9eadbf98bbc13403
2021-11-02 19:01:37 +00:00
malavan 7405b85e20 don't delete db or snapshots on shutdown, still delete storage provider
Former-commit-id: edb840ce10ea77ce654ba27c9eadbf98bbc13403
2021-11-02 19:01:37 +00:00
VivekSainiEQ b01e1e5679 Check that cluster connection is valid before setting write handler
Former-commit-id: d803e9e8bb9833023dbaf43d88aff5737ff7d08f
2021-11-02 17:43:17 +00:00
John Sully 9d9779c2a7 Make the replica weighting configurable
Former-commit-id: be6a8a7e68acb5cfbe950f13b903e6f7b98c5a39
2021-10-29 17:59:46 +00:00
John Sully 082d246974 Make the replica weighting configurable
Former-commit-id: be6a8a7e68acb5cfbe950f13b903e6f7b98c5a39
2021-10-29 17:59:46 +00:00
malavan 25fcffe2b1 null check for delete override
Former-commit-id: 3d9b2b76b8af8c7e462d7cf66e6b293b411c010a
2021-10-29 15:59:21 +00:00
Vivek Saini ecb57d695e Merge pull request #372 from VivekSainiEQ/Redis_626_Merge
Redis 6.2.6 merge

Former-commit-id: beaed5a4fd68cca086b1a239e863703ddb158653
2021-10-28 17:21:14 -04:00
VivekSainiEQ b7aa2c0ccb Cast pointer correctly and fixed MVCC not updating correctly
Former-commit-id: 582eb6cfa1cdda674eafa2be92f2fade5f107e31
2021-10-27 17:08:37 +00:00
John Sully 205c90bca4 Fix slower performance during replication by better balancing client load on threads servicing a replica
Former-commit-id: 496f91d3f169fcfe6d94c2ea69cee402f8eb60ca
2021-10-22 03:16:33 +00:00
John Sully 44640c5d19 Fix slower performance during replication by better balancing client load on threads servicing a replica
Former-commit-id: 496f91d3f169fcfe6d94c2ea69cee402f8eb60ca
2021-10-22 03:16:33 +00:00
John Sully 289ebabd2d Merge branch 'COLLAB_RELEASE_6_4' into keydbpro_collab
Former-commit-id: 3d43e7a022250273ee5cfb5755ed1d6ca42b9889
2021-10-21 23:58:32 +00:00
John Sully 66f76cdb6e Merge branch 'COLLAB_RELEASE_6_4' into keydbpro_collab
Former-commit-id: 3d43e7a022250273ee5cfb5755ed1d6ca42b9889
2021-10-21 23:58:32 +00:00
malavan 31f0fb463b null check for delete override
Former-commit-id: f5f2f5e200a5ff1b0306998624b758d5a4c10825
2021-10-21 23:56:45 +00:00
malavan 92ac53382c null check for delete override
Former-commit-id: f5f2f5e200a5ff1b0306998624b758d5a4c10825
2021-10-21 23:56:45 +00:00
malavan af153c03e6 null check for delete override
Former-commit-id: a48b4cbdf24bfa5a1d13295c0202d1ed09115374
2021-10-21 23:50:50 +00:00
malavan 84eae35329 null check for delete override
Former-commit-id: a48b4cbdf24bfa5a1d13295c0202d1ed09115374
2021-10-21 23:50:50 +00:00
John Sully 50d0ee66e7 Do not dereference a nullptr if there are too many files open
Former-commit-id: 4674eb29a261e8b046953398c94354fc3e550c2a
2021-10-21 23:45:46 +00:00
John Sully 75da3b0ac2 Do not dereference a nullptr if there are too many files open
Former-commit-id: 4674eb29a261e8b046953398c94354fc3e550c2a
2021-10-21 23:45:46 +00:00
John Sully d83da7f11b Ensure async rehash completes before we start a new time. Degrad to sync hash if necessary to ensure this
Former-commit-id: 0f830facc7c6bc6668af9bb2e10b6e13a13227aa
2021-10-21 22:46:17 +00:00
John Sully b44cd8fa66 Ensure async rehash completes before we start a new time. Degrad to sync hash if necessary to ensure this
Former-commit-id: 0f830facc7c6bc6668af9bb2e10b6e13a13227aa
2021-10-21 22:46:17 +00:00
VivekSainiEQ 817d2c55e4 Resolved merge conflicts in prior commit
Former-commit-id: 1594ef5e3e9f6413d8a68d91cad8eec0dc163b4e
2021-10-21 22:35:15 +00:00
VivekSainiEQ 443f8d8f9b Merge tag '6.2.6' into Redis_626_Merge
Former-commit-id: a4220f27d308863d77feab1713a920add23062ff
2021-10-21 22:33:55 +00:00
John Sully fb14479054 Additional change to ensure FLASH storage goes through the multithread path
Former-commit-id: 422ea0723f0b8718f28ef9c1cc4d5f56d374af46
2021-10-20 03:13:36 +00:00
John Sully c6dce69ae7 Additional change to ensure FLASH storage goes through the multithread path
Former-commit-id: 422ea0723f0b8718f28ef9c1cc4d5f56d374af46
2021-10-20 03:13:36 +00:00
John Sully a8338ade37 Permit prefetch for FLASH scenarios in single thread mode
Former-commit-id: 6d0b90ed43cc9d1196903ddbc7d50cd40e439e42
2021-10-15 16:22:42 +00:00
John Sully dcc725197a Permit prefetch for FLASH scenarios in single thread mode
Former-commit-id: 6d0b90ed43cc9d1196903ddbc7d50cd40e439e42
2021-10-15 16:22:42 +00:00
noobpwnftw 61268c2bfd Fix incorrect counting of client connections
This affects later distribution of clients among threads if there had been many connection attempts during loading phase.


Former-commit-id: 8ed711569dba18752a7c6a0c79d583faa19193fc
2021-10-12 21:47:15 -04:00
Alexis 4a02808fe8 Fix alignment of #ifndef USE_ALIGNED_ACCESS
Former-commit-id: df0003b60d542fc9a9becfc897fe23a590df1a6f
2021-10-12 14:27:53 -04:00
jsully 34f36bfe38 Merge branch 'multithread_load' into 'keydbpro'
Multithread load

See merge request external-collab/keydb-pro-6!5

Former-commit-id: 20e712244071028b0f75ccad477308efd139261f
2021-10-08 17:55:55 +00:00
jsully 685d11e368 Merge branch 'multithread_load' into 'keydbpro'
Multithread load

See merge request external-collab/keydb-pro-6!5

Former-commit-id: 20e712244071028b0f75ccad477308efd139261f
2021-10-08 17:55:55 +00:00
John Sully 3124a1ea1e disable key cache during load if necessary
Former-commit-id: 68dcf66909e2138da4902bdec98985f4fcd737cf
2021-10-04 07:35:36 +00:00
John Sully a31a268d26 disable key cache during load if necessary
Former-commit-id: 68dcf66909e2138da4902bdec98985f4fcd737cf
2021-10-04 07:35:36 +00:00
John Sully e27091d82e Handle the case where the key cache exceeds maxmemory
Former-commit-id: 01febf902267fec7fe87e6437b0b81fd08b50963
2021-10-04 07:34:05 +00:00
John Sully 0c314de03c Handle the case where the key cache exceeds maxmemory
Former-commit-id: 01febf902267fec7fe87e6437b0b81fd08b50963
2021-10-04 07:34:05 +00:00
John Sully 4ff8bfd313 Don't expand the dictionary if a storage provider is set as we won't use the whole thing
Former-commit-id: 1f07b01144397cec59ec2d94f41c85eceb7248e2
2021-10-04 07:33:38 +00:00
John Sully bcfe5b365a Don't expand the dictionary if a storage provider is set as we won't use the whole thing
Former-commit-id: 1f07b01144397cec59ec2d94f41c85eceb7248e2
2021-10-04 07:33:38 +00:00
John Sully ce814741f1 Use the concurrentqueue for multithread load instead of mutex and cvs
Former-commit-id: d5a59113dbfedaf7b62a650cff58a2e8ec01826f
2021-10-04 07:33:03 +00:00
John Sully e69932bea5 Use the concurrentqueue for multithread load instead of mutex and cvs
Former-commit-id: d5a59113dbfedaf7b62a650cff58a2e8ec01826f
2021-10-04 07:33:03 +00:00
John Sully 55c2f5ca76 Add in the concurrentqueue
Former-commit-id: 319cad462be502b0b7a8c45b634d578b2c1c4e9d
2021-10-02 18:27:21 +00:00
John Sully f65fb39f31 Add in the concurrentqueue
Former-commit-id: 319cad462be502b0b7a8c45b634d578b2c1c4e9d
2021-10-02 18:27:21 +00:00
jsully 78dffa7e77 Merge branch 'improve_overwrite_performance' into 'keydbpro'
Improve overwrite performance

See merge request external-collab/keydb-pro-6!4

Former-commit-id: 7e59e889f28e30fca409dfb951c31f8cb47effbd
2021-09-28 18:13:12 +00:00
jsully ceb86c4601 Merge branch 'improve_overwrite_performance' into 'keydbpro'
Improve overwrite performance

See merge request external-collab/keydb-pro-6!4

Former-commit-id: 7e59e889f28e30fca409dfb951c31f8cb47effbd
2021-09-28 18:13:12 +00:00
John Sully 3bde7eb463 Revert "Don't zero out potentially long buffers" - It has no benefit above the noise floor and potentially is the cause of a multithread slowdown
This reverts commit d68c35c275 [formerly 91e76ab4a00546278100baf6dfe61c13e802b40e].


Former-commit-id: f651cf67d731a10c3a52e30261c8d8b9d291576c
2021-09-28 18:08:15 +00:00
John Sully f898bbb3d6 Revert "Don't zero out potentially long buffers" - It has no benefit above the noise floor and potentially is the cause of a multithread slowdown
This reverts commit d68c35c275 [formerly 91e76ab4a00546278100baf6dfe61c13e802b40e].


Former-commit-id: f651cf67d731a10c3a52e30261c8d8b9d291576c
2021-09-28 18:08:15 +00:00
malavan 81fffaaaac add hmset and hmget to keydb-benchmark
Former-commit-id: e05466c362ba01e61cf007ad8bfc26e1af21ec4f
2021-09-23 20:53:27 +00:00
malavan dd8074e436 add hmset and hmget to keydb-benchmark
Former-commit-id: e05466c362ba01e61cf007ad8bfc26e1af21ec4f
2021-09-23 20:53:27 +00:00
malavan d0ca3bfd58 add async tag to hgwtall hkeys hvals hscan
Former-commit-id: 8534de27603bd4cbd10a087840bcb1a90651afa1
2021-09-23 20:18:38 +00:00
malavan a6d0611e6b add async tag to hgwtall hkeys hvals hscan
Former-commit-id: 8534de27603bd4cbd10a087840bcb1a90651afa1
2021-09-23 20:18:38 +00:00
malavan 4ea2524647 add async lookup to hmget
Former-commit-id: a967b47b60e3f4efbc945dc44a0903f47e07993f
2021-09-23 19:57:18 +00:00
malavan 3745a37a30 add async lookup to hmget
Former-commit-id: a967b47b60e3f4efbc945dc44a0903f47e07993f
2021-09-23 19:57:18 +00:00
malavan d37a6af91b Merge branch 'async_commands' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into async_commands
Former-commit-id: a19112ec839da4684aeb1a9d1b41906f4c698944
2021-09-23 17:48:33 +00:00
malavan 1210b92720 Merge branch 'async_commands' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into async_commands
Former-commit-id: a19112ec839da4684aeb1a9d1b41906f4c698944
2021-09-23 17:48:33 +00:00
John Sully 21a3f7ff89 Rework the tuning to be better for mixed read/write workloads
Former-commit-id: a4fdd3e3cb41160b20e92e1b1f4f4ebd2ee86a4a
2021-09-23 17:46:56 +00:00
John Sully e7fafc1bdd Rework the tuning to be better for mixed read/write workloads
Former-commit-id: a4fdd3e3cb41160b20e92e1b1f4f4ebd2ee86a4a
2021-09-23 17:46:56 +00:00
John Sully 7588b680ea Move the snapshot stale threshold to a named constant
Former-commit-id: 46d2aaf17abb0fb021aa6d7b393ffc143493d339
2021-09-23 17:45:49 +00:00
John Sully c05d7920a5 Move the snapshot stale threshold to a named constant
Former-commit-id: 46d2aaf17abb0fb021aa6d7b393ffc143493d339
2021-09-23 17:45:49 +00:00
John Sully 7e7049a517 prefetch crashes intermittently when a snapshot exists
Former-commit-id: 4a2657023d5d8218c815ce77c2676fd53a634b3f
2021-09-23 17:44:06 +00:00
John Sully 9ea336c4d3 prefetch crashes intermittently when a snapshot exists
Former-commit-id: 4a2657023d5d8218c815ce77c2676fd53a634b3f
2021-09-23 17:44:06 +00:00
malavan 713fa45330 prev_error_count needs to be thread local
Former-commit-id: 4abede1c40db1dfb4235b9aa1e3177678c5304b1
2021-09-23 17:41:28 +00:00
malavan 54761129e2 prev_error_count needs to be thread local
Former-commit-id: 4abede1c40db1dfb4235b9aa1e3177678c5304b1
2021-09-23 17:41:28 +00:00
John Sully 7fea970ccd Async commands incorrectly think they are dirty
Former-commit-id: 4874247931425767156ab3da934c00a4d4832bcf
2021-09-23 05:24:28 +00:00
John Sully 1b84c01751 Async commands incorrectly think they are dirty
Former-commit-id: 4874247931425767156ab3da934c00a4d4832bcf
2021-09-23 05:24:28 +00:00
John Sully 5d2724a46c Create snapshots less often, and use them if they exist
Former-commit-id: ba8a00074171d346813247de0b218e08c8f07b92
2021-09-23 00:19:52 +00:00
John Sully 49e88de93b Create snapshots less often, and use them if they exist
Former-commit-id: ba8a00074171d346813247de0b218e08c8f07b92
2021-09-23 00:19:52 +00:00
John Sully cbe71597e8 Clients should initialize with an mvcc checkpoint
Former-commit-id: 5183cb721774be1b769d130359e4bddb1eb8224b
2021-09-23 00:15:47 +00:00
John Sully 6edb7d0c82 Clients should initialize with an mvcc checkpoint
Former-commit-id: 5183cb721774be1b769d130359e4bddb1eb8224b
2021-09-23 00:15:47 +00:00
malavan a96e659e46 update expire tests for async commands
Former-commit-id: 088ecd30a7b360e63d701f811f2fc0b9d77f5eb0
2021-09-22 21:49:30 +00:00
malavan fd59d31a07 update expire tests for async commands
Former-commit-id: 088ecd30a7b360e63d701f811f2fc0b9d77f5eb0
2021-09-22 21:49:30 +00:00
malavan 139a9ba071 make keyIsExpired check earlier on async read
Former-commit-id: 32dbfbb3a69681553b65afa2d05ea47058833550
2021-09-22 21:16:36 +00:00
malavan 540c2ddcb4 make keyIsExpired check earlier on async read
Former-commit-id: 32dbfbb3a69681553b65afa2d05ea47058833550
2021-09-22 21:16:36 +00:00
malavan fa21ad8141 remove unneeded mgetCore function
Former-commit-id: 7961d4253b5a356e24d17ab07ac79ba1bf191efd
2021-09-22 21:15:47 +00:00
malavan acf1b34120 remove unneeded mgetCore function
Former-commit-id: 7961d4253b5a356e24d17ab07ac79ba1bf191efd
2021-09-22 21:15:47 +00:00
malavan 8e868739a2 check if key is expired for async lookup
Former-commit-id: d4e3a2688e903fe426e791f8608495fca1c76df6
2021-09-22 19:30:38 +00:00
malavan 5cec478fc1 check if key is expired for async lookup
Former-commit-id: d4e3a2688e903fe426e791f8608495fca1c76df6
2021-09-22 19:30:38 +00:00
malavan 066710c7d9 Merge branch 'async_commands' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into async_commands
Former-commit-id: 393add1f3d70f7d1e09ecbce60c65508bc06394d
2021-09-22 19:28:37 +00:00
malavan e3c4f7a727 Merge branch 'async_commands' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into async_commands
Former-commit-id: 393add1f3d70f7d1e09ecbce60c65508bc06394d
2021-09-22 19:28:37 +00:00
John Sully 181dc2c99e We can't evict in an async command
Former-commit-id: 39c2903cbca08c2dbfc3275f83d65e6360c61651
2021-09-22 19:26:30 +00:00
John Sully 66c4ff5d09 We can't evict in an async command
Former-commit-id: 39c2903cbca08c2dbfc3275f83d65e6360c61651
2021-09-22 19:26:30 +00:00
John Sully 2e853d6471 We returned too early and didn't set the mvcc
Former-commit-id: d8e2ffe538a6b237529c37cb142a7076dd4836f8
2021-09-22 19:25:57 +00:00
John Sully faf2801ac8 We returned too early and didn't set the mvcc
Former-commit-id: d8e2ffe538a6b237529c37cb142a7076dd4836f8
2021-09-22 19:25:57 +00:00
John Sully 1c7972a7b1 We can't do a command async if there are monitors because we need the lock
Former-commit-id: c5b6ade51251a3f57b69d1f3d9c22b199ec00a69
2021-09-22 19:24:39 +00:00
John Sully 34d9280a02 We can't do a command async if there are monitors because we need the lock
Former-commit-id: c5b6ade51251a3f57b69d1f3d9c22b199ec00a69
2021-09-22 19:24:39 +00:00
malavan 0e0c1109c1 Merge branch 'async_commands' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into async_commands
Former-commit-id: d6cc79a80d0bd22c99e3ea21740c89870cfb235b
2021-09-21 22:00:33 +00:00
malavan d2c165bbef Merge branch 'async_commands' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into async_commands
Former-commit-id: d6cc79a80d0bd22c99e3ea21740c89870cfb235b
2021-09-21 22:00:33 +00:00
John Sully d09ce2e2be Make tests deterministic and fix an issue found
Former-commit-id: fd00f39f3ca11053a5c99ab52daa1f9a051b7058
2021-09-21 21:59:19 +00:00
John Sully e8b909042f Make tests deterministic and fix an issue found
Former-commit-id: fd00f39f3ca11053a5c99ab52daa1f9a051b7058
2021-09-21 21:59:19 +00:00
John Sully 41741c85fe Improve low load latency
Former-commit-id: f5ac2432cf58c697a6da101d63423679cbd08021
2021-09-21 21:15:21 +00:00
John Sully 29235288e0 Improve low load latency
Former-commit-id: f5ac2432cf58c697a6da101d63423679cbd08021
2021-09-21 21:15:21 +00:00
malavan a4e54d20d7 add mget to keydb-benchmark
Former-commit-id: 6bd15f65c46f570f66d58bd759e1c595006d783a
2021-09-21 20:57:08 +00:00
malavan 89c43a5538 add mget to keydb-benchmark
Former-commit-id: 6bd15f65c46f570f66d58bd759e1c595006d783a
2021-09-21 20:57:08 +00:00
John Sully 5f5f985fb3 Make async commands runtime configurable
Former-commit-id: 23bafb5f7c3c9805581f4bf09d9d5136898c2883
2021-09-21 20:49:44 +00:00
John Sully 91b401786a Make async commands runtime configurable
Former-commit-id: 23bafb5f7c3c9805581f4bf09d9d5136898c2883
2021-09-21 20:49:44 +00:00
John Sully 8418a8edf1 Initial implementation of async commands
Former-commit-id: 0d3a4ce7e60c42b2d81962f13100bd1789bf64a8
2021-09-21 20:43:16 +00:00
John Sully 52868b1aa9 Initial implementation of async commands
Former-commit-id: 0d3a4ce7e60c42b2d81962f13100bd1789bf64a8
2021-09-21 20:43:16 +00:00
John Sully e024ab30e1 Unify job types so everything is processed in order
Former-commit-id: 625aa97e4cf16337e8b052b7a27491a0ab09110f
2021-09-17 17:27:19 +00:00
John Sully af70c35a8d Unify job types so everything is processed in order
Former-commit-id: 625aa97e4cf16337e8b052b7a27491a0ab09110f
2021-09-17 17:27:19 +00:00
Malavan Sotheeswaran a5ea2fa628 Merge fix to dict resize during rdb load
Former-commit-id: c398d5f8a027c67acac64bdbfbd01486dde555eb
2021-09-17 16:10:48 +00:00
Malavan Sotheeswaran 6ccffe6768 Merge fix to dict resize during rdb load
Former-commit-id: c398d5f8a027c67acac64bdbfbd01486dde555eb
2021-09-17 16:10:48 +00:00
Maxime de Roucy 2e75402668 syslog: enforce syslog identity and facility as soon as possible
Former-commit-id: 3943274f012cfe45d0cff8c77709549768abd735
2021-09-16 17:29:55 -04:00
Maxime de Roucy c85b507f9e use LL_… log level instead of syslog LOG_… log level
Else there is an out of bound access in syslogLevelMap.

For example if we use `serverLog(LOG_INFO,…`, later in the code
it tries to access `syslogLevelMap[LOG_INFO]`.
LOG_INFO == 6 but syslogLevelMap only have 4 elements.


Former-commit-id: 1033a942491c6b7d2587d3c1a228802cb48ef3eb
2021-09-16 17:29:07 -04:00
malavan 68997c6185 if statement was actually correct
Former-commit-id: d44b99afdf1ec92f8a36f0c091c37328008d867b
2021-09-14 17:17:08 +00:00
malavan dc39cb621c if statement was actually correct
Former-commit-id: d44b99afdf1ec92f8a36f0c091c37328008d867b
2021-09-14 17:17:08 +00:00
malavan d018678d4c the if statement was actually correct
Former-commit-id: 8e4d1ceb859b3440bdec525ff7b8ed4aef86f4b8
2021-09-14 17:15:44 +00:00
malavan ba2934e910 the if statement was actually correct
Former-commit-id: 8e4d1ceb859b3440bdec525ff7b8ed4aef86f4b8
2021-09-14 17:15:44 +00:00
malavan 1f0504cb2d improve overwrite key performance
Former-commit-id: 56f9d5528385ea78074a308c6d3987b920d6cc35
2021-09-14 17:06:04 +00:00
malavan 53d5fcfd32 improve overwrite key performance
Former-commit-id: 56f9d5528385ea78074a308c6d3987b920d6cc35
2021-09-14 17:06:04 +00:00
malavan 808af8f2b0 missing brackets in databasesCron rehash check
Former-commit-id: f2f0d5287edda676a514cbc02172bb874569016b
2021-09-14 02:03:18 +00:00
malavan d8710c2bf4 missing brackets in databasesCron rehash check
Former-commit-id: f2f0d5287edda676a514cbc02172bb874569016b
2021-09-14 02:03:18 +00:00
John Sully d68c35c275 Don't zero out potentially long buffers
Former-commit-id: 91e76ab4a00546278100baf6dfe61c13e802b40e
2021-09-10 00:40:08 +00:00
John Sully e68e4ab43c Don't zero out potentially long buffers
Former-commit-id: 91e76ab4a00546278100baf6dfe61c13e802b40e
2021-09-10 00:40:08 +00:00
John Sully 53779eedd8 In single thread mode don't batch
Former-commit-id: 7daadae789cdca6f0eb0c3f553737d4f8efc0566
2021-09-10 00:39:47 +00:00
John Sully bd487470a7 In single thread mode don't batch
Former-commit-id: 7daadae789cdca6f0eb0c3f553737d4f8efc0566
2021-09-10 00:39:47 +00:00
John Sully 00b9db481d Don't zero out potentially long buffers
Former-commit-id: 99eb47e129a3cd555914d4816febb02f0058253a
2021-09-10 00:38:49 +00:00
John Sully fef5c11e59 Don't zero out potentially long buffers
Former-commit-id: 99eb47e129a3cd555914d4816febb02f0058253a
2021-09-10 00:38:49 +00:00
John Sully de2b87f711 In single thread mode don't batch
Former-commit-id: b1cb230690a584b8bfe7f433fc0ca0320877ebd3
2021-09-10 00:38:08 +00:00
John Sully 5b1533cf0c In single thread mode don't batch
Former-commit-id: b1cb230690a584b8bfe7f433fc0ca0320877ebd3
2021-09-10 00:38:08 +00:00
John Sully 674b80027b Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: 026e939db2897701d936487ca30dd1c30feb299b
2021-09-09 19:35:08 +00:00
John Sully 44265b3ed3 Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: 026e939db2897701d936487ca30dd1c30feb299b
2021-09-09 19:35:08 +00:00
malavan f8b56f73e9 Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: f0025394aed6f72a8c678be0da7c42d5e4fad1d9
2021-09-08 21:16:41 +00:00
malavan cbc293e7d8 Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: f0025394aed6f72a8c678be0da7c42d5e4fad1d9
2021-09-08 21:16:41 +00:00
malavan 72313d3ef2 add command arg to clientArgs helper
Former-commit-id: b6f388ee3bd269bd8373ea16adb379ec6922ee0a
2021-09-08 21:16:04 +00:00
malavan 25e0c3d199 add command arg to clientArgs helper
Former-commit-id: b6f388ee3bd269bd8373ea16adb379ec6922ee0a
2021-09-08 21:16:04 +00:00
jsully 1cb9a290f1 Merge branch 'async_mget' into 'keydbpro'
add async mget

See merge request keydb-dev/KeyDB-Pro!38

Former-commit-id: e315b39f4779d530f5ab93e1f15915211e6706e2
2021-09-08 19:08:23 +00:00
jsully 8b7117a456 Merge branch 'async_mget' into 'keydbpro'
add async mget

See merge request keydb-dev/KeyDB-Pro!38

Former-commit-id: e315b39f4779d530f5ab93e1f15915211e6706e2
2021-09-08 19:08:23 +00:00
benschermel ff3a0dc914 update deb packaging to build with systemd flag
Former-commit-id: e3c0c99427077cb7a75abc772727efdbc7aba6f4
2021-09-08 02:28:17 +00:00
John Sully 3b40a64ada Merge branch 'keydbpro' of https://gitlab.eqalpha.com/external-collab/keydb-pro-6 into keydbpro_collab
Former-commit-id: 067acbbfd5eb0c2b4515a5d2cc87970870a88acb
2021-09-03 17:20:54 +00:00
John Sully c87e22966d Merge branch 'keydbpro' of https://gitlab.eqalpha.com/external-collab/keydb-pro-6 into keydbpro_collab
Former-commit-id: 067acbbfd5eb0c2b4515a5d2cc87970870a88acb
2021-09-03 17:20:54 +00:00
malavan bb1def0637 don't use flags that aren't supported by certain versions of OPENSSL
Former-commit-id: ca7342948fb12804905219ae106b4722368e9a2f
2021-09-02 19:06:35 +00:00
malavan 4a7e7a37a8 don't use flags that aren't supported by certain versions of OPENSSL
Former-commit-id: ca7342948fb12804905219ae106b4722368e9a2f
2021-09-02 19:06:35 +00:00
malavan b496ee8869 Remove duplicate code
Former-commit-id: a4c3182afb71a0d7d6d25111c0e0cfe5dcfc6130
2021-09-02 19:06:12 +00:00
malavan a64a97a9db Remove duplicate code
Former-commit-id: a4c3182afb71a0d7d6d25111c0e0cfe5dcfc6130
2021-09-02 19:06:12 +00:00
malavan 9f1a5fddca updates from comments
Former-commit-id: 852885f09e7df1d9570408546baffa8545707335
2021-09-01 21:00:27 +00:00
malavan 4d01b20c71 updates from comments
Former-commit-id: 852885f09e7df1d9570408546baffa8545707335
2021-09-01 21:00:27 +00:00
malavan 723bf0fa61 refactor asyncCommand
Former-commit-id: 6af5775e01872f130bc18791fdb4c0b22507b37f
2021-09-01 20:18:41 +00:00
malavan c8cbbb9e66 refactor asyncCommand
Former-commit-id: 6af5775e01872f130bc18791fdb4c0b22507b37f
2021-09-01 20:18:41 +00:00
jsully 85f07748e0 Merge branch 'add_storage_provider_data_to_INFO' into 'keydbpro'
add stats for storage provider reads

See merge request keydb-dev/KeyDB-Pro!39

Former-commit-id: 07bb08a8bc89350f4addb9dfd77435217c6b46d5
2021-09-01 19:21:05 +00:00
jsully cac4cc781b Merge branch 'add_storage_provider_data_to_INFO' into 'keydbpro'
add stats for storage provider reads

See merge request keydb-dev/KeyDB-Pro!39

Former-commit-id: 07bb08a8bc89350f4addb9dfd77435217c6b46d5
2021-09-01 19:21:05 +00:00
John Sully 629289b968 We need to send keepalives to masters while waiting to prevent disconnects
Former-commit-id: 7cbd6758b1042198c14ca9e8da0f1f7bc05df93d
2021-09-01 04:15:59 +00:00
John Sully c7ca6a6b2f We need to send keepalives to masters while waiting to prevent disconnects
Former-commit-id: 7cbd6758b1042198c14ca9e8da0f1f7bc05df93d
2021-09-01 04:15:59 +00:00
John Sully 7d2db15a8c Don't be in tracking mode during load as processChangesAsync works outside the normal system
Former-commit-id: 8d31ce6eafea1cea2f9f4ea25e44306efef28fa3
2021-09-01 04:15:28 +00:00
John Sully 65a39cafa2 Don't be in tracking mode during load as processChangesAsync works outside the normal system
Former-commit-id: 8d31ce6eafea1cea2f9f4ea25e44306efef28fa3
2021-09-01 04:15:28 +00:00
malavan 9fe5c2d9c3 remove unused variable names
Former-commit-id: 18d688c2f04a8ce67409bd4442c7635d426fc0ac
2021-08-31 20:03:55 +00:00
malavan 81a8601bac remove unused variable names
Former-commit-id: 18d688c2f04a8ce67409bd4442c7635d426fc0ac
2021-08-31 20:03:55 +00:00
malavan f0abffc8dc add method to get client args as list
Former-commit-id: 576b8cd2153c48c0ca4dfc9ed7d12f77d6f76f7e
2021-08-30 21:09:22 +00:00
malavan d37fbca781 add method to get client args as list
Former-commit-id: 576b8cd2153c48c0ca4dfc9ed7d12f77d6f76f7e
2021-08-30 21:09:22 +00:00
malavan 200b59255e add stats for storage provider reads
Former-commit-id: 612393ffba43cda31443605de924dc8dcf77ef52
2021-08-26 19:45:33 +00:00
malavan 8b39179226 add stats for storage provider reads
Former-commit-id: 612393ffba43cda31443605de924dc8dcf77ef52
2021-08-26 19:45:33 +00:00
malavan 65153ee9bb add correct thread assert to client::asyncCommand
Former-commit-id: a892fb4d551fb58d619bc80c333a6b3a9ed34215
2021-08-26 14:23:13 +00:00
malavan 849321ecbf add correct thread assert to client::asyncCommand
Former-commit-id: a892fb4d551fb58d619bc80c333a6b3a9ed34215
2021-08-26 14:23:13 +00:00
malavan 5124516913 add correct thread assert to client::asyncCommand
Former-commit-id: 8970f832348a80db6c183d25c4a5342a258a6ba9
2021-08-26 13:58:12 +00:00
malavan 522059e189 add correct thread assert to client::asyncCommand
Former-commit-id: 8970f832348a80db6c183d25c4a5342a258a6ba9
2021-08-26 13:58:12 +00:00
malavan 7632e6b2b1 refactor scan to use client::asyncCommand
Former-commit-id: 4de596631f48626b770d0217c7ff21001ea46bcf
2021-08-26 13:55:32 +00:00
malavan ceec387496 refactor scan to use client::asyncCommand
Former-commit-id: 4de596631f48626b770d0217c7ff21001ea46bcf
2021-08-26 13:55:32 +00:00
malavan 1aee0036b5 refactor of asyncCommand to include snapshot creation
Former-commit-id: c0908362162b5f2834b90cd9ce84fd1ee6768834
2021-08-26 13:10:59 +00:00
malavan a670a3c99a refactor of asyncCommand to include snapshot creation
Former-commit-id: c0908362162b5f2834b90cd9ce84fd1ee6768834
2021-08-26 13:10:59 +00:00
malavan a5f2d943db change indentation and increase async mget threshold
Former-commit-id: ffaa176d5eafabfae372224c790e99dd9e520fef
2021-08-25 22:15:28 +00:00
malavan 6005b2e726 change indentation and increase async mget threshold
Former-commit-id: ffaa176d5eafabfae372224c790e99dd9e520fef
2021-08-25 22:15:28 +00:00
malavan 65ae26cc51 refactor async to offload common code to client
Former-commit-id: 9a7547bfaa0ceff76e604262913fb11a64c627d8
2021-08-25 20:06:06 +00:00
malavan 0f3af2427a refactor async to offload common code to client
Former-commit-id: 9a7547bfaa0ceff76e604262913fb11a64c627d8
2021-08-25 20:06:06 +00:00
malavan a57fb88656 Merge branch 'keydbpro' into async_mget
Former-commit-id: ae34d0b6324ebd9d2d52342c06b3fd49f110210c
2021-08-25 19:37:33 +00:00
malavan a769f99b1e Merge branch 'keydbpro' into async_mget
Former-commit-id: ae34d0b6324ebd9d2d52342c06b3fd49f110210c
2021-08-25 19:37:33 +00:00
jsully 1a9448fd9d Merge branch 'upgrade_rocksdb' into 'keydbpro'
upgrade to latest version of rocksdb

See merge request keydb-dev/KeyDB-Pro!34

Former-commit-id: 74c39b237ee0f9ff98a6cc8e3e4fbf70a3ee00ac
2021-08-25 19:08:19 +00:00
jsully d12ad5ee03 Merge branch 'upgrade_rocksdb' into 'keydbpro'
upgrade to latest version of rocksdb

See merge request keydb-dev/KeyDB-Pro!34

Former-commit-id: 74c39b237ee0f9ff98a6cc8e3e4fbf70a3ee00ac
2021-08-25 19:08:19 +00:00
malavan fd22e8bcd4 update gitlab ci to work with facebook repo instead of ours
Former-commit-id: 2745277e7591076373e2dfd4eef8c1412cffffbc
2021-08-24 22:07:21 +00:00
malavan cfea171619 update gitlab ci to work with facebook repo instead of ours
Former-commit-id: 2745277e7591076373e2dfd4eef8c1412cffffbc
2021-08-24 22:07:21 +00:00
malavan cdc806b9e3 use latest stable version
Former-commit-id: 792f72cb513fc6db58d824649478ee36d47631eb
2021-08-24 22:00:52 +00:00
malavan a318a0a665 use latest stable version
Former-commit-id: 792f72cb513fc6db58d824649478ee36d47631eb
2021-08-24 22:00:52 +00:00
malavan 957ea27b0c Merge branch 'keydbpro' into upgrade_rocksdb
Former-commit-id: 1bf9d7e749e7007f1309f3e57e366122fdbacbac
2021-08-24 21:54:01 +00:00
malavan 0445fca9aa Merge branch 'keydbpro' into upgrade_rocksdb
Former-commit-id: 1bf9d7e749e7007f1309f3e57e366122fdbacbac
2021-08-24 21:54:01 +00:00
malavan 1ffbe014ae add async mget
Former-commit-id: c7bd2327f8e4330e2bcd857fc87ce7e86e075d20
2021-08-24 21:44:17 +00:00
malavan 141c5fdf93 add async mget
Former-commit-id: c7bd2327f8e4330e2bcd857fc87ce7e86e075d20
2021-08-24 21:44:17 +00:00
malavan 801b75d105 add a few more flash tests
Former-commit-id: b19fdc23a9a39ae718580feae5049f6906caec28
2021-08-23 21:30:16 +00:00
malavan 6067fdf9b3 add a few more flash tests
Former-commit-id: b19fdc23a9a39ae718580feae5049f6906caec28
2021-08-23 21:30:16 +00:00
benschermel 2fef45cd96 fix service install
Former-commit-id: c43cec74178d8bf35143f3f4148dbe3c37a75f90
2021-08-23 18:41:43 +00:00
benschermel 720a87c7b7 fix service install
Former-commit-id: c43cec74178d8bf35143f3f4148dbe3c37a75f90
2021-08-23 18:41:43 +00:00
malavan 64202ff83f newest version of rocksdb
Former-commit-id: e384baa62e50a5caa0cdc779f2b8554ce8d8b375
2021-08-23 17:04:01 +00:00
malavan 56f9927b84 newest version of rocksdb
Former-commit-id: e384baa62e50a5caa0cdc779f2b8554ce8d8b375
2021-08-23 17:04:01 +00:00
benschermel df6f42cfe4 fix service install
Former-commit-id: 41bf39f6e92beb8ab55ec0e7652154bc43d48774
2021-08-23 03:39:16 +00:00
benschermel 09af258023 fix service install
Former-commit-id: 41bf39f6e92beb8ab55ec0e7652154bc43d48774
2021-08-23 03:39:16 +00:00
benschermel b0a9b98919 update pkg conf file
Former-commit-id: f87945cbbd2a475394f584b09b15c2c19db5e9bd
2021-08-22 22:29:42 +00:00
benschermel f37928f174 update pkg conf file
Former-commit-id: f87945cbbd2a475394f584b09b15c2c19db5e9bd
2021-08-22 22:29:42 +00:00
benschermel 1eb871c9b4 update pkg conf file
Former-commit-id: 2a2ae61f07ecea8a178f4bc478bb7786d5be27d9
2021-08-22 22:28:18 +00:00
benschermel c1df13b946 update pkg conf file
Former-commit-id: 2a2ae61f07ecea8a178f4bc478bb7786d5be27d9
2021-08-22 22:28:18 +00:00
benschermel b1ee0d9275 update pkg conf file
Former-commit-id: da5df78872d941fe8734947b6fa5f1ecf66e2643
2021-08-22 22:21:34 +00:00
benschermel 1cdd0cc1ad update pkg conf file
Former-commit-id: 99f8caa626b46d9615cc2ce8cd4b9084fa1a9282
2021-08-22 22:18:22 +00:00
Malavan Sotheeswaran 25025bb4ff Merge branch 'keydbpro' into 'PRO_RELEASE_6'
Keydbpro

See merge request keydb-dev/KeyDB-Pro!37

Former-commit-id: e6a130e4a02b3d0cc2fcaeb0ab24e23cb60a7181
2021-08-19 19:11:04 +00:00
Malavan Sotheeswaran 207ea3dc4f Merge branch 'keydbpro' into 'PRO_RELEASE_6'
Keydbpro

See merge request keydb-dev/KeyDB-Pro!37

Former-commit-id: e6a130e4a02b3d0cc2fcaeb0ab24e23cb60a7181
2021-08-19 19:11:04 +00:00
malavan 8391e7899e Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: 4059f9c2396f0fa517ac2946ad5f0e45039c00e6
2021-08-19 18:24:29 +00:00
malavan c5c1d03708 Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: 4059f9c2396f0fa517ac2946ad5f0e45039c00e6
2021-08-19 18:24:29 +00:00
malavan 4fdb059d6e switch to new patch of rocksdb that fixes archlinux build
Former-commit-id: e2e5b5320e5c1b89ec2a3f946826097b819f6593
2021-08-19 18:24:01 +00:00
malavan 86c3fec4c0 switch to new patch of rocksdb that fixes archlinux build
Former-commit-id: e2e5b5320e5c1b89ec2a3f946826097b819f6593
2021-08-19 18:24:01 +00:00
Malavan Sotheeswaran 3279490892 Merge branch 'patch_rocks_db' into 'keydbpro'
public copy of rocksdb

See merge request keydb-dev/KeyDB-Pro!36

Former-commit-id: 4421396764688f7df2c967974f6a3b5dca28e3f5
2021-08-19 18:08:16 +00:00
Malavan Sotheeswaran 27c1c0a846 Merge branch 'patch_rocks_db' into 'keydbpro'
public copy of rocksdb

See merge request keydb-dev/KeyDB-Pro!36

Former-commit-id: 4421396764688f7df2c967974f6a3b5dca28e3f5
2021-08-19 18:08:16 +00:00
Malavan Sotheeswaran 75b0886fca Merge branch 'keydbpro' into 'patch_rocks_db'
# Conflicts:
#   .gitmodules

Former-commit-id: aec26e46d3b3617a57edd42d996f7598de5bfe4e
2021-08-19 17:57:52 +00:00
Malavan Sotheeswaran da55439b32 Merge branch 'keydbpro' into 'patch_rocks_db'
# Conflicts:
#   .gitmodules

Former-commit-id: aec26e46d3b3617a57edd42d996f7598de5bfe4e
2021-08-19 17:57:52 +00:00
malavan 40062589ad use --init instead of git submodule init
Former-commit-id: 967866c56c9d4590d72c63169d0e3c32c21b24e0
2021-08-19 17:47:23 +00:00
malavan 5814135960 use --init instead of git submodule init
Former-commit-id: 967866c56c9d4590d72c63169d0e3c32c21b24e0
2021-08-19 17:47:23 +00:00
malavan e429219a07 use --init instead of git submodule init
Former-commit-id: e5582ddf313a6bdd2ae0cb68da980954caf83e1b
2021-08-19 17:45:37 +00:00
malavan c358285cfe use --init instead of git submodule init
Former-commit-id: e5582ddf313a6bdd2ae0cb68da980954caf83e1b
2021-08-19 17:45:37 +00:00
malavan 6b0e96ea98 add branch for git submodule
Former-commit-id: b4471308f1cf99b0a5a4c8c8da8ccf9546123e3f
2021-08-19 17:42:52 +00:00
malavan 61c180d1f9 add branch for git submodule
Former-commit-id: b4471308f1cf99b0a5a4c8c8da8ccf9546123e3f
2021-08-19 17:42:52 +00:00
malavan bc124e3955 public copy of rocksdb
Former-commit-id: 50bbadcab6d2911fb9cbe15aef03c9762aa91280
2021-08-19 17:22:09 +00:00
malavan 32d8617ee2 public copy of rocksdb
Former-commit-id: 50bbadcab6d2911fb9cbe15aef03c9762aa91280
2021-08-19 17:22:09 +00:00
Malavan Sotheeswaran 664c7d65fd Revert "Merge branch 'patch_rocks_db' into 'keydbpro'"
This reverts merge request !35

Former-commit-id: 8ee1c251de5687fdcf8af740766d2968163bc8e9
2021-08-18 22:47:38 +00:00
Malavan Sotheeswaran bc323665c1 Revert "Merge branch 'patch_rocks_db' into 'keydbpro'"
This reverts merge request !35

Former-commit-id: 8ee1c251de5687fdcf8af740766d2968163bc8e9
2021-08-18 22:47:38 +00:00
Malavan Sotheeswaran d5f2287676 Merge branch 'patch_rocks_db' into 'keydbpro'
Patch rocks db, switch to private clone of rocksdb

See merge request keydb-dev/KeyDB-Pro!35

Former-commit-id: 08155fa62332a9e9d3046796cb378e04405c6ca7
2021-08-18 22:07:56 +00:00
Malavan Sotheeswaran 4cfaf92187 Merge branch 'patch_rocks_db' into 'keydbpro'
Patch rocks db, switch to private clone of rocksdb

See merge request keydb-dev/KeyDB-Pro!35

Former-commit-id: 08155fa62332a9e9d3046796cb378e04405c6ca7
2021-08-18 22:07:56 +00:00
malavan 2492a7fff6 use our own clone of rocksdb
Former-commit-id: 1de8a88679faa94d14875655305e6102289556a0
2021-08-18 21:53:55 +00:00
malavan 0cc976346c use our own clone of rocksdb
Former-commit-id: 1de8a88679faa94d14875655305e6102289556a0
2021-08-18 21:53:55 +00:00
malavan 56768b2b15 use our own clone of rocksdb
Former-commit-id: 0aeceb2a8c487eea43d47497647d4e38a3478ca7
2021-08-18 21:46:16 +00:00
malavan 3200249f63 use our own clone of rocksdb
Former-commit-id: 0aeceb2a8c487eea43d47497647d4e38a3478ca7
2021-08-18 21:46:16 +00:00
MalavanEQAlpha 1391594708 Merge pull request #313 from MalavanEQAlpha/fixissue295
Resolve Issue #295 by speeding up keyIsExpired and setting timeout on subkey expires.

Former-commit-id: 92b6603f5f16872268f7be6d7c9068873c932094
2021-08-18 17:34:18 -04:00
malavan 3f1cca0c27 should use LLONG_MAX for INVALID_EXPIRE not LLONG_MIN and add better comments
Former-commit-id: efe9a1533d02b3f0e5a09d314875c3ab3f71928f
2021-08-18 20:59:01 +00:00
malavan 0a990c07a3 patch rocksdb to fix archlinux build
Former-commit-id: b3c6e4f6353935545dca73cbc103fac9f3da7c42
2021-08-18 20:13:53 +00:00
malavan 8d37656252 patch rocksdb to fix archlinux build
Former-commit-id: b3c6e4f6353935545dca73cbc103fac9f3da7c42
2021-08-18 20:13:53 +00:00
VivekSainiEQ 9c9aa770db Include gperftools/tcmalloc.h instead of google/tcmalloc.h
Former-commit-id: 3575ede449cd6442ccd38b5d68c20f0154c597b1
2021-08-18 15:40:09 -04:00
John Sully f00e6c6ea9 Solo tests should work with loopn
Former-commit-id: 669ac986a1cb3f926eb0ecd867acc6827ebffcb0
2021-08-18 15:08:10 -04:00
malavan 0df4068911 upgrade to latest version of rocksdb
Former-commit-id: 9272e412acecc7d032c6299fb815c84c15fb0e2d
2021-08-18 15:18:51 +00:00
malavan 15fb97549f upgrade to latest version of rocksdb
Former-commit-id: 9272e412acecc7d032c6299fb815c84c15fb0e2d
2021-08-18 15:18:51 +00:00
benschermel a0303590d5 add keydb-diagnostic-tool to packaging
Former-commit-id: 9d1ade406bf8d1fff08eb172ee50c38d1c23d3c6
2021-08-16 23:21:07 +00:00
malavan c43062aab7 Remove duplicate code
Former-commit-id: 39cc8ce1041d6f7e03504949001c6ca8798265e1
2021-08-16 22:55:46 +00:00
malavan ce73404d40 don't use flags that aren't supported by certain versions of OPENSSL
Former-commit-id: e7704680f269872a1997c6683a6391d807494087
2021-08-16 22:55:46 +00:00
malavan f270752970 Remove duplicate code
Former-commit-id: 046df30861b73f796a7819d8a9ffe6bd68b7e910
2021-08-16 22:53:00 +00:00
malavan fe0259e272 Remove duplicate code
Former-commit-id: 046df30861b73f796a7819d8a9ffe6bd68b7e910
2021-08-16 22:53:00 +00:00
malavan bd5db8149d don't use flags that aren't supported by certain versions of OPENSSL
Former-commit-id: 1ae9af250513d1430160b37d24ba617551402926
2021-08-16 22:49:55 +00:00
malavan 252f63ed0a don't use flags that aren't supported by certain versions of OPENSSL
Former-commit-id: 1ae9af250513d1430160b37d24ba617551402926
2021-08-16 22:49:55 +00:00
malavan 41a01c6f48 Merge remote-tracking branch 'origin/keydbpro' into PRO_RELEASE_6
Former-commit-id: 11214acb5aff8af1e09a64ee2db71357899a9bf7
2021-08-16 22:49:18 +00:00
malavan 3e0f6d983a Merge remote-tracking branch 'origin/keydbpro' into PRO_RELEASE_6
Former-commit-id: 11214acb5aff8af1e09a64ee2db71357899a9bf7
2021-08-16 22:49:18 +00:00
Malavan Sotheeswaran 09aaa12af8 Merge branch 'pkg_update_tools' into 'keydbpro'
add diagnostic tool to packaging

See merge request keydb-dev/KeyDB-Pro!33

Former-commit-id: f87960ac26a710ed1a014a93e47740db1a81a07f
2021-08-16 22:44:53 +00:00
Malavan Sotheeswaran 7bb01c0241 Merge branch 'pkg_update_tools' into 'keydbpro'
add diagnostic tool to packaging

See merge request keydb-dev/KeyDB-Pro!33

Former-commit-id: f87960ac26a710ed1a014a93e47740db1a81a07f
2021-08-16 22:44:53 +00:00
Malavan Sotheeswaran 451c4d40bd Merge branch 'add_asyncFreeDictTable_to_diagnostic_tool' into 'keydbpro'
add asyncFreeDictTable tokeydb-diagnostic-tool.cpp to avoid linker error

See merge request keydb-dev/KeyDB-Pro!32

Former-commit-id: 0a253222359454f233b82c8aaff7c2d9ab57e571
2021-08-16 22:44:43 +00:00
Malavan Sotheeswaran a36a33a399 Merge branch 'add_asyncFreeDictTable_to_diagnostic_tool' into 'keydbpro'
add asyncFreeDictTable tokeydb-diagnostic-tool.cpp to avoid linker error

See merge request keydb-dev/KeyDB-Pro!32

Former-commit-id: 0a253222359454f233b82c8aaff7c2d9ab57e571
2021-08-16 22:44:43 +00:00
Malavan Sotheeswaran 683524a205 Merge branch 'pkg_config' into 'keydbpro'
update packaging config files

See merge request keydb-dev/KeyDB-Pro!31

Former-commit-id: d6bce861e5bafa30d1cc31d1856c75f6e492d454
2021-08-16 22:42:29 +00:00
Malavan Sotheeswaran c692b96fe4 Merge branch 'pkg_config' into 'keydbpro'
update packaging config files

See merge request keydb-dev/KeyDB-Pro!31

Former-commit-id: d6bce861e5bafa30d1cc31d1856c75f6e492d454
2021-08-16 22:42:29 +00:00
benschermel 6d04a4ab15 add keydb-diagnostic-tool to packaging
Former-commit-id: 5bb2b331fa0abc3b10f1bf52c5178123e54a991c
2021-08-16 22:10:31 +00:00
benschermel 5f89e73fd1 add diagnostic tool to packaging
Former-commit-id: 37c3ca16162bd8a97ef35e2104ff5dc0ed6d7e48
2021-08-16 21:59:59 +00:00
benschermel 9912731837 add diagnostic tool to packaging
Former-commit-id: 37c3ca16162bd8a97ef35e2104ff5dc0ed6d7e48
2021-08-16 21:59:59 +00:00
malavan 9e7f8fa664 add asyncFreeDictTable tokeydb-diagnostic-tool.cpp to avoid linker error
Former-commit-id: 6b1509932f592ffffb9dd5d06de7f313d44e4394
2021-08-16 21:35:52 +00:00
malavan 1d0c5763b0 add asyncFreeDictTable tokeydb-diagnostic-tool.cpp to avoid linker error
Former-commit-id: 6b1509932f592ffffb9dd5d06de7f313d44e4394
2021-08-16 21:35:52 +00:00
malavan af6a906a9d Merge remote-tracking branch 'opensource/RELEASE_6' into PRO_RELEASE_6
Former-commit-id: 4505b3caa94ea0366014fabcbdb36850f7b60be7
2021-08-14 04:04:05 +00:00
malavan 3617d3f63e Merge remote-tracking branch 'opensource/RELEASE_6' into PRO_RELEASE_6
Former-commit-id: 4505b3caa94ea0366014fabcbdb36850f7b60be7
2021-08-14 04:04:05 +00:00
MalavanEQAlpha adff8fb92c Merge pull request #344 from EQ-Alpha/fix_pbuild_ubuntu18.04
don't use flags that aren't supported by certain versions of OPENSSL

Former-commit-id: e9765ea69b5aeb7a2c45e4780a5d017a7d26c635
2021-08-13 23:59:50 -04:00
malavan d3f7fd98a5 don't use flags that aren't supported by certain versions of OPENSSL
Former-commit-id: 57c2cc6fceb6d7ae0b0fdf4c6d16170ea8f4ede2
2021-08-13 20:02:06 +00:00
malavan 64ab9dbd60 Merge branch 'RELEASE_6' of https://github.com/EQ-Alpha/KeyDB into RELEASE_6
Former-commit-id: 8a4562312ea5436e04f6b75d5ff1ed8c7ae1cdc8
2021-08-13 15:46:24 +00:00
malavan 31acab3d9e Remove duplicate code
Former-commit-id: 1c2c6b997922dd06316fc1306922fa04a6c02625
2021-08-13 15:46:09 +00:00
christianEQ fce4a7a49d install 32bit libraries in github action
Former-commit-id: ac54985d6a8d07144297682e03f19ba8e8403b37
2021-08-13 11:05:12 -04:00
christianEQ c02587edfd github runner for 32bit build
Former-commit-id: 35d1bd846a7f47a7ccabd79620d349b3967dad5b
2021-08-13 11:05:12 -04:00
christianEQ df0e7b379f changed keys counter variable to unsigned to fix signedness comparison warning
Former-commit-id: 12a12a4bbec59aab4492900ed90e59e0566cc330
2021-08-13 11:05:12 -04:00
christianEQ 3feea52419 %zu for printing type size_t
Former-commit-id: 31db055a4666deed1fb9522e0332ecf83dc36870
2021-08-13 11:05:12 -04:00
christianEQ c825ff5f27 fixed 32bit compatibility in Makefile
Former-commit-id: 2ae9d08a5152d5a71bc62ccba190cd6ee655b023
2021-08-13 11:05:12 -04:00
christianEQ dec657b4f9 fixed overly strict assert for 32bit
Former-commit-id: 748a1a61d998a65a0faf3072a97b928b700037cf
2021-08-13 11:05:12 -04:00
benschermel dfdf22c95a update deb master changelog
Former-commit-id: 4c9610a7c7a35bd83ab9a245018b9d16ffe50001
2021-08-13 00:49:41 +00:00
benschermel 91e83a893f update deb changelog
Former-commit-id: d919317ac338a9bfa2e8de7338fcf08a51e31dd1
2021-08-13 00:48:45 +00:00
benschermel 14cbb9d53e update deb changelog
Former-commit-id: d919317ac338a9bfa2e8de7338fcf08a51e31dd1
2021-08-13 00:48:45 +00:00
benschermel f563b24b1f bump version
Former-commit-id: a230a7973a64ad29174348ab8d053c9bb2ea60c9
2021-08-13 00:40:46 +00:00
benschermel 678e1f08ae bump version
Former-commit-id: af0769c1a917e9b17dda15b5aca6efdb958bfce4
2021-08-13 00:35:19 +00:00
benschermel dded699352 bump version
Former-commit-id: af0769c1a917e9b17dda15b5aca6efdb958bfce4
2021-08-13 00:35:19 +00:00
malavan 9ed2e518b4 bump version
Former-commit-id: 80ad06f51f15eabb6289a6d887a470b814763a98
2021-08-11 23:23:39 +00:00
malavan 71100f697e bump version
Former-commit-id: d923003969be0ecb507bea0acc643ccdf06f8831
2021-08-11 23:22:17 +00:00
malavan 0bcea13474 bump version
Former-commit-id: d923003969be0ecb507bea0acc643ccdf06f8831
2021-08-11 23:22:17 +00:00
malavan f910071992 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 6b385bc057d8a01ed57a6c0d89eb30e9832fe1ca
2021-08-11 21:20:47 +00:00
malavan fe9933334c Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 6b385bc057d8a01ed57a6c0d89eb30e9832fe1ca
2021-08-11 21:20:47 +00:00
malavan 55132ebab3 Merge remote-tracking branch 'opensource/unstable' into keydbpro
Former-commit-id: cf40fa5da29ba9574d20d706d0a41ca7001df95a
2021-08-11 20:41:54 +00:00
malavan a93eebc93a Merge remote-tracking branch 'opensource/unstable' into keydbpro
Former-commit-id: cf40fa5da29ba9574d20d706d0a41ca7001df95a
2021-08-11 20:41:54 +00:00
malavan df5ed116ef Merge remote-tracking branch 'origin/unstable' into RELEASE_6
Former-commit-id: 8e6c8f1da1ff6bd354a13cfafd0b3899d9d00a05
2021-08-11 19:59:28 +00:00
MalavanEQAlpha 391e4d5c7b Merge pull request #318 from VivekSainiEQ/redisearch_fixes
Initialized serverTL in more places in module.cpp

Former-commit-id: 7314eb0006522882450de7fa66b06a7f7730ed80
2021-08-11 15:47:30 -04:00
Vivek Saini 51fcef1ebc Merge pull request #296 from VivekSainiEQ/systemd_fix
Fixed bug where make USE_SYSTEMD=yes would not pass in correct flags

Former-commit-id: 0b76f5993f0d2e87cb656f4398de87fe900c08e9
2021-08-11 15:39:50 -04:00
VivekSainiEQ 35182974fc Merge remote-tracking branch 'upstream/unstable' into redisearch_fixes
Former-commit-id: 1b251153f4bc7ce2ec94103136ced64581321f4b
2021-08-11 19:28:04 +00:00
VivekSainiEQ 1c674bd6d0 Prevent invalid mvcc timestamps from causing critical errors
Former-commit-id: 5efb8db6f182919bbaaaf9c92feda54009232584
2021-08-11 15:06:14 -04:00
Paweł Sacawa 7abff1a525 Add: zsh completions with descriptions
This commit add zsh completions for the keydb `client`. They have contextual host completion and full argument descriptions.
Vendor-distributed completions for zsh should end up in `/usr/share/zsh/vendor-completions`, but unfortunatly I'm not familiar with the packaging method for *.deb archives, so these completions will need to be moved to the appropriate directory.


Former-commit-id: d3dd702af3a2ac715e8684020af17623c73fd6e9
2021-08-11 15:05:11 -04:00
MalavanEQAlpha 56f0d5ea9a Merge pull request #340 from EQ-Alpha/update_keydb.conf
update keydb.conf with new configs from redis unstable

Former-commit-id: 34c0e9e386a428fde033433e94378674454c4c15
2021-08-11 15:04:22 -04:00
MalavanEQAlpha 81bfdae670 Merge pull request #341 from EQ-Alpha/pkg_config
update packaging config files

Former-commit-id: 9abf9a4ec4bbfe0510db68d3c67c5afbc49d85ee
2021-08-11 15:01:37 -04:00
John Sully a4f12b3afb Merge branch 'keydbpro_collab' into multithread_load
Former-commit-id: f36e9efd8e0079650c78e1e8c19c5fa8553c8251
2021-08-11 02:54:02 +00:00
John Sully f406ef72ae Merge branch 'keydbpro_collab' into multithread_load
Former-commit-id: f36e9efd8e0079650c78e1e8c19c5fa8553c8251
2021-08-11 02:54:02 +00:00
John Sully 51f1c8ce57 Fix crash loading RDB on start with a storage provider set
Former-commit-id: ace6a44399a15ab48a7ef798dc656dbc1207b58d
2021-08-11 02:53:44 +00:00
John Sully 0d2b6ee3dd Fix crash loading RDB on start with a storage provider set
Former-commit-id: ace6a44399a15ab48a7ef798dc656dbc1207b58d
2021-08-11 02:53:44 +00:00
John Sully 4518eedbbf Fix crash in load with storage provider set
Former-commit-id: 6990818b7ca647819b50ae04224778e6f8f12a1a
2021-08-11 01:19:39 +00:00
John Sully fc2d678b50 Fix crash in load with storage provider set
Former-commit-id: 6990818b7ca647819b50ae04224778e6f8f12a1a
2021-08-11 01:19:39 +00:00
benschermel 743689226a add script to compare all active config parameters of any 2 config files
Former-commit-id: 4e8155966fa07f1395ad789123cc3519e614cd4f
2021-08-10 20:10:28 -04:00
benschermel 19105455d3 update packaging config files
Former-commit-id: d45cfb8e6416c9305447bb6fc02cbbc40875a4f0
2021-08-10 20:08:39 -04:00
benschermel dbbc68a223 add script to compare all active config parameters of any 2 config files
Former-commit-id: b873f90dc1f0f9343bc5c8c3c94a544b5f1f7321
2021-08-10 20:06:59 -04:00
benschermel 64eff23f91 add script to compare all active config parameters of any 2 config files
Former-commit-id: b873f90dc1f0f9343bc5c8c3c94a544b5f1f7321
2021-08-10 20:06:59 -04:00
benschermel 9007fef288 update package config files
Former-commit-id: fd367a91cc0feb22b67f034627d59feb679b81e8
2021-08-10 20:04:30 -04:00
benschermel 0c57f07b35 update package config files
Former-commit-id: fd367a91cc0feb22b67f034627d59feb679b81e8
2021-08-10 20:04:30 -04:00
malavan 1074f4a27d update keydb.conf with new configs from redis unstable
Former-commit-id: 2ccfb25ac199b720b60ea860078359ce07b995f6
2021-08-10 21:34:52 +00:00
malavan 20e5c4e5be Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: a1b8103f429a319e19ca8144f8442905530d7ed8
2021-08-09 22:15:44 +00:00
malavan 3925ab8372 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: a1b8103f429a319e19ca8144f8442905530d7ed8
2021-08-09 22:15:44 +00:00
John Sully a9f52fce05 Merge branch 'keydbpro_collab' into multithread_load
Former-commit-id: 8016c20f1f9a648e658c816e2f6777c5718d5e19
2021-08-09 20:20:34 +00:00
John Sully 2d1638e8d7 Merge branch 'keydbpro_collab' into multithread_load
Former-commit-id: 8016c20f1f9a648e658c816e2f6777c5718d5e19
2021-08-09 20:20:34 +00:00
malavan ddb6eb2ac4 Merge branch 'unstable' into RELEASE_6
Former-commit-id: e5c56d1f0ee38d72eca4efb67460cc71d35b6f0e
2021-08-09 18:17:11 +00:00
Malavan Sotheeswaran 41d87867dc Merge branch 'add_ci' into 'keydbpro'
Use artifacts to speed up pipeline

See merge request keydb-dev/KeyDB-Pro!30

Former-commit-id: 2b377364d0df4779cf5fef75d30853e1dab73638
2021-08-06 02:20:18 +00:00
Malavan Sotheeswaran a17ad2bb90 Merge branch 'add_ci' into 'keydbpro'
Use artifacts to speed up pipeline

See merge request keydb-dev/KeyDB-Pro!30

Former-commit-id: 2b377364d0df4779cf5fef75d30853e1dab73638
2021-08-06 02:20:18 +00:00
Malavan Sotheeswaran 3e19974d61 Use artifacts to speed up pipeline
Former-commit-id: 37ad7b3567aaefa7785eb50e1370db4734605e4c
2021-08-06 02:20:18 +00:00
Malavan Sotheeswaran 3c588e9179 Use artifacts to speed up pipeline
Former-commit-id: 37ad7b3567aaefa7785eb50e1370db4734605e4c
2021-08-06 02:20:18 +00:00
Malavan Sotheeswaran f2b9516b39 Merge branch 'fix_shrink_on_rdb_load' into 'keydbpro'
add noshrink flag to stop dict from shrinking during mass insertions

See merge request keydb-dev/KeyDB-Pro!28

Former-commit-id: 41241189cb0238b240b2f894f77ae254e49770ac
2021-08-05 20:07:31 +00:00
Malavan Sotheeswaran 739c29fa44 Merge branch 'fix_shrink_on_rdb_load' into 'keydbpro'
add noshrink flag to stop dict from shrinking during mass insertions

See merge request keydb-dev/KeyDB-Pro!28

Former-commit-id: 41241189cb0238b240b2f894f77ae254e49770ac
2021-08-05 20:07:31 +00:00
Malavan Sotheeswaran f1f7ff27b9 add noshrink flag to stop dict from shrinking during mass insertions
Former-commit-id: 5e0c994ec82f4adb437a31f8d89eee7a09145576
2021-08-05 20:07:31 +00:00
Malavan Sotheeswaran 4e5d72de76 add noshrink flag to stop dict from shrinking during mass insertions
Former-commit-id: 5e0c994ec82f4adb437a31f8d89eee7a09145576
2021-08-05 20:07:31 +00:00
Malavan Sotheeswaran 0a26ee1472 Merge branch 'add_ci' into 'keydbpro'
remove duplicate rules and fix duplicating pipelines

See merge request keydb-dev/KeyDB-Pro!29

Former-commit-id: 8e458fb4bed27f653a3630e15aa9c637b2915f62
2021-08-04 15:00:18 +00:00
Malavan Sotheeswaran 66615c36ca Merge branch 'add_ci' into 'keydbpro'
remove duplicate rules and fix duplicating pipelines

See merge request keydb-dev/KeyDB-Pro!29

Former-commit-id: 8e458fb4bed27f653a3630e15aa9c637b2915f62
2021-08-04 15:00:18 +00:00
malavan d5e283dd8d disable node redis for now since it does not work with redis 6.23
Former-commit-id: 6bd93684b6078782fc40973b253f1534d79888c1
2021-08-04 01:50:55 +00:00
malavan 2bcd358575 disable node redis for now since it does not work with redis 6.23
Former-commit-id: 6bd93684b6078782fc40973b253f1534d79888c1
2021-08-04 01:50:55 +00:00
malavan 589d1712b0 remove duplicate rules and try to fix double pipelines
Former-commit-id: 0f504408042670f3ead2e1522dcbbae7c4c3b62c
2021-08-04 01:44:47 +00:00
malavan 00b02b6045 remove duplicate rules and try to fix double pipelines
Former-commit-id: 0f504408042670f3ead2e1522dcbbae7c4c3b62c
2021-08-04 01:44:47 +00:00
Christian Legge 976eca1862 Add REPLPING command for use during replication (#329)
* added replping command for initiating replication

* backwards compatibility for replping (retry if not recognized)

* don't allow ping during loading (load balancer fix)

* changed replping warning to notice

Former-commit-id: 13e9a473e2a0b053e0aac64897fb2adc35240d14
2021-07-29 15:50:30 -04:00
malavan 8cb9c664d2 don't create pipeline on every push
Former-commit-id: fb4bb008856c3e685afb470617a1ab3579ee63a8
2021-07-28 22:52:50 +00:00
malavan 1b4ec9d4d7 don't create pipeline on every push
Former-commit-id: fb4bb008856c3e685afb470617a1ab3579ee63a8
2021-07-28 22:52:50 +00:00
Malavan Sotheeswaran 5683114ebf Merge branch 'add_ci' into 'keydbpro'
make make test multithreaded

See merge request keydb-dev/KeyDB-Pro!27

Former-commit-id: 7cb619601d110962ef061b99425ab03d914929c8
2021-07-28 22:23:54 +00:00
Malavan Sotheeswaran a5c74d9479 Merge branch 'add_ci' into 'keydbpro'
make make test multithreaded

See merge request keydb-dev/KeyDB-Pro!27

Former-commit-id: 7cb619601d110962ef061b99425ab03d914929c8
2021-07-28 22:23:54 +00:00
MalavanEQAlpha c483489531 Merge pull request #328 from EQ-Alpha/backtrace_for_alpine
Backtrace for alpine using libunwind

Former-commit-id: 21617ab5f355959696710e87c1afd210fb6abb12
2021-07-28 17:17:06 -04:00
malavan df2647a43f add some comments
Former-commit-id: bd8bcdae0d244e93e23871f5306b002690f101c6
2021-07-28 20:32:18 +00:00
John Sully 062e35e809 Fix issue collab #32
Former-commit-id: 0d192cf00ebe9fc0d898404b86e1173476edaefb
2021-07-26 22:30:31 +00:00
John Sully fc740893ff Fix issue collab #32
Former-commit-id: 0d192cf00ebe9fc0d898404b86e1173476edaefb
2021-07-26 22:30:31 +00:00
John Sully 0e79fce228 Initialize el so we can detect if it is null
Former-commit-id: ec0f833ea17c668971893aa8f198d22da2e1d289
2021-07-23 19:31:22 +00:00
John Sully d849a71eb8 Initialize el so we can detect if it is null
Former-commit-id: ec0f833ea17c668971893aa8f198d22da2e1d289
2021-07-23 19:31:22 +00:00
John Sully e9f2b4f67d We cannot create time events on threads that don't have an event loop
Former-commit-id: 3812586a41bb7f974b5d9820c8a68ff34ee8aa9a
2021-07-23 16:02:57 +00:00
John Sully 65228a12ea We cannot create time events on threads that don't have an event loop
Former-commit-id: 3812586a41bb7f974b5d9820c8a68ff34ee8aa9a
2021-07-23 16:02:57 +00:00
John Sully 6fbe529923 We cannot create time events on threads that don't have an event loop
Former-commit-id: 4c88a4ee0e86f6e1c9b18733e48ce50751d01e45
2021-07-23 16:02:29 +00:00
John Sully e516f6eef6 We cannot create time events on threads that don't have an event loop
Former-commit-id: 4c88a4ee0e86f6e1c9b18733e48ce50751d01e45
2021-07-23 16:02:29 +00:00
malavan bc09298bcc remove duplicate function
Former-commit-id: b1a8bb6e75d82a73755cf9e74cb74c483a3a3253
2021-07-21 16:00:24 +00:00
malavan ee6d0ff6e4 add stacktrace message
Former-commit-id: 71bd41efdbaeecedc802a73ef2f801ac62cf6ffc
2021-07-19 23:17:18 +00:00
John Sully 228cb28552 Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: e4e5c6696c6d831924f314a198b266b10d831e14
2021-07-19 20:51:27 +00:00
John Sully ea8934ddf3 Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: e4e5c6696c6d831924f314a198b266b10d831e14
2021-07-19 20:51:27 +00:00
John Sully 2c856755e9 Disable async rehash during load as it interferes with eviction
Former-commit-id: 54b4f39e9d634bf53b04cd94433b051b14323bc6
2021-07-19 18:17:54 +00:00
John Sully 6da3ff9949 Disable async rehash during load as it interferes with eviction
Former-commit-id: 54b4f39e9d634bf53b04cd94433b051b14323bc6
2021-07-19 18:17:54 +00:00
John Sully cdd6dbc6fd We need to free in order since the first big async free is likely the largest, so don't set the hipri bit
Former-commit-id: 76a9cefa94e0f446e12a690909cbda15d03ca211
2021-07-19 18:01:39 +00:00
John Sully 19916b9d26 We need to free in order since the first big async free is likely the largest, so don't set the hipri bit
Former-commit-id: 76a9cefa94e0f446e12a690909cbda15d03ca211
2021-07-19 18:01:39 +00:00
malavan fa06fedc6f dd comment and set eip unused
Former-commit-id: 4f9ba7b01a9afed82b88d3dc480c74a0e208ad70
2021-07-19 17:32:38 +00:00
malavan 50a809a25a dd comment and set eip unused
Former-commit-id: 7c96e303c8c930fe5d17fd5c448ffb0b4d4a5b47
2021-07-19 17:31:24 +00:00
malavan f373df592d dd comment and set eip unused
Former-commit-id: d1c44227782b608bf6aa2dbad24c9fb4567393cb
2021-07-19 17:29:43 +00:00
malavan e2aa947c3b add backtrace for alpine using libunwind
Former-commit-id: 4a1d0f663a7ec9c523f92608c986c57a49177871
2021-07-19 17:20:52 +00:00
malavan 960f7c761f Merge branch 'add_ci' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into add_ci
Former-commit-id: 82438d8332e4f23c67df17f888b87aff04a46363
2021-07-19 17:01:17 +00:00
malavan afaef24f7b Merge branch 'add_ci' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into add_ci
Former-commit-id: 82438d8332e4f23c67df17f888b87aff04a46363
2021-07-19 17:01:17 +00:00
malavan 459d1684ee split up runtests
Former-commit-id: 93e36a064033dc55fe281fe113425b33cf42b2c3
2021-07-19 16:59:03 +00:00
malavan 85efd483d2 split up runtests
Former-commit-id: 93e36a064033dc55fe281fe113425b33cf42b2c3
2021-07-19 16:59:03 +00:00
John Sully 9a172c57ee We need to periodically flush the GC or we'll end up blocking with a huge backlog at the end of load
Former-commit-id: 29c0bf79ad1a810e808790de2f7db24f3cc603e8
2021-07-19 16:50:48 +00:00
John Sully a0b0773f67 We need to periodically flush the GC or we'll end up blocking with a huge backlog at the end of load
Former-commit-id: 29c0bf79ad1a810e808790de2f7db24f3cc603e8
2021-07-19 16:50:48 +00:00
Malavan Sotheeswaran d9bf895f36 Merge branch 'keydbpro' into 'add_ci'
# Conflicts:
#   .gitlab-ci.yml

Former-commit-id: 828924d67d622483fccf570649fc81aa3d78673b
2021-07-19 16:16:36 +00:00
Malavan Sotheeswaran 807cfaa668 Merge branch 'keydbpro' into 'add_ci'
# Conflicts:
#   .gitlab-ci.yml

Former-commit-id: 828924d67d622483fccf570649fc81aa3d78673b
2021-07-19 16:16:36 +00:00
malavan f285aafc8c change make test to multithreaded
Former-commit-id: 8f2bae851f2aa7c2600a487733a82850d6552882
2021-07-19 15:52:33 +00:00
malavan 27cf986011 change make test to multithreaded
Former-commit-id: 8f2bae851f2aa7c2600a487733a82850d6552882
2021-07-19 15:52:33 +00:00
John Sully a3252bea33 Info command should show how many keys are cached in RAM vs storage provider
Former-commit-id: 08597bee69bc16ca7c3d5ff31020472774c6eec9
2021-07-19 15:11:33 +00:00
John Sully 38ac33fadd Info command should show how many keys are cached in RAM vs storage provider
Former-commit-id: 08597bee69bc16ca7c3d5ff31020472774c6eec9
2021-07-19 15:11:33 +00:00
John Sully 3a5792a089 StorageCache dtor leaks
Former-commit-id: 0262c4dc76a320141b8a4454df2f6baab4f74ab3
2021-07-19 15:10:48 +00:00
John Sully b09690d322 StorageCache dtor leaks
Former-commit-id: 0262c4dc76a320141b8a4454df2f6baab4f74ab3
2021-07-19 15:10:48 +00:00
John Sully a4e59b7f63 Do not resize replica buffer past the max client limit
Former-commit-id: ba116500ca4fd53e4e40f04fc33981e60bb21ab7
2021-07-18 20:48:08 +00:00
John Sully 56f6f8c915 Do not resize replica buffer past the max client limit
Former-commit-id: ba116500ca4fd53e4e40f04fc33981e60bb21ab7
2021-07-18 20:48:08 +00:00
John Sully e8a654166e Return the ring buffer to its original size if we temporarily resized it
Former-commit-id: a12ce4a0d105bf7d6ccff95f7dc0044c4676b0a7
2021-07-18 20:45:32 +00:00
John Sully d4cea21cd7 Return the ring buffer to its original size if we temporarily resized it
Former-commit-id: a12ce4a0d105bf7d6ccff95f7dc0044c4676b0a7
2021-07-18 20:45:32 +00:00
John Sully 53fab59e87 Do not update batch variables when not in a batch
Former-commit-id: ad1e0286cf9b2d9de33c65e8e798a05ead3f7d5a
2021-07-18 20:28:42 +00:00
John Sully dd3c4a2f38 Do not update batch variables when not in a batch
Former-commit-id: ad1e0286cf9b2d9de33c65e8e798a05ead3f7d5a
2021-07-18 20:28:42 +00:00
Christian Legge 4a0b1a3f24 Merge pull request #321 from EQ-Alpha/ci-flags-fix
Requested changes from 6.2.2 merge

Former-commit-id: 78c93bfb5a9aa09f40bba173dc5d97a7af17dc64
2021-07-15 16:42:02 -04:00
christianEQ ec2d722858 fix warnings for mac build
Former-commit-id: b533cc63300c5628550d612cb6ce068676f7b32c
2021-07-15 20:14:14 +00:00
Malavan Sotheeswaran 8ebff5164e Merge branch 'add_ci' into 'keydbpro'
test CI do not merge

See merge request keydb-dev/KeyDB-Pro!24

Former-commit-id: 047e32c63a329c9ebc6756db704eda8bbcc1b10a
2021-07-14 23:41:24 +00:00
Malavan Sotheeswaran 662ade93d9 Merge branch 'add_ci' into 'keydbpro'
test CI do not merge

See merge request keydb-dev/KeyDB-Pro!24

Former-commit-id: 047e32c63a329c9ebc6756db704eda8bbcc1b10a
2021-07-14 23:41:24 +00:00
Malavan Sotheeswaran d85c1e1458 test CI do not merge
Former-commit-id: ccdf18b1bef07ba076e5f86d74fe1e1f6ae50a8c
2021-07-14 23:41:24 +00:00
Malavan Sotheeswaran 24eae00cb3 test CI do not merge
Former-commit-id: ccdf18b1bef07ba076e5f86d74fe1e1f6ae50a8c
2021-07-14 23:41:24 +00:00
christianEQ e9b0e6453d Merge remote-tracking branch 'origin/unstable' into ci-flags-fix
Former-commit-id: 71db54191d17211c72bfdad2c4aee8f04237a5fc
2021-07-14 22:56:15 +00:00
malavan 91b1f1bb5f add endurance test
Former-commit-id: 3ebd20e66fd6cf858f8d7de7de223d18c387a2a9
2021-07-14 22:15:44 +00:00
malavan ae88a9e13e add endurance test
Former-commit-id: 3ebd20e66fd6cf858f8d7de7de223d18c387a2a9
2021-07-14 22:15:44 +00:00
malavan 51059a80b0 use INVALID_EXPIRE instead of -1
Former-commit-id: 4de458d57b37d5efe589367c5a059cf09f289d51
2021-07-14 22:13:29 +00:00
christianEQ 1e63f4aabb added REDIS_CFLAGS to makefile for backwards compatibility
Former-commit-id: c6aa233ca24f66bf4c0dfa78857cb546c024a6bf
2021-07-14 21:51:44 +00:00
malavan 78e69c2241 cleanup based on 6.2.2 merge review
Former-commit-id: 498f36e7a5c6b08ffda5f0c0fd1eb8fe966680f6
2021-07-14 15:22:27 -04:00
Christian Legge 6742c4ab8b Merge pull request #322 from EQ-Alpha/diagnostic-tool
Basic first iteration of Diagnostic Tool

Former-commit-id: 6e78becd21a40c35177e7e453820fb248c75310d
2021-07-14 14:19:44 -04:00
malavan 46b3916226 more specific requirements for jedis and node-redis
Former-commit-id: 4d3f9cb88a8d60ac0350d658f76bae7ad5e17e8f
2021-07-13 20:58:58 +00:00
malavan 13aab76b79 more specific requirements for jedis and node-redis
Former-commit-id: 4d3f9cb88a8d60ac0350d658f76bae7ad5e17e8f
2021-07-13 20:58:58 +00:00
Christian Legge 7711d4b3ac Merge pull request #327 from EQ-Alpha/issue323_fix
fix for #323: seg fault on expiremember

Former-commit-id: 4faec545abb79e4deafb3f154f39105c3cc5fb16
2021-07-12 16:54:31 -04:00
christianEQ 8fdb571453 tabs -> spaces
Former-commit-id: 668231bd2d5f3048104207befc825cc751b14f9f
2021-07-12 18:55:44 +00:00
John Sully 699ccbc2d5 Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: 8eec3e948ffd204bb2d6170ad3ca42fa8a2c6d8b
2021-07-09 05:25:04 +00:00
John Sully 508e23b2c0 Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: 8eec3e948ffd204bb2d6170ad3ca42fa8a2c6d8b
2021-07-09 05:25:04 +00:00
John Sully 88521a9dfb Merge branch 'unstable' into keydbpro
Former-commit-id: 81ded8a35daa5100cac7299a7d0b5f43ee7ac74f
2021-07-09 04:41:47 +00:00
John Sully 6e68808e4b Merge branch 'unstable' into keydbpro
Former-commit-id: 81ded8a35daa5100cac7299a7d0b5f43ee7ac74f
2021-07-09 04:41:47 +00:00
John Sully 9c841628da Merge tag '6.2.3' into unstable
Former-commit-id: 1895dbb768
2021-07-09 04:40:31 +00:00
malavan 2024682fbc only use docker
Former-commit-id: c66dbb4afe6b63caa065b7ff8e7b11691099b1ce
2021-07-08 19:11:13 +00:00
malavan f1c6c825da only use docker
Former-commit-id: c66dbb4afe6b63caa065b7ff8e7b11691099b1ce
2021-07-08 19:11:13 +00:00
christianEQ 0d436777b0 added eq alpha copyright
Former-commit-id: 0ea7b2db02f824e2b57d32dd209e59e490ba8d68
2021-07-08 02:58:18 +00:00
christianEQ d66dd25845 fix for #323: seg fault on expiremember
Former-commit-id: 92ef2743147202378c555c19afd1667d2cae10b0
2021-07-08 02:50:05 +00:00
christianEQ 5eb9942c98 various branding and cleanup fixes
Former-commit-id: 94aba1d763c2ab75943e55f188e7cb83119265db
2021-07-08 02:46:42 +00:00
jsully 43accfbbec Merge branch 'license_status_fix' into 'keydbpro'
license status OK if not checking license

Closes #14

See merge request keydb-dev/KeyDB-Pro!19

Former-commit-id: f66d0970b1eb9be50210a88bf773769a40513521
2021-07-07 18:07:30 +00:00
jsully d0c40ed511 Merge branch 'license_status_fix' into 'keydbpro'
license status OK if not checking license

Closes #14

See merge request keydb-dev/KeyDB-Pro!19

Former-commit-id: f66d0970b1eb9be50210a88bf773769a40513521
2021-07-07 18:07:30 +00:00
malavan 21d50f483b gitlab-ci syntax error
Former-commit-id: 5bab59629c39c8eb22567be36faf092d0b54dbe4
2021-07-07 08:32:09 +00:00
malavan 955caf82d8 gitlab-ci syntax error
Former-commit-id: 5bab59629c39c8eb22567be36faf092d0b54dbe4
2021-07-07 08:32:09 +00:00
malavan 24ad00cd57 gitlab-ci syntax error
Former-commit-id: 92aaa4fd66225593fa477053f960ee1dbf2f522c
2021-07-07 08:30:41 +00:00
malavan 73f6eddbd7 gitlab-ci syntax error
Former-commit-id: 92aaa4fd66225593fa477053f960ee1dbf2f522c
2021-07-07 08:30:41 +00:00
malavan 10ae6522db gitlab-ci syntax error
Former-commit-id: 2a5b4297425e773cc97376f271acce535ef3a20e
2021-07-07 08:26:39 +00:00
malavan 52efb72461 gitlab-ci syntax error
Former-commit-id: 2a5b4297425e773cc97376f271acce535ef3a20e
2021-07-07 08:26:39 +00:00
malavan 0ad560b9fd code coverage job
Former-commit-id: 418fd5716dde4b8034259ca31290e5538f0f0aad
2021-07-07 08:25:37 +00:00
malavan f680ebd9e7 code coverage job
Former-commit-id: 418fd5716dde4b8034259ca31290e5538f0f0aad
2021-07-07 08:25:37 +00:00
malavan ba39b9873e add redis-rs
Former-commit-id: 13f171eb06b98f25424b1dff8c6572b668dd92ad
2021-07-07 05:28:59 +00:00
malavan d539257d6f add redis-rs
Former-commit-id: 13f171eb06b98f25424b1dff8c6572b668dd92ad
2021-07-07 05:28:59 +00:00
malavan c0d27a3e90 tmp dir created by jedis make now
Former-commit-id: 2c362ea5359f0f814da231a5fb9e826d1851bfe3
2021-06-30 17:51:51 +00:00
malavan 1528d03efc tmp dir created by jedis make now
Former-commit-id: 2c362ea5359f0f814da231a5fb9e826d1851bfe3
2021-06-30 17:51:51 +00:00
John Sully a765b9508f Merge branch 'repl_backlog_rework' into keydbpro_collab
Former-commit-id: 0983e195757d92d6cbcb63436a1332a6b80e275c
2021-06-30 06:36:45 +00:00
John Sully 1766f223c9 Merge branch 'repl_backlog_rework' into keydbpro_collab
Former-commit-id: 0983e195757d92d6cbcb63436a1332a6b80e275c
2021-06-30 06:36:45 +00:00
malavan 415f37b5b8 Merge branch 'keydbpro' into add_ci
Former-commit-id: 3a745920e519177390a36abc207e02f01e35828a
2021-06-25 12:15:52 +00:00
malavan ef1341d2fc Merge branch 'keydbpro' into add_ci
Former-commit-id: 3a745920e519177390a36abc207e02f01e35828a
2021-06-25 12:15:52 +00:00
malavan 76344dabe1 add tags hopefully no need to kill stunnel
Former-commit-id: 6b49258ba88874075e18e71911f472bc95595c5a
2021-06-25 11:46:28 +00:00
malavan fb31e21ec7 add tags hopefully no need to kill stunnel
Former-commit-id: 6b49258ba88874075e18e71911f472bc95595c5a
2021-06-25 11:46:28 +00:00
John Sully 714c369f95 Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: ecc69952dfd1f145e1aff12bca56a4b4e102d669
2021-06-25 06:21:58 +00:00
John Sully fd352812d5 Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: ecc69952dfd1f145e1aff12bca56a4b4e102d669
2021-06-25 06:21:58 +00:00
John Sully 4eaf1fbb96 Avoid taking locks when we don't need to
Former-commit-id: 0d8d3ee9e217cd1f1366a117e6e212f610a028e1
2021-06-25 06:11:14 +00:00
John Sully 7e0a3e88b0 Avoid taking locks when we don't need to
Former-commit-id: 0d8d3ee9e217cd1f1366a117e6e212f610a028e1
2021-06-25 06:11:14 +00:00
John Sully 7a01ee9f5f OPTIMIZATION: Only notify the condition variable when needed
Former-commit-id: 11f07b49c613f54cef682da1e3c8fc54918809b0
2021-06-25 06:11:01 +00:00
John Sully 4262bed9de OPTIMIZATION: Only notify the condition variable when needed
Former-commit-id: 11f07b49c613f54cef682da1e3c8fc54918809b0
2021-06-25 06:11:01 +00:00
John Sully 80860b8224 Reenable LTO
Former-commit-id: e7c1e1c9d8021f48c4081a9dfb84dba9da2521fc
2021-06-25 06:10:13 +00:00
John Sully 22b98b86fe Reenable LTO
Former-commit-id: e7c1e1c9d8021f48c4081a9dfb84dba9da2521fc
2021-06-25 06:10:13 +00:00
jsully 3cf4c05b2b Merge branch 'repl_backlog_rework' into 'keydbpro'
Replication backlog rework

See merge request keydb-dev/KeyDB-Pro!23

Former-commit-id: 6937d3be40fdc79dddc1852bf7fc8565984da006
2021-06-25 03:10:56 +00:00
jsully d35c7a425b Merge branch 'repl_backlog_rework' into 'keydbpro'
Replication backlog rework

See merge request keydb-dev/KeyDB-Pro!23

Former-commit-id: 6937d3be40fdc79dddc1852bf7fc8565984da006
2021-06-25 03:10:56 +00:00
vivek 0b47c29683 Primitive implementation of bypassing client buffer, stats are all messed up and print statements everywhere
Former-commit-id: 59b2ae8ff451f8a5ac2f3baf3c7b509f6872895e
2021-06-25 03:10:56 +00:00
vivek aa9afe4854 Primitive implementation of bypassing client buffer, stats are all messed up and print statements everywhere
Former-commit-id: 59b2ae8ff451f8a5ac2f3baf3c7b509f6872895e
2021-06-25 03:10:56 +00:00
John Sully 368a619dbe remove unnecessary newline
Former-commit-id: 532af9cd0286ac6ece6f401c42aea18e36d16f7c
2021-06-25 02:46:32 +00:00
John Sully 134beafb76 remove unnecessary newline
Former-commit-id: 532af9cd0286ac6ece6f401c42aea18e36d16f7c
2021-06-25 02:46:32 +00:00
John Sully 001323e3f3 Avoid holding the lockPendingWrite for too long and deadlocking due to lock inversion
Former-commit-id: a4b49fbec60e2333a4407d24383ae204d5d2b413
2021-06-25 02:31:17 +00:00
John Sully 5082c186f9 Avoid holding the lockPendingWrite for too long and deadlocking due to lock inversion
Former-commit-id: a4b49fbec60e2333a4407d24383ae204d5d2b413
2021-06-25 02:31:17 +00:00
John Sully a236ba397c Remove fPendingReplicaWrite flag which can instead be calculated on demand
Former-commit-id: ae26afd13f955eb230b5c2cab20ec90db9b714ad
2021-06-25 01:54:38 +00:00
John Sully 47f515e1ae Remove fPendingReplicaWrite flag which can instead be calculated on demand
Former-commit-id: ae26afd13f955eb230b5c2cab20ec90db9b714ad
2021-06-25 01:54:38 +00:00
malavan 13493bd8ae don't fail on pkill
Former-commit-id: 7e187095eb82052c2ef0a37094a0cf3c0545c2f0
2021-06-24 22:51:14 +00:00
malavan 234179c963 don't fail on pkill
Former-commit-id: 7e187095eb82052c2ef0a37094a0cf3c0545c2f0
2021-06-24 22:51:14 +00:00
malavan 44498c7108 add local tmp dir
Former-commit-id: 7a8f6e7f3c2b4a3e10dabdb2961a39bdd859a2e0
2021-06-24 14:38:52 +00:00
malavan b9bcaeccd9 add local tmp dir
Former-commit-id: 7a8f6e7f3c2b4a3e10dabdb2961a39bdd859a2e0
2021-06-24 14:38:52 +00:00
malavan 60207f303e reset stunnel for jedis
Former-commit-id: 52d0e91046975791cc91ae230777f80ba2573dc9
2021-06-24 14:04:31 +00:00
malavan 1733911f2a reset stunnel for jedis
Former-commit-id: 52d0e91046975791cc91ae230777f80ba2573dc9
2021-06-24 14:04:31 +00:00
malavan 3d0c9529be add jedis-test
Former-commit-id: 964e0313169f3d942d9ea6d7c4af181a20f9c663
2021-06-24 13:34:08 +00:00
malavan 6c280e71c3 add jedis-test
Former-commit-id: 964e0313169f3d942d9ea6d7c4af181a20f9c663
2021-06-24 13:34:08 +00:00
christianEQ c3f0773636 removed unused command line options
Former-commit-id: 1b3b066c2530f51d31e89b1814d48bb4551df5aa
2021-06-22 17:13:35 +00:00
christianEQ 23ef7cfd21 changed --ms to --time
Former-commit-id: aad16337cdec027d7f41e50352bbd0890c6bfe5e
2021-06-21 19:57:14 +00:00
christianEQ 49900d0c92 added more verbose options
Former-commit-id: d584a7c2023d7a805179320b10c94ae89c96cc1c
2021-06-21 18:40:37 +00:00
christianEQ d180140c85 -t threads option
Former-commit-id: 151ef31abb8a0bfb4f07dfd7a9b3256ba3e75bf9
2021-06-21 18:36:21 +00:00
malavan ea2eaef3a1 redo build instead of upload and download
Former-commit-id: 841cdb2a429576ef2a6fb299aef2156ec56df243
2021-06-19 07:07:28 +00:00
malavan e0eb2051c0 redo build instead of upload and download
Former-commit-id: 841cdb2a429576ef2a6fb299aef2156ec56df243
2021-06-19 07:07:28 +00:00
malavan f4f1c74082 copy entire directory not just src
Former-commit-id: f75c88039383e1ebb83ea3254c07541b8575e869
2021-06-19 07:01:35 +00:00
malavan b39f8e859c copy entire directory not just src
Former-commit-id: f75c88039383e1ebb83ea3254c07541b8575e869
2021-06-19 07:01:35 +00:00
malavan be1d37f06f try to maintain combined files between jobs
Former-commit-id: acf5161c353ddcbbdfc45b4e85ae978bb442e507
2021-06-19 06:55:41 +00:00
malavan f9fd39673f try to maintain combined files between jobs
Former-commit-id: acf5161c353ddcbbdfc45b4e85ae978bb442e507
2021-06-19 06:55:41 +00:00
christianEQ c0b71bc9da added starting line so diagnostic tool doesnt look frozen at first
Former-commit-id: bb1714beb3b2e62fee676c0ded92f7686a673acc
2021-06-18 20:21:47 +00:00
christianEQ e35cb83bd8 Merge remote-tracking branch 'origin/unstable' into diagnostic-tool
Former-commit-id: 985477ea8c5fd62814e87970d9d663561fddc580
2021-06-18 20:19:31 +00:00
christianEQ 23dcfe0704 detect stagnating server load before 100% (diagnostic tool)
Former-commit-id: 98142d6130742b4d1c76a99051d54541255e2b6b
2021-06-18 19:01:51 +00:00
malavan 35f59a0c5c add -j to make test
Former-commit-id: 7509875974938f1087ace2437ceb95d8baeeeffa
2021-06-18 17:50:35 +00:00
malavan a14a32f40f add -j to make test
Former-commit-id: 7509875974938f1087ace2437ceb95d8baeeeffa
2021-06-18 17:50:35 +00:00
malavan 9f3b21112c use runner login for clone
Former-commit-id: 64cc31184d3a91386b689870de7d96e423fb58af
2021-06-18 17:15:49 +00:00
malavan 9e3aef3893 use runner login for clone
Former-commit-id: 64cc31184d3a91386b689870de7d96e423fb58af
2021-06-18 17:15:49 +00:00
christianEQ bbf1c456c4 added config option for time to spin up new client threads (diagnostic tool)
Former-commit-id: 2d4bc8f7db0292bd64e6febc4f84299b0f3554f8
2021-06-18 16:58:16 +00:00
christianEQ 37ac81cdc7 detect full load + server threads (diagnostic tool)
Former-commit-id: ad01eb66e72582ca7b249c8ef44049ef24d2a302
2021-06-18 16:49:25 +00:00
malavan f0a1725880 remove artifacts
Former-commit-id: dd62d85dd101b1f9947af0b335874fd28fee21bc
2021-06-18 16:32:15 +00:00
malavan 976cc2608a remove artifacts
Former-commit-id: dd62d85dd101b1f9947af0b335874fd28fee21bc
2021-06-18 16:32:15 +00:00
malavan 54ba9ad22a remove allow_failure
Former-commit-id: 55f62ea9f6ea4c6adefc81ad90a8bd1567406b72
2021-06-18 16:19:11 +00:00
malavan 9859761ef9 remove allow_failure
Former-commit-id: 55f62ea9f6ea4c6adefc81ad90a8bd1567406b72
2021-06-18 16:19:11 +00:00
malavan 6f2a74ec1f force test to run even if build hangs
Former-commit-id: e7a68417ae133402e1f53a6dbbdabbbfc2b3edf7
2021-06-18 16:16:19 +00:00
malavan 9722a3a182 force test to run even if build hangs
Former-commit-id: e7a68417ae133402e1f53a6dbbdabbbfc2b3edf7
2021-06-18 16:16:19 +00:00
malavan a4d6891b24 syntax error in last commit
Former-commit-id: 4638526c0e68d9b153a5ea11f8ef83b0ad2f42de
2021-06-18 15:34:18 +00:00
malavan 4770045e9a syntax error in last commit
Former-commit-id: 4638526c0e68d9b153a5ea11f8ef83b0ad2f42de
2021-06-18 15:34:18 +00:00
malavan af0861f8f6 add src/ as an artifact
Former-commit-id: 315bd739a9db97c4e680212dfd31580828c3fcc6
2021-06-18 15:32:58 +00:00
malavan 8f765d6aa1 add src/ as an artifact
Former-commit-id: 315bd739a9db97c4e680212dfd31580828c3fcc6
2021-06-18 15:32:58 +00:00
malavan 3cc74fb57a wrong syntax on last commit
Former-commit-id: 587ed953fa8c6a9ed9faf1c406e813ba79e9b7bf
2021-06-18 15:27:30 +00:00
malavan 7703d6da2c wrong syntax on last commit
Former-commit-id: 587ed953fa8c6a9ed9faf1c406e813ba79e9b7bf
2021-06-18 15:27:30 +00:00
malavan 435ac8eef8 parallel make, order tests
Former-commit-id: d01afd8324e415b92a292c199703999df1f72457
2021-06-18 15:23:42 +00:00
malavan 7f6443e677 parallel make, order tests
Former-commit-id: d01afd8324e415b92a292c199703999df1f72457
2021-06-18 15:23:42 +00:00
christianEQ 7ae71e9315 detect client cpu usage in diagnostic tool
Former-commit-id: ab26635dee0958cbedd4791a53f298d4c23d813b
2021-06-17 20:40:10 +00:00
malavan 3315a45cf9 uninstall before install
Former-commit-id: f30afe82d799ad680343cdcb7b80e8c257026ff7
2021-06-17 20:38:56 +00:00
malavan f063ef2ca2 uninstall before install
Former-commit-id: f30afe82d799ad680343cdcb7b80e8c257026ff7
2021-06-17 20:38:56 +00:00
malavan d7bee39125 init git submodule
Former-commit-id: e96906d095fed6b37c9ece79526cfd0a88819e4d
2021-06-17 18:52:36 +00:00
malavan 3d86a20b0f init git submodule
Former-commit-id: e96906d095fed6b37c9ece79526cfd0a88819e4d
2021-06-17 18:52:36 +00:00
christianEQ 94f2882f04 accurate cpu usage in diagnostic tool
Former-commit-id: e1dd303dce35068e631ebbcbc56b251748676411
2021-06-17 18:32:11 +00:00
malavan 20102e5164 clean before build
Former-commit-id: 49805ee385381486476d2986cca9e9c3d50d68b5
2021-06-17 18:30:11 +00:00
malavan ce4ab9fdc4 clean before build
Former-commit-id: 49805ee385381486476d2986cca9e9c3d50d68b5
2021-06-17 18:30:11 +00:00
malavan 8af94cc2f1 add CI for gitlab
Former-commit-id: 37ba6d28030f4cf1866cc9c182833fe247348f38
2021-06-17 08:44:29 +00:00
malavan 7e209b2ff4 add CI for gitlab
Former-commit-id: 37ba6d28030f4cf1866cc9c182833fe247348f38
2021-06-17 08:44:29 +00:00
VivekSainiEQ 28fecbb838 More code cleanup
Former-commit-id: 8e9962b9b7b9093399451bf93d30e5b5d26e3d33
2021-06-16 19:41:55 +00:00
VivekSainiEQ 142d45fa5b More code cleanup
Former-commit-id: 8e9962b9b7b9093399451bf93d30e5b5d26e3d33
2021-06-16 19:41:55 +00:00
VivekSainiEQ b9546e014c Merge remote-tracking branch 'origin/keydbpro' into repl_backlog_rework
Former-commit-id: e9bfcef5429c747fd9f26a829fed2281c5ec2b25
2021-06-16 16:40:06 +00:00
VivekSainiEQ fcd96d92da Merge remote-tracking branch 'origin/keydbpro' into repl_backlog_rework
Former-commit-id: e9bfcef5429c747fd9f26a829fed2281c5ec2b25
2021-06-16 16:40:06 +00:00
Ubuntu d6be246f6c Optimized use of repl_lowest_off to reduce lock contention
Former-commit-id: 30a957e5399fe94675f0b6d2d34c24112d5a9734
2021-06-15 23:13:49 +00:00
Ubuntu ad6c69df28 Optimized use of repl_lowest_off to reduce lock contention
Former-commit-id: 30a957e5399fe94675f0b6d2d34c24112d5a9734
2021-06-15 23:13:49 +00:00
John Sully 592316ea53 Prevent test code crash due to no log data
Former-commit-id: 0a56a73bd9
2021-06-14 22:06:36 +00:00
Ubuntu bd3aff50c3 Relaxed locking, should run faster now
Former-commit-id: 5cec4d026dc1766b9ecbade6ec4b9d0e75a94e0f
2021-06-14 19:30:49 +00:00
Ubuntu 605f767d5e Relaxed locking, should run faster now
Former-commit-id: 5cec4d026dc1766b9ecbade6ec4b9d0e75a94e0f
2021-06-14 19:30:49 +00:00
John Sully 7fe221221c active defrag tests need to run single threaded because jemalloc has seperate mempools per thread and the numbers won't match otherwise
Former-commit-id: 3a1d3090f2
2021-06-14 16:32:47 +00:00
christianEQ 703fa0449b changed redis_flags names to keydb in makefile
Former-commit-id: ebcd106f1602b7e622e084070130c19e9c52d3a8
2021-06-14 16:09:42 +00:00
John Sully 71784390cb Fix deadlock in storage cache
Former-commit-id: e74711e8131cd29a1e0294fbb28e1737ee98afce
2021-06-14 06:32:58 +00:00
John Sully 5d6dee7f96 Fix deadlock in storage cache
Former-commit-id: e74711e8131cd29a1e0294fbb28e1737ee98afce
2021-06-14 06:32:58 +00:00
John Sully 0dbb71e47e Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: 975655ab7ff357c2d86d2368899325f88efe5310
2021-06-14 04:07:11 +00:00
John Sully d99bbcb823 Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: 975655ab7ff357c2d86d2368899325f88efe5310
2021-06-14 04:07:11 +00:00
John Sully 847056b28d Free objects immediately before adding to the GC list, this cuts down on mem consumption
Former-commit-id: 49d718ae9c1c8a850df5ffa2c550df3381ad7174
2021-06-14 04:06:34 +00:00
John Sully d4ee53860b Free objects immediately before adding to the GC list, this cuts down on mem consumption
Former-commit-id: 49d718ae9c1c8a850df5ffa2c550df3381ad7174
2021-06-14 04:06:34 +00:00
John Sully 38d4a33369 Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: efea1ce6ca09e09cfe83425c385d0ca1c47514ce
2021-06-14 03:51:09 +00:00
John Sully d565b83a26 Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: efea1ce6ca09e09cfe83425c385d0ca1c47514ce
2021-06-14 03:51:09 +00:00
John Sully 2334d4c236 Remove lock
Former-commit-id: bb8efe2ed942fd67d091b16bb27f67ccefcbbf19
2021-06-14 03:50:47 +00:00
John Sully 48f3265891 Remove lock
Former-commit-id: bb8efe2ed942fd67d091b16bb27f67ccefcbbf19
2021-06-14 03:50:47 +00:00
John Sully 51d9a7acd4 Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: 51c8b911b1de88065654eec87b88e1f46cf57e2a
2021-06-14 03:35:25 +00:00
John Sully 70f6e81fb2 Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: 51c8b911b1de88065654eec87b88e1f46cf57e2a
2021-06-14 03:35:25 +00:00
John Sully 8169e4b1e3 memefficiency tests need to run single threaded as jemalloc has seperate pools for threads
Former-commit-id: 02152c7bd8bc0462edd809122873ceb8644dc69a
2021-06-14 03:34:56 +00:00
John Sully 7b8c01f194 memefficiency tests need to run single threaded as jemalloc has seperate pools for threads
Former-commit-id: 02152c7bd8bc0462edd809122873ceb8644dc69a
2021-06-14 03:34:56 +00:00
John Sully ba9c3e9eff Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: 0f1b891c15ac27c4ad8a63a798c7dfa9fdcd2e01
2021-06-14 03:14:15 +00:00
John Sully 3e5019d124 Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: 0f1b891c15ac27c4ad8a63a798c7dfa9fdcd2e01
2021-06-14 03:14:15 +00:00
jsully 247291f368 Merge branch 'merge_6.2.2' into 'keydbpro'
Merge 6.2.2

See merge request keydb-dev/KeyDB-Pro!21

Former-commit-id: c1076b2311e8bc1217b7f5030f5f5ebea1e98215
2021-06-14 03:14:03 +00:00
jsully 717fe46c39 Merge branch 'merge_6.2.2' into 'keydbpro'
Merge 6.2.2

See merge request keydb-dev/KeyDB-Pro!21

Former-commit-id: c1076b2311e8bc1217b7f5030f5f5ebea1e98215
2021-06-14 03:14:03 +00:00
jsully 5c1cfab4fc Merge branch 'fixintermittentdoublefree' into 'keydbpro'
Fix issue #23 by adding global locks to FreeMemoryLazyFree

Closes #23

See merge request external-collab/keydb-pro-6!2

Former-commit-id: 2c2d09b123da72483d0b85e41a457ccce13e4fc5
2021-06-14 03:01:03 +00:00
jsully c94e110104 Merge branch 'fixintermittentdoublefree' into 'keydbpro'
Fix issue #23 by adding global locks to FreeMemoryLazyFree

Closes #23

See merge request external-collab/keydb-pro-6!2

Former-commit-id: 2c2d09b123da72483d0b85e41a457ccce13e4fc5
2021-06-14 03:01:03 +00:00
christianEQ 4eec70f762 several redis->keydb changes in sentinel.conf
Former-commit-id: ca12a57661907caf88d14cab93770a3cd73c0e49
2021-06-11 19:16:33 +00:00
christianEQ 980466a511 renamed redis mentions in runtest files
Former-commit-id: 7964bde33d9eeb522d9177b7bd3a3c598aae8e1c
2021-06-11 19:11:12 +00:00
christianEQ 05d126483b renamed redis mention in readme
Former-commit-id: 99441ab9df05dc76d5be9af9d9bd463efda9fc45
2021-06-11 19:10:35 +00:00
christianEQ 21459edab6 renamed workspace gitignore
Former-commit-id: 0e35c80e4d7868611858ba2670d85e50c64cef66
2021-06-11 19:10:12 +00:00
christianEQ 7cbc2bab80 renamed redis test files
Former-commit-id: 3c9eea9085527ef3538b06e7bf41a88e70d5290a
2021-06-11 19:09:40 +00:00
christianEQ 0b74d90cbc removed unreliable musl test and left only accurate new one
Former-commit-id: 748a4442c1b631a74be07b8ca404354e4bf0d0dc
2021-06-11 18:19:59 +00:00
christianEQ 2f57a1c536 changed redis.pid to keydb.pid where necessary
Former-commit-id: 3b79e45e73028e290c9c02676dd8a968b5a891b3
2021-06-11 18:19:02 +00:00
christianEQ 48ca005c0b removed outdated comment in server.cpp
Former-commit-id: c4e4211441b16e65a63aeb5faf3e73ac0cb6b2ac
2021-06-11 18:17:18 +00:00
christianEQ d6156edbb8 updated pkg/deb/conf/keydb.conf to use keydb name throughout
Former-commit-id: 9cc096e477046176859284d14f3c34c59e225128
2021-06-11 18:15:50 +00:00
christianEQ 8ff5479f12 removed the question issue template - doesn't seem necessary for us
Former-commit-id: 93730b37b4701eb31c9ed3edcb9ff2b34ddda996
2021-06-11 18:08:19 +00:00
christianEQ 013cf6de86 fixed flag var names in ci
Former-commit-id: 31bd67f19f554faf6fdef763aca4eac71f366694
2021-06-11 17:04:33 +00:00
christianEQ 7f230f478f don't enforce upper limit for requests issued; tool will run indefinitely
Former-commit-id: 7a5fff2bef5fc6aa37de42d29de616c10550f34d
2021-06-11 16:28:29 +00:00
VivekSainiEQ 267211edfe Merged in 6.2.2
Former-commit-id: 3fb9bb5b4fdfb8e09430c7bef6bf9421065adf0f
2021-06-10 20:11:14 +00:00
VivekSainiEQ e3d6c3446a Merged in 6.2.2
Former-commit-id: 3fb9bb5b4fdfb8e09430c7bef6bf9421065adf0f
2021-06-10 20:11:14 +00:00
malavan 6c4ff04b75 add global locks to FreeMemoryLazyFree
Former-commit-id: d850ce20219a3e29a6a816ebfa0d714963d6a88b
2021-06-09 21:49:15 +00:00
malavan ad8b766df1 add global locks to FreeMemoryLazyFree
Former-commit-id: d850ce20219a3e29a6a816ebfa0d714963d6a88b
2021-06-09 21:49:15 +00:00
VivekSainiEQ af803c36c5 Cleaned up code a bit, need to rewrite some comments to reflect new behaviour
Former-commit-id: 850ec766cd71614ce9e61c12414545cd212d3878
2021-06-08 23:10:53 +00:00
VivekSainiEQ 9f84bbead8 Cleaned up code a bit, need to rewrite some comments to reflect new behaviour
Former-commit-id: 850ec766cd71614ce9e61c12414545cd212d3878
2021-06-08 23:10:53 +00:00
VivekSainiEQ 70b0b0d3da Seems to pass multithreaded test cases, thank the lord
Former-commit-id: 6cbf70cfff5735f3d4ef2e980945b4b1a1f85971
2021-06-04 20:09:47 +00:00
VivekSainiEQ 43dc050850 Seems to pass multithreaded test cases, thank the lord
Former-commit-id: 6cbf70cfff5735f3d4ef2e980945b4b1a1f85971
2021-06-04 20:09:47 +00:00
VivekSainiEQ 7b8b69529f Removed unused variables
Former-commit-id: 48663bc480f7279a94c68aeebdd9721ca64f7038
2021-06-03 21:47:33 +00:00
VivekSainiEQ 76bf7d0b69 Removed unused variables
Former-commit-id: 48663bc480f7279a94c68aeebdd9721ca64f7038
2021-06-03 21:47:33 +00:00
VivekSainiEQ 4ca223609c Single threaded tests work now
Former-commit-id: 0e760d7c71231c7f52102909a31fc8db1b3e2860
2021-06-03 20:44:32 +00:00
VivekSainiEQ 03120ea5cd Single threaded tests work now
Former-commit-id: 0e760d7c71231c7f52102909a31fc8db1b3e2860
2021-06-03 20:44:32 +00:00
John Sully cb744773c6 Fix collab issue #26
Former-commit-id: 2392879772a77fc30c856488b9911d194ced827b
2021-06-03 04:43:38 +00:00
John Sully bad63230fd Fix collab issue #26
Former-commit-id: 2392879772a77fc30c856488b9911d194ced827b
2021-06-03 04:43:38 +00:00
VivekSainiEQ e5bbdafdcb Sync works single threaded properly, passes all but one testcase (which hangs)
Former-commit-id: 9a6ca3a5d906b9d87fe70652d218decbb2775ac1
2021-06-02 23:41:36 +00:00
VivekSainiEQ e8a24e31aa Sync works single threaded properly, passes all but one testcase (which hangs)
Former-commit-id: 9a6ca3a5d906b9d87fe70652d218decbb2775ac1
2021-06-02 23:41:36 +00:00
christianEQ 3bf6bba21e fixed code style for ifdef
Former-commit-id: 93c41fa31c91098af98d2bc0362eb29685cd6678
2021-06-02 15:02:27 +00:00
christianEQ 66a384e08e fixed code style for ifdef
Former-commit-id: 93c41fa31c91098af98d2bc0362eb29685cd6678
2021-06-02 15:02:27 +00:00
John Sully 106dbd9ebe Merge branch 'keydbpro_collab' into multithread_load
Former-commit-id: b580a5561220bc6dc7bc073135f3045ba0cdda51
2021-06-02 04:24:49 +00:00
John Sully 9d3c917836 Merge branch 'keydbpro_collab' into multithread_load
Former-commit-id: b580a5561220bc6dc7bc073135f3045ba0cdda51
2021-06-02 04:24:49 +00:00
John Sully 5012bc6d56 Merge branch 'merge_6.2.2' into keydbpro_collab
Former-commit-id: 00f3646df54d25443d8d42c92de60fdeef4fbbe8
2021-06-02 02:12:16 +00:00
John Sully 6c1da9873e Merge branch 'merge_6.2.2' into keydbpro_collab
Former-commit-id: 00f3646df54d25443d8d42c92de60fdeef4fbbe8
2021-06-02 02:12:16 +00:00
John Sully df521863e0 Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: 6eb1417295ecc6ce23677e9a8e1c756579177629
2021-06-02 02:11:29 +00:00
John Sully 3b3b8216be Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: 6eb1417295ecc6ce23677e9a8e1c756579177629
2021-06-02 02:11:29 +00:00
John Sully 13639a6538 Fix merge issue with wrong return type
Former-commit-id: 1640a2fefb8f09c7b6b335838f14a7fd3a51ae88
2021-06-02 02:10:00 +00:00
John Sully df60b4ad91 Fix merge issue with wrong return type
Former-commit-id: 1640a2fefb8f09c7b6b335838f14a7fd3a51ae88
2021-06-02 02:10:00 +00:00
John Sully fbe6ce2a27 Merge branch 'unstable' into keydbpro
Former-commit-id: 657789db5c3bd0fbbfc15be150d6eb525554251c
2021-06-02 02:08:18 +00:00
John Sully aedb2393fe Merge branch 'unstable' into keydbpro
Former-commit-id: 657789db5c3bd0fbbfc15be150d6eb525554251c
2021-06-02 02:08:18 +00:00
John Sully 64d0a1c98a Merge branch 'merge_6.2.2' into keydbpro_collab
Former-commit-id: 54fe037e4e215b1e5bdb42b567c6df04a69ba150
2021-06-02 02:05:44 +00:00
John Sully 170641144c Merge branch 'merge_6.2.2' into keydbpro_collab
Former-commit-id: 54fe037e4e215b1e5bdb42b567c6df04a69ba150
2021-06-02 02:05:44 +00:00
jsully 8586bc1aea Merge branch 'fixleakindictdelete' into 'keydbpro'
fix leak caused by dict entry not being added to GCList

See merge request keydb-dev/KeyDB-Pro!20

Former-commit-id: 92c8c6d854c3029269f695d0f9e4afe80c1e48f6
2021-06-02 00:01:52 +00:00
jsully 40b9d8974f Merge branch 'fixleakindictdelete' into 'keydbpro'
fix leak caused by dict entry not being added to GCList

See merge request keydb-dev/KeyDB-Pro!20

Former-commit-id: 92c8c6d854c3029269f695d0f9e4afe80c1e48f6
2021-06-02 00:01:52 +00:00
jsully 6841a4ef1a Merge branch 'jesse/update-readme-build-instructions' into 'PRO_RELEASE_6'
Add additional libraries that need to be installed for building pro

See merge request keydb-dev/KeyDB-Pro!16

Former-commit-id: b18a4f718f40059c30dba6f8ceb2c7612dbcf392
2021-06-02 00:01:33 +00:00
jsully 85f466d8fe Merge branch 'jesse/update-readme-build-instructions' into 'PRO_RELEASE_6'
Add additional libraries that need to be installed for building pro

See merge request keydb-dev/KeyDB-Pro!16

Former-commit-id: b18a4f718f40059c30dba6f8ceb2c7612dbcf392
2021-06-02 00:01:33 +00:00
jsully cdfd3bf870 Merge branch 'monkey_blocking' into 'keydbpro'
Monkey Improvements

See merge request keydb-dev/KeyDB-Pro!13

Former-commit-id: 130434f01b4bd27c14502b005b5dc71daa6b9cae
2021-06-02 00:01:19 +00:00
jsully c32c53a624 Merge branch 'monkey_blocking' into 'keydbpro'
Monkey Improvements

See merge request keydb-dev/KeyDB-Pro!13

Former-commit-id: 130434f01b4bd27c14502b005b5dc71daa6b9cae
2021-06-02 00:01:19 +00:00
John Sully 6b3e7e700a We need to refactor to gurantee the key is visible when loading subexpires. Keys may be temporarily invisible while waiting to be added to the storage
Former-commit-id: 222eecb95925f7c60e28a5717d73163ad64b522b
2021-06-01 23:59:22 +00:00
John Sully 82f8bfaa3d We need to refactor to gurantee the key is visible when loading subexpires. Keys may be temporarily invisible while waiting to be added to the storage
Former-commit-id: 222eecb95925f7c60e28a5717d73163ad64b522b
2021-06-01 23:59:22 +00:00
John Sully b6a63ce5c3 Merge branch 'keydbpro_collab' into multithread_load
Former-commit-id: ffd1225c007e3d1eaecb6b71e215d1e08364aa51
2021-06-01 22:31:52 +00:00
John Sully 18f67cab17 Merge branch 'keydbpro_collab' into multithread_load
Former-commit-id: ffd1225c007e3d1eaecb6b71e215d1e08364aa51
2021-06-01 22:31:52 +00:00
John Sully 7b456ab0db Fix lock mismatch
Former-commit-id: 98eb0e778bc3a5ff7da917d39997b2fdb4adbca6
2021-06-01 22:15:35 +00:00
John Sully ecd450fc49 Fix lock mismatch
Former-commit-id: 98eb0e778bc3a5ff7da917d39997b2fdb4adbca6
2021-06-01 22:15:35 +00:00
christianEQ a6d12fe713 working diag tool prototype
Former-commit-id: 20775387a55743c59cbca1096bb2c071c29fcd27
2021-06-01 20:54:48 +00:00
John Sully f5391f23b7 Reduce lock contention when loading to a storage provider
Former-commit-id: 58bc777f2215918043325753b6e2bf89dc3108f7
2021-06-01 20:01:41 +00:00
John Sully 3e74b3dfe3 Reduce lock contention when loading to a storage provider
Former-commit-id: 58bc777f2215918043325753b6e2bf89dc3108f7
2021-06-01 20:01:41 +00:00
John Sully 66af36ec4f Merge branch 'keydbpro_collab' into multithread_load
Former-commit-id: 31ddf772cd89344017042a18547ae83a60ce02b9
2021-06-01 19:18:19 +00:00
John Sully 190cf3a47d Merge branch 'keydbpro_collab' into multithread_load
Former-commit-id: 31ddf772cd89344017042a18547ae83a60ce02b9
2021-06-01 19:18:19 +00:00
John Sully 7dde8c69d3 Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: 0f2132505470ca63375f53b54cb6751b604d92f9
2021-06-01 19:17:54 +00:00
John Sully b484bce57c Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: 0f2132505470ca63375f53b54cb6751b604d92f9
2021-06-01 19:17:54 +00:00
John Sully 6044000963 Implement bulkInsert for rocksdb
Former-commit-id: e9abae77d6ae18e21d7dac0cbdd563f572ac3d03
2021-06-01 19:17:40 +00:00
John Sully 3633e6e8df Implement bulkInsert for rocksdb
Former-commit-id: e9abae77d6ae18e21d7dac0cbdd563f572ac3d03
2021-06-01 19:17:40 +00:00
John Sully e9712d4fff Initial bulkInsert implementation
Former-commit-id: 2a721d4dff3c9f78ec4ba1c7b490ea1f5d216a89
2021-06-01 19:15:01 +00:00
John Sully c37c948cec Initial bulkInsert implementation
Former-commit-id: 2a721d4dff3c9f78ec4ba1c7b490ea1f5d216a89
2021-06-01 19:15:01 +00:00
John Sully 86e56e87a9 Merge remote-tracking branch 'collab/keydbpro' into multithread_load
Former-commit-id: a09454b3a4b295b2d04bdb7d742db7f9a3e17be7
2021-05-31 01:16:01 +00:00
John Sully 1e120f2287 Merge remote-tracking branch 'collab/keydbpro' into multithread_load
Former-commit-id: a09454b3a4b295b2d04bdb7d742db7f9a3e17be7
2021-05-31 01:16:01 +00:00
John Sully 73f8a791aa Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: 40187ebd4cc479fa86a3ee5cca9bedef7d488ee7
2021-05-31 01:15:30 +00:00
John Sully f9cf1d67ae Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: 40187ebd4cc479fa86a3ee5cca9bedef7d488ee7
2021-05-31 01:15:30 +00:00
John Sully 26cc3b5414 Eliminate unnecessary global locks
Former-commit-id: 8f924ed0979f3cf7cd290395d1b1eec358979325
2021-05-31 01:14:28 +00:00
John Sully e507883b22 Eliminate unnecessary global locks
Former-commit-id: 8f924ed0979f3cf7cd290395d1b1eec358979325
2021-05-31 01:14:28 +00:00
John Sully 792a217ed7 Fix deadlock in async work queue
Former-commit-id: 3265f2908e8d3aa567b3b9e6b141a7881c795053
2021-05-31 01:14:11 +00:00
John Sully 24d55e8a9e Fix deadlock in async work queue
Former-commit-id: 3265f2908e8d3aa567b3b9e6b141a7881c795053
2021-05-31 01:14:11 +00:00
John Sully 4f8183fc6a Don't pass on flags indicating membership in a list
Former-commit-id: b1f662d639
2021-05-30 05:11:18 +00:00
John Sully 1cf10d50d8 Merge branch 'unstable' into keydbpro
Former-commit-id: 4fd95b064648ee3d02097a1c2dabf306978b44f9
2021-05-30 04:28:09 +00:00
John Sully b2d8707d1f Merge branch 'unstable' into keydbpro
Former-commit-id: 4fd95b064648ee3d02097a1c2dabf306978b44f9
2021-05-30 04:28:09 +00:00
John Sully f70016f7f3 Fix a leak in the benchmark
Former-commit-id: aa5b27b040
2021-05-30 02:55:39 +00:00
John Sully 0083e887cb Fix merge issue with module test script
Former-commit-id: 10d254ec1b
2021-05-30 02:45:06 +00:00
John Sully 136da0109b Ensure our connections are touched only on the right thread
Former-commit-id: e8a44821d0
2021-05-30 02:08:30 +00:00
John Sully b06e054df7 Handle race where a different thread cancels the replication but we haven't closed the connection
Former-commit-id: 92e48f0717
2021-05-30 02:08:02 +00:00
John Sully 57668c22d0 Delete pipe on the right thread so event handlers are cleaned up
Former-commit-id: 9742c44db5
2021-05-30 02:07:31 +00:00
John Sully c059411e28 Don't leave dangling client pointers in the process list
Former-commit-id: 5d16f51950
2021-05-30 02:06:47 +00:00
John Sully 3d297a7ca9 Don't leak AE control pipes to fork children
Former-commit-id: 1ed2e8b5bc
2021-05-30 02:06:20 +00:00
John Sully 45b04d0009 Fix branding
Former-commit-id: b20803b766
2021-05-29 07:08:01 +00:00
John Sully ffb285cdfe Fix cluster test failures
Former-commit-id: 8cf1daf823
2021-05-29 07:07:54 +00:00
John Sully 333a5a5fa5 Merge branch 'unstable' into keydbpro
Former-commit-id: 14c24ce161ddcbddb701a20062659261397cb0e4
2021-05-29 06:49:05 +00:00
John Sully aab7bbdf4c Merge branch 'unstable' into keydbpro
Former-commit-id: 14c24ce161ddcbddb701a20062659261397cb0e4
2021-05-29 06:49:05 +00:00
John Sully 95260c1146 Mac build break fixes
Former-commit-id: 083b54472c
2021-05-28 22:40:03 -04:00
John Sully 2ad6491c38 Prevent partial sync in test that requires only full syncs
Former-commit-id: 1b9fea0669
2021-05-29 02:22:20 +00:00
John Sully 35895e5272 Fix failover command test failures
Former-commit-id: d3c37c7159
2021-05-29 01:19:12 +00:00
John Sully 403c0fede2 Remove dup'd code from merge
Former-commit-id: 807f020184
2021-05-29 01:08:52 +00:00
John Sully da53561354 ProcessingEventsWhileBlocked is relevant only to the current thread
Former-commit-id: b400be68b7
2021-05-29 01:08:43 +00:00
John Sully 2c5b0926f3 Make processClients reentrant
Former-commit-id: e39bdb58ec
2021-05-29 01:08:14 +00:00
John Sully b6d5588fe6 Don't have dangling expires
Former-commit-id: 83c8977033
2021-05-29 01:07:46 +00:00
John Sully 7cd60ccf36 Use correct make flags
Former-commit-id: 682990eeb3
2021-05-29 01:07:35 +00:00
John Sully ad631c3fe2 Repair async rehash code removed by merge
Former-commit-id: 14a3ab8133c474bf8f1ad636c8699d5d59c5394e
2021-05-29 00:24:46 +00:00
John Sully 0680492265 Repair async rehash code removed by merge
Former-commit-id: 14a3ab8133c474bf8f1ad636c8699d5d59c5394e
2021-05-29 00:24:46 +00:00
John Sully 7d6aa9ada3 Merge branch 'unstable' into keydbpro
Former-commit-id: 205d8f18d2bb8df5253bab40578b006b7aa73fd5
2021-05-28 23:32:46 +00:00
John Sully a43a69f47a Merge branch 'unstable' into keydbpro
Former-commit-id: 205d8f18d2bb8df5253bab40578b006b7aa73fd5
2021-05-28 23:32:46 +00:00
VivekSainiEQ 7bdb7882d4 Added more synchronization and fixed some data races
Former-commit-id: 183e015dac6f85df1c94d0761e89bc23d9f53319
2021-05-27 18:57:23 +00:00
VivekSainiEQ e184db14e4 Added more synchronization and fixed some data races
Former-commit-id: 183e015dac6f85df1c94d0761e89bc23d9f53319
2021-05-27 18:57:23 +00:00
VivekSainiEQ 59598b0402 Added transmitted RDB lock
Former-commit-id: 4b32167afc85742d85ff9b47b2c2e0b6b02e140a
2021-05-26 20:10:33 +00:00
VivekSainiEQ a7d7ea5beb Added transmitted RDB lock
Former-commit-id: 4b32167afc85742d85ff9b47b2c2e0b6b02e140a
2021-05-26 20:10:33 +00:00
John Sully 5a43dcdbcd Ensure multi-thread handling of cached master is equivalent to single thread case
Former-commit-id: 7ee766aee1
2021-05-26 17:29:47 +00:00
John Sully 7b6d758463 Avoid differences between single thread and multi-thread
Former-commit-id: 848c5ad784
2021-05-26 17:29:01 +00:00
malavan 4df6b6fe36 fix leak caused by dict entry not being added to GCList
Former-commit-id: d8c1b3b6ec64f63fdff04d53102e4563c2c6764a
2021-05-26 17:01:51 +00:00
malavan 7b921a3324 fix leak caused by dict entry not being added to GCList
Former-commit-id: d8c1b3b6ec64f63fdff04d53102e4563c2c6764a
2021-05-26 17:01:51 +00:00
John Sully 586eaa3409 Eliminate test issue while clients wait for async free
Former-commit-id: a41fb1b036
2021-05-26 01:18:47 +00:00
John Sully 598887ec75 Fix failure sending deferred aggregate lengths to clients on other threads (merge bug)
Former-commit-id: 915117ae7b
2021-05-25 20:51:18 +00:00
John Sully 45b724d03e Remove duplicate code
Former-commit-id: de5fa78762
2021-05-25 20:50:40 +00:00
John Sully 096ac1019d Fix TLS test failure due to tls-port not marked as runtime configurable
Former-commit-id: b0c8efd840
2021-05-25 20:50:23 +00:00
John Sully 554962b31e Fix crash in TLS due to merge
Former-commit-id: 1dcd5edbf9
2021-05-25 18:52:27 +00:00
John Sully 8e8773a574 Build break fix: Remove dependency on future C++ feature
Former-commit-id: 87d7fc8e5d
2021-05-25 18:52:08 +00:00
John Sully 221e4a3d13 More OS X build breaks
Former-commit-id: 100a747eab
2021-05-25 18:35:45 +00:00
John Sully acd9d5a0fa OS X build break fix
Former-commit-id: 105fd03ef8
2021-05-25 18:32:31 +00:00
John Sully 8fd5ac303b Fix uninitialized variable
Former-commit-id: 9395a9c1d9
2021-05-25 18:30:07 +00:00
John Sully 47054b40c9 Fix duplicate checks (resolve PR comments)
Former-commit-id: 02f7efd9d4
2021-05-25 16:57:49 +00:00
John Sully 655cdd7d3c Fix TLS Build Errors
Former-commit-id: aea86c5977
2021-05-25 16:55:59 +00:00
VivekSainiEQ 6f5e7e0bb5 Initialized serverTL in more places in module.cpp
Former-commit-id: 31cac772a925893c25c8ee7f67a13535818c752d
2021-05-25 16:55:47 +00:00
VivekSainiEQ ace622ba15 Fixed single threaded for real this time, need to add synchronization for multi threaded
Former-commit-id: 4d858dac1a503f4d518477212ba585069af22574
2021-05-21 17:05:55 +00:00
VivekSainiEQ 2154d54f6b Fixed single threaded for real this time, need to add synchronization for multi threaded
Former-commit-id: 4d858dac1a503f4d518477212ba585069af22574
2021-05-21 17:05:55 +00:00
John Sully 25f083a1f4 Merge tag '6.2.2' into unstable
Former-commit-id: 93ebb31b17
2021-05-21 05:54:39 +00:00
christianEQ a9aec03dde license status OK if not checking license
Former-commit-id: 6bfdc9d41dc638989d50f005af8d66e4ed47ce77
2021-05-20 19:09:02 +00:00
christianEQ 7a0a307b6c license status OK if not checking license
Former-commit-id: 6bfdc9d41dc638989d50f005af8d66e4ed47ce77
2021-05-20 19:09:02 +00:00
John Sully f6b81914d8 Merge tag '6.2.1' into unstable
Former-commit-id: bfed57e3e0
2021-05-19 02:59:48 +00:00
Malavan 0809cc1e0c Fix issue with INVALID_EXPIRE overlapping with mask
Former-commit-id: b66949d8c0a97110e22c68607411fa1095226162
2021-05-17 21:38:42 +00:00
Malavan fb37f9e297 Merge remote-tracking branch 'upstream/unstable' into fixissue295
Former-commit-id: 25fab4ed4a42378f0e0d018db42a235c258f34fe
2021-05-17 21:35:43 +00:00
Malavan 03400d555a merge when and whenFull
Former-commit-id: 2e63ff052725f3aaf4c008ae7c86250c145f282e
2021-05-15 05:48:23 +00:00
Malavan 2d960bbbfe Speedup keyIsExpired by removing subkey search
Former-commit-id: 4f6935f98b491243669482f95be4e224bb463986
2021-05-07 09:40:23 +00:00
John Sully 6949ba3e74 Fix test hang
Former-commit-id: 23647390e6
2021-05-07 00:28:10 +00:00
VivekSainiEQ 89e9af0aef Changed branding in various locations
Former-commit-id: 96bca72bb4
2021-05-06 20:13:45 -04:00
John Sully 7cb340cbdd Pause execution during rdbLoadProgressCallback as its too risky to let it run
Former-commit-id: e70c01cb3e756d1e02ed190b76c73b7b7010c0d3
2021-05-06 00:42:49 +00:00
John Sully 88fe187e45 Pause execution during rdbLoadProgressCallback as its too risky to let it run
Former-commit-id: e70c01cb3e756d1e02ed190b76c73b7b7010c0d3
2021-05-06 00:42:49 +00:00
John Sully 760fff16bf Add endurance testing to better detect threading bugs
Former-commit-id: 945e428aa110968479fdcdfc2d5c5308a99eadc3
2021-05-06 00:09:07 +00:00
John Sully 007b4fc2a1 Add endurance testing to better detect threading bugs
Former-commit-id: 945e428aa110968479fdcdfc2d5c5308a99eadc3
2021-05-06 00:09:07 +00:00
VivekSainiEQ dc1fc6da7e Fixed data race? Seems to be passing multithreaded test cases now
Former-commit-id: cb13edd1200c1230fa7e313d69c69e06129951d3
2021-05-05 22:26:36 +00:00
VivekSainiEQ f050652e74 Fixed data race? Seems to be passing multithreaded test cases now
Former-commit-id: cb13edd1200c1230fa7e313d69c69e06129951d3
2021-05-05 22:26:36 +00:00
VivekSainiEQ 57c50c45e0 Updated overhead calculation to only use repl_backlog_size
Former-commit-id: 6f93c7eb44d84bb143b4ad4fff3c6a5436ebaaf7
2021-05-05 17:04:08 +00:00
VivekSainiEQ 4f2b5bf50f Updated overhead calculation to only use repl_backlog_size
Former-commit-id: 6f93c7eb44d84bb143b4ad4fff3c6a5436ebaaf7
2021-05-05 17:04:08 +00:00
VivekSainiEQ a6ac4ec42d Updated maxmemory tests to account for overhead in new replication backlog behaviour
Former-commit-id: 4cd197959693dfe4d1497c3f703cf6aaa27d34ad
2021-05-05 16:37:02 +00:00
VivekSainiEQ 24956cb5af Updated maxmemory tests to account for overhead in new replication backlog behaviour
Former-commit-id: 4cd197959693dfe4d1497c3f703cf6aaa27d34ad
2021-05-05 16:37:02 +00:00
Malavan 93fbec9d7e add lookup limit to active subkey expire
Former-commit-id: 697e122cd9b4188329a4cef788891455d8fcd0c5
2021-05-04 22:28:03 +00:00
Malavan c1fb90e61a add lookup limit to active subkey expire
Former-commit-id: a9e2fb1731304d170f3b30f2c708cdbb44e8c092
2021-05-04 21:34:25 +00:00
John Sully de80fd8d29 Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: 446daf8f4c33005096372ad9e29ae9b3d465c64e
2021-05-03 22:58:56 +00:00
John Sully 28e11e5766 Merge branch 'keydbpro' into keydbpro_collab
Former-commit-id: 446daf8f4c33005096372ad9e29ae9b3d465c64e
2021-05-03 22:58:56 +00:00
jsully cfad8e971d Merge branch 'cluster_bugfix' into 'keydbpro'
Set repl_down_since in freeClientAsync

See merge request keydb-dev/KeyDB-Pro!12

Former-commit-id: bd7591fe50b1e5565da2fa521438b88058d4da07
2021-05-03 21:41:05 +00:00
jsully 62a8d238ca Merge branch 'cluster_bugfix' into 'keydbpro'
Set repl_down_since in freeClientAsync

See merge request keydb-dev/KeyDB-Pro!12

Former-commit-id: bd7591fe50b1e5565da2fa521438b88058d4da07
2021-05-03 21:41:05 +00:00
christian 950fe2d370 Set repl_down_since in freeClientAsync
Former-commit-id: fb4bd2984651837fadd1dbbbb56327e8452b4a2a
2021-05-03 21:41:04 +00:00
christian 101a0b9e5d Set repl_down_since in freeClientAsync
Former-commit-id: fb4bd2984651837fadd1dbbbb56327e8452b4a2a
2021-05-03 21:41:04 +00:00
John Sully 0afdff5ce7 Ensure multithread load works with FLASH storage
Former-commit-id: 24e2991c7aa2cef90a89b1640f7095235c5d34ed
2021-05-03 20:18:45 +00:00
John Sully e09f383bec Ensure multithread load works with FLASH storage
Former-commit-id: 24e2991c7aa2cef90a89b1640f7095235c5d34ed
2021-05-03 20:18:45 +00:00
VivekSainiEQ edfcc6700a Forgot to add server.h in last commit
Former-commit-id: 34fa6119c9a3f1533cc3e6e5d118dc6424a70891
2021-05-03 16:49:09 +00:00
VivekSainiEQ 3298a34592 Forgot to add server.h in last commit
Former-commit-id: 34fa6119c9a3f1533cc3e6e5d118dc6424a70891
2021-05-03 16:49:09 +00:00
John Sully ceff9cba70 Respect replica output buffer limits when adding large commands to the ring buffer
Former-commit-id: 37ec01cfd8a8da1e895c7cdc358d382d35ad59dd
2021-05-03 16:33:16 +00:00
John Sully 96738f6e16 Respect replica output buffer limits when adding large commands to the ring buffer
Former-commit-id: 37ec01cfd8a8da1e895c7cdc358d382d35ad59dd
2021-05-03 16:33:16 +00:00
VivekSainiEQ 51d7c726eb Now tracks memory and resizes 'accurately', need to fix cluster
Former-commit-id: 5f0e01cc199427ab6dfd7f8f28321f6a1f34fd1c
2021-05-03 16:29:11 +00:00
VivekSainiEQ 00be2d6a8c Now tracks memory and resizes 'accurately', need to fix cluster
Former-commit-id: 5f0e01cc199427ab6dfd7f8f28321f6a1f34fd1c
2021-05-03 16:29:11 +00:00
John Sully 9e194bf712 Don't sync too often it hurts perf
Former-commit-id: a20e89a457a0a682483c22f0f1cdb5c93c574d28
2021-05-03 04:15:46 +00:00
John Sully c1cc3c04ad Don't sync too often it hurts perf
Former-commit-id: a20e89a457a0a682483c22f0f1cdb5c93c574d28
2021-05-03 04:15:46 +00:00
John Sully 8fee5c8dc5 Fix remaining test failures
Former-commit-id: 37e607f9b13b6601ff52e74e613fb369cab22b56
2021-05-03 02:37:02 +00:00
John Sully 38a9edbacb Fix remaining test failures
Former-commit-id: 37e607f9b13b6601ff52e74e613fb369cab22b56
2021-05-03 02:37:02 +00:00
John Sully 995cd35f24 Fix issue where async load thread misses work
Former-commit-id: a24a7b093295c5f5d69feee9fbc37c64cfa8aa03
2021-04-30 18:48:23 +00:00
John Sully 35cfaa6eca Fix issue where async load thread misses work
Former-commit-id: a24a7b093295c5f5d69feee9fbc37c64cfa8aa03
2021-04-30 18:48:23 +00:00
John Sully 1133c3049f Fix majority of test issues with multithread load
Former-commit-id: 4db88176e33e3615ffb90852b49e76b12d5b4622
2021-04-30 18:45:37 +00:00
John Sully 9edfd54b63 Fix majority of test issues with multithread load
Former-commit-id: 4db88176e33e3615ffb90852b49e76b12d5b4622
2021-04-30 18:45:37 +00:00
John Sully e71a845fdd Initial implementation of multithread load
Former-commit-id: 87b0657c3acd7a3c89964afe1702851b44467c9a
2021-04-30 17:32:54 +00:00
John Sully afec826030 Initial implementation of multithread load
Former-commit-id: 87b0657c3acd7a3c89964afe1702851b44467c9a
2021-04-30 17:32:54 +00:00
VivekSainiEQ abe08bf8be Performance optimizations
Former-commit-id: 7fd83d467784d293f7da78b74f9b9763ce387238
2021-04-29 18:51:30 +00:00
VivekSainiEQ 7fa9844579 Performance optimizations
Former-commit-id: 7fd83d467784d293f7da78b74f9b9763ce387238
2021-04-29 18:51:30 +00:00
VivekSainiEQ 10e3eb917e Updated resize logic
Former-commit-id: e6d892ef21b7fc6f51433f32b01198038e555419
2021-04-29 17:01:06 +00:00
VivekSainiEQ c047c180df Updated resize logic
Former-commit-id: e6d892ef21b7fc6f51433f32b01198038e555419
2021-04-29 17:01:06 +00:00
benschermel bbe4de456b update README with community slack info
Former-commit-id: 6163e7b13a
2021-04-29 03:11:54 +00:00
christianEQ f7e86c62d2 fixed diagnostic tool to use correct obj files
Former-commit-id: 69747205fb0046b187b3cf67ad6bff7eda61de73
2021-04-28 16:02:44 +00:00
christianEQ d38445540f updated makefile vars to keydb names
Former-commit-id: b459f73fac6c38f3258a5eb5c8d8573deb6179f8
2021-04-27 21:14:05 +00:00
christianEQ b49eafa7db added keydb-diagnostic-tool binary (copy of benchmark)
Former-commit-id: d93ee004c5d87f6f81d3ca503b7745cc0e977600
2021-04-27 20:56:37 +00:00
VivekSainiEQ 2183eca2be Primitive implementation of bypassing client buffer, stats are all messed up and print statements everywhere
Former-commit-id: 8ae310fb0f7b53add826f76891da333b63860001
2021-04-26 22:13:32 +00:00
VivekSainiEQ d1ff0a428c Primitive implementation of bypassing client buffer, stats are all messed up and print statements everywhere
Former-commit-id: 8ae310fb0f7b53add826f76891da333b63860001
2021-04-26 22:13:32 +00:00
John Sully 5c045b8fed Optimize freeMemory by lazy freeing objects
Former-commit-id: cca31ed5ee2f42975f0051cfabf1e88720b3d678
2021-04-21 01:20:13 +00:00
John Sully 223869a4bb Optimize freeMemory by lazy freeing objects
Former-commit-id: cca31ed5ee2f42975f0051cfabf1e88720b3d678
2021-04-21 01:20:13 +00:00
John Sully 5413584b5c Better RocksDB perf tuning
Former-commit-id: cbe1e0a7c1b5dc49c1adff07b7c32042e673acf4
2021-04-21 01:19:44 +00:00
John Sully b5186a76d6 Better RocksDB perf tuning
Former-commit-id: cbe1e0a7c1b5dc49c1adff07b7c32042e673acf4
2021-04-21 01:19:44 +00:00
John Sully 1b14a3621f Fix issue where we reply a dangling pointer
Former-commit-id: fd11e490c39fe876d979eace5eaec56c645cdfcf
2021-04-21 01:19:29 +00:00
John Sully b0f16a88cd Fix issue where we reply a dangling pointer
Former-commit-id: fd11e490c39fe876d979eace5eaec56c645cdfcf
2021-04-21 01:19:29 +00:00
John Sully 24f5098d17 _dictExpandIfNeeded is called too late to be useful
Former-commit-id: 7f75ca5d3a9ed47465bceb22f5f74fd6f0760008
2021-04-21 01:18:38 +00:00
John Sully e0a17a583c _dictExpandIfNeeded is called too late to be useful
Former-commit-id: 7f75ca5d3a9ed47465bceb22f5f74fd6f0760008
2021-04-21 01:18:38 +00:00
John Sully 1c40cccc4c Allow prefetch even with a single thread
Former-commit-id: 2e68821b330a6bae8a352e37c3da643d504b2ce3
2021-04-12 04:44:52 +00:00
John Sully 4607953218 Allow prefetch even with a single thread
Former-commit-id: 2e68821b330a6bae8a352e37c3da643d504b2ce3
2021-04-12 04:44:52 +00:00
John Sully 53fdec20ec Avoid posting unnecessary async tasks
Former-commit-id: 1661d2a05943f96992be195f5dc32dd9a67c0e68
2021-04-12 03:44:29 +00:00
John Sully 616357cb50 Avoid posting unnecessary async tasks
Former-commit-id: 1661d2a05943f96992be195f5dc32dd9a67c0e68
2021-04-12 03:44:29 +00:00
John Sully 9dfdae6c3b Fix issue where GC is not free'd until a BGSAVE
Former-commit-id: 38523e6b508cf5f4b40c178dfe98554abea8f6bd
2021-04-12 03:44:15 +00:00
John Sully 357330dcd5 Fix issue where GC is not free'd until a BGSAVE
Former-commit-id: 38523e6b508cf5f4b40c178dfe98554abea8f6bd
2021-04-12 03:44:15 +00:00
John Sully 5ddbcd065e Make prefetch more aggressive
Former-commit-id: 25a5cfefcf7fa3451e92500f5d310290c4b6bbde
2021-04-12 03:42:05 +00:00
John Sully f2e86ecfb7 Make prefetch more aggressive
Former-commit-id: 25a5cfefcf7fa3451e92500f5d310290c4b6bbde
2021-04-12 03:42:05 +00:00
John Sully d30bee0c5f Don't prefetch when lock contention is low, it increases latency
Former-commit-id: 0d21614e0e5aba28acd364231823d51a3073081f
2021-04-12 03:41:53 +00:00
John Sully 4f7205f5ac Don't prefetch when lock contention is low, it increases latency
Former-commit-id: 0d21614e0e5aba28acd364231823d51a3073081f
2021-04-12 03:41:53 +00:00
John Sully 64cd1d636a Reduce P99 latency with async rehash
Former-commit-id: 7ea4c26fd82c0cdfa377183083f38a43336e480b
2021-04-12 03:39:13 +00:00
John Sully c0e07e5ae3 Reduce P99 latency with async rehash
Former-commit-id: 7ea4c26fd82c0cdfa377183083f38a43336e480b
2021-04-12 03:39:13 +00:00
John Sully 37a3df1fb7 Make prefetch configurable
Former-commit-id: 3b660347d70cc25d57119080bd43fb4671e36488
2021-04-12 03:38:57 +00:00
John Sully c63f8e7568 Make prefetch configurable
Former-commit-id: 3b660347d70cc25d57119080bd43fb4671e36488
2021-04-12 03:38:57 +00:00
John Sully 6d45e00876 Make prefetch more aggressive
Former-commit-id: 9cb0be197fb96d7fb3cb697c19b5be313b01337a
2021-04-12 03:24:05 +00:00
John Sully 164d10f655 Make prefetch more aggressive
Former-commit-id: 9cb0be197fb96d7fb3cb697c19b5be313b01337a
2021-04-12 03:24:05 +00:00
John Sully efef50b5d8 Don't prefetch when lock contention is low, it increases latency
Former-commit-id: 9b2629f6a20368cec8e55f0d006f3a67c8b770b7
2021-04-12 03:23:49 +00:00
John Sully 6f19b3acca Don't prefetch when lock contention is low, it increases latency
Former-commit-id: 9b2629f6a20368cec8e55f0d006f3a67c8b770b7
2021-04-12 03:23:49 +00:00
John Sully 47588d6da8 Reduce P99 latency with async rehash
Former-commit-id: 6c045837c7cf92dc92be35465229b482e09e46d2
2021-04-12 03:22:22 +00:00
John Sully a4f9891699 Reduce P99 latency with async rehash
Former-commit-id: 6c045837c7cf92dc92be35465229b482e09e46d2
2021-04-12 03:22:22 +00:00
John Sully a8d2656e87 DO not set the timethread as high priority, it can starve the server threads
Former-commit-id: faeac65371af9d6b6effe0886bcbdefaec24ad6d
2021-04-09 01:06:24 +00:00
John Sully 3534b0bf8c DO not set the timethread as high priority, it can starve the server threads
Former-commit-id: faeac65371af9d6b6effe0886bcbdefaec24ad6d
2021-04-09 01:06:24 +00:00
John Sully ef48760857 DO not set the timethread as high priority, it can starve the server threads
Former-commit-id: 5355207a0ad3f1a191fa06450490c792caa76e87
2021-04-09 01:05:55 +00:00
John Sully ee70e6ef6a DO not set the timethread as high priority, it can starve the server threads
Former-commit-id: 5355207a0ad3f1a191fa06450490c792caa76e87
2021-04-09 01:05:55 +00:00
John Sully b8ecf1e705 Make prefetch configurable
Former-commit-id: 16996c048042bd3799c8051645bbe7c54137d54c
2021-04-08 19:52:38 +00:00
John Sully 292d52890e Make prefetch configurable
Former-commit-id: 16996c048042bd3799c8051645bbe7c54137d54c
2021-04-08 19:52:38 +00:00
John Sully a9b727ff48 Avoid posting unnecessary async tasks
Former-commit-id: 08f63fdfd6c78388bba093ec2edda7d77fc9173e
2021-04-07 17:41:20 +00:00
John Sully 059d0dee23 Avoid posting unnecessary async tasks
Former-commit-id: 08f63fdfd6c78388bba093ec2edda7d77fc9173e
2021-04-07 17:41:20 +00:00
John Sully fb0a113dad Fix issue where GC is not free'd until a BGSAVE
Former-commit-id: e19350005b571591876e49219bfca75e905604a5
2021-04-07 17:30:59 +00:00
John Sully 06cd8b5f1f Fix issue where GC is not free'd until a BGSAVE
Former-commit-id: e19350005b571591876e49219bfca75e905604a5
2021-04-07 17:30:59 +00:00
John Sully c5b96a4ff1 Reduce connection latency for cluster clients
Former-commit-id: f1acee99bdaee4faf9e18cdf4734d51a73e78a41
2021-04-07 15:49:58 +00:00
John Sully 06891c8e7b Reduce connection latency for cluster clients
Former-commit-id: f1acee99bdaee4faf9e18cdf4734d51a73e78a41
2021-04-07 15:49:58 +00:00
John Sully 08265654d9 Fix build break from merge conflicts
Former-commit-id: 5052388bd43b0e42430fd741fb2b403544684246
2021-04-07 15:25:22 +00:00
John Sully e44e85e042 Fix build break from merge conflicts
Former-commit-id: 5052388bd43b0e42430fd741fb2b403544684246
2021-04-07 15:25:22 +00:00
John Sully 90906c36af Merge branch 'keydbpro' of https://gitlab.eqalpha.com/external-collab/keydb-pro-6 into keydbpro_collab
Former-commit-id: e077756b140855cb5a7e60567abf845dbfbc162d
2021-04-07 15:14:59 +00:00
John Sully 2385f7443e Merge branch 'keydbpro' of https://gitlab.eqalpha.com/external-collab/keydb-pro-6 into keydbpro_collab
Former-commit-id: e077756b140855cb5a7e60567abf845dbfbc162d
2021-04-07 15:14:59 +00:00
jsully cc5c051de6 Merge branch 'flash_read_perf' into 'keydbpro'
Flash read perf

See merge request external-collab/keydb-pro-6!1

Former-commit-id: f6d7277f307b78f079dd99bf532cd26a7b62018d
2021-04-07 06:12:55 +00:00
jsully fbe0319ba2 Merge branch 'flash_read_perf' into 'keydbpro'
Flash read perf

See merge request external-collab/keydb-pro-6!1

Former-commit-id: f6d7277f307b78f079dd99bf532cd26a7b62018d
2021-04-07 06:12:55 +00:00
Cloud User 6cb110a4b8 Make high pri time thread configurable
Former-commit-id: 7e94207765d2166f46792aea0919786f3f30d7b3
2021-04-06 22:39:20 +00:00
Cloud User 9764bf43e4 Make high pri time thread configurable
Former-commit-id: 7e94207765d2166f46792aea0919786f3f30d7b3
2021-04-06 22:39:20 +00:00
christianEQ 61abb462c4 check for musl in logging.tcl as backtrace() is not available with it
Former-commit-id: b9fc00651c5740dced751a3700f6891f5dae0b8a
2021-04-05 11:09:49 -04:00
John Sully 7ecff2c81d Don't ensure if we don't have to
Former-commit-id: b7b678a3ada531890e67313c867b7b49b01fe41e
2021-04-01 18:17:05 +00:00
John Sully 7133b9dffa Don't ensure if we don't have to
Former-commit-id: b7b678a3ada531890e67313c867b7b49b01fe41e
2021-04-01 18:17:05 +00:00
jsully 11046122d1 Merge branch 'keydbpro' into 'flash_read_perf'
# Conflicts:
#   src/db.cpp
#   src/networking.cpp

Former-commit-id: e16c846b2b9e70f20981172287b19e585f81d73d
2021-04-01 17:25:31 +00:00
jsully f91b859668 Merge branch 'keydbpro' into 'flash_read_perf'
# Conflicts:
#   src/db.cpp
#   src/networking.cpp

Former-commit-id: e16c846b2b9e70f20981172287b19e585f81d73d
2021-04-01 17:25:31 +00:00
John Sully fad8cfb654 Fix issue #300
Former-commit-id: 22d0bca3a51bef7d42264b518b1c470df51fdc5e
2021-03-30 23:45:07 +00:00
John Sully 6caf6678b7 Fix issue #300
Former-commit-id: 22d0bca3a51bef7d42264b518b1c470df51fdc5e
2021-03-30 23:45:07 +00:00
John Sully 43cbcb6283 Fix issue #300
Former-commit-id: bee7f398c9c3b4c01b687d26194913bf215dca36
2021-03-30 23:44:34 +00:00
John Sully 30e5abf59f Fix issue #300
Former-commit-id: bee7f398c9c3b4c01b687d26194913bf215dca36
2021-03-30 23:44:34 +00:00
John Sully 0686803753 Fix issue #300
Former-commit-id: 571815035089d91c66c8ac744134921dcb3463ad
2021-03-30 23:30:41 +00:00
John Sully 802e0df3ac Fix issue #300
Former-commit-id: 59e70d9d56d9fe84992afb9bb0bfb4f332f68710
2021-03-30 23:30:17 +00:00
John Sully d533499d02 Fix crash in RDB save
Former-commit-id: b032809b3e978fe571b791179d32ecdc9c067045
2021-03-30 20:49:33 +00:00
John Sully a2fa45ad22 Fix crash in RDB save
Former-commit-id: b032809b3e978fe571b791179d32ecdc9c067045
2021-03-30 20:49:33 +00:00
John Sully 205a3a08fe Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: c4eefb1345209790e31b41401d1870473a401676
2021-03-30 20:44:36 +00:00
John Sully bc4428e0a6 Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: c4eefb1345209790e31b41401d1870473a401676
2021-03-30 20:44:36 +00:00
John Sully 8595e669a2 Fix crash in RDB save
Former-commit-id: ef1e122fcb039d25f60752ca27c9feb5e8cfbb31
2021-03-30 20:44:22 +00:00
John Sully 9b433d60b4 Fix crash in RDB save
Former-commit-id: ef1e122fcb039d25f60752ca27c9feb5e8cfbb31
2021-03-30 20:44:22 +00:00
jsully 2a6bb9356b Merge branch 'jesse/update-readme-build-instructions-default-branch' into 'keydbpro'
Add additional libraries that need to be installed for building pro

See merge request keydb-dev/KeyDB-Pro!17

Former-commit-id: d42c70048d4e4b7dd0ecc802742ff45f7c959b1c
2021-03-30 20:20:45 +00:00
jsully 0930736378 Merge branch 'jesse/update-readme-build-instructions-default-branch' into 'keydbpro'
Add additional libraries that need to be installed for building pro

See merge request keydb-dev/KeyDB-Pro!17

Former-commit-id: d42c70048d4e4b7dd0ecc802742ff45f7c959b1c
2021-03-30 20:20:45 +00:00
Jesse 420b8c2536 Add additional libraries that need to be installed for building pro
Former-commit-id: 303a0646b5510e310dfd03c7288d747f76ce3d62
2021-03-30 13:14:03 -07:00
Jesse af946c3e3f Add additional libraries that need to be installed for building pro
Former-commit-id: 303a0646b5510e310dfd03c7288d747f76ce3d62
2021-03-30 13:14:03 -07:00
Jesse 71916be8e0 Add additional libraries that need to be installed for building pro
Former-commit-id: 506d4229c46598330ed39d837196d790bf4867cb
2021-03-30 13:12:23 -07:00
Jesse b827cf20b8 Add additional libraries that need to be installed for building pro
Former-commit-id: 506d4229c46598330ed39d837196d790bf4867cb
2021-03-30 13:12:23 -07:00
Hanif Ariffin 393e88f3d3 Fix typo in error string
Former-commit-id: b8cd7d90264d9a2cafdff3d6feb2ca501edf366b
2021-03-30 13:52:47 -04:00
VivekSainiEQ a0ac5f67ff Added logic back to only acquire/release GIL if modules are enabled, without causing deadlocks
Former-commit-id: e80c892a964a5675a6296efb1b416585fe9e5d35
2021-03-30 13:46:03 -04:00
VivekSainiEQ 35a95a5fdc now acquire and release GIL every time you go to/wake from sleep
Former-commit-id: 79fd5e8efa73795b3f7c43b7867f316b24abcbc6
2021-03-30 13:46:03 -04:00
VivekSainiEQ 7ff439e4b1 Created and initialized seperate thread variables for modules
Former-commit-id: ab508bf18f8bcf20dddd258cd8cd8de97df64802
2021-03-30 13:46:03 -04:00
VivekSainiEQ faa788ae43 Readded getkeys to module build
Former-commit-id: 330eabc49fdf67b00c707ed49d8c2512728325a5
2021-03-30 13:46:03 -04:00
John Sully 866dcc954c Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: 907928d65dffee97a788609af40a462e53932d1e
2021-03-29 00:49:34 +00:00
John Sully a28afc203b Enable LTO
Former-commit-id: a6edb104b7142b8e76048e0534e342048ade08d6
2021-03-29 00:47:50 +00:00
John Sully ec166f3a91 Enable LTO
Former-commit-id: a6edb104b7142b8e76048e0534e342048ade08d6
2021-03-29 00:47:50 +00:00
John Sully cff7ee08d5 Prevent unnecessary copies in replication scenarios
Former-commit-id: b152a9bd88c081ce98eebe9a7af49649e60e5523
2021-03-28 22:43:15 +00:00
John Sully 929417233d Prevent unnecessary copies in replication scenarios
Former-commit-id: b152a9bd88c081ce98eebe9a7af49649e60e5523
2021-03-28 22:43:15 +00:00
John Sully cfcab8f330 Make some asserts debug only for perf
Former-commit-id: dc66209f2cf8eadb794dad302bd1ea92890e75b0
2021-03-28 21:08:48 +00:00
John Sully ea5ca47234 Make some asserts debug only for perf
Former-commit-id: dc66209f2cf8eadb794dad302bd1ea92890e75b0
2021-03-28 21:08:48 +00:00
John Sully ecc8e28d19 Excessive rehashing adds latency
Former-commit-id: ee5a4528d61420a18f89a07f4ac63e2181a19738
2021-03-28 20:22:01 +00:00
John Sully ba403c8833 Excessive rehashing adds latency
Former-commit-id: ee5a4528d61420a18f89a07f4ac63e2181a19738
2021-03-28 20:22:01 +00:00
John Sully b4cef22f69 Fix thread safety issues with the cache prefetch logic
Former-commit-id: 4892122fc02109d98684a350bd732a0b08a8c7b4
2021-03-28 20:21:44 +00:00
John Sully 7523d80632 Fix thread safety issues with the cache prefetch logic
Former-commit-id: 4892122fc02109d98684a350bd732a0b08a8c7b4
2021-03-28 20:21:44 +00:00
John Sully 9446b1b71d Prefetch keys even in pure RAM scenarios
Former-commit-id: d7219de186d60a5a437c1828ac97117eaad34819
2021-03-28 20:21:31 +00:00
John Sully 9655ec0b4a Prefetch keys even in pure RAM scenarios
Former-commit-id: d7219de186d60a5a437c1828ac97117eaad34819
2021-03-28 20:21:31 +00:00
John Sully 8bcf649faa Eliminate unnecessary lookup in ensure when there is no snapshot
Former-commit-id: 1f363ed7c13c186f0c120ab4f3e321144667f50f
2021-03-28 20:19:15 +00:00
John Sully 734e18774b Eliminate unnecessary lookup in ensure when there is no snapshot
Former-commit-id: 1f363ed7c13c186f0c120ab4f3e321144667f50f
2021-03-28 20:19:15 +00:00
John Sully 7a2e02ca59 Enable LTO
Former-commit-id: 3ec75184bae92c0e7af579eda8cbe6cfa2375327
2021-03-28 20:13:54 +00:00
John Sully bb7c5fd4ca Enable LTO
Former-commit-id: 3ec75184bae92c0e7af579eda8cbe6cfa2375327
2021-03-28 20:13:54 +00:00
John Sully c4888f2c65 Enable LTO
Former-commit-id: 7241bfc25525e8b27193fb0d4f9eae2e5e98e8d6
2021-03-28 18:27:14 +00:00
John Sully f0d9393a65 Enable LTO
Former-commit-id: 7241bfc25525e8b27193fb0d4f9eae2e5e98e8d6
2021-03-28 18:27:14 +00:00
John Sully d35de9dbf0 Make some asserts debug only for perf
Former-commit-id: c22740df4f7c1468fbe19fd97dfaec20e011b6f1
2021-03-28 18:27:00 +00:00
John Sully 52f7a35480 Make some asserts debug only for perf
Former-commit-id: c22740df4f7c1468fbe19fd97dfaec20e011b6f1
2021-03-28 18:27:00 +00:00
John Sully 31e2daacb3 Excessive rehashing adds latency
Former-commit-id: 9db2277b0fea032abcde089f617fe7e4f5ce12e3
2021-03-28 17:59:02 +00:00
John Sully 0cc4b4a3b9 Excessive rehashing adds latency
Former-commit-id: 9db2277b0fea032abcde089f617fe7e4f5ce12e3
2021-03-28 17:59:02 +00:00
John Sully 2b6f72a1b4 Fix thread safety issues with the cache prefetch logic
Former-commit-id: a80a128bb64b81115c095d6dd91896ff73048b3d
2021-03-28 17:58:43 +00:00
John Sully 327e51c761 Fix thread safety issues with the cache prefetch logic
Former-commit-id: a80a128bb64b81115c095d6dd91896ff73048b3d
2021-03-28 17:58:43 +00:00
benschermel a735700a50 bump version
Former-commit-id: 82f946187730290919c6c5433eead6a14397c772
2021-03-27 18:30:52 +00:00
benschermel 61d0605ae3 bump version
Former-commit-id: 33b75e0a2cf8712c976e7af74e2a615bb991c356
2021-03-27 18:26:11 +00:00
benschermel fb8db543f1 bump version
Former-commit-id: 33b75e0a2cf8712c976e7af74e2a615bb991c356
2021-03-27 18:26:11 +00:00
John Sully 08a23f72e1 Prefetch keys even in pure RAM scenarios
Former-commit-id: 54c0f11db0b35f34c9dfc3c8b4b76b7b7921bacd
2021-03-26 23:48:24 +00:00
John Sully 52dd09e503 Prefetch keys even in pure RAM scenarios
Former-commit-id: 54c0f11db0b35f34c9dfc3c8b4b76b7b7921bacd
2021-03-26 23:48:24 +00:00
John Sully f2612e4664 Eliminate unnecessary lookup in ensure when there is no snapshot
Former-commit-id: 04540531b95ebadf6d60c90c6681c11060eaf907
2021-03-26 23:44:42 +00:00
John Sully d466af2606 Eliminate unnecessary lookup in ensure when there is no snapshot
Former-commit-id: 04540531b95ebadf6d60c90c6681c11060eaf907
2021-03-26 23:44:42 +00:00
benschermel 8ed4126080 bump version
Former-commit-id: d3660673152f7c7becccc19a7fc19650bdbb4065
2021-03-26 22:57:19 +00:00
benschermel b5d7a722a5 update rpm script for centos8
Former-commit-id: eb639f456586a3105bef1ad7f299c371310e671e
2021-03-26 22:55:12 +00:00
John Sully 2e39d4ba92 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 7e0bcf58224921abf2046dc1f58606ed18ebb379
2021-03-26 02:54:50 +00:00
John Sully 47288fe4c2 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 7e0bcf58224921abf2046dc1f58606ed18ebb379
2021-03-26 02:54:50 +00:00
John Sully 98e5854e11 Fix issue where timethread wakes too slowly
Former-commit-id: 60f875f5eb7cb541e537f0f440ce8d5aeac57862
2021-03-26 02:54:33 +00:00
John Sully f6e5830c14 Fix issue where timethread wakes too slowly
Former-commit-id: 60f875f5eb7cb541e537f0f440ce8d5aeac57862
2021-03-26 02:54:33 +00:00
John Sully 61d803cfdc Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: c180de1c6d3ef25877ec3b4c50698624dfd3320d
2021-03-26 02:36:27 +00:00
John Sully 85a0dc2ab9 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: c180de1c6d3ef25877ec3b4c50698624dfd3320d
2021-03-26 02:36:27 +00:00
jsully 9d41b2fe0e Merge branch 'timethread_idle' into 'keydbpro'
Sleep the time thread when server sleeps

See merge request keydb-dev/KeyDB-Pro!15

Former-commit-id: 0864c46e38f85f03ea69a18162e3797370c17c91
2021-03-26 02:36:01 +00:00
jsully 67ea9f5803 Merge branch 'timethread_idle' into 'keydbpro'
Sleep the time thread when server sleeps

See merge request keydb-dev/KeyDB-Pro!15

Former-commit-id: 0864c46e38f85f03ea69a18162e3797370c17c91
2021-03-26 02:36:01 +00:00
John Sully 6aa51e8e4d Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 20d2c4fd62bb1867b8970b2bb282bd2ed64bcf6e
2021-03-26 01:50:51 +00:00
John Sully e982c1f1a5 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 20d2c4fd62bb1867b8970b2bb282bd2ed64bcf6e
2021-03-26 01:50:51 +00:00
John Sully 3b19014c51 Fix bug where we skip valid dict elements in dictGetRandomKey
Former-commit-id: c25a9a3b84c967428b3598c99a65b14ed2417571
2021-03-26 01:18:39 +00:00
John Sully 569419c981 Fix bug where we skip valid dict elements in dictGetRandomKey
Former-commit-id: c25a9a3b84c967428b3598c99a65b14ed2417571
2021-03-26 01:18:39 +00:00
John Sully 1ab6768267 Prevent unnecessary copies in replication scenarios
Former-commit-id: 84c671cdafae7e84beef722fcc8a90b92918c89d
2021-03-25 23:14:48 +00:00
John Sully 7d986f86d7 Prevent unnecessary copies in replication scenarios
Former-commit-id: 84c671cdafae7e84beef722fcc8a90b92918c89d
2021-03-25 23:14:48 +00:00
christianEQ 8331157897 moved time thread code to end of beforeSleep
Former-commit-id: ac1022c772c7357571829f24c87aa3dc2deade72
2021-03-24 21:16:21 +00:00
christianEQ 8977c9e83f moved time thread code to end of beforeSleep
Former-commit-id: ac1022c772c7357571829f24c87aa3dc2deade72
2021-03-24 21:16:21 +00:00
christianEQ 94b083705c serverAsserts on sleeping_threads, remove bare locks
Former-commit-id: 8c64ca2333d8eb2ee92d835907474ec63e127b62
2021-03-24 20:44:40 +00:00
christianEQ 2d91c3d828 serverAsserts on sleeping_threads, remove bare locks
Former-commit-id: 8c64ca2333d8eb2ee92d835907474ec63e127b62
2021-03-24 20:44:40 +00:00
christianEQ 0da12556e3 counter for time thread sleeping threads
Former-commit-id: 6270939d6a2d7820fecac9c5aedf0ff985531f6b
2021-03-24 20:33:26 +00:00
christianEQ 1db70e13a3 counter for time thread sleeping threads
Former-commit-id: 6270939d6a2d7820fecac9c5aedf0ff985531f6b
2021-03-24 20:33:26 +00:00
John Sully 5c5fe484c4 Fix bug where we skip valid dict elements in dictGetRandomKey
Former-commit-id: 626b56b00824573660af0c47b210fd1e8d2cfeb2
2021-03-24 20:26:33 +00:00
John Sully 084ebaaf30 Fix bug where we skip valid dict elements in dictGetRandomKey
Former-commit-id: 626b56b00824573660af0c47b210fd1e8d2cfeb2
2021-03-24 20:26:33 +00:00
christianEQ fe6965e6c9 removed extraneous wakeTimeThread cal
Former-commit-id: cfb5c5d7dc1e09c51ca416a2dbb19eab4bbaa77a
2021-03-24 20:24:07 +00:00
christianEQ cd5bbcf251 removed extraneous wakeTimeThread cal
Former-commit-id: cfb5c5d7dc1e09c51ca416a2dbb19eab4bbaa77a
2021-03-24 20:24:07 +00:00
John Sully 08c97588f0 Don't run code in evict unless we really have to
Former-commit-id: b665b1c2b2df96883a6e2237f7bf3f9b1bec2a89
2021-03-24 20:13:42 +00:00
John Sully b5adbb82a8 Don't run code in evict unless we really have to
Former-commit-id: b665b1c2b2df96883a6e2237f7bf3f9b1bec2a89
2021-03-24 20:13:42 +00:00
John Sully 3ec53d1583 Bump RocksDB version for better perf
Former-commit-id: ab4ae61b9c54b3c28dc5fd775d0df3d377c4846a
2021-03-24 20:12:43 +00:00
John Sully 368c7a929b Bump RocksDB version for better perf
Former-commit-id: ab4ae61b9c54b3c28dc5fd775d0df3d377c4846a
2021-03-24 20:12:43 +00:00
John Sully 6594175fff Fix bug where we skip valid dict elements in dictGetRandomKey
Former-commit-id: 291a3610a679cb1d17caadf6ab067cad41885935
2021-03-24 19:58:51 +00:00
John Sully 2b273f6bcc Fix bug where we skip valid dict elements in dictGetRandomKey
Former-commit-id: 291a3610a679cb1d17caadf6ab067cad41885935
2021-03-24 19:58:51 +00:00
christianEQ 5de451ba39 added condition variable to time thread; wake on afterSleep, sleep on beforeSleep
Former-commit-id: ff2f2a3aceff2ba4a74951197348d67fc39568b2
2021-03-24 19:27:39 +00:00
christianEQ bb4d3031bd added condition variable to time thread; wake on afterSleep, sleep on beforeSleep
Former-commit-id: ff2f2a3aceff2ba4a74951197348d67fc39568b2
2021-03-24 19:27:39 +00:00
John Sully 2645467fda Disable assert
Former-commit-id: b5d5eeee7cb1900eba192704e5d68c90b9f2b9f2
2021-03-23 23:50:48 +00:00
John Sully c5474170c3 Disable assert
Former-commit-id: b5d5eeee7cb1900eba192704e5d68c90b9f2b9f2
2021-03-23 23:50:48 +00:00
benschermel 15fe9ca5a6 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 99021efc9d4b59a93328e6f85db8b29010b3b0b1
2021-03-23 21:29:16 +00:00
benschermel d2d35b27cc Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 99021efc9d4b59a93328e6f85db8b29010b3b0b1
2021-03-23 21:29:16 +00:00
christian b286eaaee8 Merge branch 'rebrand' into 'keydbpro'
Rebrand

See merge request keydb-dev/KeyDB-Pro!14

Former-commit-id: 6840087819f26804302635dd0a75de523e133f8c
2021-03-23 20:01:05 +00:00
christian ed7bfc10da Merge branch 'rebrand' into 'keydbpro'
Rebrand

See merge request keydb-dev/KeyDB-Pro!14

Former-commit-id: 6840087819f26804302635dd0a75de523e133f8c
2021-03-23 20:01:05 +00:00
benschermel 730946ebeb addressing comments from merge review
Former-commit-id: 955aa69ca16ca7230d5099ad16f6f825402b5dd5
2021-03-23 18:41:59 +00:00
benschermel 39e0e0db7c addressing comments from merge review
Former-commit-id: 955aa69ca16ca7230d5099ad16f6f825402b5dd5
2021-03-23 18:41:59 +00:00
John Sully 0770e77be2 Perform GET command inline
Former-commit-id: 5623936d99e334ab103f3dc1541b145c125d0ee8
2021-03-23 03:44:20 +00:00
John Sully 8b6c824ab3 Perform GET command inline
Former-commit-id: 5623936d99e334ab103f3dc1541b145c125d0ee8
2021-03-23 03:44:20 +00:00
benschermel 2e51ff9d50 update enterprise wording for keydb.config lk
Former-commit-id: feb2d31e6544763c94f4abaea69bc98bd1cb8b17
2021-03-21 05:19:28 +00:00
benschermel af9826ee8f update enterprise wording for keydb.config lk
Former-commit-id: feb2d31e6544763c94f4abaea69bc98bd1cb8b17
2021-03-21 05:19:28 +00:00
VivekSainiEQ 6fd47f1dba Updated jemalloc to version 5.2.1
Former-commit-id: 8f2ef6d6f00981654631b90fbb08339ca96ad5a9
2021-03-19 20:10:27 +00:00
VivekSainiEQ a08ea414f3 Removed hasModuleGIL boolean and added fix from PR #292
Former-commit-id: eb33b6c78fcd4462816a5fd0a0bacdc2d20f23ec
2021-03-19 20:10:24 +00:00
VivekSainiEQ daba381150 added lock releasing w/ hasModuleGIL, changed module serverTL, and moved module_blocking_pipe to global scope to fix issue #276
Former-commit-id: c9b296fbc2bb44940189da05b1f76343b20d700e
2021-03-19 20:08:28 +00:00
benschermel d6c790f574 update rpm script for centos8
Former-commit-id: 8d2e94c9682c46df39ae97302625972d196a03e2
2021-03-18 19:31:54 +00:00
benschermel e1dfab9f1f bump version
Former-commit-id: d5b042f010395628734848fc0b7db370fa9106c4
2021-03-18 02:11:19 +00:00
benschermel 20942bc16d bump version
Former-commit-id: d5b042f010395628734848fc0b7db370fa9106c4
2021-03-18 02:11:19 +00:00
benschermel 5ff1cfc774 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: c03c45a1a1bf3c92a75804e123e34ea394adad07
2021-03-18 02:01:15 +00:00
benschermel 2af23dbff6 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: c03c45a1a1bf3c92a75804e123e34ea394adad07
2021-03-18 02:01:15 +00:00
benschermel 810998b8e0 minor fixes
Former-commit-id: ad7a27d41fb9e8e47966bbee72b28a4be66bbd8f
2021-03-18 01:16:57 +00:00
benschermel 3db62730ab minor fixes
Former-commit-id: ad7a27d41fb9e8e47966bbee72b28a4be66bbd8f
2021-03-18 01:16:57 +00:00
christianEQ d02a582815 fix old reference to c variable (monkey)
Former-commit-id: 0b9b6413c70d4ba71bbabcd0b22fb004d804958f
2021-03-17 20:22:01 +00:00
christianEQ 60101dbd67 fix old reference to c variable (monkey)
Former-commit-id: 0b9b6413c70d4ba71bbabcd0b22fb004d804958f
2021-03-17 20:22:01 +00:00
christianEQ 49a8978ac2 removed unused stuff from monkey
Former-commit-id: be55daa6f7bcbf137b37269d1ee7a5fcacc14ff0
2021-03-17 20:17:52 +00:00
christianEQ 59b48097d9 removed unused stuff from monkey
Former-commit-id: be55daa6f7bcbf137b37269d1ee7a5fcacc14ff0
2021-03-17 20:17:52 +00:00
christianEQ ee19e5ba3d fixed runtime arg for monkey
Former-commit-id: b3e6e1f13b3d24c92d9f7e8441831232f47ff053
2021-03-17 19:50:28 +00:00
christianEQ cefe51e6c3 fixed runtime arg for monkey
Former-commit-id: b3e6e1f13b3d24c92d9f7e8441831232f47ff053
2021-03-17 19:50:28 +00:00
christianEQ a3d64a3f4e working blpop test in monkey
Former-commit-id: 21af13c2a38741ad9e036fad42b23ea2454ac33c
2021-03-17 16:10:06 +00:00
christianEQ 15aa870d2d working blpop test in monkey
Former-commit-id: 21af13c2a38741ad9e036fad42b23ea2454ac33c
2021-03-17 16:10:06 +00:00
christianEQ 6f8f6a5653 track each command separately in monkey
Former-commit-id: e3accdaad985fd9f93490a5cc6704d9ecb909604
2021-03-17 16:03:51 +00:00
christianEQ 8449160521 track each command separately in monkey
Former-commit-id: e3accdaad985fd9f93490a5cc6704d9ecb909604
2021-03-17 16:03:51 +00:00
benschermel a7293b7391 fix rpm script for centos8
Former-commit-id: 6790d9b793b1995b2faae7dbfb5d09dce90a878c
2021-03-17 05:11:01 +00:00
benschermel 89b127823e fix rpm script for centos8
Former-commit-id: 6790d9b793b1995b2faae7dbfb5d09dce90a878c
2021-03-17 05:11:01 +00:00
benschermel 2d25c05371 update all packaging to support enterprise dist
Former-commit-id: 1fd4f27cd271090fc66dba3b09a3800bf1c33b0e
2021-03-17 02:30:34 +00:00
benschermel c14e5bbe79 update all packaging to support enterprise dist
Former-commit-id: 1fd4f27cd271090fc66dba3b09a3800bf1c33b0e
2021-03-17 02:30:34 +00:00
christianEQ 6254157251 unblocking test to monkey, works with 1 client
Former-commit-id: 9fbe8cf6a8aeb141d4a502532a456e4256f4daf8
2021-03-17 01:40:38 +00:00
christianEQ 0187094fd8 unblocking test to monkey, works with 1 client
Former-commit-id: 9fbe8cf6a8aeb141d4a502532a456e4256f4daf8
2021-03-17 01:40:38 +00:00
christianEQ 09eafa7494 parameterized monkey options
Former-commit-id: eda1055689587c25dca3e889dd3a74d3f9c9378f
2021-03-16 23:19:29 +00:00
christianEQ 0e8e3e3cd5 parameterized monkey options
Former-commit-id: eda1055689587c25dca3e889dd3a74d3f9c9378f
2021-03-16 23:19:29 +00:00
John Sully 5d285683dd Make async rehash behave with snapshots (thread safety issues)
Former-commit-id: 372adf39a80252b8035e3c948fcaf7d5ef6f928f
2021-03-16 02:38:41 +00:00
John Sully 86563bab91 Make async rehash behave with snapshots (thread safety issues)
Former-commit-id: 372adf39a80252b8035e3c948fcaf7d5ef6f928f
2021-03-16 02:38:41 +00:00
John Sully 96421f2bd0 Remove snapshot consolidation because its not properly thread safe
Former-commit-id: dcb86d2b92e3ecdb9f914b6f5de9e184cdd23036
2021-03-16 02:37:49 +00:00
John Sully 7cd8632a75 Remove snapshot consolidation because its not properly thread safe
Former-commit-id: dcb86d2b92e3ecdb9f914b6f5de9e184cdd23036
2021-03-16 02:37:49 +00:00
John Sully fb54dba744 Fix TSAN errors in tests
Former-commit-id: 30207d2ab34f175b94f430f97581191343d23f1e
2021-03-16 02:29:24 +00:00
John Sully 16bd1dd059 Fix TSAN errors in tests
Former-commit-id: 30207d2ab34f175b94f430f97581191343d23f1e
2021-03-16 02:29:24 +00:00
benschermel 164eb146ea re-label keydb-pro-server to keydb-server
Former-commit-id: eb6f61ad372f0f4e573b9b731eac6c7f2ada0d9f
2021-03-16 01:57:26 +00:00
benschermel 8d3edbc2b4 re-label keydb-pro-server to keydb-server
Former-commit-id: eb6f61ad372f0f4e573b9b731eac6c7f2ada0d9f
2021-03-16 01:57:26 +00:00
John Sully e5560fc648 Support deletes in the monkey
Former-commit-id: 84101aaa1bd0c89fbaffc11a264788cd75458c48
2021-03-15 19:41:38 +00:00
John Sully be852aa1bb Support deletes in the monkey
Former-commit-id: 84101aaa1bd0c89fbaffc11a264788cd75458c48
2021-03-15 19:41:38 +00:00
John Sully 8e626528c0 Add the monkey script to enhance testing
Former-commit-id: 57ce7b9e9976ca6827415d756ea3cabef1a0d615
2021-03-15 15:32:43 +00:00
John Sully fa8cae657f Add the monkey script to enhance testing
Former-commit-id: 57ce7b9e9976ca6827415d756ea3cabef1a0d615
2021-03-15 15:32:43 +00:00
John Sully 906b115353 We can't swap databases if there are async rehashes
Former-commit-id: 4b8967f94667309c5585032db7403bf4c8885145
2021-03-15 05:46:52 +00:00
John Sully 01c4352706 We can't swap databases if there are async rehashes
Former-commit-id: 4b8967f94667309c5585032db7403bf4c8885145
2021-03-15 05:46:52 +00:00
John Sully 4390666be7 Enable more asserts to better validate snapshots
Former-commit-id: 01113e2eec3a0dbe0d07f98289a0050df7713047
2021-03-14 23:40:41 +00:00
John Sully f666501de6 Enable more asserts to better validate snapshots
Former-commit-id: 01113e2eec3a0dbe0d07f98289a0050df7713047
2021-03-14 23:40:41 +00:00
John Sully 3a0aea272f Fix incorrect memory order on refcounted strings
Former-commit-id: fcf3368b1d56ad7a11e510e5a66e415a46277e8b
2021-03-14 19:42:56 +00:00
John Sully 87ff698b36 Fix incorrect memory order on refcounted strings
Former-commit-id: fcf3368b1d56ad7a11e510e5a66e415a46277e8b
2021-03-14 19:42:56 +00:00
John Sully aacbc3ca06 Avoid queuing null pointers to be freed
Former-commit-id: f50541d437cd1d98139c29407bb3fb4d6ce17fca
2021-03-14 03:22:10 +00:00
John Sully eeb68d7e38 Avoid queuing null pointers to be freed
Former-commit-id: f50541d437cd1d98139c29407bb3fb4d6ce17fca
2021-03-14 03:22:10 +00:00
John Sully 6b4c774c8a Ensure the hash is passed through when moving tombstones
Former-commit-id: 91c8d2d38a33175c64c987b75e94c4b8782a3cdc
2021-03-14 03:21:09 +00:00
John Sully 7381b59022 Ensure the hash is passed through when moving tombstones
Former-commit-id: 91c8d2d38a33175c64c987b75e94c4b8782a3cdc
2021-03-14 03:21:09 +00:00
John Sully 8ab21e8ad9 Reduce log spam
Former-commit-id: a5ba7bdde5435ad5b7cf066e0b45f6df1f784808
2021-03-14 03:19:41 +00:00
John Sully e266759edb Reduce log spam
Former-commit-id: a5ba7bdde5435ad5b7cf066e0b45f6df1f784808
2021-03-14 03:19:41 +00:00
John Sully d63f68a936 Remove rarely used bug-prone code paths from tricky snapshot code
Former-commit-id: dff84228afb97962d77caefe948154090dd5ce23
2021-03-14 03:19:04 +00:00
John Sully dde9d91de2 Remove rarely used bug-prone code paths from tricky snapshot code
Former-commit-id: dff84228afb97962d77caefe948154090dd5ce23
2021-03-14 03:19:04 +00:00
John Sully 9d297cba23 Add checked build support to makefile
Former-commit-id: 7e27c371679d780137a5d39b03b9472651ddf686
2021-03-14 03:18:24 +00:00
John Sully 8537affa36 Add checked build support to makefile
Former-commit-id: 7e27c371679d780137a5d39b03b9472651ddf686
2021-03-14 03:18:24 +00:00
John Sully 847b42242e bump version
Former-commit-id: c802ea93a167ff6c59e585d4ab72c9f7b6b03a1c
2021-03-10 04:03:56 +00:00
John Sully 8ae177ef21 bump version
Former-commit-id: c802ea93a167ff6c59e585d4ab72c9f7b6b03a1c
2021-03-10 04:03:56 +00:00
John Sully 3b518970b0 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 066f984e5223f58b239d99c115901ea9845da513
2021-03-10 04:03:13 +00:00
John Sully 0e5e0e50b6 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 066f984e5223f58b239d99c115901ea9845da513
2021-03-10 04:03:13 +00:00
John Sully 4f1804f11a If we're clearing the command queue we need to reset the parse length
Former-commit-id: 19068f990a77fb428a50a8f751ed6f8cf59a8a74
2021-03-10 02:53:52 +00:00
John Sully a6c3749143 If we're clearing the command queue we need to reset the parse length
Former-commit-id: 19068f990a77fb428a50a8f751ed6f8cf59a8a74
2021-03-10 02:53:52 +00:00
John Sully d882e4126b When we add a delay to rdb save for test purposes we still need to check for aborts
Former-commit-id: b057b4d05aae6c08b855bfc9ae48d41ad0e881f8
2021-03-10 02:53:15 +00:00
John Sully 2a7a302d94 When we add a delay to rdb save for test purposes we still need to check for aborts
Former-commit-id: b057b4d05aae6c08b855bfc9ae48d41ad0e881f8
2021-03-10 02:53:15 +00:00
John Sully 14f60aa1cb Fix failed merge due to overwriting the hashidx and pretending no rehash is in progress
Former-commit-id: 0524b822a05b732e0f3e510dcaeb3304069d3595
2021-03-10 02:52:22 +00:00
John Sully d60b7b3953 Fix failed merge due to overwriting the hashidx and pretending no rehash is in progress
Former-commit-id: 0524b822a05b732e0f3e510dcaeb3304069d3595
2021-03-10 02:52:22 +00:00
John Sully b5c43f682a Fix crash saving an RDB
Former-commit-id: 51c35f03a84f7ada0f150a1c3992df574ab89b95
2021-03-05 00:54:11 +00:00
John Sully bb5780c7fc Fix crash saving an RDB
Former-commit-id: 51c35f03a84f7ada0f150a1c3992df574ab89b95
2021-03-05 00:54:11 +00:00
VivekSainiEQ 71d130ddb2 Updated module tests to default to multithreaded and added tests for RM_CreateTimer while loading .rdb
Former-commit-id: 1b29115190ce3f72fddf8e1549901c327b064880
2021-03-04 23:33:01 +00:00
John Sully 85da00bd91 Load perf fixes with a storage provider set
Former-commit-id: 861b19de00c75c9167cc25031292284ad1c21893
2021-03-04 07:41:06 +00:00
John Sully bfb8332ac6 Load perf fixes with a storage provider set
Former-commit-id: 861b19de00c75c9167cc25031292284ad1c21893
2021-03-04 07:41:06 +00:00
John Sully ca11197dd3 Fix compile warnings
Former-commit-id: c314cab888e9c8b3e825b2dfe0c0392ee998bdc4
2021-03-03 22:12:51 +00:00
John Sully b6817662a1 Fix compile warnings
Former-commit-id: c314cab888e9c8b3e825b2dfe0c0392ee998bdc4
2021-03-03 22:12:51 +00:00
jsully d900de5ec9 Merge branch 'time_thread_priority' into 'keydbpro'
time thread priority + nanosleep

See merge request keydb-dev/KeyDB-Pro!11

Former-commit-id: 423b76a2bbbd568f525f6469ce829ab053972536
2021-03-03 18:55:07 +00:00
jsully e9d8bb7998 Merge branch 'time_thread_priority' into 'keydbpro'
time thread priority + nanosleep

See merge request keydb-dev/KeyDB-Pro!11

Former-commit-id: 423b76a2bbbd568f525f6469ce829ab053972536
2021-03-03 18:55:07 +00:00
John Sully df965d6b3b Data loss issue due to async rehash interfering with snapshots
Former-commit-id: 5245ca9a67c74b34139cafc9754543d1b8bed90a
2021-03-03 07:06:19 +00:00
John Sully bfbf9ecaf3 Data loss issue due to async rehash interfering with snapshots
Former-commit-id: 5245ca9a67c74b34139cafc9754543d1b8bed90a
2021-03-03 07:06:19 +00:00
John Sully 1884a5c578 In low load async rehash may not complete in time, do it in the cron
Former-commit-id: 0a27d30753d887b6251e645abe26118068c55587
2021-03-03 07:05:51 +00:00
John Sully 63920249c7 In low load async rehash may not complete in time, do it in the cron
Former-commit-id: 0a27d30753d887b6251e645abe26118068c55587
2021-03-03 07:05:51 +00:00
John Sully bfc22535ff Don't let dictionaries shrink too rapidly. It can cause massive perf issues while in the shrink rehash
Former-commit-id: a7ad346e4f03c85d22a29c8268d35471e86283aa
2021-03-03 07:05:12 +00:00
John Sully 9856f5f905 Don't let dictionaries shrink too rapidly. It can cause massive perf issues while in the shrink rehash
Former-commit-id: a7ad346e4f03c85d22a29c8268d35471e86283aa
2021-03-03 07:05:12 +00:00
John Sully c8861f1c0d Drastically improve perf when loading an RDB with a storage provider
Former-commit-id: 0133b42d54676e8fac2c5cb006cc87988dced268
2021-03-02 04:16:20 +00:00
John Sully 9d082df132 Drastically improve perf when loading an RDB with a storage provider
Former-commit-id: 0133b42d54676e8fac2c5cb006cc87988dced268
2021-03-02 04:16:20 +00:00
John Sully dd55dd4ce4 Key prefetch error handling instead of crashign
Former-commit-id: b322a14efb1b897134b229c1726b45264b57783f
2021-03-02 01:38:12 +00:00
John Sully a41f244be8 Key prefetch error handling instead of crashign
Former-commit-id: b322a14efb1b897134b229c1726b45264b57783f
2021-03-02 01:38:12 +00:00
VivekSainiEQ d06c0cfc21 Fixed bug where make USE_SYSTEMD=yes would not pass in correct flags, issue #226
Former-commit-id: 36d3f29d19585bfc44051aa7241dcf564d649d63
2021-03-01 21:31:33 +00:00
John Sully 0fee53178a Bump version
Former-commit-id: 31392562b27a6fc1576476626a27a3defe13795f
2021-02-28 21:02:25 +00:00
John Sully b9fcc6bd4c Bump version
Former-commit-id: 31392562b27a6fc1576476626a27a3defe13795f
2021-02-28 21:02:25 +00:00
John Sully fdb83b8260 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 7609673e282b46a760a3d0e0b42d685af9b4d056
2021-02-28 20:46:08 +00:00
John Sully 8b05e96866 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 7609673e282b46a760a3d0e0b42d685af9b4d056
2021-02-28 20:46:08 +00:00
christianEQ ef946cb69e time thread priority + nanosleep
Former-commit-id: c84f296edabc001a1836ab8437f746dcff811148
2021-02-26 20:17:34 +00:00
christianEQ 8f750152ef time thread priority + nanosleep
Former-commit-id: c84f296edabc001a1836ab8437f746dcff811148
2021-02-26 20:17:34 +00:00
John Sully d7314f54e5 Don't complain about unclean shutdowns with an empty database
Former-commit-id: 99f5c02e87062552eaa2f26e960eb7c9dd977c84
2021-02-26 06:06:58 +00:00
John Sully 4aef22fc98 Don't complain about unclean shutdowns with an empty database
Former-commit-id: 99f5c02e87062552eaa2f26e960eb7c9dd977c84
2021-02-26 06:06:58 +00:00
John Sully e3b375ba25 Eliminate needless lock
Former-commit-id: 60f972d463f202edb33ff9a25bc2bd3e2558105c
2021-02-26 05:40:56 +00:00
John Sully 5ff29a085a Eliminate needless lock
Former-commit-id: 60f972d463f202edb33ff9a25bc2bd3e2558105c
2021-02-26 05:40:56 +00:00
John Sully f5de17239a Eliminate the need for an mfence by tricking the CPU into ordering the futex read
Former-commit-id: 340e6f5bc94cd1c3b0c6fb6da833e8504acaf23a
2021-02-26 01:28:05 +00:00
John Sully 41433cafe1 Eliminate the need for an mfence by tricking the CPU into ordering the futex read
Former-commit-id: 340e6f5bc94cd1c3b0c6fb6da833e8504acaf23a
2021-02-26 01:28:05 +00:00
John Sully 97c0849225 eliminate syscall in call()
Former-commit-id: 3ee111a2e50bc29818ba85ae4fb786171d695c37
2021-02-26 01:03:10 +00:00
John Sully 79ae103538 eliminate syscall in call()
Former-commit-id: 3ee111a2e50bc29818ba85ae4fb786171d695c37
2021-02-26 01:03:10 +00:00
jsully fdc2bfc12d Merge branch 'timethread' into 'keydbpro'
Offload updating cached time to dedicated thread

See merge request keydb-dev/KeyDB-Pro!10

Former-commit-id: 31786a995d0220ec0cb4502917a8cc0f192da4cb
2021-02-26 00:50:22 +00:00
jsully d5857dad94 Merge branch 'timethread' into 'keydbpro'
Offload updating cached time to dedicated thread

See merge request keydb-dev/KeyDB-Pro!10

Former-commit-id: 31786a995d0220ec0cb4502917a8cc0f192da4cb
2021-02-26 00:50:22 +00:00
christian 7bbf6ecf1c Offload updating cached time to dedicated thread
Former-commit-id: 9bfc8a43952481b5b54a7b051d44b8bece4a18dd
2021-02-26 00:50:22 +00:00
christian 7cfe8b51cc Offload updating cached time to dedicated thread
Former-commit-id: 9bfc8a43952481b5b54a7b051d44b8bece4a18dd
2021-02-26 00:50:22 +00:00
John Sully ce986661a2 Fix issue where finding random keys is slow due to not shrinking the hash table.
Former-commit-id: fd05010cdcf9d6a6187ca2e18bc55adbaa680a02
2021-02-22 09:14:24 +00:00
John Sully 9b9821d616 Fix issue where finding random keys is slow due to not shrinking the hash table.
Former-commit-id: fd05010cdcf9d6a6187ca2e18bc55adbaa680a02
2021-02-22 09:14:24 +00:00
John Sully aec5daee04 Implement maxstorage config
Former-commit-id: 79e07859dfec14edf2a39646013e1a82db033d4f
2021-02-19 05:17:41 +00:00
John Sully a77a739b6f Implement maxstorage config
Former-commit-id: 79e07859dfec14edf2a39646013e1a82db033d4f
2021-02-19 05:17:41 +00:00
John Sully 4e0230df2a Disable async rehash with single threads, it causes slowdowns as the rehash never completes
Former-commit-id: 5d08dbdf76c0fd1e0cfcf86b97ef3e656f0e4f5d
2021-02-16 21:07:43 +00:00
John Sully 51d8472d83 Disable async rehash with single threads, it causes slowdowns as the rehash never completes
Former-commit-id: 5d08dbdf76c0fd1e0cfcf86b97ef3e656f0e4f5d
2021-02-16 21:07:43 +00:00
John Sully 62d26b0584 Fix deadlock in storage prefetch
Former-commit-id: 9e6162de08248f7726b97b73aee2f23808ff4e7b
2021-02-12 19:38:57 +00:00
John Sully 538e3cdeaa Fix deadlock in storage prefetch
Former-commit-id: 9e6162de08248f7726b97b73aee2f23808ff4e7b
2021-02-12 19:38:57 +00:00
John Sully 447e92a8b4 Enable prefetch with storage providers
Former-commit-id: 21f9c52c446ad1b460a340c3d873839b2355728f
2021-02-11 00:50:21 +00:00
John Sully f8800af069 Enable prefetch with storage providers
Former-commit-id: 21f9c52c446ad1b460a340c3d873839b2355728f
2021-02-11 00:50:21 +00:00
John Sully efe591f9a7 Fix polarity issue in async rehash
Former-commit-id: 936bb30c08711179063f22682623a1e306c5c707
2021-02-09 05:10:22 +00:00
John Sully 0f2e6a8682 Fix polarity issue in async rehash
Former-commit-id: 9eefba49d4fcde7f12929929d7aeb36f5186a63d
2021-02-09 02:41:44 +00:00
John Sully 446ceba0d1 Fix polarity issue in async rehash
Former-commit-id: 9eefba49d4fcde7f12929929d7aeb36f5186a63d
2021-02-09 02:41:44 +00:00
John Sully 48e4958ae6 Fix deadlock with disconnecting client and storage provider
Former-commit-id: 0831745323e425f463322e8c0dc27fc25854868e
2021-02-08 19:02:01 +00:00
John Sully 8fe49b253d Fix deadlock with disconnecting client and storage provider
Former-commit-id: 0831745323e425f463322e8c0dc27fc25854868e
2021-02-08 19:02:01 +00:00
John Sully 46b19b37e5 Merge branch 'unstable' into keydbpro
Former-commit-id: e2140793f2bf565972ada799af73bf4457e2718d
2021-02-08 18:17:09 +00:00
John Sully 2780384c2b Merge branch 'unstable' into keydbpro
Former-commit-id: e2140793f2bf565972ada799af73bf4457e2718d
2021-02-08 18:17:09 +00:00
John Sully f878487caa Fix bug in fastlock stack metadata
Former-commit-id: 241d1bd7e1
2021-02-07 19:11:05 -05:00
John Sully 5e0bf4243d Disable multithreaded rehash when active defrag is enabled. The two are not compatible
Former-commit-id: 56addcd172
2021-02-07 19:11:05 -05:00
John Sully e129dd7b85 The server should recalibrate periodically. Also reduce log noise
Former-commit-id: 8d8e1810d4
2021-02-07 19:11:05 -05:00
John Sully 52a2225ec6 Ensure the C lock implementation behaves the same as the ASM
Former-commit-id: b5ddc11c46
2021-02-07 19:11:05 -05:00
John Sully 0b0314e8bc Ensure rehash completes even when we're in a long running task
Former-commit-id: f107746e90
2021-02-07 19:11:05 -05:00
John Sully c9d27531d3 Implement rehash during spinlock
Former-commit-id: f68a26381a
2021-02-07 19:11:05 -05:00
John Sully 37dbd2ccad Allow multiple threads to rehash simultaneously
Former-commit-id: 5a2cc90786
2021-02-07 19:11:05 -05:00
John Sully a631637dba Fix races in free
Former-commit-id: 3881d5c1f2
2021-02-07 19:11:05 -05:00
John Sully ae8278c810 Initial implementation
Former-commit-id: 958f2c00c8
2021-02-07 19:11:05 -05:00
John Sully 1566f1bff4 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 4a269c3382083f6ad7f697ef07eebc552e0de9d8
2021-02-08 00:02:54 +00:00
John Sully 85bd35266d Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 4a269c3382083f6ad7f697ef07eebc552e0de9d8
2021-02-08 00:02:54 +00:00
John Sully fdf059fe3a Merge branch 'unstable' into RELEASE_6
Former-commit-id: b4cd39d752cda834cb1a1633c36644deb8f4d39f
2021-02-07 23:55:58 +00:00
John Sully 9f9e8d8a02 Fix memory leak in mvccRestore
Former-commit-id: 8606dcd8b34016acb27ab03ead9adc43defc7f67
2021-02-07 23:38:49 +00:00
John Sully 0a1c7ea0ef Fix cluster test failure
Former-commit-id: 230fde39882766426d892fd30d0c8349f5cca912
2021-02-07 23:38:25 +00:00
John Sully 2e12641654 Fix cluster test failure
Former-commit-id: 230fde39882766426d892fd30d0c8349f5cca912
2021-02-07 23:38:25 +00:00
John Sully 6a68773299 Fix memory leak in mvccRestore
Former-commit-id: 92da1cbd0a08b66264f170a9b57ef7270f270157
2021-02-07 23:38:09 +00:00
John Sully 35afdb415b Fix memory leak in mvccRestore
Former-commit-id: 92da1cbd0a08b66264f170a9b57ef7270f270157
2021-02-07 23:38:09 +00:00
John Sully 008e471460 Update test to handle forkless bgsave
Former-commit-id: fc8c6de8252e6b802688413050f1a823093d0a1d
2021-02-07 21:41:19 +00:00
John Sully a77a1f4491 Update test to handle forkless bgsave
Former-commit-id: fc8c6de8252e6b802688413050f1a823093d0a1d
2021-02-07 21:41:19 +00:00
John Sully 83956b7e40 Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: 8bad923169b2a73f249fd8b3153236d6a74100c9
2021-02-07 20:53:07 +00:00
John Sully e697e4c623 Merge branch 'keydbpro' of https://gitlab.eqalpha.com/keydb-dev/KeyDB-Pro into keydbpro
Former-commit-id: 8bad923169b2a73f249fd8b3153236d6a74100c9
2021-02-07 20:53:07 +00:00
jsully ecf233091b Merge branch 'opensourcemerge_2021-02-01' into 'keydbpro'
Merge from open source Feb 5 2021

See merge request keydb-dev/KeyDB-Pro!9

Former-commit-id: 1a2e2b99cc0123b1b03b78b5f28107df395decdb
2021-02-07 20:49:08 +00:00
jsully 76bbacddbe Merge branch 'opensourcemerge_2021-02-01' into 'keydbpro'
Merge from open source Feb 5 2021

See merge request keydb-dev/KeyDB-Pro!9

Former-commit-id: 1a2e2b99cc0123b1b03b78b5f28107df395decdb
2021-02-07 20:49:08 +00:00
christianEQ f3b65e1a8a fixed up backup stuff
Former-commit-id: 8a23162c24dc13a4268928c5defd85b0b5249d39
2021-02-04 22:36:32 +00:00
christianEQ 4706ae5aa1 fixed up backup stuff
Former-commit-id: 8a23162c24dc13a4268928c5defd85b0b5249d39
2021-02-04 22:36:32 +00:00
christianEQ d73174fafc removed bgsave test, not applicable to keydb pro
Former-commit-id: d017c160662702ebcdbf063df239b907c2a193c5
2021-02-03 19:13:53 +00:00
christianEQ d3cc5d688a removed bgsave test, not applicable to keydb pro
Former-commit-id: d017c160662702ebcdbf063df239b907c2a193c5
2021-02-03 19:13:53 +00:00
christianEQ c6bff25bdd Merge remote-tracking branch 'opensource/unstable' into keydbpro
Former-commit-id: 5bad058733de2c217340bb9ee48f02b07d754808
2021-02-03 18:10:27 +00:00
christianEQ 0c94c81a5e Merge remote-tracking branch 'opensource/unstable' into keydbpro
Former-commit-id: 5bad058733de2c217340bb9ee48f02b07d754808
2021-02-03 18:10:27 +00:00
John Sully e1fde4a814 Module test reliability
Former-commit-id: c8edabc7effdc4120fc97cc78e8335f358671d8c
2021-02-01 22:21:49 +00:00
John Sully f4c444d82d Simplify the handling of CreateTimer
Former-commit-id: 466c9565004c62da6ba427855456d45132486804
2021-02-01 15:51:22 -05:00
VivekSainiEQ 52dde56d28 Modified RM_CreateTimer to prevent more that one function being posted at a time
Former-commit-id: 291007fd5b34ba143e198a845bd1b6c7e04363af
2021-02-01 15:51:22 -05:00
VivekSainiEQ 624165459e Changed RM_CreateTimer to only call aePostFunction is existing aePostFunction isn't in flight
Former-commit-id: 35cc135fa3faa8bbf4f47f9455d880c1e9680f33
2021-02-01 15:51:22 -05:00
VivekSainiEQ 2f6f5dbb98 Now post entire timer installation process as one function to make atomic with respect to global locks
Former-commit-id: bccf62a6c706063124c1df06d776e787ca28b382
2021-02-01 15:51:22 -05:00
VivekSainiEQ 285e459c22 Updated header file to remove fSynchronous flag
Former-commit-id: df75a6b788a0e9bed22c812fb52431155b90dd4d
2021-02-01 15:51:22 -05:00
VivekSainiEQ 53a06f0830 Removed more uses of fSynchronous and the use of condition variable and mutex on the control struct.
Former-commit-id: c6dcccda36d105a75ea5dd1766837b67f75fd9da
2021-02-01 15:51:22 -05:00
VivekSainiEQ 1283f9a607 Added fix for scenario where module thread waiting for s_mutexModule in acquireGIL can deadlock with module thread waiting for s_mutex in releaseGIL
Former-commit-id: 11b37083822ce5bf632b5c76d1b4aaa2fe9857e3
2021-02-01 15:51:22 -05:00
VivekSainiEQ f0f8479c59 removed synchronous calls to aePostFunction and changed scope of g_fModuleThread in order to prevent module related deadlocks, issue #214
Former-commit-id: 1ea1989ce4a794b4049e2164ba32d2daf2cfb317
2021-02-01 15:51:22 -05:00
John Sully 84b2ed3a3c Bump version
Former-commit-id: b8ec401b9e5538e2b979cd6104506d1d8219e205
2021-01-31 21:24:49 +00:00
John Sully 5465254118 Merge branch 'unstable' into RELEASE_6
Former-commit-id: fab3d5327757ac9cb4c225662a313edf13451ec0
2021-01-31 21:24:07 +00:00
John Sully 523a16eb09 ARM build fix
Former-commit-id: b337bfb833a555198c7e89d2979b008c1ff03b38
2021-01-31 21:22:23 +00:00
John Sully 47ee3919d4 Fix test failure caused by allowing pings during load
Former-commit-id: 283ab96f7c2f1e15232100489f61075a0cca07f7
2021-01-31 07:15:55 +00:00
John Sully d521a37098 Reduce intermittent failures by giving tests more time
Former-commit-id: 9f7080345873bf1bf231750d6a010979b14016d5
2021-01-31 06:33:13 +00:00
christianEQ a3a493408d added exception to allow pings during loading
Former-commit-id: 6c83a49a5b50bfc7a14bdd319df70e26606a60a9
2021-01-31 00:12:49 -05:00
christianEQ 1ea3c634c2 added severity levels for afterErrorReply
Former-commit-id: bee6b658f6b6fadae03f2b3be237d0f6955b6655
2021-01-31 00:12:49 -05:00
John Sully fcf9262430 Improve multithreaded test reliability
Former-commit-id: 863beff3dfc161c2ebfcd336fdbd820abc1a528d
2021-01-31 04:33:27 +00:00
John Sully e7fccbb560 Fix test failure due to bad merge
Former-commit-id: f7ce65d042875d21e5c85c2394fec0f81f578141
2021-01-31 03:40:57 +00:00
John Sully c85399eaaf Fix CI failure due to missing package
Former-commit-id: e46fec51c7033613339e2b5e46048bee1d75bd62
2021-01-31 02:36:30 +00:00
John Sully e30df2bcf3 Fix crash on shutdown command
Former-commit-id: 920c223fbf47e4a0e75f87cadfdf177014e7e31d
2021-01-31 02:30:28 +00:00
christianEQ 22c4ab41a4 Merge pull request #284 from christianEQ/redismerge_2021-01-20
Merge Redis 6.0.10 into KeyDB

Former-commit-id: 699a417cd0b1b893863448a6aceff4e76fb61c65
2021-01-29 10:59:36 -05:00
christianEQ 3f02de85fe killMainThread -> killServerThreads
Former-commit-id: 62f6ef926de1e5242903ea061a2869493ec5d6cb
2021-01-28 23:57:19 +00:00
christianEQ fc9a30ea54 compare_exchange in connSocketRead, explicitly enforce memory order (even if redundant)
Former-commit-id: 8f68407e7f4c17b6887a69b7166924a2d33c8b3d
2021-01-28 23:17:48 +00:00
christianEQ fd7ab16158 fixed replicaof no one config, added test case
Former-commit-id: 44c2069d16f411ed9f7da3597f3bf3c9062797d2
2021-01-28 19:49:22 +00:00
christianEQ 00e086d7fc updated version num to 255.255.255
Former-commit-id: 6ff152f80dc59940a5f45c86474f50a819e85fdf
2021-01-28 16:54:22 +00:00
christianEQ ce440666a5 Merge remote-tracking branch 'john/unstable' into redismerge_2021-01-20
Former-commit-id: d65b126bd84d98db219194b11ad7b8fd72600cf7
2021-01-27 22:25:14 +00:00
christianEQ 6c929d3878 arm locker before checking zmalloc_used_memory
Former-commit-id: c58db6dbbc393f958fa19465a89ef60278660fe3
2021-01-27 22:24:06 +00:00
Daniel Dai a5b6c92e89 Fix Swapdb crash
Former-commit-id: 597372e89faad099d8b7391c5e083255de1f1dce
2021-01-27 15:24:10 -05:00
christianEQ 2aed0db93b fixed uninitialized variables in ACLSetUserCommandBit
Former-commit-id: 23558c5719fa2951df5e019652924ea968ed435e
2021-01-26 23:29:15 +00:00
christianEQ 724117c3e5 fixed strncpy off-by-one errors
Former-commit-id: 6dd2042798e264dd2c15ad4795e5f8e4e586cf87
2021-01-26 23:27:28 +00:00
christianEQ ef934d40c3 removed unimplemented killIOThreads function declaration
Former-commit-id: 1acec0f11c8c5741a521f442f559be6b902d43e1
2021-01-26 22:27:22 +00:00
christianEQ 0e02a1cb05 fixed server.cpp mentions
Former-commit-id: da633f09d19157b2eaa8b32c05f07bc33bbf3086
2021-01-26 22:22:19 +00:00
christianEQ 0221403ae6 added note about io-threads to keydb.conf
Former-commit-id: 5b395d951f53af50e7d2f8f69f3ccdc3881a8465
2021-01-26 22:10:53 +00:00
christianEQ f3c7b79032 fixed race condition in connSocketWrite
Former-commit-id: 1a015c82284b509f73e326e44c44df87c1265365
2021-01-26 22:08:07 +00:00
christianEQ 554136f5b3 Removed Redis-specific things from conf file
Former-commit-id: 9ff6662c9d5c93b6a52e34a9acd53ef757c39339
2021-01-26 21:50:45 +00:00
christianEQ 3a13377335 Merge tag 'tags/6.0.10' into redismerge_2021-01-20
Former-commit-id: 3cdace182152727b2b19362072ab5f6ad55e2cd5
2021-01-26 21:43:09 +00:00
christianEQ 5d2bcd7776 changed loading process config types to be consistent across environments
Former-commit-id: 5206748bfc86d73c6ccc432cb4833f2383fb4741
2021-01-14 21:12:36 -05:00
christianEQ 23d3012eb4 renamed loaded key counter to be more clear
Former-commit-id: f1219663bd2ab507c863d3ec6206e95e46c1012f
2021-01-14 13:06:57 -05:00
christianEQ 89a48113e1 removed 'comment arguments' from config options (doesn't ignore inline comments)
Former-commit-id: 699e59b491954af3812da7d13628b8387ce411d5
2021-01-14 13:06:57 -05:00
christianEQ c5d4dc229d fixed signedness warning
Former-commit-id: 4ed05a76d5aed48a0e52015a8b4ffb3f7ecb4777
2021-01-14 13:06:57 -05:00
christianEQ 5621104d0e added section to keydb.conf for new options, tweaked default
Former-commit-id: 3fda1011452ad5827c87feefe7d9d5244cb0db87
2021-01-14 13:06:57 -05:00
christianEQ e33350f6bc ping replicas during key load
Former-commit-id: 1a5dce72817169b8ea4d06eb770124919c8c0a4a
2021-01-14 13:06:57 -05:00
christianEQ ea67fe825a added config option for loading callback interval keys
Former-commit-id: 6ca62735148627a137539301217c519770312b6e
2021-01-14 13:06:57 -05:00
christianEQ 05fc997663 configurized loading_process_events_interval_bytes
Former-commit-id: 02c650c5039504c69a13c98abc579ced79adc307
2021-01-14 13:06:57 -05:00
John Sully 2003225ce0 Fix intermittent module test failure, resizing the repl backlog is not good enough to clear the backlog
Former-commit-id: fd5c08a0ecdfda5eeb35bdf5dc767c11d1b353ec
2021-01-12 00:29:07 +00:00
benschermel 11926cd922 update perf chart, build info, job post link
Former-commit-id: 8a1a527f664d1a40663c61fdc127e3c74feac7a1
2021-01-11 11:40:00 -05:00
benschermel 6e0b385b99 created ascii logo image
Former-commit-id: 4dfa3d609a67bee466c96da767e7bb52f6d40273
2021-01-11 11:40:00 -05:00
John Sully f302712b6d Merge branch 'repl_perf' into unstable
Former-commit-id: c903d955a14a1b2304cded85ffba54d85b68567a
2020-12-24 02:22:57 +00:00
John Sully 2a8980a135 Don't write in the lock
Former-commit-id: 93b7364aaecbe578be4b75c18c840c4b396c7d4e
2020-12-17 06:52:59 +00:00
John Sully 8e759d128a Don't write in the lock
Former-commit-id: 93b7364aaecbe578be4b75c18c840c4b396c7d4e
2020-12-17 06:52:59 +00:00
John Sully c13b52ae8d Merge branch 'unstable' into keydbpro
Former-commit-id: 53a062a6b796ccbd43560fed1b05367ba759da96
2020-12-11 18:39:30 +00:00
John Sully f3c6d6b83b Merge branch 'unstable' into keydbpro
Former-commit-id: 53a062a6b796ccbd43560fed1b05367ba759da96
2020-12-11 18:39:30 +00:00
John Sully 03b347168a Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: 0f6cd758443f6a9d8a2856e3a6d6f431cc52c627
2020-12-11 03:59:50 +00:00
John Sully e848a39f6c don't try and free a client that can't be freed
Former-commit-id: da3b2e33fb31a46af4e979a704377e7b176d2bec
2020-12-11 03:59:39 +00:00
John Sully 0d37295788 Prevent use after free
Former-commit-id: 0bb42e7c1388eca172f32ecf7cab2e7261e658e2
2020-12-11 03:59:26 +00:00
John Sully 19ab526892 Merge branch 'unstable' into keydbpro
Former-commit-id: e59c3945d3ed0b05a3e42713b091b1b5c96a9db2
2020-12-11 00:49:54 +00:00
John Sully 06a81e1074 Merge branch 'unstable' into keydbpro
Former-commit-id: e59c3945d3ed0b05a3e42713b091b1b5c96a9db2
2020-12-11 00:49:54 +00:00
John Sully c3f0207ece Remove AE_ASSERT and use the proper assert infra
Former-commit-id: c81c858e9ecc2e17d034af40ed4a41f98c9a8184
2020-12-11 00:24:27 +00:00
John Sully 888ff95e6b Prevent test crash due to unimplemented save for nested hash
Former-commit-id: a6e4888b78a54e154a91f11eaa33bacf557996d6
2020-12-11 00:23:44 +00:00
John Sully 84545663e8 Fix crash freeing nested hash with list
Former-commit-id: 6435a6c672fe2ccbf9d05dc023bb53fbb26a68f8
2020-12-11 00:23:14 +00:00
John Sully a42288bcaa Fix test timeouts
Former-commit-id: 6f3feee67678b594fbe9fd592f9f823a7a07b770
2020-12-10 20:09:19 +00:00
John Sully 775e8d240a Fix test timeouts
Former-commit-id: 6f3feee67678b594fbe9fd592f9f823a7a07b770
2020-12-10 20:09:19 +00:00
John Sully 7eb901875b Merge branch 'repl_perf' into keydbpro
Former-commit-id: c4431a6be7a1ddc05abdd4510630fac2a2a6664e
2020-12-10 18:45:52 +00:00
John Sully 433981d3f4 Merge branch 'repl_perf' into keydbpro
Former-commit-id: c4431a6be7a1ddc05abdd4510630fac2a2a6664e
2020-12-10 18:45:52 +00:00
John Sully 81298de6da Merge branch 'unstable' into keydbpro
Former-commit-id: b7a1e16c0f04e8aeb3764e3681fa14fc0f97f6a3
2020-12-10 02:37:28 +00:00
John Sully 32304c5425 Merge branch 'unstable' into keydbpro
Former-commit-id: b7a1e16c0f04e8aeb3764e3681fa14fc0f97f6a3
2020-12-10 02:37:28 +00:00
Kajaruban Surendran 2b501361be Addressing PR comments
Former-commit-id: bdff284bbf1dce9340f9b67b3c100e47de159d4f
2020-12-04 14:54:06 -05:00
Kajaruban Surendran 890be9bc2c Addressing PR comments
Former-commit-id: f75add86841dab18958a2a8efda8fb30fefd4b7d
2020-12-04 14:54:06 -05:00
Kajaruban Surendran 911c409f94 Handling of aeResizeSetSize's return code for current thread
Former-commit-id: 52dc30ce32f915e67e59dcefce1f913d0c84c9cc
2020-12-04 14:54:06 -05:00
Kajaruban Surendran 73bf964327 check the aeResizeSetSize return code
Former-commit-id: 192644ef41f1aec99f76223c776de31dff38d71f
2020-12-04 14:54:06 -05:00
Kajaruban Surendran 37b09f2c06 Adding thread index to the error message
Former-commit-id: b6f6f0f1740accb0dc213a709440411320f6c867
2020-12-04 14:54:06 -05:00
Kajaruban Surendran 4e5b192def Call aePostFunction to change the setsize of each threads by that thread
Former-commit-id: 26aa7060b1985f0b46ffd4878ff41ec3dbe25cf1
2020-12-04 14:54:06 -05:00
Kajaruban Surendran 8a95f17a05 Calling initServerThread function cserver.cthreads(server-threads) times than MAX_EVENT_LOOPS(constant)
Former-commit-id: d3921bfafb478d02f3ba9a6a098c4c4a9cc091ea
2020-12-04 14:52:28 -05:00
christianEQ f06f55182c Issue: #204 Allocate 8 MB to thread stack
Former-commit-id: f02dccbad092f223f77962b2946933bd89ee3dff
2020-12-01 14:50:03 -05:00
John Sully bfc8948aa9 Issue: #260 Don't use C++ static_assert in C files
Former-commit-id: 3a53ab815c2148191e27db263b1b001ba40b0546
2020-11-30 23:01:20 +00:00
John Sully fd7cbbe4d5 code coverage reports should test multithreaded
Former-commit-id: 6af2ba5d246b5d43a4e146e538dbb4cca0195272
2020-11-30 22:59:00 +00:00
VivekSainiEQ 1e7d62f67b Added module data type load/save tests
Former-commit-id: 80976ac7708de11151850b2da733765f65dc7528
2020-11-30 17:47:04 -05:00
VivekSainiEQ 17be372b5c Removed use of module datatypes, now should work if tests/modules is not built
Former-commit-id: 6ed470dcf6718e1ee4aa5d507746cea710591d3a
2020-11-30 17:47:04 -05:00
VivekSainiEQ 58f5e7f9cf Added tests for saving various data types to disk and loading them back, and for loading data types from redis to maintain compatibility
Former-commit-id: 888c82911d6169b305d2f245bd55ac646785c040
2020-11-30 17:47:04 -05:00
VivekSainiEQ 4a4136fd18 Added remainder of runtest scripts to make lcov command. Code coverage goes from 57.9% to 72.1%
Former-commit-id: a273fefd761ca3eca476d56c0c187a0e72dd8b61
2020-11-30 17:47:04 -05:00
VivekSainiEQ 487dcd65c3 Added KeyDB.info to .gitignore file
Former-commit-id: c43cc37417773e837cffc70cec89a0799e14735f
2020-11-30 17:47:04 -05:00
Kajaruban Surendran 77bb11598b Configurable option for MOTD
Former-commit-id: 530cf1e2323233d554c18fba1c756bcdec4ab112
2020-11-30 10:42:48 -05:00
VivekSainiEQ 3634644315 Added references to KeyDB.info instead of redis.info
Former-commit-id: 2beaac58aba430a7bf1a0cc8a2c7b05fa421dc7f
2020-11-25 18:49:20 -05:00
VivekSainiEQ 43226ab4c6 Properly escaped $ in lcov command
Former-commit-id: 88f0b8cc8a465803298699fdb7e22a95975602bb
2020-11-25 18:49:20 -05:00
VivekSainiEQ 67ff83c078 Updated 'make lcov' command to exclude external dependancies and generate final code coverage percentage
Former-commit-id: a81d1da39760207a6a6af58a6f39a90e64accc52
2020-11-25 18:49:20 -05:00
VivekSainiEQ 2d5ce59ee4 Added test for issue #257
Former-commit-id: d5bb9c71f544944b9bb6aa4f1878918f2180519c
2020-11-25 17:21:37 -05:00
VivekSainiEQ 87caa9a91e Made NULL pointer check explicit, issue #257
Former-commit-id: 9db40371e91ee3049cd1df6d2a48ad6dee412f44
2020-11-25 17:21:37 -05:00
VivekSainiEQ 9506950051 Added NULL check to function objFromAllocPtr, now NULL input will map to NULL output even if active replica is enabled
Former-commit-id: 2ec45133b5fdcae4e95b44a2b6fb39dd46f7a390
2020-11-25 17:21:37 -05:00
John Sully 2dfec4fb92 Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: 4f1d44a28d1a410e7fce8a70a3ef9a286d485207
2020-11-23 02:01:54 +00:00
John Sully 5e51793751 Fix issue where active replication doesn't replicate RDB data
Former-commit-id: 95cf9b5f4d469cbf33199776c31713673a836fd8
2020-11-23 02:01:40 +00:00
Kajaruban Surendran 24017c3061 fix for the server crash when the maxclients increased via config set
Former-commit-id: 7457a0533ebd4d140ee46945f262068041c0bac0
2020-11-20 15:20:46 -05:00
John Sully 2ea281c3df Blocking clients should not crash if an active replica loads a remote RDB with a key in the blocklist
Former-commit-id: 95f29fa6e321d29d41d2fefab07ad5391780d3d2
2020-11-19 23:28:01 +00:00
John Sully e77c41e6dc Merge branch 'RELEASE_6' into keydbpro
Former-commit-id: 2ee33cb050b26cbe34f0b390b8807cdc1b908ded
2020-11-19 20:38:47 +00:00
John Sully 2d76c9ee21 Merge branch 'RELEASE_6' into keydbpro
Former-commit-id: 2ee33cb050b26cbe34f0b390b8807cdc1b908ded
2020-11-19 20:38:47 +00:00
John Sully ff792410aa Ensure multithreaded tests pass
Former-commit-id: bbbe78c86827ea3709bcdd5b1b960a30bca70ec9
2020-11-13 21:08:10 +00:00
John Sully a7da7b7446 Improve replication performance in multithreaded scenarios
Former-commit-id: a2ec35955e8040518ec18e3d25b5a0c0c5ae8a8c
2020-11-13 21:08:10 +00:00
John Sully af2aae39d2 Add ability to compile KeyDB without MOTD and curl
Former-commit-id: 23727346417cf948813dbd4801aea8a93f995072
2020-11-13 20:51:30 +00:00
John Sully 4db5e4ee6d Add missing file
Former-commit-id: 674ac5cf782fbb529aa88d361acdd431ea580416
2020-11-11 03:29:38 +00:00
John Sully 8019d11a6f Second implementation of nested hashes
Former-commit-id: b5603c032e2df25a76f57aee9d2a79c93416f4c7
2020-11-06 19:24:48 +00:00
John Sully 04651d9def Additional test reliability fixes
Former-commit-id: 17e75329203f8790833554533f85be5871ebba70
2020-10-27 07:25:43 +00:00
John Sully b2dcc47d48 Disarm not release D'oh
Former-commit-id: 0c68dae246b9c0039af2fef91d3f43ec54d289fe
2020-10-27 06:41:33 +00:00
John Sully 89b44a303b Active replica test reliability enhancements
Former-commit-id: 5dcf6b4b450dc53c05bc74060f29f6dd07d03b7e
2020-10-27 06:23:14 +00:00
John Sully e57dfd55aa Prevent crashes on shutdown due to lock being held
Former-commit-id: 5c4b8b6ceb7635c973ec54d6f873c66b9649a493
2020-10-27 04:53:19 +00:00
John Sully 2cee32b8b6 Ensure MVCC timestamp is incremented after the real time is updated
Former-commit-id: 2ab7773a22f86d2c26432611dce10a3c2165076c
2020-10-27 04:52:35 +00:00
John Sully 7ee9dd155e Fix multithreaded test failure
Former-commit-id: eef6200bfaaacb8e9682be1b72bed95ee50faa67
2020-10-27 01:54:13 +00:00
John Sully abd238c0de Avoid unnecessary memory fences
Former-commit-id: f3ea0ec949528f05a843ae624e8dd104dca3009b
2020-10-26 02:28:38 +00:00
John Sully 2a2d333a21 Remove addReply*Async methods since we already know if its async or not. This is just a source of bugs
Former-commit-id: 85c423e69c0f0daef21c0a267b30a324a1b64b84
2020-10-24 02:18:03 +00:00
John Sully bbb8090c2e Allow the locker to be used even without a client
Former-commit-id: 00d0b0d388a68329af8f0dcaec4005c26ca2b592
2020-10-23 20:21:49 +00:00
John Sully 485cb21e01 Fix multithread test failures
Former-commit-id: 554e86e0a360e65583786c480588c8503404db80
2020-10-23 15:57:39 +00:00
John Sully 51a8d8d118 Remove leak warning with ASAN in the CLI
Former-commit-id: 1d3355e6fbdde409b9fc4ca3443f31cb43857549
2020-10-21 21:16:08 +00:00
John Sully 78b8b74e58 run when necessary
Former-commit-id: d482e3758cb0cfb6037faa56714a20057ae33130
2020-10-16 07:00:03 +00:00
John Sully b4e3feab16 Fix replica buffer overflows
Former-commit-id: 4d839bc049d6f73509fe13ec8a27ca6fdc491540
2020-10-16 06:47:40 +00:00
John Sully 2fa4fe6264 Avoid locking if we won't run a time event
Former-commit-id: e54091e7e9ab4d2145823808bd76e43ece1b3f82
2020-10-16 06:19:52 +00:00
John Sully c8355e6aa5 Reduce async write copies
Former-commit-id: 88e119d9a24fa90f57c46445d1b0d06d88564bf3
2020-10-15 23:10:17 +00:00
John Sully 5e77b9e2dc Fix branding
Former-commit-id: f4856d487713926a31f48f838ace9197c8273ce1
2020-10-15 20:15:35 +00:00
John Sully d9aeb40ae3 Relax memory order where possible
Former-commit-id: a43e9c2d348ebdf3c1af8c2abce0d9d1195d6409
2020-10-13 06:35:16 +00:00
John Sully ad8bc153cb Significantly improve perf in replication scenarios
Former-commit-id: f3e7a8704e138d9990c4420e7c6c0cf4c6963d96
2020-10-12 15:27:03 +00:00
John Sully 8aaa09e520 Avoid excess locking, seeing up to 8% performance improvements
Former-commit-id: 9d36aea946498aaa58f6413a23528c77a6818695
2020-10-12 05:50:58 +00:00
John Sully 44adc8aa40 Perf: remove unnecessary vector operations
Former-commit-id: 446eac58e8dcbc0fec25a9a7d09b65765be6bb34
2020-10-12 04:28:39 +00:00
John Sully 8944fea601 Remove dead code
Former-commit-id: 23aad600ee82ead40b06ec559583f57076f160e6
2020-10-09 21:02:09 +00:00
Hanif Bin Ariffin c5aab0e855 Fixed non-empty check in src/Makefile
Per [GNU Make Manual](https://www.gnu.org/software/make/manual/html_node/Conditional-Syntax.html).
To properly check for non-empty variable, one must strip whitespaces.

Signed-off-by: Hanif Bin Ariffin <hanif.ariffin.4326@gmail.com>

Former-commit-id: 7b6b0fdd1b5e120e2fb7f7df4933a637d3139879
2020-10-05 10:58:49 -04:00
Hanif Bin Ariffin 50eb3b11eb Removed dead code from a macro in zmalloc.cpp
I think the compiler would have removed this no-op anyways but it
definitely wasted me some 30 minutes on this :(

I was hoping I could remove the branch through some bit-hacking but
apparently its dead code :). Oh well, its 30 minutes of refreshing
bit hacking.

Signed-off-by: Hanif Bin Ariffin <hanif.ariffin.4326@gmail.com>

Former-commit-id: bbc9912f528771174400e7344f30f8b114d7477a
2020-10-03 20:41:26 -04:00
John Sully ef0ee8dc5b Delete CONTRIBUTING
Former-commit-id: 13f3d36a150708e54684c9f64cda65ff84047837
2020-10-01 11:17:56 -04:00
John Sully 69fecd6fc2 Fix module test failures due to locking
Former-commit-id: 18aec70640ec81502bf1b5101e6032e3c31fbd69
2020-10-01 00:08:54 +00:00
John Sully af1dd6da3b Fix TLS test failure due to bad merge
Former-commit-id: 580e4ce876e29bcd6caa3e1a886d592c9334753f
2020-09-30 20:21:40 +00:00
John Sully fec0732050 Keep redis-cli.c C89 compatible
Former-commit-id: 2818216e401e659899436630f34798e3cf4ee875
2020-09-30 20:17:51 +00:00
John Sully 3934e60a19 Mac build break fix
Former-commit-id: 84ea1b14d32eddbe725d167c53c1c37170eb7a17
2020-09-30 20:17:02 +00:00
John Sully 194abc9a3a Fix stream replication failure with active replication, issue #238
Former-commit-id: 6f5a84f80bd1e85d1aa3f70c5a3ff6728e14ee3d
2020-09-30 20:12:54 +00:00
John Sully 12f40f1be5 Merge tag '6.0.8' into unstable
Former-commit-id: 137a30a99134e8655d36e7e5f462219cee68680c
2020-09-30 19:47:55 +00:00
John Sully 6cfa9d5539 Test RDB merge on load with active replication
Former-commit-id: 7355488e2bbfd0587e0ba39e925e802ee676e458
2020-09-29 03:26:06 +00:00
Ben Schermel 712532ada9 update deb changelog
Former-commit-id: 63c47a09e9
2020-09-28 23:42:54 +00:00
Ben Schermel c4c848ad7d update deb changelog
Former-commit-id: 087af94c22
2020-09-28 20:51:31 +00:00
John Sully 81a526039c Drop min-clients-per-thread to a more reasonable number
Former-commit-id: bf3a3225fc
2020-09-28 19:19:47 +00:00
John Sully 27e3cd1e31 Drop min-clients-per-thread to a more reasonable number
Former-commit-id: 7458885bc5d3a37314f29eb30e2d41052fa9727d
2020-09-28 19:17:36 +00:00
John Sully d4c986e90c bump version 6.0.16
Former-commit-id: dab9296d7c
2020-09-28 19:14:17 +00:00
John Sully f689c0002f Merge branch 'unstable' into RELEASE_6
Former-commit-id: a6f5a391a1
2020-09-28 18:55:24 +00:00
John Sully 50942877fc Merge branch 'unstable' into keydbpro
Former-commit-id: d1986d9fcdfd56f2c30ee95edef6d5260e0aa777
2020-09-24 22:02:30 +00:00
John Sully 4e24db3b4f Merge branch 'unstable' into keydbpro
Former-commit-id: d1986d9fcdfd56f2c30ee95edef6d5260e0aa777
2020-09-24 22:02:30 +00:00
John Sully ed66d8e3dc Support read only replicas attaching to active replicas (Bug #229)
Former-commit-id: 18e5082286fbe33762d7b24454c2c66e64dafac0
2020-09-23 04:16:08 +00:00
John Sully 222c6ab5c1 Active replicas memory leak
Former-commit-id: efaf186286d2d05180f3bc00a5286094490e4528
2020-09-22 21:38:35 +00:00
John Sully 885301272e Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: 9429c71d556c3fb3239c5fcb228899a8c24b65aa
2020-09-21 04:42:46 +00:00
Dmitry Dorofeev 07b94102a9 Fix to support FreeBSD pthread_getthreadid_np call
Former-commit-id: 631d1016d7aca127420c7dda820648dbf3a5708e
2020-09-21 00:41:41 -04:00
John Sully a8dea1bede Fix TSAN errors in fastlock
Former-commit-id: 6ab52458c0f3d367f53a7c3332bcc09c3fa61c9b
2020-09-21 03:26:50 +00:00
John Sully 7a071c14b2 Fix issue #222
Former-commit-id: 4c64071d62ebbb1a5dc568b6329a0c1b5193b3df
2020-09-21 01:09:58 +00:00
John Sully 5a760e15f0 Make multimaster replication info statelessly paresable
Former-commit-id: 8cfa8a1843fa0de18e87ddcd24ea3b7fb713e621
2020-09-20 23:57:06 +00:00
John Sully 9b9bf54f6e Dramatically improve the performance of subkey expires
Former-commit-id: 7004777a4be7a6c45076fce36e231a03081b8d94
2020-09-20 23:30:21 +00:00
John Sully 6923878c2d Reduce test noise
Former-commit-id: 752b647601cc281e4d9463e03920d04c537c12b2
2020-09-19 22:00:17 +00:00
John Sully 5173e88d36 Fix CI failure due to apt host changes
Former-commit-id: 2a41c6c5a4a015ecd09c005cadca68cb069eab54
2020-09-19 21:49:59 +00:00
John Sully 442247ec7d Avoid memory overhead in situations it won't be used (active rep only)
Former-commit-id: af404d639a1d41fd5e2e2ad5f217ec4beb9d30e7
2020-09-19 21:44:59 +00:00
John Sully 8466136c13 Update endurance test for ubuntu 20
Former-commit-id: d4b0def50606ba6f3fc61cc205563502ae82d68c
2020-09-17 02:10:18 +00:00
John Sully 2f17048470 Fix build break
Former-commit-id: 2a67483f81ce02acc9601e26740bef768b9331fd
2020-09-17 00:53:56 +00:00
John Sully 32e738f2a4 master_global_link_status should respect the quorum
Former-commit-id: 355fc22192b63679744c3119c35758d194c9de43
2020-09-17 00:31:10 +00:00
John Sully e9f5cd22a1 Allow reads during an active replica load, optionally allow writes as an experimental feature
Former-commit-id: 863531789ebc1fd7835fed9bf899ce7375a4c73c
2020-09-17 00:13:03 +00:00
John Sully 840db3cc6d Implement replica-quorum config
Former-commit-id: 4e6bbab1dc22a088c843b4dba34c6274b02903a7
2020-09-16 03:26:31 +00:00
Yossi Gottlieb a891d570f3 TLS: Session caching configuration support. (#7420)
* TLS: Session caching configuration support.
* TLS: Remove redundant config initialization.


Former-commit-id: c1da835e7d5216896275b560e97777e88c34a1a4
2020-09-16 02:10:29 +00:00
John Sully 883a30a68d Protocol error in client command
Former-commit-id: 3e7d004d88f2c1e0c9a3c4bcd981aefba66d7138
2020-09-11 20:48:18 +00:00
John Sully b3446a5e12 Fix more protocol errors
Former-commit-id: 61ec82c74d42ce347167f84662d853f127f93ae0
2020-09-11 20:47:27 +00:00
John Sully 19c824e18c Fix protocol difference with Redis
Former-commit-id: 7cacdec5f8396dedc7e8f185a8c705aed29aa3e9
2020-09-11 20:08:26 +00:00
John Sully 9ffd2bd39f Fix whitespace
Former-commit-id: fd4fc08016bf3c3d045cb82754ba285f4a0fb1fa
2020-09-07 03:35:46 +00:00
John Sully 6f4c157d0e Dramatically improve perf by blocking commands
Former-commit-id: 9f4b410c9ac2275a1e4ff9e5f187730913cd574d
2020-09-07 00:49:53 +00:00
John Sully 1cb9a3aea9 Implement use-fork config (fails with diskless repl)
Former-commit-id: f2d5c2bca22e9fd506db123c47b7f60cdded7e2c
2020-08-24 03:17:59 +00:00
John Sully ce20b04add Implement use-fork config (fails with diskless repl)
Former-commit-id: f2d5c2bca22e9fd506db123c47b7f60cdded7e2c
2020-08-24 03:17:59 +00:00
John Sully 5211e734b5 Implement use-fork config (fails with diskless repl)
Former-commit-id: 4e941b8d30612c1051a9dde67effaf8c5a86456f
2020-08-24 03:17:31 +00:00
John Sully 178bf55335 Implement use-fork config (fails with diskless repl)
Former-commit-id: 4e941b8d30612c1051a9dde67effaf8c5a86456f
2020-08-24 03:17:31 +00:00
John Sully a9e4a5058a Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: ed98be0ba81ffdc501847ea0d2486f5f01391319
2020-08-17 02:26:51 +00:00
John Sully 64b68999dc Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: ed98be0ba81ffdc501847ea0d2486f5f01391319
2020-08-17 02:26:51 +00:00
John Sully 725ff75179 Fix ARM build of RocksDB
Former-commit-id: 7301d6d5e76b65115e2610a5fc5afee443782d7c
2020-08-17 02:25:45 +00:00
John Sully 07d0154797 Fix ARM build of RocksDB
Former-commit-id: 7301d6d5e76b65115e2610a5fc5afee443782d7c
2020-08-17 02:25:45 +00:00
John Sully 2c2d22fe65 Fast cleanup of snapshots without leaving them forever
Former-commit-id: fdd83b2b49244ed2988b080892ee5cffe9fd2684
2020-08-17 00:33:37 +00:00
John Sully 49c1c3c7de Fast cleanup of snapshots without leaving them forever
Former-commit-id: fdd83b2b49244ed2988b080892ee5cffe9fd2684
2020-08-17 00:33:37 +00:00
John Sully 407a62ae67 Allow garbage collection of generic data
Former-commit-id: feadb7fb1845027422bcfca43dbcb6097409b8dc
2020-08-17 00:32:48 +00:00
John Sully 7d6394466c Allow garbage collection of generic data
Former-commit-id: feadb7fb1845027422bcfca43dbcb6097409b8dc
2020-08-17 00:32:48 +00:00
John Sully 58bb557624 Add snapshot depth to info string
Former-commit-id: 66aef678e9d6d7ab6c28622d54ada0ea8cdd2a99
2020-08-16 00:27:10 +00:00
John Sully f6c7a99743 Add snapshot depth to info string
Former-commit-id: 66aef678e9d6d7ab6c28622d54ada0ea8cdd2a99
2020-08-16 00:27:10 +00:00
John Sully a2d01828ad Don't try and consolidate snapshots with a depth of 1
Former-commit-id: 26c298bd9bc4e2c6981de5c20284120ea54580c3
2020-08-16 00:26:05 +00:00
John Sully 85e82d2513 Don't try and consolidate snapshots with a depth of 1
Former-commit-id: 26c298bd9bc4e2c6981de5c20284120ea54580c3
2020-08-16 00:26:05 +00:00
John Sully 2e5a715106 Only save MVCC tstamps if its an active replica
Former-commit-id: 5aded7dbad055308dc3932f7797fc71684b60966
2020-08-16 00:24:18 +00:00
John Sully e1270df8ea Only save MVCC tstamps if its an active replica
Former-commit-id: 5aded7dbad055308dc3932f7797fc71684b60966
2020-08-16 00:24:18 +00:00
John Sully 0fc392ceeb Don't free snapshot objects in a critical path (under the AE lock)
Former-commit-id: d0da3d3cb74334cc8a2d14f4bdaef7935181700a
2020-08-16 00:13:19 +00:00
John Sully 0167db6ef7 Don't free snapshot objects in a critical path (under the AE lock)
Former-commit-id: d0da3d3cb74334cc8a2d14f4bdaef7935181700a
2020-08-16 00:13:19 +00:00
John Sully 3089ecdc70 BUG: Cannot have an EMBSTR bigger than 255
Former-commit-id: e2d6e2d9d585cb7a73f469a8580f9cb0ec71a429
2020-08-15 23:30:22 +00:00
John Sully cd1212e238 BUG: Cannot have an EMBSTR bigger than 255
Former-commit-id: e2d6e2d9d585cb7a73f469a8580f9cb0ec71a429
2020-08-15 23:30:22 +00:00
John Sully cc5c98fa4a remove unnecessary allocation in rdb save
Former-commit-id: dfa76f04fd862e0cc7b4d3284b3922e3a5e5549d
2020-08-15 23:27:32 +00:00
John Sully cd426294a4 remove unnecessary allocation in rdb save
Former-commit-id: dfa76f04fd862e0cc7b4d3284b3922e3a5e5549d
2020-08-15 23:27:32 +00:00
John Sully a8ab467d8d Remove unnecessary key comparisons in perf critical snapshot paths
Former-commit-id: 40f8a8d102fdca9443399ef03a47df609b146d58
2020-08-15 23:25:58 +00:00
John Sully 00b5d3b9b1 Remove unnecessary key comparisons in perf critical snapshot paths
Former-commit-id: 40f8a8d102fdca9443399ef03a47df609b146d58
2020-08-15 23:25:58 +00:00
John Sully 61601fbaa2 dictMerge perf improvements
Former-commit-id: 48401ec369c5693689ef658cca518dc94ab1402e
2020-08-15 23:14:29 +00:00
John Sully ed3537fff8 dictMerge perf improvements
Former-commit-id: 48401ec369c5693689ef658cca518dc94ab1402e
2020-08-15 23:14:29 +00:00
John Sully 815d8ce117 Rehash efficiency
Former-commit-id: fab383156626ec683881101c22eb2f6c2cea4c5d
2020-08-15 23:05:56 +00:00
John Sully e277ed7d86 Rehash efficiency
Former-commit-id: fab383156626ec683881101c22eb2f6c2cea4c5d
2020-08-15 23:05:56 +00:00
John Sully c1455619b1 Prevent unnecessary copy when overwriting a value from a snapshot
Former-commit-id: 654a7bc6ea82f4ac45a1c1a25c794e1c27c0d902
2020-08-15 22:59:01 +00:00
John Sully 24663b22c1 Prevent unnecessary copy when overwriting a value from a snapshot
Former-commit-id: 654a7bc6ea82f4ac45a1c1a25c794e1c27c0d902
2020-08-15 22:59:01 +00:00
John Sully 98d1f913fa Merge branch 'unstable' into keydbpro
Former-commit-id: ae482585f0dc470efd73833f74111c2f87a172c5
2020-08-15 21:29:00 +00:00
John Sully 8fd2f6d1bb Merge branch 'unstable' into keydbpro
Former-commit-id: ae482585f0dc470efd73833f74111c2f87a172c5
2020-08-15 21:29:00 +00:00
John Sully d1705498ff Prehash the tombstone for cleanup
Former-commit-id: c9d97a7c7448fc769486175bea1648589487c87c
2020-08-14 16:05:39 +00:00
John Sully b65d18fa64 Prehash the tombstone for cleanup
Former-commit-id: c9d97a7c7448fc769486175bea1648589487c87c
2020-08-14 16:05:39 +00:00
benschermel 9b318a264b update changelog
Former-commit-id: 6709f3c8b776921fafd59046c646283f383cab71
2020-08-11 04:39:08 +00:00
benschermel 63843fe9ac update changelog
Former-commit-id: 6709f3c8b776921fafd59046c646283f383cab71
2020-08-11 04:39:08 +00:00
John Sully 1347ef8fc1 6.0.15 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 05140de5a46d05e39815472f96be526868800f30
2020-08-11 00:27:31 -04:00
John Sully 1d9ce839da 6.0.15 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 05140de5a46d05e39815472f96be526868800f30
2020-08-11 00:27:31 -04:00
John Sully 00ed7731df Add build flag to disable MVCC tstamps
Former-commit-id: 1ff2f20de5e41920043480d099e2b3fb16b1dc89
2020-08-10 06:10:24 +00:00
John Sully 6729f2f31a Fix lock after free in module API
Former-commit-id: afbe6c6553e4c2456f6259a2cea2ee66aab268eb
2020-08-10 06:10:24 +00:00
John Sully 5a13b0ff35 MVCC Perf fixes
Former-commit-id: 5a4afe5fb4231bec34d434f9e3214a7320842091
2020-08-10 05:45:56 +00:00
John Sully 1ca8945354 MVCC Perf fixes
Former-commit-id: 5a4afe5fb4231bec34d434f9e3214a7320842091
2020-08-10 05:45:56 +00:00
John Sully f5778f24e7 Fix assert caused by freeTombstoneObjects and null check in consolidate_children
Former-commit-id: 8565a02b331cd2bba2a1c7c6693dfb3f6e61c845
2020-08-10 05:01:36 +00:00
John Sully 2fcb94298e Fix assert caused by freeTombstoneObjects and null check in consolidate_children
Former-commit-id: 8565a02b331cd2bba2a1c7c6693dfb3f6e61c845
2020-08-10 05:01:36 +00:00
John Sully 3eb20eef14 RocksDB Read Performance Improvements
Former-commit-id: 80cca4869888e048e10e11f1f20796c482c3e5b3
2020-08-09 23:36:20 +00:00
John Sully 8cdef55843 RocksDB Read Performance Improvements
Former-commit-id: 80cca4869888e048e10e11f1f20796c482c3e5b3
2020-08-09 23:36:20 +00:00
John Sully 1f469446b9 Ensure we use the SSE CRC32 instruction
Former-commit-id: 78ef8976e86d07d4c1fa7c4631a610babf2f4776
2020-08-09 01:47:53 +00:00
John Sully 1724efaac3 Ensure we use the SSE CRC32 instruction
Former-commit-id: 78ef8976e86d07d4c1fa7c4631a610babf2f4776
2020-08-09 01:47:53 +00:00
John Sully 1b23e1b29f Start off storage cache with a larger size
Former-commit-id: 5f6fb970a81cc73586ba595b35564e7865e7262d
2020-08-09 00:57:56 +00:00
John Sully 65b61c9c63 Start off storage cache with a larger size
Former-commit-id: 5f6fb970a81cc73586ba595b35564e7865e7262d
2020-08-09 00:57:56 +00:00
John Sully 52cb1d2a1b Disable compression it destroys read perf
Former-commit-id: d3fffc12ae5339886f54c064127497f277393b00
2020-08-06 22:30:56 +00:00
John Sully f65108c650 Disable compression it destroys read perf
Former-commit-id: d3fffc12ae5339886f54c064127497f277393b00
2020-08-06 22:30:56 +00:00
John Sully c43d5c5b27 keydbpro unstable version should be 0.0.0
Former-commit-id: 4a6e0772f36d5dd721ad2e9b83f9fccce2e38ff0
2020-08-06 02:13:23 +00:00
John Sully 10b34326d7 keydbpro unstable version should be 0.0.0
Former-commit-id: 4a6e0772f36d5dd721ad2e9b83f9fccce2e38ff0
2020-08-06 02:13:23 +00:00
John Sully a68d233d47 Latency normalization with SCAN
Former-commit-id: 237f25d854e70d4d7a3095fdf56aaa80770e492e
2020-08-04 04:37:16 +00:00
John Sully 0b8a79e781 Latency normalization with SCAN
Former-commit-id: 237f25d854e70d4d7a3095fdf56aaa80770e492e
2020-08-04 04:37:16 +00:00
John Sully dc704f8d93 Bump version
Former-commit-id: 76c557e9f3c15094aa4f2c5f8a4484f73c7a96a4
2020-07-16 22:45:13 +00:00
John Sully b662876d6e Bump version
Former-commit-id: 76c557e9f3c15094aa4f2c5f8a4484f73c7a96a4
2020-07-16 22:45:13 +00:00
John Sully cc032f1d38 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 9bc0cb29f1c8dc8258603ea1c353fe495c1228ae
2020-07-16 22:42:48 +00:00
John Sully f800d02573 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 9bc0cb29f1c8dc8258603ea1c353fe495c1228ae
2020-07-16 22:42:48 +00:00
John Sully f4d2f3761e Fix memory leak in MVCC scan
Former-commit-id: 3acf80f8dd5ebc311670398745ef3400333a1fcb
2020-07-16 22:42:24 +00:00
John Sully 271f6e8a57 Fix memory leak in MVCC scan
Former-commit-id: 3acf80f8dd5ebc311670398745ef3400333a1fcb
2020-07-16 22:42:24 +00:00
John Sully 9bf1751b96 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: eb00c2dddc385dad4b0695d64b4f99f7a003c208
2020-07-14 04:34:56 +00:00
John Sully 47fc7f81c8 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: eb00c2dddc385dad4b0695d64b4f99f7a003c208
2020-07-14 04:34:56 +00:00
John Sully 2b8f614676 Fix test failure
Former-commit-id: 05d84f5fc184676d32c4bb61ac5957f1787cd4f8
2020-07-14 04:34:40 +00:00
John Sully a3ea2c8204 Fix test failure
Former-commit-id: 05d84f5fc184676d32c4bb61ac5957f1787cd4f8
2020-07-14 04:34:40 +00:00
John Sully 12b6655aa4 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 08264b4e755cee34704c85b191606a2b28d6d883
2020-07-14 04:25:05 +00:00
John Sully 79b22dcb8e Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 08264b4e755cee34704c85b191606a2b28d6d883
2020-07-14 04:25:05 +00:00
John Sully 86a95936ff Add new storage-provider-options config
Former-commit-id: 195a28beecc6094f959ddafef7fe33f5b55e4047
2020-07-14 04:24:46 +00:00
John Sully eea5c63dcd Add new storage-provider-options config
Former-commit-id: 195a28beecc6094f959ddafef7fe33f5b55e4047
2020-07-14 04:24:46 +00:00
John Sully 4c8b095fe9 Remove gitter, we don't check it often enough
Former-commit-id: 0fff96c31717cfef333e0b6e5e2b88b55a7beca5
2020-07-13 21:14:03 -04:00
John Sully d6626d8b68 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 86eb3f5c5ea3c17d798e74126e08114a2dd2449e
2020-07-13 18:16:05 +00:00
John Sully 7018fdb105 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 86eb3f5c5ea3c17d798e74126e08114a2dd2449e
2020-07-13 18:16:05 +00:00
John Sully 4cc6ad30aa Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: 7ce91d858f298d6172df7152fcf49188ca8251f3
2020-07-13 18:15:15 +00:00
John Sully 049c8decb8 Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: 7ce91d858f298d6172df7152fcf49188ca8251f3
2020-07-13 18:15:15 +00:00
John Sully 88f1f84299 Perf fixes on expire lock
Former-commit-id: 7f23ac087720317f54a0bc0e0c4774e7b0ef4337
2020-07-13 18:14:52 +00:00
John Sully 067d28ced5 Perf fixes on expire lock
Former-commit-id: 7f23ac087720317f54a0bc0e0c4774e7b0ef4337
2020-07-13 18:14:52 +00:00
John Sully 20fafa9248 Build fixes from cherry-pick
Former-commit-id: 70efd87cf71bb230e8b53d1c4ed3dd91997b4d23
2020-07-13 16:09:03 +00:00
John Sully 36faa5a3af Build fixes from cherry-pick
Former-commit-id: 70efd87cf71bb230e8b53d1c4ed3dd91997b4d23
2020-07-13 16:09:03 +00:00
John Sully ad7c5dbb25 unoredered_map is faster, reduce latency with the switch
Former-commit-id: f241e435ed0fd2988ada887f02e19884fd82be51
2020-07-13 16:04:00 +00:00
John Sully 712f10d8dd unoredered_map is faster, reduce latency with the switch
Former-commit-id: f241e435ed0fd2988ada887f02e19884fd82be51
2020-07-13 16:04:00 +00:00
John Sully 957673729e Remove unnecessary work from critical path (Latency Fixes)
Former-commit-id: 096a90deb7afe489875d3186f3f8f43e41fea329
2020-07-13 16:03:52 +00:00
John Sully 6f616418e5 Remove unnecessary work from critical path (Latency Fixes)
Former-commit-id: 096a90deb7afe489875d3186f3f8f43e41fea329
2020-07-13 16:03:52 +00:00
benschermel 0ef21f011b updating deb changelog
Former-commit-id: ea03d462ceddfbece66099304a91cc706fc93411
2020-07-13 01:41:18 -04:00
benschermel 0f1e830f53 updating deb changelog
Former-commit-id: ea03d462ceddfbece66099304a91cc706fc93411
2020-07-13 01:41:18 -04:00
benschermel dfa951d1f8 update deb changelog
Former-commit-id: a6782a3c0d
2020-07-13 01:35:25 -04:00
John Sully 3315d6f467 Bump version
Former-commit-id: 297f50e491030c2a65448aa80ec543263e28c298
2020-07-13 04:00:24 +00:00
John Sully 3785b293ed Bump version
Former-commit-id: 297f50e491030c2a65448aa80ec543263e28c298
2020-07-13 04:00:24 +00:00
John Sully 7188b28749 Bump version
Former-commit-id: f7d7baccc9
2020-07-13 03:59:16 +00:00
John Sully 61c37dcd5c Merge branch 'flash_cache' into keydbpro
Former-commit-id: 2a721ef645921d62b39f1374c0a3f5c92b00fae5
2020-07-13 03:53:34 +00:00
John Sully 10496feceb Merge branch 'flash_cache' into keydbpro
Former-commit-id: 2a721ef645921d62b39f1374c0a3f5c92b00fae5
2020-07-13 03:53:34 +00:00
John Sully 18a6f285be Merge branch 'PRO_RELEASE_6' into keydbpro
Former-commit-id: bffe010ea5279bee869bc61cc6d933979e10bbea
2020-07-13 03:32:14 +00:00
John Sully 33207b7f5e Merge branch 'PRO_RELEASE_6' into keydbpro
Former-commit-id: bffe010ea5279bee869bc61cc6d933979e10bbea
2020-07-13 03:32:14 +00:00
John Sully 835f0c0537 Merge branch 'unstable' into keydbpro
Former-commit-id: 0dafbc254a0efd5ee302d5c58fb2ca0a85110104
2020-07-13 03:31:47 +00:00
John Sully b3b424cddf Merge branch 'unstable' into keydbpro
Former-commit-id: 0dafbc254a0efd5ee302d5c58fb2ca0a85110104
2020-07-13 03:31:47 +00:00
John Sully 190e307920 Merge branch 'unstable' into RELEASE_6
Former-commit-id: eff294e374
2020-07-13 01:05:36 +00:00
John Sully ec4dded408 Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: b20436e8f078cc93eaa0191705060871d34001b4
2020-07-13 01:05:17 +00:00
John Sully 295c7f6979 Merge branch 'unstable' into RELEASE_6
Former-commit-id: f7c2006bf6
2020-07-13 01:04:49 +00:00
John Sully 0612dba980 Merge tag '6.0.5' into unstable
Redis 6.0.5


Former-commit-id: 2b3238403742f3ab047c62ee7fc3d6be8d05e56f
2020-07-13 00:55:23 +00:00
benschermel 5f10be5635 update rpm permissions
Former-commit-id: 7aec1e5c6463ea77d27833c66e124e8184c4a123
2020-07-12 18:08:29 -04:00
benschermel 30214509f0 update rpm permissions
Former-commit-id: 7aec1e5c6463ea77d27833c66e124e8184c4a123
2020-07-12 18:08:29 -04:00
benschermel 8b690bfda0 Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: 4c434ddd4ec61386c9ebed895f7ac56fe9bc2363
2020-07-12 18:04:40 -04:00
benschermel a63c8da562 update rpm permissions
Former-commit-id: e4d94022df4f9d39602b63c35e7e9efd5678dbd0
2020-07-12 18:03:21 -04:00
John Sully b3c0d517a9 Add the KEYDB.MEXISTS command, see issue #203
Former-commit-id: bbdf2f794529cdd2969c9b21be9d009b6554d6d2
2020-07-12 21:42:11 +00:00
John Sully 821f47e501 Add multi-master-no-forward command to reduce bus traffic with multi-master
Former-commit-id: 607ebd474f33085108e9e2ffeb3475941b7f8c13
2020-07-12 19:25:19 +00:00
John Sully c30ad7c92f Document min-clients-per-thread
Former-commit-id: 5b94e051cdc678700b2281d60a9510190e85a0b0
2020-07-12 18:49:02 +00:00
John Sully e506455480 Prevent deadlock in RM_ThreadSafeContextLock() when triggered as part of a module callback in a server thread
Former-commit-id: 61119d6c18fe39e93e961985120214c6b263b747
2020-07-12 18:17:53 +00:00
John Sully 79d933cd08 Fix CLI crash on arch with hostname
Former-commit-id: 55fd37e8d6c3775d0b1bd13966ca033f63945d7e
2020-07-12 05:38:08 +00:00
John Sully a07d19f2eb Fix CLI crash on arch with hostname
Former-commit-id: 55fd37e8d6c3775d0b1bd13966ca033f63945d7e
2020-07-12 05:38:08 +00:00
John Sully 7f2e3ebea4 Fix CLI crash on arch with hostname
Former-commit-id: a5b584d7d36c60cbbcf815572229b6c80a3a3dce
2020-07-12 05:37:43 +00:00
John Sully 2f4b772cba Fix CLI crash on arch with hostname
Former-commit-id: a5b584d7d36c60cbbcf815572229b6c80a3a3dce
2020-07-12 05:37:43 +00:00
John Sully 2a5fcf271e Fix failure to replicate with license key
Former-commit-id: d34723c567b36f8222c93fac6f0ed1f79104f33e
2020-07-12 05:15:22 +00:00
John Sully 48b91791a6 Fix failure to replicate with license key
Former-commit-id: d34723c567b36f8222c93fac6f0ed1f79104f33e
2020-07-12 05:15:22 +00:00
John Sully c2aab0c9a2 Fix failure to replicate with license key
Former-commit-id: 41a72a795ade90b1aea509e9e3ebad819a997acf
2020-07-12 05:14:59 +00:00
John Sully 237aa9e752 Fix failure to replicate with license key
Former-commit-id: 41a72a795ade90b1aea509e9e3ebad819a997acf
2020-07-12 05:14:59 +00:00
John Sully 918fe46caf Fix failure to merge databases on active replica sync, due to bad merge with Redis 6
Former-commit-id: a04988583580bbe9c709163bab0719345abce1c0
2020-07-12 01:13:22 +00:00
John Sully 4de18de7e1 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 507b791211b4b0c3251dc538fa385cd95a189e80
2020-07-11 22:27:32 +00:00
John Sully fcacb7422b Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 507b791211b4b0c3251dc538fa385cd95a189e80
2020-07-11 22:27:32 +00:00
John Sully 52f6d76588 Add KeyDB Pro info section
Former-commit-id: d73015fae36ece6db7b088cc55843385688b1866
2020-07-11 22:21:12 +00:00
John Sully 38ea14246f Add KeyDB Pro info section
Former-commit-id: d73015fae36ece6db7b088cc55843385688b1866
2020-07-11 22:21:12 +00:00
John Sully b6acd18ffa Sentinel doesn't need a license key
Former-commit-id: bc2d8c18255214b873bf45d8db8af3727ebc4723
2020-07-11 22:13:07 +00:00
John Sully fdb01a2a6d Sentinel doesn't need a license key
Former-commit-id: bc2d8c18255214b873bf45d8db8af3727ebc4723
2020-07-11 22:13:07 +00:00
John Sully 52a1a415c2 Fix failure to replicate with non-pro server when license key is set
Former-commit-id: a69beef7d92223c8dcebb9c39ca2409183571e57
2020-07-11 22:09:27 +00:00
John Sully 71d79296b8 Fix failure to replicate with non-pro server when license key is set
Former-commit-id: a69beef7d92223c8dcebb9c39ca2409183571e57
2020-07-11 22:09:27 +00:00
John Sully 657d261760 Support missing Redis 6 config options
Former-commit-id: 86a5f37fb14623400fec22f52bf530dc7be1d0cd
2020-07-11 21:39:20 +00:00
John Sully 11455692ad Support missing Redis 6 config options
Former-commit-id: d467701c6cd8ebe2937c6fda816a706a6b17182a
2020-07-11 21:38:17 +00:00
John Sully 3c808e3e08 Support missing Redis 6 config options
Former-commit-id: d467701c6cd8ebe2937c6fda816a706a6b17182a
2020-07-11 21:38:17 +00:00
John Sully ae2afc082a Implement storage key cache, and writeback memory model
Former-commit-id: 732bd9c153459f1174475ad67de36c399ddbe359
2020-07-11 21:23:48 +00:00
John Sully f3cba11f79 Implement storage key cache, and writeback memory model
Former-commit-id: 732bd9c153459f1174475ad67de36c399ddbe359
2020-07-11 21:23:48 +00:00
John Sully 2601b3936b Eliminate eviction loops. And don't OOM so often with storage providers set
Former-commit-id: 6e61cd33b4366f008b07aae88f49fd0ac9cbcaec
2020-07-11 06:51:08 +00:00
John Sully 39fe60fff8 Eliminate eviction loops. And don't OOM so often with storage providers set
Former-commit-id: 6e61cd33b4366f008b07aae88f49fd0ac9cbcaec
2020-07-11 06:51:08 +00:00
John Sully caa35a48ed Eliminate eviction loops. And don't OOM so often with storage providers set
Former-commit-id: 189674aea74c483bf0869050ecf7bf2b0b49f34e
2020-07-11 04:23:35 +00:00
John Sully e14ac88246 Eliminate eviction loops. And don't OOM so often with storage providers set
Former-commit-id: 189674aea74c483bf0869050ecf7bf2b0b49f34e
2020-07-11 04:23:35 +00:00
John Sully a3f416c9d5 Bump version
Former-commit-id: ee5a281ed0012aca359b9448df5236bef719f4a7
2020-07-10 04:13:42 +00:00
John Sully 62a8d9b336 Bump version
Former-commit-id: ee5a281ed0012aca359b9448df5236bef719f4a7
2020-07-10 04:13:42 +00:00
John Sully 6332395792 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 243dcb3853cc965109cb24a940229db7844cdd11
2020-07-10 04:11:57 +00:00
John Sully 6d2e560a3e Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 243dcb3853cc965109cb24a940229db7844cdd11
2020-07-10 04:11:57 +00:00
John Sully 66a931c85f Merge branch 'mvcc_scan' into keydbpro
Former-commit-id: f0a3f491b61a9bb7ee4ab86098958cb161b75f59
2020-07-10 03:44:20 +00:00
John Sully 4a47df12fe Merge branch 'mvcc_scan' into keydbpro
Former-commit-id: f0a3f491b61a9bb7ee4ab86098958cb161b75f59
2020-07-10 03:44:20 +00:00
John Sully 1216fd8457 MVCC scan support filtering by type on the async thread
Former-commit-id: 14f8c0ff686b93976eead5fa6bf526c2eecb5ae0
2020-07-10 03:43:56 +00:00
John Sully f52d3a3892 MVCC scan support filtering by type on the async thread
Former-commit-id: 14f8c0ff686b93976eead5fa6bf526c2eecb5ae0
2020-07-10 03:43:56 +00:00
John Sully c97dace784 Fix issue where SCAN misses elements while snapshot is in flight
Former-commit-id: ce005d748ebf0e116d674a96f74d698d17394010
2020-07-10 01:43:51 +00:00
John Sully 685f549b32 Fix issue where SCAN misses elements while snapshot is in flight
Former-commit-id: ce005d748ebf0e116d674a96f74d698d17394010
2020-07-10 01:43:51 +00:00
John Sully bfff449ef9 Disable MVCC GET, the overhead is not worth it
Former-commit-id: 8c7e1001e98be0d0e6fe0079fc9406d5d65366ff
2020-07-10 01:43:32 +00:00
John Sully feddce79fa Disable MVCC GET, the overhead is not worth it
Former-commit-id: 8c7e1001e98be0d0e6fe0079fc9406d5d65366ff
2020-07-10 01:43:32 +00:00
John Sully 33385a0a63 Fix issue where we fail to return all data
Former-commit-id: 7341c9ed14d13386a045afd6deda9c0db422cd5f
2020-07-10 00:18:10 +00:00
John Sully ea094a8ca4 Fix issue where we fail to return all data
Former-commit-id: 7341c9ed14d13386a045afd6deda9c0db422cd5f
2020-07-10 00:18:10 +00:00
John Sully 90270193e6 Graceful shutdown running async jobs
Former-commit-id: 2ce5b94741d384b2dfd6d3b347fa1582cd45df8f
2020-07-10 00:17:39 +00:00
John Sully f774fcb704 Graceful shutdown running async jobs
Former-commit-id: 2ce5b94741d384b2dfd6d3b347fa1582cd45df8f
2020-07-10 00:17:39 +00:00
John Sully 184f22e502 Fix race in db iterators in scan
Former-commit-id: a6444870660c0d3f52cd7b1dc0b80223f0d58e70
2020-07-09 22:29:27 +00:00
John Sully 7ccd312069 Fix race in db iterators in scan
Former-commit-id: a6444870660c0d3f52cd7b1dc0b80223f0d58e70
2020-07-09 22:29:27 +00:00
John Sully 86533f3c52 Do actual filtering on the async thread
Former-commit-id: 64b17139b7b5ff55bb52f27dc6f91cb81adde031
2020-07-09 21:58:06 +00:00
John Sully 6f676ba0a2 Do actual filtering on the async thread
Former-commit-id: 64b17139b7b5ff55bb52f27dc6f91cb81adde031
2020-07-09 21:58:06 +00:00
John Sully cf4c38f0df Initial scan implementation (not tested)
Former-commit-id: 0f3911d56e6878d91b6e3cacc7d637934ffe6099
2020-07-09 12:57:35 -04:00
John Sully cee8118242 Initial scan implementation (not tested)
Former-commit-id: 0f3911d56e6878d91b6e3cacc7d637934ffe6099
2020-07-09 12:57:35 -04:00
John Sully 2b503c0660 Latency fixes
Former-commit-id: d8c43b48b847ad9abd4d288930ca73388c95fb14
2020-07-01 21:59:38 -04:00
Muhammad Zahalqa 6fd951d785 replace memcpy with cctor on objects
Former-commit-id: 8534c02c5fb22f00d7a0746d79cbfd6d3186c586
2020-06-24 23:20:59 -04:00
Muhammad Zahalqa 047731d2e7 unique lock used with cv.wait already owns mutex
Former-commit-id: 91ad3e8df3ab1c1db8d6a46ccffb75bac1369494
2020-06-24 23:18:53 -04:00
Muhammad Zahalqa a6fbb5ff23 Fix bug in condition_variabe.wait usage
consition variable wait should always be called with a locked mutex.
This code break the pre-conditions of using wait.


Former-commit-id: 8981f96ca559b2bb885d0a67887854d6c42e8fef
2020-06-24 23:18:53 -04:00
Muhammad Zahalqa 0cf47603c4 fixes for robj_sharedptr
1. fix cases where null pointer might be accessed
2. make assignmnet op safe
3. make operator bool explicit (safe bool idiom)
4. make comparison operators symetric

fix robj_sharedptr use in rdb.cpp


Former-commit-id: 882b71a1fdd76a3b7dc32b21561c3625ff4dbcef
2020-06-24 23:18:27 -04:00
Muhammad Zahalqa 497ddf1525 aeCommand objects no need for memset and missing init of some memebers.
Former-commit-id: 1c9d1e6ca957174ffb5d66a1d8cafab2948e08d8
2020-06-24 23:15:29 -04:00
benschermel 9e328524b5 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 6e9ec7ae3ca49a6054f012e567eb74307227c330
2020-06-24 00:34:35 -04:00
benschermel 821dc2dab3 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 6e9ec7ae3ca49a6054f012e567eb74307227c330
2020-06-24 00:34:35 -04:00
benschermel 1b7aaeb69c update deb changelog
Former-commit-id: 85fe16238fdb692067f77f631b0589366823ba34
2020-06-24 00:32:10 -04:00
benschermel 32406500bf update deb changelog
Former-commit-id: 85fe16238fdb692067f77f631b0589366823ba34
2020-06-24 00:32:10 -04:00
John Sully 2a8ced1e1a Merge PKG files from unstable
No code change


Former-commit-id: 42c4d85d72
2020-06-24 00:16:21 -04:00
Ben Schermel 9c7ba6b408 bump version after merge
Former-commit-id: 59279d36e9337ca89518c4d1edef6c26911ea190
2020-06-16 14:17:20 -04:00
Ben Schermel 7a5ae1a6af bump version after merge
Former-commit-id: 59279d36e9337ca89518c4d1edef6c26911ea190
2020-06-16 14:17:20 -04:00
Ben Schermel 85dcc6d3bb Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: cf7ed118553af55a27c3a57c121bc26e18e0ab7e
2020-06-16 14:16:03 -04:00
Ben Schermel 7c8f260b38 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: cf7ed118553af55a27c3a57c121bc26e18e0ab7e
2020-06-16 14:16:03 -04:00
Ben Schermel b27c7bfb6f Merge branch 'PRO_RELEASE_6' of https://github.com/JohnSully/KeyDB-Pro into PRO_RELEASE_6
Former-commit-id: ff7ec3ec39d692ed59c945ace5c9a4ec140f5e52
2020-06-16 14:15:51 -04:00
Ben Schermel 65bedabe7d Merge branch 'PRO_RELEASE_6' of https://github.com/JohnSully/KeyDB-Pro into PRO_RELEASE_6
Former-commit-id: ff7ec3ec39d692ed59c945ace5c9a4ec140f5e52
2020-06-16 14:15:51 -04:00
John Sully a4a4b7ec9f Fix crash in async delete when storage provider is not set and key doesn't actually exist
Former-commit-id: 4a4828390118ab52851d8bf229c4ae853100053c
2020-06-15 19:47:06 -04:00
John Sully cda77594e5 Fix crash in async delete when storage provider is not set and key doesn't actually exist
Former-commit-id: 4a4828390118ab52851d8bf229c4ae853100053c
2020-06-15 19:47:06 -04:00
Ben Schermel 3b1f7103c4 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 97280cec291bca779739e008b9467fbb40a19a5f
2020-06-10 17:35:21 -04:00
Ben Schermel 129d3b7441 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 97280cec291bca779739e008b9467fbb40a19a5f
2020-06-10 17:35:21 -04:00
Ben Schermel a22512bd45 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: f70e34b999ba842617ed39b88a7f5bb453d570c5
2020-06-10 17:27:34 -04:00
Ben Schermel 58c6a7a0cd Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: f70e34b999ba842617ed39b88a7f5bb453d570c5
2020-06-10 17:27:34 -04:00
John Sully f2e8329509 Fix failure to find expire during rehash
Former-commit-id: b66269865cb71a5e1dd33588b012206da2765824
2020-06-10 12:48:54 -04:00
John Sully 0b9091b999 Fix failure to find expire during rehash
Former-commit-id: b66269865cb71a5e1dd33588b012206da2765824
2020-06-10 12:48:54 -04:00
John Sully f3b5a90626 Bump version
Former-commit-id: c7b16835b1c52e9d8a4859a5b6e42ea5f6a31df2
2020-06-09 21:03:11 -04:00
John Sully 9916e303c2 Bump version
Former-commit-id: c7b16835b1c52e9d8a4859a5b6e42ea5f6a31df2
2020-06-09 21:03:11 -04:00
John Sully c55351cb93 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 9d8d3a54fdb9eaad0a7cfc3d938fa35d2819fa93
2020-06-09 21:02:55 -04:00
John Sully 5a9ef1e81b Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 9d8d3a54fdb9eaad0a7cfc3d938fa35d2819fa93
2020-06-09 21:02:55 -04:00
John Sully 9411a40a5b Fix assert false alarm when freeTombstoneObjects is called
Former-commit-id: e21a011072505cfa0a37afefb94f7270e80625c5
2020-06-09 20:59:09 -04:00
John Sully 50d44e01c4 Fix assert false alarm when freeTombstoneObjects is called
Former-commit-id: e21a011072505cfa0a37afefb94f7270e80625c5
2020-06-09 20:59:09 -04:00
John Sully 8d1d303643 Fix lock inversion
Former-commit-id: 430cf88623fce8f0675ea19f73d98f6cafe9070f
2020-06-09 20:58:03 -04:00
John Sully 4f6c1efc55 Fix lock inversion
Former-commit-id: 430cf88623fce8f0675ea19f73d98f6cafe9070f
2020-06-09 20:58:03 -04:00
John Sully 303b58cf2f COW pointer is not thread safe so we need a global expire lock
Former-commit-id: ac12eef75301564d920e622a08e4f586486fd395
2020-06-09 19:58:42 -04:00
John Sully ebe0b3ece1 COW pointer is not thread safe so we need a global expire lock
Former-commit-id: ac12eef75301564d920e622a08e4f586486fd395
2020-06-09 19:58:42 -04:00
John Sully ec4e2a680c keys command should look at the snapshots expire datastructure
Former-commit-id: 70563afab48e607e127c07d637660d94d1eede6d
2020-06-09 18:57:36 -04:00
John Sully d99594a3a5 keys command should look at the snapshots expire datastructure
Former-commit-id: 70563afab48e607e127c07d637660d94d1eede6d
2020-06-09 18:57:36 -04:00
John Sully 220bd27930 Implement replicaof remove as requested in issue #192
Former-commit-id: f0a32351c50fac79727a1be28f03fb527cf580de
2020-06-09 12:43:58 -04:00
Ben Schermel d0c29a2756 fix issues from rebase
Former-commit-id: 5d7cc28208bbe7b49eed0d1b1c2bb1c31e65e865
2020-06-09 00:10:58 -04:00
Ben Schermel 2dd3f584cc fix issues from rebase
Former-commit-id: 5d7cc28208bbe7b49eed0d1b1c2bb1c31e65e865
2020-06-09 00:10:58 -04:00
Ben Schermel 8627d75aef update Dockerfile
Former-commit-id: 3f8dcfdf865ca0857bf2d5261b858cc3daa22f3f
2020-06-09 00:10:58 -04:00
Ben Schermel 2c58377168 update Dockerfile
Former-commit-id: 3f8dcfdf865ca0857bf2d5261b858cc3daa22f3f
2020-06-09 00:10:58 -04:00
Ben Schermel 9b42437630 updating changelog
Former-commit-id: 5affe6dd268bb333214f70f5f809050e4b00b28b
2020-06-09 00:10:58 -04:00
Ben Schermel e82831f35e updating changelog
Former-commit-id: 5affe6dd268bb333214f70f5f809050e4b00b28b
2020-06-09 00:10:58 -04:00
Ben Schermel 0d3e590022 dh9 for stretch deb pkg
Former-commit-id: 5cf02197ba418b5302759c14195ffa33a1db70fe
2020-06-09 00:10:58 -04:00
Ben Schermel 3bf75d133c dh9 for stretch deb pkg
Former-commit-id: 5cf02197ba418b5302759c14195ffa33a1db70fe
2020-06-09 00:10:58 -04:00
Ben Schermel 9c058fa7b2 fix missing sentinel
Former-commit-id: 01fe9274e8cb73a065d8550f220d07e5eacd0156
2020-06-09 00:10:58 -04:00
Ben Schermel bd94fcb152 fix missing sentinel
Former-commit-id: 01fe9274e8cb73a065d8550f220d07e5eacd0156
2020-06-09 00:10:58 -04:00
Ben Schermel b1bff21085 update changelog
Former-commit-id: e2be81157e9cd1f57b9d734c5536dc0f4d5dbb0b
2020-06-09 00:10:58 -04:00
Ben Schermel 977e1722e0 update changelog
Former-commit-id: e2be81157e9cd1f57b9d734c5536dc0f4d5dbb0b
2020-06-09 00:10:58 -04:00
Ben Schermel 8c71a36cb4 update changelog
Former-commit-id: f0fe6c6b3f249a919ad5f4a233049c7a931bf5cc
2020-06-09 00:10:58 -04:00
Ben Schermel 2712c4d2af update changelog
Former-commit-id: f0fe6c6b3f249a919ad5f4a233049c7a931bf5cc
2020-06-09 00:10:58 -04:00
Ben Schermel e6a031d342 update changelog
Former-commit-id: 5acb71ac79be4b0404fc56e82485a28f9664a017
2020-06-09 00:10:58 -04:00
Ben Schermel 4fa31ea86e update changelog
Former-commit-id: 5acb71ac79be4b0404fc56e82485a28f9664a017
2020-06-09 00:10:58 -04:00
Ben Schermel 53a11d7f5b update changelog
Former-commit-id: adb5f42d945960cbe153e3614a1126972c8ce841
2020-06-09 00:10:58 -04:00
Ben Schermel 75d895be43 update changelog
Former-commit-id: adb5f42d945960cbe153e3614a1126972c8ce841
2020-06-09 00:10:58 -04:00
Ben Schermel 80fd1c23ea include support for dists < dh11
Former-commit-id: 1930b759a9acce126342709acfb7884649023f3d
2020-06-09 00:10:58 -04:00
Ben Schermel 8c1313c28e include support for dists < dh11
Former-commit-id: 1930b759a9acce126342709acfb7884649023f3d
2020-06-09 00:10:58 -04:00
Ben Schermel f8edaba613 enable source build from dh9 where applicable
Former-commit-id: 9e8ea41f73674fb836f89e5d53474b271abf10d8
2020-06-09 00:10:58 -04:00
Ben Schermel e0676e4a9e enable source build from dh9 where applicable
Former-commit-id: 9e8ea41f73674fb836f89e5d53474b271abf10d8
2020-06-09 00:10:58 -04:00
Ben Schermel 9be6f8ee54 update rpm versioning
Former-commit-id: a3ccaeee78279356ec70b136df07026a9fdd43d7
2020-06-09 00:10:58 -04:00
Ben Schermel 40da05d8e4 update rpm versioning
Former-commit-id: a3ccaeee78279356ec70b136df07026a9fdd43d7
2020-06-09 00:10:58 -04:00
Ben Schermel 5f9b73d490 fix rpmbuild dirs
Former-commit-id: 2cf077e6d3bc98cf75120185c7985030b0aa4040
2020-06-09 00:10:58 -04:00
Ben Schermel aa30526242 fix rpmbuild dirs
Former-commit-id: 2cf077e6d3bc98cf75120185c7985030b0aa4040
2020-06-09 00:10:58 -04:00
Ben Schermel 8cbcea4cd6 fix rpmbuild directories
Former-commit-id: 185b6459b065c740990ca503fad880e87d15c436
2020-06-09 00:10:58 -04:00
Ben Schermel b187bc5250 fix rpmbuild directories
Former-commit-id: 185b6459b065c740990ca503fad880e87d15c436
2020-06-09 00:10:58 -04:00
Ben Schermel b5a018a2c0 fix rpmbuild directories
Former-commit-id: 314639460f4959ad6f9d4342d5baa6ad4446e7d4
2020-06-09 00:10:58 -04:00
Ben Schermel 2f72982905 fix rpmbuild directories
Former-commit-id: 314639460f4959ad6f9d4342d5baa6ad4446e7d4
2020-06-09 00:10:58 -04:00
Ben Schermel 61dde8f3ae use dh_installsystemd
Former-commit-id: 9d6d4fba41550442bf04153dc6d6f19a42afb207
2020-06-09 00:10:58 -04:00
Ben Schermel a9b1cffa82 use dh_installsystemd
Former-commit-id: 9d6d4fba41550442bf04153dc6d6f19a42afb207
2020-06-09 00:10:58 -04:00
Ben Schermel bd028278b5 adding dh_installsystemd
Former-commit-id: 39817055d85b4f6a0d575b94737f1b1b2c952708
2020-06-09 00:10:58 -04:00
Ben Schermel 9797bc0679 adding dh_installsystemd
Former-commit-id: 39817055d85b4f6a0d575b94737f1b1b2c952708
2020-06-09 00:10:58 -04:00
Ben Schermel 1c58a9ce3e fix pkg errors
Former-commit-id: 91ef1a50fb8602c7f09156a84eca17dca70b3d2e
2020-06-09 00:10:58 -04:00
Ben Schermel d7fc33e23f fix pkg errors
Former-commit-id: 91ef1a50fb8602c7f09156a84eca17dca70b3d2e
2020-06-09 00:10:58 -04:00
Ben Schermel d395ea54fc adding packaging
Former-commit-id: 108c58ba5333129eabf64f775e69f5cb7b6cbdf9
2020-06-09 00:10:58 -04:00
Ben Schermel d16e0c47d2 adding packaging
Former-commit-id: 108c58ba5333129eabf64f775e69f5cb7b6cbdf9
2020-06-09 00:10:58 -04:00
John Sully 06265aa260 Merge branch 'unstable' into keydbpro
Former-commit-id: ca3a50537e987bd30aec38265be535d89bb260f3
2020-06-08 16:51:16 -04:00
John Sully c77dbfaff2 Merge branch 'unstable' into keydbpro
Former-commit-id: ca3a50537e987bd30aec38265be535d89bb260f3
2020-06-08 16:51:16 -04:00
John Sully ef51cfa877 Update gcov for C++
Former-commit-id: e75cdb20ace406e50a5772160995de4ec62465aa
2020-06-08 16:48:44 -04:00
Ben Schermel fca621dcc2 update Dockerfile
Former-commit-id: 3002959ad2c21173a7652a22a27b65b512e3b791
2020-06-08 15:34:22 -04:00
Ben Schermel 64804ceeb1 updating changelog
Former-commit-id: 5b0fc93119cc758667f7853ba5c9e8b9f0130ada
2020-06-08 15:34:22 -04:00
Ben Schermel cc6e6c4558 dh9 for stretch deb pkg
Former-commit-id: 3d9e61097bfc244b3d2490597447c00293ecf5d5
2020-06-08 15:34:22 -04:00
Ben Schermel e1845f15cf fix missing sentinel
Former-commit-id: a04840112fcae10769a67051d79d6fdaaafa6726
2020-06-08 15:34:22 -04:00
Ben Schermel 13a6464bf5 update changelog
Former-commit-id: 36ba366c1084377b895031efc9bee5b0a54dbc04
2020-06-08 15:34:22 -04:00
Ben Schermel 0f4ebade13 update changelog
Former-commit-id: e4b3980f18a16204a2d9700de887cd122754e5c9
2020-06-08 15:34:22 -04:00
Ben Schermel dcde6ffe51 update changelog
Former-commit-id: a9791dd089830e86c863d2a04109dea26b609a1c
2020-06-08 15:34:22 -04:00
Ben Schermel 19c6643a1f include support for dists < dh11
Former-commit-id: 00c29d05e4a51b55bbf823b21adedb4afeae535a
2020-06-08 15:34:22 -04:00
Ben Schermel 96b183e7d0 fix rpmbuild dirs
Former-commit-id: bc962bd572ab2bd7170ff53c89497c661502c3de
2020-06-08 15:34:22 -04:00
Ben Schermel 526f2bf78d fix rpmbuild dirs
Former-commit-id: 703816e419c37b55904ab700cbd2ac40b50e3915
2020-06-08 15:34:22 -04:00
Ben Schermel bda8f4c3c0 adding dh_installsystemd
Former-commit-id: 1f81b5f2418dfe4f1d74ed3d1be3fe22c410f61d
2020-06-08 15:34:22 -04:00
Ben Schermel bc68456e35 strip unused from deb source
Former-commit-id: 2917754a62e7e8b94753abf70dd31e5c1b889ee0
2020-06-08 15:34:22 -04:00
benschermel 546445576a add deb/rpm/docker support
Former-commit-id: 8f2a32b35df5646ddf95d4ac19e22b3af8bebada
2020-06-08 15:34:22 -04:00
benschermel b1d51e3a3f add deb/rpm/docker support
Former-commit-id: 450a71fb2bda16ca10778d3c9bf68d9e3ef50377
2020-06-08 15:34:22 -04:00
benschermel ea81e82400 update github CI for deb
Former-commit-id: df00307ceb2e2aa2e77d3ee558bfe429797cce0c
2020-06-08 15:34:22 -04:00
Ben Schermel a2426c7fba update rpm versioning
Former-commit-id: c884b90a09dbb7b584785769b6421420cd431be6
2020-06-08 15:34:22 -04:00
benschermel bfcb563dfc add package utilities
Former-commit-id: 64b6ea01378ba57cc8dc1d8f9caa4b53b0f7ce73
2020-06-08 15:34:22 -04:00
John Sully 4531a364e0 Some valgrind fixes
Former-commit-id: fdebdfd82d8f51a98ec27ce409e30edf0fe93ae7
2020-06-07 23:20:10 -04:00
John Sully b1d7a7eeb5 fix valgrind false error
Former-commit-id: beb0f7b8c0f0cd25c97867ca1124a68dd7330c6e
2020-06-07 20:17:47 -04:00
John Sully 492ac4074e fix valgrind false error
Former-commit-id: 887d8bdd110e04b30ffb215726e8aade39f0387a
2020-06-07 20:17:32 -04:00
John Sully 8765dd3890 fix valgrind false error
Former-commit-id: 887d8bdd110e04b30ffb215726e8aade39f0387a
2020-06-07 20:17:32 -04:00
John Sully b62d877494 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 3106f60e0ebdba5db944e704d4b148ea81c806f6
2020-06-07 17:05:00 -04:00
John Sully ea91e43281 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 3106f60e0ebdba5db944e704d4b148ea81c806f6
2020-06-07 17:05:00 -04:00
John Sully 1c6ea53dd8 Fix merge bug
Former-commit-id: cc03c32271997d26ce7f07f96588f126c5939e69
2020-06-07 17:04:46 -04:00
John Sully 3cdf98c591 Fix merge bug
Former-commit-id: cc03c32271997d26ce7f07f96588f126c5939e69
2020-06-07 17:04:46 -04:00
John Sully 19b4f7a280 Endurance mode for tests ignore flaky ones
Former-commit-id: 55778b0483fd0e9043617326772ae7def164966b
2020-06-07 16:59:59 -04:00
John Sully 138021b840 Bump version
Former-commit-id: 4a3e1f3b9b
2020-06-07 16:43:07 -04:00
John Sully 498042cf98 Solo tests should work with loopn
Former-commit-id: 575fc98010
2020-06-07 16:43:07 -04:00
John Sully 6b4d7fd1a9 Stream tests rely on deferring clients, mitigate races caused by them
Former-commit-id: eb18345a61
2020-06-07 16:43:07 -04:00
John Sully a61ef31de4 replication test race
Former-commit-id: d528c5c2c2
2020-06-07 16:43:07 -04:00
John Sully 3ce98133c4 fix race in test
Former-commit-id: fa03a539f3
2020-06-07 16:43:07 -04:00
John Sully 1fc733538f Make lazyfree more reliable
Former-commit-id: 9646b1d944
2020-06-07 16:43:07 -04:00
John Sully 00ddb7162e Detect issues like #189
Former-commit-id: cc5e906ebd
2020-06-07 16:43:07 -04:00
John Sully 326d75bd73 Ensure CRON jobs run in a clean environment
Former-commit-id: b0e14683b2
2020-06-07 16:43:07 -04:00
John Sully 093dc88488 Undecorated new is OK to use
Former-commit-id: 8d5cc4cf0c
2020-06-07 16:43:07 -04:00
John Sully cb29195184 Bump version
Former-commit-id: 52a0556ba15b26d84ca9b5c804eb8fe438c9c888
2020-06-07 16:41:59 -04:00
John Sully 1612360610 Bump version
Former-commit-id: 52a0556ba15b26d84ca9b5c804eb8fe438c9c888
2020-06-07 16:41:59 -04:00
John Sully d025e27c0e Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 6495fe1c7878f96dffa25a2879cb2b825c9e10b2
2020-06-07 16:41:36 -04:00
John Sully e53779229d Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 6495fe1c7878f96dffa25a2879cb2b825c9e10b2
2020-06-07 16:41:36 -04:00
John Sully d14d49df7c Merge branch 'unstable' into keydbpro
Former-commit-id: 461eea07260a31cd75753d5b7be691f5793a6f1b
2020-06-07 16:41:21 -04:00
John Sully b7da76d1f5 Merge branch 'unstable' into keydbpro
Former-commit-id: 461eea07260a31cd75753d5b7be691f5793a6f1b
2020-06-07 16:41:21 -04:00
John Sully e371677389 Report flash disk usage
Former-commit-id: 8e4a71ccd31e3c643a6f7b5154d8f2a65d2de76f
2020-06-07 16:40:03 -04:00
John Sully 8c08aefa57 Report flash disk usage
Former-commit-id: 8e4a71ccd31e3c643a6f7b5154d8f2a65d2de76f
2020-06-07 16:40:03 -04:00
John Sully d544739f9e Solo tests should work with loopn
Former-commit-id: f298b6f0ab7ce9ff5fdad16bab1aa703af90ed95
2020-06-07 15:06:50 -04:00
John Sully f3a3fd90b6 Stream tests rely on deferring clients, mitigate races caused by them
Former-commit-id: 9278a4fdc349787df4932aa41f79856f7396c3d6
2020-06-07 13:59:41 -04:00
John Sully 7d4fe370c6 replication test race
Former-commit-id: 1b7b58e958c48e011b4114b030f205b8b1a20197
2020-06-07 01:14:57 -04:00
John Sully 4c8f684ffc fix race in test
Former-commit-id: 6a1b5f0bb75f047d30e0457da3542b639064d29b
2020-06-07 00:44:11 -04:00
John Sully 9efff548ac Make lazyfree more reliable
Former-commit-id: fea7d8bb7681c52342c977c5424b61a7e5b88a06
2020-06-07 00:40:58 -04:00
John Sully c3eeb4448f Detect issues like #189
Former-commit-id: 0bc38d6ad4e49dc432b86894c07a24e47d44c757
2020-06-05 22:18:28 -04:00
John Sully c35bc52c67 Ensure CRON jobs run in a clean environment
Former-commit-id: 87bcccd08fa0b4e6d45fb4d07423b3804e8e77c1
2020-06-05 21:35:47 -04:00
John Sully 23b7f8dc70 We need to search snapshots before deciding to not save a key
Former-commit-id: 357b09c500eecfe61970e121644a7200ac2387b9
2020-06-05 00:39:58 -04:00
John Sully 9b6871198a We need to search snapshots before deciding to not save a key
Former-commit-id: 357b09c500eecfe61970e121644a7200ac2387b9
2020-06-05 00:39:58 -04:00
John Sully 78f6d47b53 Fix dangling lock
Former-commit-id: 212e56984edfa3221c73b1d3c083efcd28f0dd25
2020-06-04 22:59:24 -04:00
John Sully 8c5627bee5 Fix dangling lock
Former-commit-id: 212e56984edfa3221c73b1d3c083efcd28f0dd25
2020-06-04 22:59:24 -04:00
John Sully 7a388629a3 Fix race when we free an item before we finish writing to disk making it temporarily unavailable
Former-commit-id: 6139cfee295261d0210f2af6217c2a23eeaf52b8
2020-06-04 22:18:03 -04:00
John Sully b354dc8bb0 Fix race when we free an item before we finish writing to disk making it temporarily unavailable
Former-commit-id: 6139cfee295261d0210f2af6217c2a23eeaf52b8
2020-06-04 22:18:03 -04:00
John Sully ec70f86063 Add latency marker for process changes phase for FLASH
Former-commit-id: 61e20b025d45b0af8ed60aab96246b30e4d0ed3d
2020-06-04 01:29:17 -04:00
John Sully 22ee9de03f Add latency marker for process changes phase for FLASH
Former-commit-id: 61e20b025d45b0af8ed60aab96246b30e4d0ed3d
2020-06-04 01:29:17 -04:00
John Sully f675598138 Latency doctor updated for KeyDB Pro
Former-commit-id: a2690fca4a74e92eb44d5e38f886b08363a6d7b0
2020-06-04 01:28:52 -04:00
John Sully 79ab07e713 Latency doctor updated for KeyDB Pro
Former-commit-id: a2690fca4a74e92eb44d5e38f886b08363a6d7b0
2020-06-04 01:28:52 -04:00
John Sully 46192e2e68 maxmem samples way too high
Former-commit-id: 599cac856d4ec77d59c5f5b4fae5b9f194c202ef
2020-06-04 01:28:34 -04:00
John Sully ee26fe0660 maxmem samples way too high
Former-commit-id: 599cac856d4ec77d59c5f5b4fae5b9f194c202ef
2020-06-04 01:28:34 -04:00
John Sully feb13f7d46 Make snapshot completion faster and add latency monitor
Former-commit-id: 8063be6ee70a652c22c3263dccf318366e208891
2020-06-04 01:07:14 -04:00
John Sully 5d13521a36 Make snapshot completion faster and add latency monitor
Former-commit-id: 8063be6ee70a652c22c3263dccf318366e208891
2020-06-04 01:07:14 -04:00
John Sully 39add8d038 Consolidate snapshots should not consider keys in bulk storage
Former-commit-id: e02a8f503d45daf63150c60a8a8c3751b9b8581e
2020-06-04 00:26:51 -04:00
John Sully 9dc45657c5 Consolidate snapshots should not consider keys in bulk storage
Former-commit-id: e02a8f503d45daf63150c60a8a8c3751b9b8581e
2020-06-04 00:26:51 -04:00
John Sully fc54469faf Disambiguate temp rdb files so its less likely two servers with the same working dir will collide
Former-commit-id: 8fbc5a63c54589bb42aa1b1b53c56f399211605c
2020-06-04 00:25:37 -04:00
John Sully 2f7305c04d Disambiguate temp rdb files so its less likely two servers with the same working dir will collide
Former-commit-id: 8fbc5a63c54589bb42aa1b1b53c56f399211605c
2020-06-04 00:25:37 -04:00
John Sully d01128dce0 Only set tombstone if there is something to mask
Former-commit-id: ea092693f53ff0803c44a851219993a933166cc3
2020-06-04 00:23:37 -04:00
John Sully 8d72639e11 Only set tombstone if there is something to mask
Former-commit-id: ea092693f53ff0803c44a851219993a933166cc3
2020-06-04 00:23:37 -04:00
John Sully 42f5df2a55 Extra debug checks in dictmerge
Former-commit-id: 839b2a151e6bad67017de87d7a637359f6ae63d1
2020-06-04 00:22:59 -04:00
John Sully 338ca5f376 Extra debug checks in dictmerge
Former-commit-id: 839b2a151e6bad67017de87d7a637359f6ae63d1
2020-06-04 00:22:59 -04:00
John Sully 26af5fb15d Clear tombstone dict when clearing database we don't need it
Former-commit-id: a8e1ef075eacfc0b767302f2514ca6f0342982bc
2020-06-04 00:17:19 -04:00
John Sully 3397591fe8 Clear tombstone dict when clearing database we don't need it
Former-commit-id: a8e1ef075eacfc0b767302f2514ca6f0342982bc
2020-06-04 00:17:19 -04:00
John Sully bd1caf1cec Fix crash where tombstone is evicted
Former-commit-id: 1f6ff7cc0fc0173610d77a69076eeaf478c3b701
2020-06-03 23:30:35 -04:00
John Sully f93b92deb4 Fix crash where tombstone is evicted
Former-commit-id: 1f6ff7cc0fc0173610d77a69076eeaf478c3b701
2020-06-03 23:30:35 -04:00
John Sully e068840b2d RocksDB compression is too slow
Former-commit-id: 665a8ff0a0a10ffecc36a8410030abd73879944c
2020-06-03 22:21:03 -04:00
John Sully 4e1a91756d RocksDB compression is too slow
Former-commit-id: 665a8ff0a0a10ffecc36a8410030abd73879944c
2020-06-03 22:21:03 -04:00
John Sully 31fa0c6124 Add DB commit latency samples
Former-commit-id: 557ea8d285045496105e3330f0007e02aa4359d7
2020-06-03 22:06:05 -04:00
John Sully 1c85c103af Add DB commit latency samples
Former-commit-id: 557ea8d285045496105e3330f0007e02aa4359d7
2020-06-03 22:06:05 -04:00
John Sully a7862dbea8 Fix crash when overwriting key stored in FLASH but not in ram during a BGSAVE while clustering is enabled
Former-commit-id: 32967b1d671b151bed976e3d13ce26c7e1496c82
2020-06-02 23:59:24 -04:00
John Sully 0428af1894 Fix crash when overwriting key stored in FLASH but not in ram during a BGSAVE while clustering is enabled
Former-commit-id: 32967b1d671b151bed976e3d13ce26c7e1496c82
2020-06-02 23:59:24 -04:00
John Sully dd4342db5c Endurance not setup for pro
Former-commit-id: 97ad41effac1322a4ad14c441e23838bb20528da
2020-06-02 23:47:13 -04:00
John Sully 8b11a5fa45 Endurance not setup for pro
Former-commit-id: 97ad41effac1322a4ad14c441e23838bb20528da
2020-06-02 23:47:13 -04:00
John Sully 5e98e7e69d Fix unmerged script
Former-commit-id: bb0df646cf4362b7f56b29ded89d167fc0f832a9
2020-06-02 21:16:24 -04:00
John Sully ceace21825 Fix unmerged script
Former-commit-id: bb0df646cf4362b7f56b29ded89d167fc0f832a9
2020-06-02 21:16:24 -04:00
John Sully 9bbd6f8873 Bump maxmemory samples by a lot
Former-commit-id: ae46d64b2e6b16f81df6b4e12ddc9fed63a9785b
2020-06-02 17:22:45 -04:00
John Sully b084b01904 Bump maxmemory samples by a lot
Former-commit-id: ae46d64b2e6b16f81df6b4e12ddc9fed63a9785b
2020-06-02 17:22:45 -04:00
John Sully 6b1e08b99d Merge error, server always flushes on eviction
Former-commit-id: 9b3b0c9a40ab5dcdac9620f0fbad84887cc9c832
2020-06-02 17:21:41 -04:00
John Sully 16e0a80c63 Merge error, server always flushes on eviction
Former-commit-id: 9b3b0c9a40ab5dcdac9620f0fbad84887cc9c832
2020-06-02 17:21:41 -04:00
John Sully ddf9857205 Undecorated new is OK to use
Former-commit-id: 8ec3381695847e1e67a7a815036429dee1f4d836
2020-06-01 23:36:01 -04:00
John Sully 20b385c589 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: a901505e562c0dc341fa939cce502da25642f7ba
2020-06-01 17:42:32 -04:00
John Sully 6c09dd2153 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: a901505e562c0dc341fa939cce502da25642f7ba
2020-06-01 17:42:32 -04:00
John Sully d6d8e6b488 Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: dd8cd6a00851b00120db9e52030c0bb85d15b54f
2020-06-01 17:42:09 -04:00
John Sully e5792dea6c Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: dd8cd6a00851b00120db9e52030c0bb85d15b54f
2020-06-01 17:42:09 -04:00
John Sully 70cedc5151 Merge branch 'unstable' into keydbpro
Former-commit-id: 08a36155e3db9918048e87c3d691b7317787c9ab
2020-06-01 17:41:37 -04:00
John Sully 51d75ad493 Merge branch 'unstable' into keydbpro
Former-commit-id: 08a36155e3db9918048e87c3d691b7317787c9ab
2020-06-01 17:41:37 -04:00
John Sully ecaa5decfd RELEASE endurance tests should run offset from unstable
Former-commit-id: b608acb349
2020-06-01 17:02:16 -04:00
John Sully ac2f07320e Bump version
Former-commit-id: 8dbea2a050
2020-06-01 17:01:50 -04:00
John Sully 277c67a693 maxmem tests should be run solo for higher reliability
Former-commit-id: adf4198d274b0b3daa7f738cb2c20dc38fb94ae6
2020-06-01 16:50:30 -04:00
John Sully 7f0ec896ad Remove debug logs that shouldn't have been checked in
Former-commit-id: f01fae3ab2fcfbe8e29e600c9c74ebb92126c1cb
2020-06-01 16:34:05 -04:00
John Sully e8b2dc33a9 PSYNC test shouldn't wait forever
Former-commit-id: 95a8b903ee5bbe30f2916996b382a18044be8204
2020-06-01 16:13:58 -04:00
John Sully 3f11b88922 PSYNC test reliability improvements (test only issue)
Former-commit-id: 2fdf3363e9501ca63432c3e5301b0246267fe5be
2020-06-01 16:01:26 -04:00
John Sully 4b1bbb4f25 Fix for issue #187 we need to properly handle the case where a key with a subkey expirey itself expires during load
Former-commit-id: ad8a039563ad4f7ccfdc8d088ad07d5da11eba3c
2020-06-01 15:33:19 -04:00
John Sully f10b7d9424 Update endurance.yml
Former-commit-id: d4d882009b58d748d837832f4f7df92fefe1d750
2020-06-01 00:25:31 -04:00
John Sully 4015a56861 Fix module multithreaded test failures
Former-commit-id: 0752eff73f3f5343d56dc71ffe5cd91ddc596893
2020-05-31 23:46:12 -04:00
John Sully 6e6c7d0c2c sendfile has high latency in some scenarios, don't use it
Former-commit-id: 790cf66e651549a1fedfb72d8abe6cdf521742d7
2020-05-31 23:22:25 -04:00
John Sully 3f48c63cea we must always respect the output of sdscat, also change the string so its not a substring of other config params
Former-commit-id: b8e8ae28324f8a8fab98df59ae1f597b1ad66a06
2020-05-31 23:22:10 -04:00
John Sully d7b4762daa Do another iteration for endurance
Former-commit-id: ef287dfedb38423acb5fe03d98dcf3111903cf08
2020-05-31 22:51:02 -04:00
John Sully e32d3172dc Don't start multimaster tests until all nodes are connected
Former-commit-id: 6740c6373198a8b457400970218572f3a9e153ea
2020-05-31 22:50:30 -04:00
John Sully 8ccc6f8398 Fix client race in test (test only issue)
Former-commit-id: 27b97c698b9a36db8c92f0d924885020c1c77de1
2020-05-31 21:39:50 -04:00
John Sully 0ab6fd023f --loop should run forever
Former-commit-id: a23a1b4a82a23831dd9fdef4b19b2740118477e6
2020-05-31 21:27:15 -04:00
John Sully fc49ce3ea8 PUBSUB test reliability: A client race was erroneously failing tests (test only issue)
Former-commit-id: 720c6f22293383007c606d077da2b40365883cfb
2020-05-31 21:27:15 -04:00
John Sully e914c09eff Update endurance.yml
Former-commit-id: 3a1c745f8b562f7b7150b2204cdb2ba6bb5b94d6
2020-05-31 17:50:02 -04:00
John Sully 0c4af8bb2b Active replicas referencing eachother should connect one at a time
Former-commit-id: c054b7381789bae6d33aba06706f93978042a282
2020-05-31 16:03:50 -04:00
John Sully 8fa2a7c324 Fix race in futex_sleep
Former-commit-id: 34833eb35c56b31aebff6c494b5fc25591825642
2020-05-31 16:03:50 -04:00
John Sully 9fc9800ad7 Update endurance.yml
Former-commit-id: ccb3046ada0ea1086a04be3bc399e28013e220a2
2020-05-31 14:18:12 -04:00
John Sully 0f1871a8cd Update endurance.yml
Former-commit-id: 253f64fd56b8d78ace7264a0cc5e1bcf8555ac87
2020-05-31 03:43:06 -04:00
John Sully 1f7e34e793 Endurance tests need more cores
Former-commit-id: 28b21f1c7716e7423a054e3b761fc038c4da8398
2020-05-30 22:16:56 -04:00
John Sully a1f73aacc9 Update endurance.yml
Former-commit-id: 79142fe5f3e5d58ecc2c339d0c99ef865596870d
2020-05-30 20:03:04 -04:00
John Sully 595ad5f1d7 Auto tune lock for high CPU tension scenarios
Former-commit-id: 46a23b07bc52eb5eb8c65700d0aefa258e8d7dac
2020-05-30 18:22:27 -04:00
John Sully 9e740cea0d Ensure endurance run can complete in an hour
Former-commit-id: 86de8f9fd80d3c58cd6894a35e56df9c3fec9a07
2020-05-30 15:31:54 -04:00
John Sully e60a6fb09e We only want one master connection in progress at a time, ensure that if the connection fails we try a different master
Former-commit-id: 4b8105d7dcedb16c69262b69cd4b76f0e9e8a04c
2020-05-30 15:13:28 -04:00
John Sully ca31cbc543 daily CI config fix
Former-commit-id: 256573ceb4ba5594a17bded3fc22cc73064d14e2
2020-05-30 03:27:37 -04:00
John Sully c3ab9bb8eb More clients for endurance
Former-commit-id: 7fc4a29aef6732ca2663821806c6f8785d04fb46
2020-05-30 03:13:04 -04:00
John Sully 6434e785b6 Endurance tests need to be faster, reduce loops
Former-commit-id: 08877b230dfac90969b1e9f5eaa0bd130fc27454
2020-05-30 02:40:44 -04:00
John Sully 3f84f23a13 Only CI ARM daily
Former-commit-id: d36c33691ecf23eddf6f6d4431770517e0277908
2020-05-30 02:34:37 -04:00
John Sully d614dbb666 Also test with multiple threads
Former-commit-id: fe7fd19626070f1a862044be3585eacd3f38ae3f
2020-05-30 02:10:00 -04:00
John Sully f703967b4e Reduce clients for endurance test
Former-commit-id: eef2ad263397b63df5b71bad150c8ec52134e858
2020-05-30 02:07:30 -04:00
John Sully 1dace57ea6 Fix cron syntax
Former-commit-id: f73d7eebc5a5573febc7dbc7f132809bf47e5424
2020-05-30 01:53:21 -04:00
John Sully 9cb69957a5 Add endurance CI tests
Former-commit-id: b97c41382ff4f577a5eefc787dddd6ed67e313a5
2020-05-30 01:47:26 -04:00
John Sully 9c5269de1b Update daily CI job
Former-commit-id: 4de43c237919f63b6721a7be2714848f1e77b443
2020-05-30 01:21:50 -04:00
John Sully 86ced2e09d TLS requires we explicitly marshal connected sockets when using them on a different thread
Former-commit-id: fdcc6a311b93ba5fc9462e68a1510a4653945821
2020-05-30 01:14:53 -04:00
John Sully 504c251c12 Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: c2770b2e1e01d1a366f2d307b9b9d5c40226fc92
2020-05-30 00:06:23 -04:00
John Sully 1bf20aaf7d Fix memory test failures with multithreading enabled
Former-commit-id: 711d49c6780dd40158aea0de0e9bfb374423e6ca
2020-05-30 00:06:15 -04:00
Ben Schermel 1236e8ef37 centos build fix
Former-commit-id: 74e3be98f5db72c4020f77a2280fc409a46d03f9
2020-05-29 22:23:48 -04:00
Ben Schermel 52184a8a34 centos build fix
Former-commit-id: 6fe4571bf959432127b8741c22d8264fd55969b8
2020-05-29 22:21:01 -04:00
Ben Schermel 46100d4550 centos build fix
Former-commit-id: 6fe4571bf959432127b8741c22d8264fd55969b8
2020-05-29 22:21:01 -04:00
John Sully 4e41517e9a sendFile blocks too long for use with active replication
Former-commit-id: 847654e90056029ed6bda9116bf9b69dbce411d5
2020-05-29 20:27:45 -04:00
John Sully 8e36c09f82 Unify beforeSleep handling
Former-commit-id: 5e875fde17729e271650d16a80c2caee0b5cf82a
2020-05-29 17:44:55 -04:00
John Sully 07f671b473 Cluster crash
Former-commit-id: 73c43940f6d3001da2e8142dc0abb75a0139dd12
2020-05-29 03:40:52 -04:00
John Sully 56c8b4e634 active replica tests on slow computers
Former-commit-id: ae90a2d9488ebdf724214b7f777ddee1efc66bb1
2020-05-29 01:58:15 -04:00
John Sully 306498cb25 Fix test issue with TLS
Former-commit-id: 0bc736b26f48f3a37071447437b024a84a2a5ab9
2020-05-29 01:44:52 -04:00
John Sully 11df226798 Fix CI
Former-commit-id: ed0acfa7b61acc472b5367499ed3856103c25af2
2020-05-29 01:01:41 -04:00
John Sully 53715eb3ca Merge tag '6.0.4' into unstable
Redis 6.0.4.


Former-commit-id: d1ec405f788ec72a9947b48536ec427b21331aba
2020-05-29 00:57:07 -04:00
John Sully 8b883573b3 Fix TLS tests
Former-commit-id: 0175d9ad64f01cc54290198bbced4c07ee1f7566
2020-05-29 00:16:06 -04:00
John Sully 577c6928bc gencert its own step
Former-commit-id: d2ecdb2d9c07bbecaa9bc19e785138df54d0c1ed
2020-05-28 23:49:13 -04:00
John Sully 404b968df5 CI yml syntax error
Former-commit-id: 62c46746b8b910931841e364f5336481aef8e7b8
2020-05-28 23:18:02 -04:00
John Sully d63f44cda8 Fix TLS tests in CI
Former-commit-id: a86d510dd53c7aa14ce87046a3b3f14e900fa674
2020-05-28 23:16:42 -04:00
John Sully f291a1f60f fix TLS test failure
Former-commit-id: b77726e0368e2edfc196c704fbd7a9ba5a795641
2020-05-28 23:16:27 -04:00
John Sully 82cb29b568 Test TLS as part of CI
Former-commit-id: a6ea18b691af1b66aebd56c7701f7481ee7798ee
2020-05-26 01:39:54 -04:00
John Sully 1df23823ac Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: f98c1999f95ec59f7201056781cb89dc465a1461
2020-05-26 01:38:52 -04:00
John Sully c902eb7b2a Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: f98c1999f95ec59f7201056781cb89dc465a1461
2020-05-26 01:38:52 -04:00
John Sully 66216a192f Complete TLS merge
Former-commit-id: 856d23023259d59ce766e9cd00526de0e7d06c2f
2020-05-26 01:38:29 -04:00
John Sully 771c8276b2 Complete TLS merge
Former-commit-id: 856d23023259d59ce766e9cd00526de0e7d06c2f
2020-05-26 01:38:29 -04:00
John Sully c4ed859dd3 Merge branch 'unstable' into keydbpro
Former-commit-id: b0636273806ce323627ce31c1ad7f86ceb39696d
2020-05-26 01:34:19 -04:00
John Sully e827de1fa4 Merge branch 'unstable' into keydbpro
Former-commit-id: b0636273806ce323627ce31c1ad7f86ceb39696d
2020-05-26 01:34:19 -04:00
John Sully b1c5cafd7a Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: 6262faccbb21cf692e6f374146b6d18a5a1a1b0b
2020-05-26 01:29:08 -04:00
John Sully eca966ac91 Fix client tracking, also ensure tracking tests are enabled
Former-commit-id: a46756837de7d5cfa08490ef4cc403a023fb0641
2020-05-26 01:28:52 -04:00
Maxime de Roucy 4300f59229 acl: @replication command group
containing mandatory commands for replication (used by masteruser user)


Former-commit-id: a02047a8af3a082751ffd1f96f2f4ede8c4bc146
2020-05-25 02:35:22 -04:00
John Sully 70ed4fcefe Fix issue #170. Intermittent crash destroying fastlock due to implicit type conversion in assert
Former-commit-id: daa746d189042ab4ce6aec92b7b452e4e2cbb07f
2020-05-25 02:13:57 -04:00
John Sully cdf8525fff Fix infinite logs of Error in rreplay
Former-commit-id: c92ab531fb855e8471a5364b4252205dc1f406fe
2020-05-24 20:05:22 -04:00
John Sully 91412e92ac Enable TLS connections
Former-commit-id: 597c3def933ff3866aae0a88da27a6d9d39204ff
2020-05-24 19:57:16 -04:00
John Sully 830db06cf4 bump version
Former-commit-id: 9353b3aac2ab65120f2ad5caa2f8272ae02df380
2020-05-24 18:35:03 -04:00
John Sully 8066e3e18c bump version
Former-commit-id: 9353b3aac2ab65120f2ad5caa2f8272ae02df380
2020-05-24 18:35:03 -04:00
John Sully 00e6464ae8 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 056c672cf60a00980cb10e97fc5da93d8eada937
2020-05-24 18:34:15 -04:00
John Sully 9e34367a4e Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 056c672cf60a00980cb10e97fc5da93d8eada937
2020-05-24 18:34:15 -04:00
John Sully 558bd135b9 Fix test failures
Former-commit-id: c0b2263478d79f33d04ed409a68caa312884fa4c
2020-05-24 18:33:15 -04:00
John Sully 06d974f319 Fix test failures
Former-commit-id: c0b2263478d79f33d04ed409a68caa312884fa4c
2020-05-24 18:33:15 -04:00
John Sully 916e84cbf7 Fix crash on shutdown with snapshots pending
Former-commit-id: 124e79a81d6995ea7d5ba39d1830b591b705acbf
2020-05-24 17:11:56 -04:00
John Sully 95470886e4 Fix crash on shutdown with snapshots pending
Former-commit-id: 124e79a81d6995ea7d5ba39d1830b591b705acbf
2020-05-24 17:11:56 -04:00
John Sully 0718f2211f Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: 9e473a9957f274f641ddad16d67d848f9a3c93c1
2020-05-24 14:47:55 -04:00
John Sully 375f73df98 Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: 9e473a9957f274f641ddad16d67d848f9a3c93c1
2020-05-24 14:47:55 -04:00
John Sully 98c33c2c6f Merge branch 'unstable' into keydbpro
Former-commit-id: a830cf85df236885558c5571c0bf23cfb23e3655
2020-05-24 14:41:53 -04:00
John Sully 48c1bf668e Merge branch 'unstable' into keydbpro
Former-commit-id: a830cf85df236885558c5571c0bf23cfb23e3655
2020-05-24 14:41:53 -04:00
John Sully a6ec42c58c don't keep feeding data to clients pending close
Former-commit-id: ddb011dd67966c776220b9417d6b1679d8e76815
2020-05-24 12:46:11 -04:00
John Sully ae0892afd3 Quiet TSAN during exit
Former-commit-id: c8e3fed4dfaad5cf29bb7bd17e9cbcb97fed8cc5
2020-05-24 12:45:10 -04:00
John Sully 5a1479762a Install deps for daily workflow
Former-commit-id: 994cae03f4196c607218105c7ee6de39a1ed275c
2020-05-24 11:19:53 -04:00
John Sully f64d3c7540 Hold the AE lock until we process the repl backlog after a command
Former-commit-id: c6ffae7855b5924cca53ca2378f9913ae2cf96b5
2020-05-24 11:19:23 -04:00
John Sully 7e1cac3340 Add standardized way to post client dependent functions
Former-commit-id: 3326ed3a20885bd03cb5ff4b857bcc187d253f4c
2020-05-24 02:46:39 -04:00
John Sully 25cbc66702 remove unnecessary cplusplus guard
Former-commit-id: 3c7543239498a3029868a9d2ca9ad2bf2dea5135
2020-05-24 02:45:55 -04:00
John Sully d396fed0fd race in connection state when setting a handler on a different thread
Former-commit-id: 35db0819a4462a8109016d0623a0a25883e975d0
2020-05-24 02:45:11 -04:00
John Sully a3755302e3 Fix ASAN races
Former-commit-id: 21f52d4e0fb24c64e098ea362d7e51b9ce4cad54
2020-05-24 01:58:33 -04:00
John Sully 9509a69f25 Incorrect locking in replication error paths
Former-commit-id: 901ba07c49dfadfefbebc97ab9bfdfe5d4d7907f
2020-05-24 01:57:49 -04:00
John Sully aa6ba6ff69 Incorrect memory order on weak ordered architectures
Former-commit-id: 43160ac9533772e69fbe120049ae807a9fe84fa0
2020-05-24 01:57:18 -04:00
John Sully 5041b36f3f If we request shutdown from a client on a different thread than a blocking lua script we fail to actually shutdown until the script completes
Former-commit-id: 3daceb01cbac9e8cdb9bab95f65e359c1a4d0feb
2020-05-24 01:56:23 -04:00
John Sully d34ea78b53 race calculating client overhead
Former-commit-id: 6e6e49b723401ac3f4e28bf582141cc3a525e1fe
2020-05-24 01:53:43 -04:00
John Sully 41312cc823 During RDB load we can only handle clients on the main thread as our workers are not yet created. This change also unifies the accept logic across the socket types
Former-commit-id: ba245e55d2c65e1808bed30d1b43f17965ac7518
2020-05-23 16:03:24 -04:00
John Sully b320436c12 Diskless replication handler needs to run on the main thread
Former-commit-id: ed8a03ab7057eef4d00cd702ead5351078de8c5f
2020-05-23 15:15:42 -04:00
ShooterIT a36535c9ed Fix reply bytes calculation error
Fix #7275.


Former-commit-id: 4c69e0558a34a5e801d5dd3cf91995de400247ab
2020-05-23 13:02:55 -04:00
John Sully cfff87f2e5 Merge tag '6.0.3' into unstable
Redis 6.0.3


Former-commit-id: 04641264240afbbd13cab82e50293e1361419ef1
2020-05-22 16:53:10 -04:00
John Sully 97a50a5318 Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: d8fe04ec6f50481e2695d42306972816b6cc301b
2020-05-22 16:45:27 -04:00
John Sully cee229889e Merge tag '6.0.2' into unstable
Redis 6.0.2


Former-commit-id: a0a5d39b417af1c1aa524f361c47879f4b629d35
2020-05-22 16:45:18 -04:00
John Sully 47fd00082f Merge commit '24075946c77f227b14ffdfde4b10d90a400d12fc' into unstable
Former-commit-id: 1639abe51f073f01bdcf7b1253691fae267791a5
2020-05-22 15:56:35 -04:00
John Sully f9dce8fb7f Merge commit '3843eb300d9da39dbb75d7c9f29d4948d305af8c' into unstable
Former-commit-id: c703897b509bd20aa4d169bf07736640bf093c12
2020-05-22 15:42:50 -04:00
John Sully 79d356e22c Merge commit '5133e970ccdd3495916681f39249fd551b3dd1a4' into unstable
Former-commit-id: a6e6114ffcedc55c36dab16e17b500d09ec4db70
2020-05-22 15:36:44 -04:00
John Sully 03720e5964 Update README.md
Former-commit-id: a6e371ba1b1083639d217919744314cdb1570c2f
2020-05-22 14:03:29 -04:00
John Sully f4323fdb41 Merge tag '6.0.1' into unstable
Redis 6.0.1.


Former-commit-id: 73aa8cb043af65190e2b6a8d9a4990408402bcda
2020-05-21 23:41:36 -04:00
John Sully 614cf01577 Missing noexcept
Former-commit-id: c291623210057bfcc8d58b587638ea37c51c3807
2020-05-21 23:25:50 -04:00
John Sully 96e582cfc9 build failure on macos
Former-commit-id: a71925ab51db0862fcc383150aaca6e5f46c00ed
2020-05-21 23:24:34 -04:00
John Sully 304fbcc206 Fix bad merge in CI.yml
Former-commit-id: 596b656df68eca7bac0aaaa2fbae71c2c47d3e7f
2020-05-21 22:09:06 -04:00
John Sully c61a414b4c Merge commit '97e58ee026675e70fbd8843f7a86e98f53a3c791' into unstable
Former-commit-id: b169f9f9c8a25370d88fcb1d82db8ab360e0a283
2020-05-21 19:37:42 -04:00
John Sully 6cfa757942 Merge commit '3b373fbb0b05ee862dfef32199cfb63459019cd9' into unstable
Former-commit-id: 6f9f4c4aac55c885d7170892e2b90410b7ed32a0
2020-05-21 18:57:28 -04:00
John Sully 9cbe9da4ba Merge commit 'd7b07d3ded06b4cd843baffd3a6d33dd96efd401' into unstable
Former-commit-id: b21357ca23e56a3f90b01f97239ff932d1563f0e
2020-05-21 18:48:49 -04:00
John Sully 4506be6991 Merge commit '87924d673138531cbaf606015ea7b6a9e3ae2465' into unstable
Former-commit-id: b6eb4034ed1ecbe0f7e7986dc52583847d892a10
2020-05-21 17:55:09 -04:00
John Sully 56052c2595 Merge commit 'c5d805f87771581d3f6b29861ed2062c0ae2a688' into unstable
Former-commit-id: 36a1e6ad2d9917c4676f53f3dc033da10e778f83
2020-05-21 17:45:15 -04:00
John Sully babad00e4c Merge commit '7cb94fd6cc9e1ad106964171023457ae3ff0a40b' into unstable
Former-commit-id: d9b2fdb179ee1fdc8fc48a45b2e1c12e372519d0
2020-05-21 17:36:53 -04:00
John Sully 48d92c534c Merge commit '71134e357ffd6ced7c40c145205dbbac173ee181' into unstable
Former-commit-id: 4908da605355f0ada0bb605dc5a5fb8753d4749e
2020-05-21 17:32:53 -04:00
John Sully a43431de7f Merge commit '2535a172c1247d5d32d6f2fefe51b95c27ba8ae1' into unstable
Former-commit-id: ecef43431db59899d1267e69786c347eba7aefd4
2020-05-21 17:30:56 -04:00
John Sully 5a9415ace8 Override missing new, fix new/delete mismatch
Former-commit-id: 9b9d9a72aaf24abe41937efdefb547b4bff7729f
2020-05-20 15:57:08 -04:00
John Sully e807fc470a Remove debugging logs
Former-commit-id: 348fc2c393a7dd786df2a624dba04da157224c7e
2020-05-14 22:18:29 -04:00
John Sully 864fbf8f94 Update ci.yml
Former-commit-id: d4b1d3f755f7c1f6ca4642b5258b4a5157eacb5a
2020-05-12 01:06:08 -04:00
John Sully 330f3dbec0 Update ci.yml
Former-commit-id: d4b1d3f755f7c1f6ca4642b5258b4a5157eacb5a
2020-05-12 01:06:08 -04:00
John Sully ebd82f40fa Update ci.yml
Former-commit-id: d06c6c67ea36a21e515390405a0f947a23ec4b42
2020-05-11 22:09:27 -04:00
John Sully 39bd16dabf Update ci.yml
Former-commit-id: d06c6c67ea36a21e515390405a0f947a23ec4b42
2020-05-11 22:09:27 -04:00
John Sully 15e949d48d Reduce test load for more reliability
Former-commit-id: 3f8f9743c1f6d75647cfbdbc1544a8c8a5142df3
2020-05-11 22:04:52 -04:00
John Sully c1513fd613 Reduce test load for more reliability
Former-commit-id: 3f8f9743c1f6d75647cfbdbc1544a8c8a5142df3
2020-05-11 22:04:52 -04:00
John Sully 5eed12bcd8 limit clients to make tests more reliable
Former-commit-id: 2c130a816647bacaba5d99d76c19e09b9c9875da
2020-05-11 21:56:17 -04:00
John Sully 94a8fd063b limit clients to make tests more reliable
Former-commit-id: 2c130a816647bacaba5d99d76c19e09b9c9875da
2020-05-11 21:56:17 -04:00
John Sully fe40aece72 Update cached time only in main cron
Former-commit-id: 5396dd9587599d6672e8d80967aa1fd8ba16e7ec
2020-05-11 20:31:47 -04:00
John Sully 98cc027dbc Update cached time only in main cron
Former-commit-id: 5396dd9587599d6672e8d80967aa1fd8ba16e7ec
2020-05-11 20:31:47 -04:00
John 46cee0c132 more reliability fixes for multimaster
Former-commit-id: 325788b4fbc2828e6563e672ee63ecb7ca987e3e
2020-05-11 05:38:21 -04:00
John 5298a16322 more reliability fixes for multimaster
Former-commit-id: fd5b541260908423c35227ff9e42a83f96ace6c0
2020-05-11 09:37:42 +00:00
John acc542aec5 more reliability fixes for multimaster
Former-commit-id: fd5b541260908423c35227ff9e42a83f96ace6c0
2020-05-11 09:37:42 +00:00
John e95e40a4c4 Make multimaster tests more reliable
Former-commit-id: f94610dc8415c29265720717bd65484de7b3d069
2020-05-11 05:23:47 -04:00
John 7c8b569e64 Make multimaster tests more reliable
Former-commit-id: 4fe59ba11b720864ea0124885b358cb72127cc2d
2020-05-11 09:22:27 +00:00
John a4036b6c5d Make multimaster tests more reliable
Former-commit-id: 4fe59ba11b720864ea0124885b358cb72127cc2d
2020-05-11 09:22:27 +00:00
John Sully 82be99183a too many clients makes tests unreliable
Former-commit-id: 89b39629980ab3e2930663c2922141e18e2fc38c
2020-05-11 04:54:17 -04:00
John Sully bc9b7604c4 too many clients makes tests unreliable
Former-commit-id: 89b39629980ab3e2930663c2922141e18e2fc38c
2020-05-11 04:54:17 -04:00
John f291a39faf Run tests with more clients if possible
Former-commit-id: 3c73eb41bd904953c1e0e2d655d42599f3e9d2a2
2020-05-11 08:25:13 +00:00
John 03c9a6811e Run tests with more clients if possible
Former-commit-id: 3c73eb41bd904953c1e0e2d655d42599f3e9d2a2
2020-05-11 08:25:13 +00:00
John 140ffc8084 link dependent libs
Former-commit-id: 165eb203f2a64f588b42b765afaafc370c547a25
2020-05-11 08:19:08 +00:00
John 64368aa40d link dependent libs
Former-commit-id: 165eb203f2a64f588b42b765afaafc370c547a25
2020-05-11 08:19:08 +00:00
John Sully c0994a2a37 run on self hosted
Former-commit-id: 51dba847764abc0014ef3be17a03afebd038854d
2020-05-11 03:10:27 -04:00
John Sully 6aa8299cb1 run on self hosted
Former-commit-id: 51dba847764abc0014ef3be17a03afebd038854d
2020-05-11 03:10:27 -04:00
John Sully 0a11773628 update ci.yml
Former-commit-id: 92a31cfd4d5bcf913f55c0f127b28738056f2a0a
2020-05-11 01:08:46 -04:00
John Sully 8cc2badef9 update ci.yml
Former-commit-id: 92a31cfd4d5bcf913f55c0f127b28738056f2a0a
2020-05-11 01:08:46 -04:00
John Sully 5e4b122907 Fix bug merging LFU fix
Former-commit-id: 319099e1cb337d13444c16df1b5e1c300e6f2d15
2020-05-11 01:05:57 -04:00
John Sully 4cb253da0d Fix bug merging LFU fix
Former-commit-id: 319099e1cb337d13444c16df1b5e1c300e6f2d15
2020-05-11 01:05:57 -04:00
John Sully 5c0cc1468c Fix crash during RDB save with module events
Former-commit-id: 0f7eac411eccb853d7e50152e2bbd1ee28e6ee53
2020-05-11 01:02:58 -04:00
John Sully 1ab1557e4f Fix crash during RDB save with module events
Former-commit-id: 0f7eac411eccb853d7e50152e2bbd1ee28e6ee53
2020-05-11 01:02:58 -04:00
John Sully c837f30edb Merge branch 'unstable' into keydbpro
Former-commit-id: d89c15518f984c1d4d4e7638a4e8ac5aa499632a
2020-05-11 00:53:38 -04:00
John Sully effddf64e1 Merge branch 'unstable' into keydbpro
Former-commit-id: d89c15518f984c1d4d4e7638a4e8ac5aa499632a
2020-05-11 00:53:38 -04:00
John Sully a6df8d14db Update access LFU/LRU access times when overwriting key
Former-commit-id: b79dbfd5c6d4f4763f88d9ab0cf1d2a025d3bd34
2020-05-11 00:42:46 -04:00
John Sully 992600fe2f We should still send replies even if an async close is pending
Former-commit-id: f41f9c9fe617f2e6965a8ec9f9eef00da2ea2d58
2020-05-10 23:56:29 -04:00
John Sully c1336af53e Fix race on clients_to_close
Former-commit-id: c6845033bf830e87a94cb0e04427941daf13e89e
2020-05-10 23:14:15 -04:00
John Sully 05e5cbf710 Fix crash in client unblock command
Former-commit-id: a454af96334b318512df92535a01231416684f29
2020-05-10 22:08:50 -04:00
John Sully d0e0752c7c Fix crash during hook module test
Former-commit-id: 182d64458b52ae181df5ac1f277999136ad4999a
2020-05-10 21:57:16 -04:00
John Sully d7ce80c757 Fix crash in module tests
Former-commit-id: b8aea13c4853032d0a8345e17c526927a60a3796
2020-05-10 21:06:38 -04:00
John Sully 2e2e46bbc9 Run sentinel and module tests under CI
Former-commit-id: 156424fd8d9cceb5e5da877e74150d8c7b9ca373
2020-05-10 18:05:05 -04:00
John Sully a5231ab0d6 add help for hrename
Former-commit-id: f1da950a06ab52468be576dc48a9c5536fc63d36
2020-05-10 17:41:01 -04:00
John Sully 84d5e33d88 hrename tests
Former-commit-id: 3eb75f46c8046dda64be3c8dc6da4a342936139e
2020-05-10 17:14:44 -04:00
John Sully b17c47bc08 Implement keydb.hrename command
Former-commit-id: 971b2e373ec349fec0c9fbfa73a1c96ee426c127
2020-05-10 17:04:22 -04:00
John Sully e74b4d6d92 Work around broken package installed on CI machines
Former-commit-id: 3340aaf8ad87fe0f7dd5c53254cd34605a3a8f12
2020-05-08 00:57:39 -04:00
John Sully ed78a6adbe Work around broken package installed on CI machines
Former-commit-id: 3340aaf8ad87fe0f7dd5c53254cd34605a3a8f12
2020-05-08 00:57:39 -04:00
John Sully 785a6e704a Update CI
Former-commit-id: 332900e24a539c694929dd4163a25037ded6b19e
2020-05-08 00:44:00 -04:00
John Sully 446b22bb55 Update CI
Former-commit-id: 332900e24a539c694929dd4163a25037ded6b19e
2020-05-08 00:44:00 -04:00
John Sully ad84e4095e Bump version
Former-commit-id: 88eeb1c13cdf21df274ea9c364f35c4de522d215
2020-05-08 00:25:19 -04:00
John Sully b0d30ebc88 Bump version
Former-commit-id: 88eeb1c13cdf21df274ea9c364f35c4de522d215
2020-05-08 00:25:19 -04:00
John Sully 9d6133e010 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 219d7f3499fd826f039a1490ed3317791b084f94
2020-05-08 00:24:58 -04:00
John Sully 3579abea85 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 219d7f3499fd826f039a1490ed3317791b084f94
2020-05-08 00:24:58 -04:00
John Sully f16e51683a Free memory before we enter a script and may not have a chance
Former-commit-id: 7a3173c74ca617b4d0f9e852ab580731fa92f3df
2020-05-08 00:15:58 -04:00
John Sully c89a08b8ae Free memory before we enter a script and may not have a chance
Former-commit-id: 7a3173c74ca617b4d0f9e852ab580731fa92f3df
2020-05-08 00:15:58 -04:00
John Sully f30f6ea03b Fix bug where we don't correctly process maxmemory during bgsave
Former-commit-id: a0f2694d15784628df5d5ecb72b42c2979100f93
2020-05-08 00:14:55 -04:00
John Sully 20d5dfde38 Fix bug where we don't correctly process maxmemory during bgsave
Former-commit-id: a0f2694d15784628df5d5ecb72b42c2979100f93
2020-05-08 00:14:55 -04:00
John Sully 5bc90defc9 Be *much* more aggressive flushing memory
Former-commit-id: f0bdc4fb5fce02d79c1aa2bcf384aa06580ff9e1
2020-05-07 23:07:31 -04:00
John Sully 92f2463179 Be *much* more aggressive flushing memory
Former-commit-id: f0bdc4fb5fce02d79c1aa2bcf384aa06580ff9e1
2020-05-07 23:07:31 -04:00
John Sully 919fedefe6 Disable cluster tests
They are unreliable on slow hardware.

Former-commit-id: 4345708b9cc7de82fb7cba150ac80861b137e7f2
2020-05-07 01:49:04 -04:00
Diab Neiroukh d76c99c755 Clang requires libatomic to be linked via LDFLAGS
Clang requires the libatomic to be linked via LDFLAGS or else the linker
will fail to recognise __atomic macros.

An error as a result of not passing -latomic to the linker can be seen
below:

ld.lld: error: undefined symbol: __atomic_fetch_add_2
>>> referenced by sds.c:185
>>>               lto.tmp:(sdsdupshared)
clang-10: error: linker command failed with exit code 1 (use -v to see invocation)
make[1]: *** [Makefile:276: keydb-server] Error 1
Former-commit-id: 1bae3f301135367142df3e3939f481ac91eae16b
2020-04-30 15:06:10 -04:00
John Sully 70217d27a6 cluster tests should be a named task
Former-commit-id: dc6290420b4f145f6af05d64590ad56c4799a051
2020-04-29 18:43:55 -04:00
John Sully ae1c2c42db Run cluster tests as part of CI
Former-commit-id: 7e503b3d4d588174010d2c908250b84f7827b2eb
2020-04-29 18:41:51 -04:00
John Sully f785c3bd64 use serverAssert() instead of assert() to get callstacks in fastlock
Former-commit-id: c33ddc059785b2000b9ea5f08711e177a3fc2e0e
2020-04-28 22:41:07 -04:00
John Sully 1d9510a36b Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: c7b288babfc87748b4c5381460fcd676822da4f6
2020-04-28 22:24:45 -04:00
John Sully db2a564c23 Bump version
Former-commit-id: 8e12ff0cd9e50867b42b165af278a7dc91fc17e1
2020-04-28 20:49:39 -04:00
John Sully e52cbad238 Bump version
Former-commit-id: 8e12ff0cd9e50867b42b165af278a7dc91fc17e1
2020-04-28 20:49:39 -04:00
John Sully e0f6b4fcff Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 6e7ffcddfbde8ee310e07b510097b69104f862b8
2020-04-28 20:48:54 -04:00
John Sully 65fcf3b204 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 6e7ffcddfbde8ee310e07b510097b69104f862b8
2020-04-28 20:48:54 -04:00
John Sully c7635f9872 Fix failure to count keys in cluster slots when reloading a FLASH database
Former-commit-id: f6dd863e51f91620f184ff80f08cfe518d29c87f
2020-04-28 20:48:46 -04:00
John Sully bca2c18ff8 Fix failure to count keys in cluster slots when reloading a FLASH database
Former-commit-id: f6dd863e51f91620f184ff80f08cfe518d29c87f
2020-04-28 20:48:46 -04:00
John Sully 599b9cee62 shared pointer comparisons with other pointers
Former-commit-id: e122d036a9ccf5066215ee0bcb04c6f0fad4a6f9
2020-04-24 22:20:26 -04:00
John Sully 8db7c58ef3 EMBSTR size is lower than it needs to be
Former-commit-id: f88dbf66c76e7dfbd49d258ee6e0a8a399639fcf
2020-04-24 22:19:55 -04:00
John Sully 701a5c58c5 Default yes in apt install
Former-commit-id: e399aaeaaaac6d87af81fda4a634f42fe137218d
2020-04-22 02:17:28 -04:00
John Sully fadeb7defb Run arm CI builds
Former-commit-id: 2222db8fe10c7d7b60fe3b962bf2e14cb57a4426
2020-04-22 02:13:02 -04:00
John Sully 331369ffac MacOS Build Break Fix
Former-commit-id: d763e2cf7120dfb6330245569faf12ae9e9a4ce7
2020-04-22 01:21:35 -04:00
John Sully a9a7049444 Add deps to CI yml
Former-commit-id: 29d9fba802a24ba3e29bf5a66ab684c7d9d0959a
2020-04-22 01:11:06 -04:00
John Sully f5ee69dcc3 Add deps to CI yml
Former-commit-id: 29d9fba802a24ba3e29bf5a66ab684c7d9d0959a
2020-04-22 01:11:06 -04:00
John Sully 910762a3b7 Bump version
Former-commit-id: f527649f156147f29efb81a7a20057909fe43748
2020-04-22 01:07:14 -04:00
John Sully 69c3cc4172 Bump version
Former-commit-id: f527649f156147f29efb81a7a20057909fe43748
2020-04-22 01:07:14 -04:00
John Sully cc1a33583d Merge branch 'PRO_RELEASE_6' of https://github.com/JohnSully/KeyDB-Pro into PRO_RELEASE_6
Former-commit-id: 859540b68c54f86f97c33c87802d8c3e74437325
2020-04-22 01:06:43 -04:00
John Sully b4edee06a4 Merge branch 'PRO_RELEASE_6' of https://github.com/JohnSully/KeyDB-Pro into PRO_RELEASE_6
Former-commit-id: 859540b68c54f86f97c33c87802d8c3e74437325
2020-04-22 01:06:43 -04:00
John Sully 3a84b29434 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 6b6a1c711dbb7786e30be29e2d1930582037f7f9
2020-04-22 01:06:24 -04:00
John Sully f178aaae80 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 6b6a1c711dbb7786e30be29e2d1930582037f7f9
2020-04-22 01:06:24 -04:00
John Sully 0fce4240c5 Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: 9004ecf11e31be1b0d43a0d8c6e8263636b3bac4
2020-04-22 01:06:06 -04:00
John Sully 343eb0b9b8 Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: 9004ecf11e31be1b0d43a0d8c6e8263636b3bac4
2020-04-22 01:06:06 -04:00
John Sully e49628c373 Don't CI build Pro on MacOS
Former-commit-id: aaed87516ea9f428ebea286dd936dd219691b4f6
2020-04-22 01:05:24 -04:00
John Sully 5accc03018 Don't CI build Pro on MacOS
Former-commit-id: aaed87516ea9f428ebea286dd936dd219691b4f6
2020-04-22 01:05:24 -04:00
John Sully 7c293a7226 Don't show trial warning on license disabled builds
Former-commit-id: 08fd74360d1e0196db7a6b52717500325533576c
2020-04-22 01:04:29 -04:00
John Sully a8d42607db Don't show trial warning on license disabled builds
Former-commit-id: 08fd74360d1e0196db7a6b52717500325533576c
2020-04-22 01:04:29 -04:00
John Sully a1ac2a34ce Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 8ff5c0baef1d7ec8f225c3e115f37731e4ee8593
2020-04-22 00:56:43 -04:00
John Sully cd81b7aa09 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 8ff5c0baef1d7ec8f225c3e115f37731e4ee8593
2020-04-22 00:56:43 -04:00
John Sully c618586588 CI syntax error fix
Former-commit-id: 0845620384c08a3f937655931775a20728b19526
2020-04-22 00:55:31 -04:00
John Sully f0e62a1bfa CI syntax error fix
Former-commit-id: 0845620384c08a3f937655931775a20728b19526
2020-04-22 00:55:31 -04:00
John Sully fb8e58b9bd CI enable submodules
Former-commit-id: f57611e82fa7a63bd554568748338e8a116534b5
2020-04-22 00:53:31 -04:00
John Sully dc5d289ac6 CI enable submodules
Former-commit-id: f57611e82fa7a63bd554568748338e8a116534b5
2020-04-22 00:53:31 -04:00
John Sully 7f2c40e6b4 RDB load performance, eliminate useless reads
Former-commit-id: 68e5d1850dbba89a87710968d314cb8c0d3cb562
2020-04-22 00:47:49 -04:00
John Sully d62d5972b6 RDB load performance, eliminate useless reads
Former-commit-id: 68e5d1850dbba89a87710968d314cb8c0d3cb562
2020-04-22 00:47:49 -04:00
John Sully ac014e4503 Be more aggressive evicting when a storage provider is set
Former-commit-id: 4d1cabe2ab383939670e5ff0a2b91aa758f4e15e
2020-04-22 00:47:24 -04:00
John Sully 93970e91cf Be more aggressive evicting when a storage provider is set
Former-commit-id: 4d1cabe2ab383939670e5ff0a2b91aa758f4e15e
2020-04-22 00:47:24 -04:00
John Sully 703d69df53 Periodically FLASH flush write queues during RDB load
Former-commit-id: 721129b18263eabfc2a29556a2b7a9a861110953
2020-04-21 21:39:36 -04:00
John Sully d9381e27b8 Periodically FLASH flush write queues during RDB load
Former-commit-id: 721129b18263eabfc2a29556a2b7a9a861110953
2020-04-21 21:39:36 -04:00
John Sully 501cf1b5c3 don't swap iterators when swapping DB contents
Former-commit-id: 4971518d42218a63cf86919e91af54462f6dc8c0
2020-04-21 21:38:24 -04:00
John Sully 6d5c172ee3 don't swap iterators when swapping DB contents
Former-commit-id: 4971518d42218a63cf86919e91af54462f6dc8c0
2020-04-21 21:38:24 -04:00
John Sully 1a3e524e97 Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: e3fa69e2e5c816408deee3e4e317d0546aa0245c
2020-04-16 20:12:14 -04:00
John Sully f892c5b698 Fix some clang warnings
Former-commit-id: 0f02a6d740a2a776ba73c9d00f3f5229a396e5fe
2020-04-16 20:12:05 -04:00
John Sully 18e926de94 Always link libatomic
Former-commit-id: 982e9a8a7b0971b00d4f384ffe8339ad4301f977
2020-04-16 20:01:24 -04:00
John Sully 1abce5e8bc Fix warning in cluster.cpp
Former-commit-id: 0de0b0707c4c248f0c2712aabce58d2a28616eee
2020-04-16 20:01:13 -04:00
John Sully 4b11e80a2d Merge branch 'unstable' into keydbpro
Former-commit-id: 642719cef20a88d23af84a16d3f6757088c23b1a
2020-04-16 17:06:33 -04:00
John Sully 67f7e9a97e Merge branch 'unstable' into keydbpro
Former-commit-id: 642719cef20a88d23af84a16d3f6757088c23b1a
2020-04-16 17:06:33 -04:00
John Sully 310018aba0 quiet TSAN in serverLog
Former-commit-id: ecff16adda1f5317643ad268ead850c61be14556
2020-04-16 17:06:25 -04:00
John Sully a20caa5735 Initial merge of unstable 6
Former-commit-id: aac140de199646914cc02997a45111c9c695e55d
2020-04-16 16:36:16 -04:00
John Sully 4c34a9b7d4 Initial merge of unstable 6
Former-commit-id: aac140de199646914cc02997a45111c9c695e55d
2020-04-16 16:36:16 -04:00
John Sully fee6e70fd0 Update Readme to use github CI badge
Former-commit-id: 733f1e29654b1a856d6026b5719ea13b31fe8e58
2020-04-15 23:21:10 -04:00
John Sully 6942f6b317 update TLS readme for KeyDB
Former-commit-id: f61de948df0c460b0c06a950303dca776cabfd97
2020-04-15 23:19:05 -04:00
John Sully 70fd085442 Deprecate travis and finish setting up github CI
Former-commit-id: 78996fa03cf544655403d8cf628dc05712f5d8e2
2020-04-15 23:04:04 -04:00
John Sully 7197db2a95 Merge branch 'unstable' into redis_6_merge
Former-commit-id: 08ae82da4e6e43e3348e5abf1e9ea6353b741989
2020-04-15 23:00:13 -04:00
Ubuntu 4008ecad23 updating version
Former-commit-id: f994436486b2e8b4eb63f8ce29ab9c8595e1a694
2020-04-16 02:56:49 +00:00
Ubuntu a8934daba7 updating version
Former-commit-id: f994436486b2e8b4eb63f8ce29ab9c8595e1a694
2020-04-16 02:56:49 +00:00
John Sully adb3af3da8 OS X build break
Former-commit-id: 1b8dfed8871c4cb37cf0470dc321654db52060a9
2020-04-15 22:43:40 -04:00
John Sully 570f9769db more dependencies for CI
Former-commit-id: 8ae6204dbd7446aa1eaa58ebc6e57effb9709ec7
2020-04-15 22:39:47 -04:00
John Sully 11e3973260 Add CI dependency
Former-commit-id: 98f0ebf5be8060a5aa7c1d42d8a5e3e610819715
2020-04-15 22:36:16 -04:00
John Sully f503c5a745 During AOF reload we can erroneously read incorrect aof_state values, so this variable must be read with the global lock acquired
Former-commit-id: 67d46f50ab748afdc15382fa211fef3a6ef0115e
2020-04-15 22:30:19 -04:00
John Sully c9d77fad6c Quiet test only ASAN fd race
Former-commit-id: a985fd90d4c5b6d5be5154b4b250224d2ec510ba
2020-04-15 22:27:45 -04:00
John Sully cb9756e085 Run all KeyDB instances in testmode during tests
Former-commit-id: c07b5524fb927dd558287c839b86f216bf791ac1
2020-04-15 22:27:04 -04:00
John Sully f85243553b Fix race in sendBulk
Former-commit-id: 5d7cfcfffd354a28e17c7aa5aca35d5e16588f1b
2020-04-15 22:26:00 -04:00
John Sully 9392d20165 Convert variables accessed outside lock to atomics
Former-commit-id: f0938073b59844f2ed5da0054801fb4f8c68b863
2020-04-15 22:25:17 -04:00
John Sully 1e31671a0b ASAN races in leak checker
Former-commit-id: aa4c1157b6bcf385f8766b80ba1914d74b484e85
2020-04-15 22:24:12 -04:00
John Sully 9e1ae7e7aa Multithreading reliability, force single thread for test relying on internal behavior
Former-commit-id: ce5dfd1e944f43f95a740a390f2b513dd149a0db
2020-04-15 20:52:25 -04:00
John Sully 2682b7bbd2 rename to KeyDB (merge)
Former-commit-id: a5c6b565ca2e76d04b8c02b3c929df50c4128792
2020-04-15 16:44:06 -04:00
John Sully 9aca25be21 Log stdout and stderr for cluster tests
Former-commit-id: eb7a75f6985f1fd47620eecbbfcc93d6f61258d0
2020-04-15 16:35:24 -04:00
John Sully 856f85df7e Fix TSAN race
Former-commit-id: 9d1e489e83268b887ab2f417cf09a800dfc58f5b
2020-04-15 16:34:38 -04:00
John Sully 1f9e811344 Fix incorrect cluster slot tracking (regression from merge)
Former-commit-id: 21205779282301958849b3fdb98b0f7cfed3867b
2020-04-15 16:34:07 -04:00
John Sully 5d1465f4c1 Merge tag '6.0-rc3' into redis_6_merge
Redis 6.0 RC3.


Former-commit-id: 0ebb1956eca0cc6797dd2e3fdf1f79e068ace701
2020-04-14 22:56:19 -04:00
John Sully 4286104b63 Fix merge issues and move timeout to C++
Former-commit-id: 45c4245eb81bf1539007c05cbf117006423793d6
2020-04-14 22:37:26 -04:00
John Sully addfa273ac Merge commit '2a820251c8ffba152e00ef7b1ca5e7a477087d33' into redis_6_merge
Former-commit-id: 95f3a79b8b87aa99094b182a0e4aa5f1605da5e9
2020-04-14 22:25:44 -04:00
John Sully 141d060729 Merge commit '454e12cb8961f21c9dd8502dc82ae6ffd7e22fe0' into redis_6_merge
Former-commit-id: b2ca29453b61c10c03f2c405ffa221b2eb9e2716
2020-04-14 22:19:29 -04:00
John Sully 3ac4fa36a9 Merge commit '714ae38ee1fc260df6fc5708463accd74a93c215' into redis_6_merge
Former-commit-id: 2aec8a1bb2a2fe3e867c054628feaedb2a0bfbca
2020-04-14 21:26:51 -04:00
John Sully 4d45697d99 Merge commit 'd3491c5182b97535cfdf2c3d4f9d0762c608e1ff' into redis_6_merge
Former-commit-id: 6306b4730bee3524f1f4e524f1ccbdd07350d431
2020-04-14 21:16:38 -04:00
John Sully 509f5c2d90 Merge commit '07c75f60f3fe0b300fd7913bab3d2d7e612afb03' into redis_6_merge
Former-commit-id: 10187865f710fc9a381a5ae11d27369909362e53
2020-04-14 21:13:42 -04:00
John Sully ffc006d322 Merge commit 'c609bf3f2c7f0982f632f82623ee4802868b8ef1' into redis_6_merge
Former-commit-id: e9eeee2780d7af8d983c489fcbbe758b4f613b65
2020-04-14 21:04:42 -04:00
John Sully 5ba73dfbc5 Merge commit 'c208956fbe077e8249d2965dec2ea1b9b7588d6d' into redis_6_merge
Former-commit-id: 3ff9428f2b10cd98df8ce751a81119f6beff2c42
2020-04-14 20:55:29 -04:00
John Sully 5b446c8a05 Merge commit '00e53fb140fb67d329aff6cd2200f1eaf9e80cf5' into redis_6_merge
Former-commit-id: e4656724b7bda4e242a8614e810b347bca524e60
2020-04-14 20:44:27 -04:00
John Sully 0046a5625b Merge commit 'e91ca9fee9c56ef319b407b104afc435be0c53cb' into redis_6_merge
Former-commit-id: 01bc534c56416f6a7b109bc38a97e108015729d8
2020-04-14 20:42:48 -04:00
John Sully f9cf6c1060 Merge commit '6718d5d37517bd927635649708913affb98f67c9' into redis_6_merge
Former-commit-id: 315e4ec2bb0f18ce72973f6f80f6fc638c547284
2020-04-14 20:19:48 -04:00
John Sully f747c84bd4 Merge commit '79e8b17d7b44c793d8b22668b8583a297ee1b387' into redis_6_merge
Former-commit-id: b718dd6aef175d4a1f046ca761e7dfde294eba1d
2020-04-14 20:09:53 -04:00
John Sully 8fbe6a68dd Merge commit '13fbdf970660b15011c4312f31137e58bbda5b2c' into redis_6_merge
Former-commit-id: e919dc40ba5e77f2413923bcf18d7c62a18c6cc1
2020-04-14 19:43:04 -04:00
John Sully 3a4ce7fdb4 Merge commit 'a8e2bbe8f6a3f4833f286cc5049e6b52c87de1a9' into redis_6_merge
Former-commit-id: 84ffc4de4feea69d934f741502e0f51821800246
2020-04-14 19:22:44 -04:00
John Sully 923f772e52 Merge commit '491949ee5bf4ffbfc746ea4ed5a6d673b0e2fb81' into redis_6_merge
Former-commit-id: 98bf4812570727290d1c16153c79c1bbcd548258
2020-04-14 18:44:42 -04:00
John Sully e2a19693b8 Merge commit '2ad427f862084e0e18fbd6c313af35ccdb6c68f7' into redis_6_merge
Former-commit-id: 2f6e9f3f34cb97f3dae524f7403c46865ea148d0
2020-04-14 18:30:26 -04:00
John Sully f39d16a664 Merge commit '9a39a227fff45baa0f1532dba017f31ac71b68e5' into redis_6_merge
Former-commit-id: 76d51d9aa5eee874a8683bc57af23c0cc661820c
2020-04-14 18:29:03 -04:00
John Sully 2370756fb9 Merge commit 'dff5370c8be0dcef1728b95b17906d2494ce9bf2' into redis_6_merge
Former-commit-id: 0d7b8297b597b7acdca596e465ea88430f6f22be
2020-04-14 18:05:10 -04:00
John Sully 96f93355f8 Merge commit '87d059a7454aad2c3a9810ddafd33c3a9e4be383' into redis_6_merge
Former-commit-id: 2d8538780b7eaaaac44e445b946d9e740009e589
2020-04-14 18:04:51 -04:00
antirez 6d86fc09db Jump to right label on AOF parsing error.
Related to #6054.


Former-commit-id: cb29dc0c3518f78258bf5470f4615d3e403835a9
2020-04-14 18:03:22 -04:00
antirez 22db8c7f4f PSYNC2: meaningful offset implemented.
A very commonly signaled operational problem with Redis master-replicas
sets is that, once the master becomes unavailable for some reason,
especially because of network problems, many times it wont be able to
perform a partial resynchronization with the new master, once it rejoins
the partition, for the following reason:

1. The master becomes isolated, however it keeps sending PINGs to the
replicas. Such PINGs will never be received since the link connection is
actually already severed.
2. On the other side, one of the replicas will turn into the new master,
setting its secondary replication ID offset to the one of the last
command received from the old master: this offset will not include the
PINGs sent by the master once the link was already disconnected.
3. When the master rejoins the partion and is turned into a replica, its
offset will be too advanced because of the PINGs, so a PSYNC will fail,
and a full synchronization will be required.

Related to issue #7002 and other discussion we had in the past around
this problem.


Former-commit-id: 1f81a9bfddac312f9a883344f02167f3caa50ba4
2020-04-14 17:56:09 -04:00
Oran Agra 23af0fda33 reduce repeated calls to use_diskless_load
this function possibly iterates on the module list


Former-commit-id: 76b379bc103bfc4e124bbf46f667836d1ada6cf0
2020-04-14 17:34:36 -04:00
John Sully 48505d6fcc Fix merge conflicts from cherry-pick
Former-commit-id: a5634bfea02691ffb2f133572cd40cf1a087c56f
2020-04-14 17:33:54 -04:00
antirez d3892f6cd3 Remove RDB files used for replication in persistence-less instances.
Former-commit-id: 322b608f5ae2ef87a6553e44c42704dde2ec0006
2020-04-14 17:27:05 -04:00
Johannes Truschnigg ca657398e8 Signal systemd readiness atfer Partial Resync
"Partial Resynchronization" is a special variant of replication success
that we have to tell systemd about if it is managing redis-server via a
Type=Notify service unit.


Former-commit-id: 2132afe898d94143175a9c49e5f11b48bca2f8a6
2020-04-14 17:22:30 -04:00
Guy Benoish 9169b04b4d Diskless-load emptyDb-related fixes
1. Call emptyDb even in case of diskless-load: We want modules
   to get the same FLUSHDB event as disk-based replication.
2. Do not fire any module events when flushing the backups array.
3. Delete redundant call to signalFlushedDb (Called from emptyDb).


Former-commit-id: e18003ee20e9eb0b5d5a0d35834213da3da541cb
2020-04-14 17:21:10 -04:00
John Sully 489f8c9e48 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 1dd55bec28e7bba38ff9fbd7c6b22b23b911a4eb
2020-04-14 01:01:20 -04:00
John Sully 433a990fc7 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 1dd55bec28e7bba38ff9fbd7c6b22b23b911a4eb
2020-04-14 01:01:20 -04:00
John Sully 47cb2d2f5b Cache fake client in replicaFeedSlaves
Former-commit-id: e4da31f5e23ccb5132faa067ea1939db9fcd47b8
2020-04-13 22:45:15 -04:00
John Sully 807e3832cb Don't do active replica work if we're not an active replica
Former-commit-id: d6fe0d9f48b38d48e3cde71e855285836f12427e
2020-04-13 22:35:06 -04:00
John Sully 49db3652bd Optimize replicaFeedSlaves by removing use of snprintf
Former-commit-id: c5fabc3a69e7d61e995aa918400bfeef47f1990c
2020-04-13 22:11:34 -04:00
John Sully fb2e772e30 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 8d8115ff59f5838e13e911416eff7dfe2c0d92dc
2020-04-06 01:25:15 -04:00
John Sully c49689a53d Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 8d8115ff59f5838e13e911416eff7dfe2c0d92dc
2020-04-06 01:25:15 -04:00
John Sully 6c24e34de5 Fix failure to AUTH with master when masterauth is set last
Former-commit-id: 7e1d4ff8d0fa72bb86d29076476ab802d8aebb87
2020-04-06 01:24:59 -04:00
John Sully 4bce3e3cf7 Add the ability to set a starting core # when setting thread affinity
Former-commit-id: e050768b25c87c5c0e6a7f24a58bbf6c9e94ff66
2020-04-04 22:58:17 -04:00
John Sully 6594fded8d Fix issue #164
Former-commit-id: 619d06aa33005c3fd98628ac601a57dc0ba4aff5
2020-04-04 22:45:12 -04:00
John Sully 04bfcc987c Role command protocol corruption with multiple masters
Former-commit-id: 5b7cf1b03da2578d3b7c3a730f0ba8f7102740fd
2020-04-04 22:32:15 -04:00
John Sully 74102d1980 Fix subkey expires not replicating correctly, and AOF issues
Former-commit-id: c9bb7ff37be4f91e8746ed5804443fd30b596139
2020-04-04 21:52:27 -04:00
John Sully d119f90431 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: e6c8a157e136ac5e5b44b5ea60c619ad4e55942b
2020-03-30 00:58:38 -04:00
John Sully a58ba09fb2 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: e6c8a157e136ac5e5b44b5ea60c619ad4e55942b
2020-03-30 00:58:38 -04:00
John Sully 957ad2872f Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 86f7292ed375d509645458704828e72fdbfea936
2020-03-30 00:57:58 -04:00
John Sully cce3c1b5ef Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 86f7292ed375d509645458704828e72fdbfea936
2020-03-30 00:57:58 -04:00
John Sully d0be850e70 Merge branch 'redis_6_merge' of https://github.com/JohnSully/KeyDB into redis_6_merge
Former-commit-id: 4b72f106a4dc16cdfc11e501ee0455de2aaaf6cb
2020-03-30 00:52:43 -04:00
John Sully 5306b94a63 Merge branch 'unstable' into redis_6_merge
Former-commit-id: c3cdb8c4f560f71d3203d50c0a5a9029fafc1c99
2020-03-30 00:52:12 -04:00
John Sully 96cb83dac7 Allow active replicas to connect to each other when replica-serve-stale-data is set
Former-commit-id: 94597709207b53c5213000e78177519e311d3688
2020-03-30 00:51:40 -04:00
John Sully 65710c2bef Don't send build log to stderr
Former-commit-id: eacdf1d9ffe22ecb0501ab7b2c9faffa7b0a9aa5
2020-03-28 23:36:57 -04:00
John Sully 6225a65911 Merge branch 'unstable' into redis_6_merge
Former-commit-id: 5fa8922fdde8f7ed20d8043eaea658783f36c4bf
2020-03-27 14:50:37 -04:00
John Sully 24cf761bf7 Raspberry Pi fixes (compile and replication)
Former-commit-id: 11a7ecc5f66f39a7d9b82737676d99ecfef0044b
2020-03-27 12:46:25 -04:00
John Sully a6448f7abe OS X Build break fix
Former-commit-id: 98da479d9241c077d3c11787800075dea91e989e
2020-03-26 15:20:55 -04:00
John Sully c0f10ae230 OS X Build break fix
Former-commit-id: 98da479d9241c077d3c11787800075dea91e989e
2020-03-26 15:20:55 -04:00
John Sully 523708e150 bump version
Former-commit-id: 8e855c4568fd555f6df9a5b00bab2e42248127e3
2020-03-26 01:18:21 -04:00
John Sully 5e2531251e bump version
Former-commit-id: 8e855c4568fd555f6df9a5b00bab2e42248127e3
2020-03-26 01:18:21 -04:00
John Sully fbf097afa5 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: a5d8a93a476366ef2aa6fe9c248f33288b322ff6
2020-03-26 01:17:56 -04:00
John Sully c0d73c69ee Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: a5d8a93a476366ef2aa6fe9c248f33288b322ff6
2020-03-26 01:17:56 -04:00
John Sully 1bb4b72208 merge
Former-commit-id: 187773190f153f8a7236bc2e4f42bffe6885f727
2020-03-26 01:16:36 -04:00
John Sully 4658af1c8f merge
Former-commit-id: 187773190f153f8a7236bc2e4f42bffe6885f727
2020-03-26 01:16:36 -04:00
John Sully a82e819618 Fix merge issues
Former-commit-id: 02a6bec80eca5b4cd641f67a1ddf86c9efa578e5
2020-03-25 22:26:27 -04:00
John Sully 1c2ae22fae Merge branch 'unstable' into redis_6_merge
Former-commit-id: 21f879b4f78af231428d2755d6b80b7d58bbb600
2020-03-25 22:12:22 -04:00
John Sully fa2c741aba Fix issue #143
Former-commit-id: ae914a413cd6ea38aeb0aaef159ced174f17b337
2020-03-25 21:55:31 -04:00
John Sully 37c7675d3e Give a better error when handling std::terminate
Former-commit-id: d374cc8773d16cc304bd062ae03897e6d47b9578
2020-03-25 16:27:24 -04:00
John Sully 0cd0ecf62a Fix breaks from merge
Former-commit-id: fa76d19bee9df21967c4d8554128eebdd19021fa
2020-03-25 16:22:32 -04:00
John Sully 0af4bd220e Fix breaks from merge
Former-commit-id: fa76d19bee9df21967c4d8554128eebdd19021fa
2020-03-25 16:22:32 -04:00
John Sully f76d14e493 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 44f1b065ed6d3b0ad2a62f093432743b98fad6be
2020-03-25 15:47:24 -04:00
John Sully 91bcc2b375 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 44f1b065ed6d3b0ad2a62f093432743b98fad6be
2020-03-25 15:47:24 -04:00
John Sully 4336995cfb Merge branch 'unstable' into redis_6_merge
Former-commit-id: 26f870486313ab459de5fb2f8feacc1aca475d9d
2020-03-25 15:47:12 -04:00
John Sully 5fc388c32d Add roundtrip test for subkey expires
Former-commit-id: 4b6367e1c74187cb4d779105bf57ac58c031e91f
2020-03-25 15:34:30 -04:00
John Sully d9993e300b Fix failure to load subkey expires
Former-commit-id: 51bd7c22ce5b2995d5b3419f13b2232165331b82
2020-03-25 01:38:58 -04:00
John Sully 12ddffffa0 Expire entry needs to be resorted after a subkey expires
Former-commit-id: dda4222845042a768dffdea883b042dbd94f575f
2020-03-25 01:06:40 -04:00
John Sully ce48c53719 Evict on load if we have a storage provider
Former-commit-id: bb091796c3da7282e040c7b72a28ec1c5f5ecfb7
2020-03-24 14:49:43 -04:00
John Sully b1d3c3c928 Evict on load if we have a storage provider
Former-commit-id: bb091796c3da7282e040c7b72a28ec1c5f5ecfb7
2020-03-24 14:49:43 -04:00
John Sully 9046105860 Prevent issue where count can be out of sync temporarily, causing crashes where we expect the count to be perfect
Former-commit-id: 77c9f36413c6f0cbb0b13a7ec746746c97faadcd
2020-03-24 00:21:12 -04:00
John Sully e0bdd1f203 Prevent issue where count can be out of sync temporarily, causing crashes where we expect the count to be perfect
Former-commit-id: 77c9f36413c6f0cbb0b13a7ec746746c97faadcd
2020-03-24 00:21:12 -04:00
John Sully 41de0056d6 Fix OOM errors during forkless bgsave
Former-commit-id: c31c64b13409c741e8d52ad06add78300c39fce2
2020-03-23 23:12:10 -04:00
John Sully ec3e22d7b7 Fix OOM errors during forkless bgsave
Former-commit-id: c31c64b13409c741e8d52ad06add78300c39fce2
2020-03-23 23:12:10 -04:00
John Sully de10b7eb69 Fix incorrect prefix comparison
Former-commit-id: 1ef167546be0678edd457d65a5368e8706fde0a3
2020-03-23 22:51:46 -04:00
John Sully 0dd85d1038 Fix incorrect prefix comparison
Former-commit-id: 1ef167546be0678edd457d65a5368e8706fde0a3
2020-03-23 22:51:46 -04:00
John Sully f30a9da9af Fix incorrect count when loading FLASH
Former-commit-id: 38ee9c0df144621f7ca750527e9efb16e754ef40
2020-03-23 19:47:48 -04:00
John Sully 6f2e3657a5 Fix incorrect count when loading FLASH
Former-commit-id: 38ee9c0df144621f7ca750527e9efb16e754ef40
2020-03-23 19:47:48 -04:00
John Sully 03e844ba72 Prevent bookkeeping keys from leaking through
Former-commit-id: 1a5af28e115fc123bf250b4a80ac69232bb3add0
2020-03-23 18:06:47 -04:00
John Sully 59c256ba29 Prevent bookkeeping keys from leaking through
Former-commit-id: 1a5af28e115fc123bf250b4a80ac69232bb3add0
2020-03-23 18:06:47 -04:00
John Sully 5681f4d8e7 Unstable branch should always be version 0.0.0
Former-commit-id: 9e2ff638a0464973f520d59dd0f731e261b76265
2020-03-19 15:52:24 -04:00
John Sully 2e2e958823 Merge branch 'RELEASE_5' into unstable
Former-commit-id: 94b9793ba9821d1b431bd5505f1c5bc2a70aac26
2020-03-19 15:38:16 -04:00
John Sully 9e95bffea8 Print stack traces of other threads in the deadlock detector
Former-commit-id: 10f4ed8478e852264643ccc738f77c3d646d37b1
2020-03-19 15:37:49 -04:00
John Sully 73c7b9c67f Log which thread a message came from
Former-commit-id: c4c0c6f22703f238f712602f549334e08634f6f3
2020-03-19 15:37:24 -04:00
John Sully 54db27b816 Fix lock inversion in processEventsWhileBlocked
Former-commit-id: 8af2e757ea80620896db0c53dd84f83891a9ebe1
2020-03-19 15:28:39 -04:00
John Sully 3e4cad3801 Prevent dangling lock when we can't free the client
Former-commit-id: bad4fd835ab496c7c581880ea8babab490972240
2020-03-19 14:34:23 -04:00
John Sully f8746a4d45 Merge branch 'PRO_RELEASE_6' of https://github.com/JohnSully/KeyDB-Pro into PRO_RELEASE_6
Former-commit-id: 1c1f3c920411ee94eb8b81922189b98c9631b3de
2020-03-17 17:48:27 -04:00
John Sully 1ff28922b9 Merge branch 'PRO_RELEASE_6' of https://github.com/JohnSully/KeyDB-Pro into PRO_RELEASE_6
Former-commit-id: 1c1f3c920411ee94eb8b81922189b98c9631b3de
2020-03-17 17:48:27 -04:00
John Sully a374fae9a6 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 23c3316c10f2771bc26e50698b48934ec7549bcd
2020-03-17 17:47:55 -04:00
John Sully 45f0bcc4fb Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 23c3316c10f2771bc26e50698b48934ec7549bcd
2020-03-17 17:47:55 -04:00
John Sully 1b5eac86a7 Special case version 0.0.0 which is equal to any version
Former-commit-id: 869d037490b6905674f75a8552898aed72148558
2020-03-17 17:25:36 -04:00
John Sully 5f5d665212 Special case version 0.0.0 which is equal to any version
Former-commit-id: 869d037490b6905674f75a8552898aed72148558
2020-03-17 17:25:36 -04:00
John Sully 578ea0e8ec Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: dd8339da10c17f0e2f238310a10e97395f8f12ac
2020-03-17 17:11:51 -04:00
John Sully 5c73fbadd7 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: dd8339da10c17f0e2f238310a10e97395f8f12ac
2020-03-17 17:11:51 -04:00
John Sully ab316128eb Cache count of keys in database
Former-commit-id: 7cd266030ad82b5fddd4668d666adc95e1bed475
2020-03-17 17:11:41 -04:00
John Sully 3f7785dc0b Cache count of keys in database
Former-commit-id: 7cd266030ad82b5fddd4668d666adc95e1bed475
2020-03-17 17:11:41 -04:00
John Sully 2a7daf93ae Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: ff3190cac5c5d222904aa2d57d97c752c1b7e554
2020-03-17 00:10:09 -04:00
John Sully 18cbe8086f Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: ff3190cac5c5d222904aa2d57d97c752c1b7e554
2020-03-17 00:10:09 -04:00
John Sully 0038355778 Merge branch 'unstable' into redis_6_merge
Former-commit-id: 02764735c23aab2ec53a02cd291587fce7a8e487
2020-03-17 00:09:48 -04:00
John Sully 8ec4a2b31e Fix issue #153: Config get replicaof returns a corrupt response
Former-commit-id: 4cb18b9d25e35923dfea9f00eb38ea98c6b6c93c
2020-03-16 20:43:46 -04:00
John Sully 5d370e6387 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: aea8413a15001e2c27cf03dd41fa15151b0d3ccb
2020-03-15 18:48:45 -04:00
John Sully 703b097e3a Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: aea8413a15001e2c27cf03dd41fa15151b0d3ccb
2020-03-15 18:48:45 -04:00
John Sully bdb8254785 Merge branch 'unstable' into redis_6_merge
Former-commit-id: 799e7a8ff9af948105de6d06820de6b0c23b92d5
2020-03-15 18:47:27 -04:00
John Sully 76c0d8309a Handle HTTP error codes with MOTD
Former-commit-id: f8627c60bb6f542b35458dc95dfab635f554d5b4
2020-03-15 18:47:01 -04:00
John Sully 16a7dfd27c Update MOTD url for Pro
Former-commit-id: feed518042f3046016c26beda1c08cc721914943
2020-03-15 18:34:42 -04:00
John Sully 97e8ed71fd Update MOTD url for Pro
Former-commit-id: feed518042f3046016c26beda1c08cc721914943
2020-03-15 18:34:42 -04:00
John Sully 5a93298bca Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 2765895981196adf6a8300eb4a704d60ec651f56
2020-03-15 18:34:15 -04:00
John Sully 3e13c03d40 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 2765895981196adf6a8300eb4a704d60ec651f56
2020-03-15 18:34:15 -04:00
John Sully 3951d50540 Merge branch 'unstable' into redis_6_merge
Former-commit-id: 505c981659c5101d1caaf160857ed88fbef02930
2020-03-15 18:33:24 -04:00
John Sully 6c0f3fd479 Update MOTD URL
Former-commit-id: 707b66ec35bda5f0c35b71fbd7f2c2e0dddf874c
2020-03-15 18:32:05 -04:00
John Sully c7870a6b36 Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: c70edb09d33b746fa6893488327f301aff455b58
2020-03-15 18:28:00 -04:00
John Sully d4804d6b05 Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: c70edb09d33b746fa6893488327f301aff455b58
2020-03-15 18:28:00 -04:00
John Sully 2dfd7fc738 Add fallback if we fail to evict normally with FLASH (flush everything)
Former-commit-id: 66ee85a8d5e24514083aa3478dcf0cf3da86520e
2020-03-15 18:27:10 -04:00
John Sully 8bec9fa199 Add fallback if we fail to evict normally with FLASH (flush everything)
Former-commit-id: 66ee85a8d5e24514083aa3478dcf0cf3da86520e
2020-03-15 18:27:10 -04:00
John Sully 36b0e932a3 Change the default for maxmemory samples to 10 to reduce issues with FLASH storage and eviction failure
Former-commit-id: 8571d8aca9b462d600b78854c0795c8b33520088
2020-03-15 18:26:46 -04:00
John Sully ab9a67f76b Change the default for maxmemory samples to 10 to reduce issues with FLASH storage and eviction failure
Former-commit-id: 8571d8aca9b462d600b78854c0795c8b33520088
2020-03-15 18:26:46 -04:00
John Sully 14cee36abe Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 1982bf26a5d24327389676031ecc599a5a6d88a7
2020-03-04 17:24:51 -05:00
John Sully 738aff3d91 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 1982bf26a5d24327389676031ecc599a5a6d88a7
2020-03-04 17:24:51 -05:00
John Sully 731bf62e2b Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: b0a3bb848937d24dd74de63032306fd92c61dd7b
2020-03-04 17:24:36 -05:00
John Sully 8ad16b6d00 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: b0a3bb848937d24dd74de63032306fd92c61dd7b
2020-03-04 17:24:36 -05:00
John Sully f56f4b810a Fix CLANG build break
Former-commit-id: 103db9d0d2af98369805bd708ac2eac56ad54c2b
2020-03-04 17:24:17 -05:00
John Sully 095a07d827 Fix CLANG build break
Former-commit-id: 3ef5e2f068a5118e448351f79eb35a7e84ecf629
2020-03-04 17:24:00 -05:00
John Sully f4d478b1bc Fix CLANG build break
Former-commit-id: 91fb771bf061d9412dc7d8378572848d09cfd59e
2020-03-04 17:23:40 -05:00
John Sully 0f84d8cb26 finish merge
Former-commit-id: 66063a19f6cdbc87ead8ecbd4887134438ee1ccd
2020-03-04 17:22:57 -05:00
John Sully cc7bbd57d2 finish merge
Former-commit-id: 66063a19f6cdbc87ead8ecbd4887134438ee1ccd
2020-03-04 17:22:57 -05:00
John Sully c7896fcb77 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: bef19fefeb293e44e31dfefe383eef99e4cd7721
2020-03-04 17:15:54 -05:00
John Sully 6d62c66f2b Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: bef19fefeb293e44e31dfefe383eef99e4cd7721
2020-03-04 17:15:54 -05:00
John Sully d8cf6facf7 Merge branch 'unstable' into redis_6_merge
Former-commit-id: 08b0eadcf1063f2fa7026821e05125d488f9aa18
2020-03-04 17:13:50 -05:00
John Sully 7ac53e849d Merge branch 'unstable' into RELEASE_5
Former-commit-id: a857966259890f391fcc5fbcd1132d7e457e2ee3
2020-03-04 17:13:32 -05:00
John Sully e04b332b51 Add missing files from last checkin
Former-commit-id: ad6161d9356c27b14de31998180571eb72901aa8
2020-03-04 17:13:18 -05:00
John Sully 5e6ae3118c Merge branch 'unstable' into redis_6_merge
Former-commit-id: 36e706a6e1a9977c86a3ec1864d4706b22d0169c
2020-03-04 17:13:01 -05:00
John Sully 1be1aaeafe Merge branch 'unstable' into RELEASE_5
Former-commit-id: 61b49ca1a751a5ca3a0073dd7e69abec1f7d65ed
2020-03-04 17:09:29 -05:00
John Sully 334d72b033 Add extra logging when reporting errors from masters - especially in rreplay
Former-commit-id: a543a353d129c57fbbc46f9652fd0fdae5ca5a84
2020-03-04 17:09:12 -05:00
John Sully ebfe3a9e11 MOTD refactor
Former-commit-id: 6959390c6875704482cb751d9415b6107db3147c
2020-03-04 16:22:55 -05:00
John Sully 9033e0f675 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 5b89b51192154e66e8ad87ce342a9cd4ab7a0130
2020-03-04 15:34:27 -05:00
John Sully bfe6b9fc4f Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 5b89b51192154e66e8ad87ce342a9cd4ab7a0130
2020-03-04 15:34:27 -05:00
John Sully 3f3fedb910 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: a14d1d5b55a507a83cf5b85920607a0d013e7037
2020-03-04 15:33:59 -05:00
John Sully 75f590de02 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: a14d1d5b55a507a83cf5b85920607a0d013e7037
2020-03-04 15:33:59 -05:00
John Sully 944a7352be min-clients-per-thread needs to use the new config code
Former-commit-id: 5003fcc878426a1552c978fb39882708ea44862d
2020-03-04 15:14:41 -05:00
John Sully ea1eec38b5 Update README.md
Former-commit-id: 792c717949a91d0b58f33066bbe050b08f455ebb
2020-03-03 13:58:48 -08:00
John Sully ddea8b80ef Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 51e889277c59adb25a8724b25706631e6adca366
2020-03-01 22:17:04 -05:00
John Sully fc353a346b Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 51e889277c59adb25a8724b25706631e6adca366
2020-03-01 22:17:04 -05:00
John Sully 57fcd6a44c Add option to build pro without license checks
Former-commit-id: 0713518d2f34559a06db31a9023228b91ce60af3
2020-03-01 22:16:25 -05:00
John Sully aa636eb0fd Add option to build pro without license checks
Former-commit-id: 0713518d2f34559a06db31a9023228b91ce60af3
2020-03-01 22:16:25 -05:00
John Sully 75aba7e297 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 656bacd614f359742f6bd2df3fd2009c44c3d788
2020-03-01 21:49:21 -05:00
John Sully 5a5b0428a5 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 656bacd614f359742f6bd2df3fd2009c44c3d788
2020-03-01 21:49:21 -05:00
John Sully 6813a97738 Merge branch 'unstable' into redis_6_merge
Former-commit-id: 59aea09bf8a6b97b77135280ada704b7f05f93f0
2020-03-01 21:48:51 -05:00
John Sully 50be560e1d Merge branch 'unstable' into RELEASE_5
Former-commit-id: 3545feee4ba77a85afd324abb188c65d01fc2bef
2020-03-01 21:43:21 -05:00
John Sully 5d2cf7f92e Update tests to reflect new CRON name (keydb.cron)
Former-commit-id: d9b1e93cc456574c282825b5eefd877660ed3cf1
2020-03-01 21:42:01 -05:00
benschermel b97fd0d451 Merge branch 'unstable' into RELEASE_5
Former-commit-id: 62e79218f21e05b6e8760613f0d2c489f9656480
2020-03-01 19:53:32 -05:00
John Sully b4fe96d23c Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 197022aa76949664dfd866e0e71602bf23cbc3a0
2020-03-01 19:18:56 -05:00
John Sully 16163959c4 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 197022aa76949664dfd866e0e71602bf23cbc3a0
2020-03-01 19:18:56 -05:00
John Sully 8de67206af Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 4e8000d43cd4e23c90bf7e262835fae5ae6da34d
2020-03-01 19:18:34 -05:00
John Sully bb4f2182fc Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 4e8000d43cd4e23c90bf7e262835fae5ae6da34d
2020-03-01 19:18:34 -05:00
John Sully 44f235bfb0 Rename cron command to KEYDB.CRON and add help
Former-commit-id: e42e1f966e6bc57cf72cb4d01d6d1a630f58ab77
2020-03-01 19:18:21 -05:00
John Sully c99deff07c Rename cron command to KEYDB.CRON and add help
Former-commit-id: 0fb35811d77e53a5b8ad4624220b80834b925cb1
2020-03-01 19:17:58 -05:00
John Sully da1ec11aae Bump version
Former-commit-id: e5776fd1a05b329c3113b94d26fba9e39816644f
2020-02-29 00:04:24 -05:00
John Sully 7f3fedc59a Bump version
Former-commit-id: e5776fd1a05b329c3113b94d26fba9e39816644f
2020-02-29 00:04:24 -05:00
John Sully c63fbef58a Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: e559a947e6d233146416e68a7c69d4e9b2eadd6c
2020-02-29 00:03:55 -05:00
John Sully 8ed3293a98 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: e559a947e6d233146416e68a7c69d4e9b2eadd6c
2020-02-29 00:03:55 -05:00
John Sully 8c28a61436 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: a60d71e13335bdf231b5f1bec61b457056dc5e0a
2020-02-28 23:57:45 -05:00
John Sully 8096c76bc1 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: a60d71e13335bdf231b5f1bec61b457056dc5e0a
2020-02-28 23:57:45 -05:00
John Sully 37d89d7cd3 Merge branch 'unstable' into redis_6_merge
Former-commit-id: 916a31b927f3242643c364e0ad0f1abc9cd98286
2020-02-28 23:56:26 -05:00
John Sully a2cc65d256 Bump version
Former-commit-id: 0c1f7ae344a7d5372f85f8f20137d1b78a70755d
2020-02-28 23:53:54 -05:00
John Sully 3c4238b5de Merge branch 'unstable' into RELEASE_5
Former-commit-id: 3b704ec8a42b082b4c8e1b5ca935fad8932d6158
2020-02-28 23:53:00 -05:00
John Sully 796f611e55 Fix compile failure on raspberry pi machines, issue #141
Former-commit-id: 4560f7f78db38cac87971fcc4041069c4022b633
2020-02-28 23:49:17 -05:00
John Sully f978a8be31 Fix not respecting max clients config, issue #147
Former-commit-id: 6ad76d6f15262973153a2437e4611be8b2306a31
2020-02-28 22:04:42 -05:00
John Sully 29794fec2e Fix issue #146
Former-commit-id: 6e373dcb91f82814c858ca3d270b8c47e60a7256
2020-02-28 21:21:05 -05:00
John Sully 4fd0513530 Fix crash propogating stale keys
Former-commit-id: eaca39530a8eb1ddb1049b5f982550a1cf6d63b8
2020-02-26 21:49:40 -05:00
John Sully 7ee536d084 Change Redis to KeyDB
Former-commit-id: ee5f026eea133ad851bfb3e8788a15ac798ca7e6
2020-02-17 23:46:29 -05:00
John Sully 961273878a Change Redis to KeyDB
Former-commit-id: ee5f026eea133ad851bfb3e8788a15ac798ca7e6
2020-02-17 23:46:29 -05:00
John Sully 7de1af9a83 Change Redis to KeyDB
Former-commit-id: e6316c8106caa9103d2bef6af35721a0be87aae0
2020-02-17 23:46:17 -05:00
John Sully 65ba802a36 Change Redis to KeyDB
Former-commit-id: e6316c8106caa9103d2bef6af35721a0be87aae0
2020-02-17 23:46:17 -05:00
John Sully 36c5d506ad Change Redis to KeyDB
Former-commit-id: 96030cf2d6b90fe1e09dcd593999ac011b82158b
2020-02-17 23:46:01 -05:00
John Sully 0eca83807b Change Redis to KeyDB
Former-commit-id: 795c6efcc2e09c681c3e17490ae96589e634547f
2020-02-17 23:45:40 -05:00
John Sully b99af0f882 C++14 build fix
Former-commit-id: b45f50efa2fb56aa995ee6ceb6bd91380c28187c
2020-02-17 23:29:23 -05:00
John Sully 63c79593c0 C++14 build fix
Former-commit-id: b45f50efa2fb56aa995ee6ceb6bd91380c28187c
2020-02-17 23:29:23 -05:00
John Sully 3d9aaaa034 C++14 build fix
Former-commit-id: 5a3e3c9fe20dabe294c439cd2b22e929a228f596
2020-02-17 23:29:03 -05:00
John Sully a513f24841 C++14 build fix
Former-commit-id: 5a3e3c9fe20dabe294c439cd2b22e929a228f596
2020-02-17 23:29:03 -05:00
John Sully 3c9d25ede0 Bump version
Former-commit-id: 7f84d6d6301303a3277910bf93e5d8dc900908c1
2020-02-17 22:27:50 -05:00
John Sully f14fd30ef0 Bump version
Former-commit-id: 7f84d6d6301303a3277910bf93e5d8dc900908c1
2020-02-17 22:27:50 -05:00
John Sully 24c77a7c8b Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 5db2ab0ef538391eb2e20cce6a6af6b750458db0
2020-02-17 22:27:11 -05:00
John Sully eac97291b3 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 5db2ab0ef538391eb2e20cce6a6af6b750458db0
2020-02-17 22:27:11 -05:00
John Sully 30e3d2cfa2 override eviction policy for flash
Former-commit-id: 48a4f967e66ba765be96c9f8e113f808a4390f88
2020-02-17 22:26:48 -05:00
John Sully 9508aa04a2 override eviction policy for flash
Former-commit-id: 48a4f967e66ba765be96c9f8e113f808a4390f88
2020-02-17 22:26:48 -05:00
John Sully 37acc0fa9d Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: ad5a015388a3180bcbfefebf106a1a56e304e380
2020-02-17 22:03:54 -05:00
John Sully cf4231ad44 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: ad5a015388a3180bcbfefebf106a1a56e304e380
2020-02-17 22:03:54 -05:00
John Sully 4badba8e37 We should give a nice error message when we can't init a storage provider
Former-commit-id: 6c5acd8fe926d9f66fa5b13a2b962e5632f148de
2020-02-17 22:03:35 -05:00
John Sully 728a854b35 We should give a nice error message when we can't init a storage provider
Former-commit-id: 6c5acd8fe926d9f66fa5b13a2b962e5632f148de
2020-02-17 22:03:35 -05:00
John Sully 3f617f45bd Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 50127eec445cb8d7abceb683f2afbd7aad90a3ae
2020-02-17 21:51:02 -05:00
John Sully 9d481824c0 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 50127eec445cb8d7abceb683f2afbd7aad90a3ae
2020-02-17 21:51:02 -05:00
John Sully 204bf7e131 Tune rocksdb
Former-commit-id: 95d91b1ff8c8080dfcbf59e51d3eff73d27dcfb5
2020-02-17 21:50:45 -05:00
John Sully 310d2e7857 Tune rocksdb
Former-commit-id: 95d91b1ff8c8080dfcbf59e51d3eff73d27dcfb5
2020-02-17 21:50:45 -05:00
John Sully 1ff01bd1cd Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: bc4b0ff8c18410ae1d1b029410580c96c430510f
2020-02-17 19:56:38 -05:00
John Sully 3243d9342e Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: bc4b0ff8c18410ae1d1b029410580c96c430510f
2020-02-17 19:56:38 -05:00
John Sully a8d1483dd9 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 82b957be47c828238554ba8b365e2d0a45994bc2
2020-02-17 19:56:07 -05:00
John Sully 21698048c4 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 82b957be47c828238554ba8b365e2d0a45994bc2
2020-02-17 19:56:07 -05:00
John Sully 8a9371dbef Merge branch 'unstable' into redis_6_merge
Former-commit-id: 4add47b244a28e4cfecfcc65e47c42e99325bf80
2020-02-17 19:55:29 -05:00
John Sully 0e06b4d5b9 Add double unlock detection and improve fastlock_unlock assmebly
Former-commit-id: 539c81daf2a87f947eea2340c617f4ebf94f9efe
2020-02-17 19:54:05 -05:00
John Sully 23ce33c7ef Incorrect use of std::atomic
Former-commit-id: 7a679cdd8a43fcebc6125a35afb0574ab6523fed
2020-02-17 19:07:13 -05:00
John Sully 896f716678 processEventsWhileBlocked not exception safe
Former-commit-id: adcb12ba8789c7a1a372358b15341455b0863b95
2020-02-17 19:04:11 -05:00
John Sully 4cf851fb4b processEventsWhileBlocked not exception safe
Former-commit-id: 765c81894d52f24436f2f8681b7f82aaf3c75c16
2020-02-17 19:03:49 -05:00
John Sully 0d54d36f64 Fix race condition with IStorage batches
Former-commit-id: a2eabd044c9048662a63ff0f980ed947dc145912
2020-02-17 19:00:31 -05:00
John Sully 7f7e252602 Fix race condition with IStorage batches
Former-commit-id: a2eabd044c9048662a63ff0f980ed947dc145912
2020-02-17 19:00:31 -05:00
John Sully fbfa450ecf processEventsWhileBlocked not exception safe
Former-commit-id: 432543956c74351a12af2cb258a7a0ba5daa9b27
2020-02-17 18:57:13 -05:00
John Sully efa2f6a95a processEventsWhileBlocked not exception safe
Former-commit-id: 432543956c74351a12af2cb258a7a0ba5daa9b27
2020-02-17 18:57:13 -05:00
John Sully 2479f676f0 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: b16090958d392a6de908562dee65a02c851f07ae
2020-02-16 20:07:03 -05:00
John Sully e8c3503a06 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: b16090958d392a6de908562dee65a02c851f07ae
2020-02-16 20:07:03 -05:00
John Sully 7bffa38dc3 Merge branch 'unstable' into redis_6_merge
Former-commit-id: 878f505e69291d84ad1fbedac06420f447b0b17b
2020-02-16 19:14:51 -05:00
John Sully c63d565b9a Support C++14 and remove dependency on future standard 2a
Former-commit-id: 7646a9215be9a10c7610e50f4c59ae1881932307
2020-02-16 19:04:56 -05:00
John Sully 2e4f160e0a Graceful shutdown of server threads when quit is requested
Former-commit-id: ee1d24855eb90eb59da9cddcd7dfeb09c8f57592
2020-02-16 18:53:46 -05:00
John Sully de1baf7306 Virtual dtor for DB base class
Former-commit-id: 953b1cb3a2fec808751d2e7507efe8896f671921
2020-02-16 18:43:36 -05:00
John Sully 2d3d8b71e3 Virtual dtor for DB base class
Former-commit-id: 953b1cb3a2fec808751d2e7507efe8896f671921
2020-02-16 18:43:36 -05:00
John Sully a52d41a611 Fix memory leak in RDB load
Former-commit-id: f9d21017a7a5d078db721ca2705ffed8befcaac4
2020-02-16 18:42:14 -05:00
John Sully d65593f6a0 Fix memory leak in RDB load
Former-commit-id: f0c3959cd90e62c69d10dbc1f5ff38cc8a397cfb
2020-02-16 18:41:50 -05:00
John Sully f4ab585412 Fix memory leak in RDB load
Former-commit-id: a424194f42e61a324489464a0fed14837b8191e4
2020-02-16 18:41:29 -05:00
John Sully ad69834f09 Fix memory leak in RDB load
Former-commit-id: a424194f42e61a324489464a0fed14837b8191e4
2020-02-16 18:41:29 -05:00
John Sully 000b00ad8b Fix leak deserializing expire
Former-commit-id: 1a7e14d8ef96f7849ecdb120f3339b2423ca25d8
2020-02-16 18:40:00 -05:00
John Sully 104b8429ea Fix leak deserializing expire
Former-commit-id: 1a7e14d8ef96f7849ecdb120f3339b2423ca25d8
2020-02-16 18:40:00 -05:00
John Sully ef4f8932ae Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: 770941923d183c0dfed8d5bf8f2299fc4fadf9c6
2020-02-16 18:38:15 -05:00
John Sully 323cf15d94 Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: 770941923d183c0dfed8d5bf8f2299fc4fadf9c6
2020-02-16 18:38:15 -05:00
John Sully 08f1f5c535 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 8456e92d6e446f1cc20d9cea2328998da0a4d7d5
2020-02-16 18:28:45 -05:00
John Sully b49a49983c Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 8456e92d6e446f1cc20d9cea2328998da0a4d7d5
2020-02-16 18:28:45 -05:00
John Sully e3cbd04cf6 Merge branch 'unstable' into redis_6_merge
Former-commit-id: 22aef51551f87dc59ad9a3d04844904986fa807c
2020-02-16 18:18:24 -05:00
John Sully d5e6289845 Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: 7fb842fab5c69280eace2e56f1febfbdae35c7a1
2020-02-16 18:12:11 -05:00
John Sully 4c1b44e92e Memory leak fix on config, and redisDb dtor
Former-commit-id: d150dc7a9a852d9f6f8b0df7444f6a485741739b
2020-02-16 17:08:00 -05:00
John Sully 5771140d67 Add GC shutdown command
Former-commit-id: 28e8f68016b554f3d410502c2af1641368c2bb92
2020-02-16 16:49:04 -05:00
John Sully 78840c9fc2 Add GC shutdown command
Former-commit-id: 28e8f68016b554f3d410502c2af1641368c2bb92
2020-02-16 16:49:04 -05:00
John Sully c46de94df5 Merge branch 'unstable' into keydbpro
Former-commit-id: f3457e2a9a8464bac656b57256316bbddb65d9e9
2020-02-16 04:04:34 -05:00
John Sully efd0b80fc2 Merge branch 'unstable' into keydbpro
Former-commit-id: f3457e2a9a8464bac656b57256316bbddb65d9e9
2020-02-16 04:04:34 -05:00
John Sully b3e68a7c13 Fix memory leak of ReplicaNestState on shutdown
Former-commit-id: 6d71b78cd314135cd280bb31d2dd92391cc27b39
2020-02-16 03:43:29 -05:00
John Sully d8d3f65736 Fix leak when tombstone exists
Former-commit-id: 3d0ccdf6d2ddc523a3532c46cf905023d207b8cb
2020-02-16 03:36:47 -05:00
John Sully d4a28250d0 Fix leak when tombstone exists
Former-commit-id: 3d0ccdf6d2ddc523a3532c46cf905023d207b8cb
2020-02-16 03:36:47 -05:00
John Sully a9a857b127 aeDeleteEventLoop use after free and leak fixes
Former-commit-id: 89e666a3d469288d7c34648772059dd39c9ed092
2020-02-16 03:34:25 -05:00
John Sully 782fd3117e aeDeleteEventLoop use after free and leak fixes
Former-commit-id: 77820e5d50e0426570285a2c740c47b05a7c6c2f
2020-02-16 03:33:45 -05:00
John Sully 93a58fd7ab aeDeleteEventLoop use after free and leak fixes
Former-commit-id: 77820e5d50e0426570285a2c740c47b05a7c6c2f
2020-02-16 03:33:45 -05:00
John Sully 872800f347 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 4bd4159e2d8a7cdd0af9719776dca3e7d161d166
2020-02-11 03:48:24 -05:00
John Sully c077c06a23 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 4bd4159e2d8a7cdd0af9719776dca3e7d161d166
2020-02-11 03:48:24 -05:00
John Sully ac1c88082d Merge branch 'unstable' into redis_6_merge
Former-commit-id: d0a4a55aa9cd64e5a27b3084800a83c6e12f97ff
2020-02-11 03:48:08 -05:00
John Sully d4d6f3ee4a Fix race condition in allocating connections to threads
Former-commit-id: 3f581b513992ec75bb370e9f986b649fcc807d77
2020-02-11 03:44:28 -05:00
John Sully 751f5fa199 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 4091800e499cade8bc188c9e6f52f535c500f282
2020-02-11 02:54:24 -05:00
John Sully 851457a4c1 Merge branch 'redis_6_merge' into keydbpro
Former-commit-id: 4091800e499cade8bc188c9e6f52f535c500f282
2020-02-11 02:54:24 -05:00
John Sully 8297831a9e Merge branch 'unstable' into redis_6_merge
Former-commit-id: 17dc5b554c9a6587a92f7dc9cb8f1dd80447422a
2020-02-11 02:39:08 -05:00
John Sully d1ab769064 Implement an error handler so bug #125 can't happen
Former-commit-id: 21b0d162d66d3a7ed8e7825dd0a70d9ff9c65a98
2020-02-11 01:41:00 -05:00
John Sully dd0932e5d3 Fix higher latency at low load by grouping clients to threads. This fixes slow perf in cluster benchmarks mentioned in issue #102
Former-commit-id: 3a8a5a425a6983e1677f329c6291b21e0b70f350
2020-02-11 01:00:21 -05:00
John Sully a006de84d6 Fix cases where duplicate RREPLAY is applied
Former-commit-id: c92a59006a3baa0f36192bf4e4dd763a475ea336
2020-02-11 00:59:07 -05:00
John Sully 1f421aead6 Fix issue #119
Former-commit-id: 870da155d7aa8b4738eab342dfa369d9ef032c91
2020-02-10 19:52:57 -05:00
John Sully ed099122a4 Fix memory leak in cron
Former-commit-id: 5919483f8347925046f503ccaf94b8bba493a196
2020-02-10 18:26:04 -05:00
John Sully 4e89d280f4 Add missing test file
Former-commit-id: ccec4d9c2ed6be9986818df53d5bd5ce44572b41
2020-02-10 18:15:29 -05:00
John Sully dcddf47c48 CLANG build fix
Former-commit-id: cd4be50e184318ea1f61bfee93330027a98ea61d
2020-02-10 00:29:26 -05:00
John Sully a053fc196e Ensure multi-master works for ring topologies
Former-commit-id: c75229b82ebec8fb883750ead7ba83186c640e78
2020-02-10 00:25:03 -05:00
John Sully 1175091ac5 Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: a453cbc9868a400be2d50b766b770600897244fe
2020-02-09 02:25:20 -05:00
John Sully 172a787f03 Addmissing test file
Former-commit-id: 34aea2c641532dc44f37ace9094d9cb3a78635bc
2020-02-08 16:49:41 -05:00
John Sully bc41cf58e6 Merge branch 'unstable' into keydbpro
Former-commit-id: fec8209c1996112976d927d65dbc2b4492131681
2020-02-07 16:46:13 -05:00
John Sully 8c404b9e6c Merge branch 'unstable' into keydbpro
Former-commit-id: fec8209c1996112976d927d65dbc2b4492131681
2020-02-07 16:46:13 -05:00
John Sully e030476029 merge 5.0 unstable
Former-commit-id: a176c149fa170dcfb4846d8f07734ad80a59a626
2020-02-07 16:45:59 -05:00
John Sully dcf19edcbe Fix issue #137 and #132
Former-commit-id: 55e031372393746beb1c1a10d67d816e5a4e8a89
2020-02-06 23:31:31 -05:00
John Sully d3ca658194 Add test to detect issue #137 and #132
Former-commit-id: a0569106ac57f0ced69ce8667ff7f06172bff141
2020-02-06 23:31:12 -05:00
John Sully 7b24f77d5c module fixes
Former-commit-id: e167bfa4c060393983ec277607757a3dce82c652
2020-02-04 01:22:25 -05:00
John Sully 9ea7b161f5 rename to pro binary
Former-commit-id: a8854bfd83de72d6aa418ee6d9b44fae1f622787
2020-02-04 00:30:13 -05:00
John Sully d88fb1ebd6 rename to pro binary
Former-commit-id: a8854bfd83de72d6aa418ee6d9b44fae1f622787
2020-02-04 00:30:13 -05:00
John Sully 7a9f15733e Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 055eaa99ab918609f4ac6b533da3067e5e32a170
2020-02-03 20:16:20 -05:00
John Sully 9adf145760 Merge branch 'keydbpro' into PRO_RELEASE_6
Former-commit-id: 055eaa99ab918609f4ac6b533da3067e5e32a170
2020-02-03 20:16:20 -05:00
John Sully 72f6912a64 Ensure create-cluster launches pro
Former-commit-id: 8b3773805d2208070e807ede219821c524495c34
2020-02-03 20:15:59 -05:00
John Sully 3a888e4a85 Ensure create-cluster launches pro
Former-commit-id: 8b3773805d2208070e807ede219821c524495c34
2020-02-03 20:15:59 -05:00
John Sully db759ee483 Bump version
Former-commit-id: ac84153f61b213d42ad503ac38948f9740a5f923
2020-02-03 20:01:53 -05:00
John Sully 960d0cfe3e Bump version
Former-commit-id: ac84153f61b213d42ad503ac38948f9740a5f923
2020-02-03 20:01:53 -05:00
John Sully 271e6bf675 Merge branch 'unstable' into keydbpro
Former-commit-id: 0db79c793e30ab268cb0f771928468e477e3b8da
2020-02-03 20:00:16 -05:00
John Sully 1fb4ab60bd Merge branch 'unstable' into keydbpro
Former-commit-id: 0db79c793e30ab268cb0f771928468e477e3b8da
2020-02-03 20:00:16 -05:00
John Sully 078392c79a Fix cluster test failures from Redis 6 merge
Former-commit-id: 761cab753abd66f2ddda3360bf9707d7072ada96
2020-02-03 20:00:09 -05:00
John Sully 003c54d90e Build portable rocksdb binaries
Former-commit-id: e94db969f8ac584b75b2ad015b65c1d0d73d0776
2020-02-03 17:33:15 -05:00
John Sully b45ea6effa Build portable rocksdb binaries
Former-commit-id: e94db969f8ac584b75b2ad015b65c1d0d73d0776
2020-02-03 17:33:15 -05:00
John Sully f28e671b46 Fix failure to save RDB on shutdown
Former-commit-id: 1a8331c88a17deaa5faf34c7ea65957c57530546
2020-02-03 16:00:01 -05:00
John Sully 7ad24969b9 Fix failure to save RDB on shutdown
Former-commit-id: 1a8331c88a17deaa5faf34c7ea65957c57530546
2020-02-03 16:00:01 -05:00
John Sully cc62d52f05 Optimize bgsave snapshotting
Former-commit-id: 15b4bf003537fe6fd926146f46d38203683846be
2020-02-02 23:42:44 -05:00
John Sully 6fd3ccf33e Optimize bgsave snapshotting
Former-commit-id: 15b4bf003537fe6fd926146f46d38203683846be
2020-02-02 23:42:44 -05:00
John Sully 472a97eb13 3 fixes, 0 array access on boot, getAsync is useless on single theaded, and don't print COW info for BG thread work since it will be inaccurate
Former-commit-id: 09362ff44afed8525816437aead84f215eb59c36
2020-02-02 23:30:42 -05:00
John Sully 917e9dec3a 3 fixes, 0 array access on boot, getAsync is useless on single theaded, and don't print COW info for BG thread work since it will be inaccurate
Former-commit-id: 09362ff44afed8525816437aead84f215eb59c36
2020-02-02 23:30:42 -05:00
John Sully 2e059023a9 RDB thread cleanup fixes
Former-commit-id: 3e30cf6de930c40c3a1c63a761b2018836d4ae52
2020-02-02 23:29:20 -05:00
John Sully 94ecf30dfc RDB thread cleanup fixes
Former-commit-id: 3e30cf6de930c40c3a1c63a761b2018836d4ae52
2020-02-02 23:29:20 -05:00
John Sully eb10cd8115 Handle case where src dict is larger in dictMerge
Former-commit-id: c750fdb381f5dd3e92d251a82bd86533eb2cadf5
2020-02-02 23:27:25 -05:00
John Sully 77147804da Handle case where src dict is larger in dictMerge
Former-commit-id: c750fdb381f5dd3e92d251a82bd86533eb2cadf5
2020-02-02 23:27:25 -05:00
John Sully 60ab0ad3f3 endSnapshotAsync implementation (fails tests w/ multithreading)
Former-commit-id: b401e9fcae40cf1d4e4c1584f57e760d9adf36a9
2020-02-01 22:28:24 -05:00
John Sully e10eaadc02 endSnapshotAsync implementation (fails tests w/ multithreading)
Former-commit-id: b401e9fcae40cf1d4e4c1584f57e760d9adf36a9
2020-02-01 22:28:24 -05:00
John Sully 48569b5482 Merge branch 'unstable' into keydbpro
Former-commit-id: 53b36801cede2dbebbf33ec665af69f810b438d5
2020-02-01 21:52:26 -05:00
John Sully 56b8c173a5 Merge branch 'unstable' into keydbpro
Former-commit-id: 53b36801cede2dbebbf33ec665af69f810b438d5
2020-02-01 21:52:26 -05:00
John Sully 7e4eb9869b addRef memory model too restrictive
Former-commit-id: c8bc7799b65e54bdf57d7a80f4ce6a67d3adbb89
2020-02-01 21:52:17 -05:00
John Sully 5516241df8 use dictMerge() in endSnapshot for speed and cleaner code
Former-commit-id: ed8e10234e4499506f2557b0858dba86c30c9dc0
2020-02-01 21:08:26 -05:00
John Sully 18a417bdc6 use dictMerge() in endSnapshot for speed and cleaner code
Former-commit-id: ed8e10234e4499506f2557b0858dba86c30c9dc0
2020-02-01 21:08:26 -05:00
John Sully 6a8a5d93a4 Allow rehashing if RDB thread is active, it doesn't suffer from COW madness
Former-commit-id: 2f1f2eaa9d160701f45eed52fc7903fcccd7656b
2020-02-01 20:28:17 -05:00
John Sully 99ffa068d0 Allow rehashing if RDB thread is active, it doesn't suffer from COW madness
Former-commit-id: 2f1f2eaa9d160701f45eed52fc7903fcccd7656b
2020-02-01 20:28:17 -05:00
John Sully 0a8505df51 Fix spurious error messages trying to join the RDB save thread
Former-commit-id: 775f3477655207a4df2b0b3609f3ee83d41098af
2020-02-01 20:26:09 -05:00
John Sully e4dfd96d59 Fix spurious error messages trying to join the RDB save thread
Former-commit-id: 775f3477655207a4df2b0b3609f3ee83d41098af
2020-02-01 20:26:09 -05:00
John Sully aadd52b823 Add new faster dictionary merging for use by snapshotting code
Former-commit-id: b6f120b3d401c92ef5cf1cc6f5e77da139e33a97
2020-02-01 20:17:40 -05:00
John Sully 909e30cf93 Add new faster dictionary merging for use by snapshotting code
Former-commit-id: b6f120b3d401c92ef5cf1cc6f5e77da139e33a97
2020-02-01 20:17:40 -05:00
John Sully ec92c8a5f9 Increase trial timeout to 2 hours
Former-commit-id: 2614f902e4292c84b9bc473c8d3a5bba9dfdbc2d
2020-01-31 23:35:13 -05:00
John Sully 5c89ab20e2 Increase trial timeout to 2 hours
Former-commit-id: 2614f902e4292c84b9bc473c8d3a5bba9dfdbc2d
2020-01-31 23:35:13 -05:00
John Sully d06d13b661 snapshot optimizations
Former-commit-id: 642f67376a480497554f2891ebfbe7639583c6f1
2020-01-31 17:32:48 -05:00
John Sully b18a941f14 snapshot optimizations
Former-commit-id: 642f67376a480497554f2891ebfbe7639583c6f1
2020-01-31 17:32:48 -05:00
John Sully a94172299b Initialize the storage provider after daemonize
Former-commit-id: 5910af623b024b087c69b17ec32ce351fc4d00c2
2020-01-30 22:26:44 -05:00
John Sully decd4743de Initialize the storage provider after daemonize
Former-commit-id: 5910af623b024b087c69b17ec32ce351fc4d00c2
2020-01-30 22:26:44 -05:00
John Sully 905b69db90 build break non-TLS
Former-commit-id: 72e455b94739625a217a664b61f4a4b7ae98f7f1
2020-01-30 21:19:08 -05:00
John Sully e10187f5b2 build break non-TLS
Former-commit-id: 72e455b94739625a217a664b61f4a4b7ae98f7f1
2020-01-30 21:19:08 -05:00
John Sully 652be9d3e3 Merge branch 'unstable' into keydbpro
Former-commit-id: aca1a6605685811833729d746df85781177d5a78
2020-01-30 21:15:42 -05:00
John Sully 0812f4b77c Merge branch 'unstable' into keydbpro
Former-commit-id: aca1a6605685811833729d746df85781177d5a78
2020-01-30 21:15:42 -05:00
John Sully de22e714c9 RDB memory leaks
Former-commit-id: 487c0693f75e0cf3ed6cdde263b81a8fb6a42084
2020-01-30 17:57:10 -05:00
John Sully debe3079ef replication memory leaks
Former-commit-id: f5e52bb1ae426d29f5dc0af53dca26a3e48f8c7c
2020-01-30 17:56:24 -05:00
John Sully ab4fb38960 Fix memory leak in cron
Former-commit-id: 1f16bbeeee45a3b5d993102d8a86621ae2d350f3
2020-01-30 17:55:48 -05:00
John Sully e904904101 Merge branch 'redis_merge' into unstable
Former-commit-id: 81ca9ed0d64ce4cb6de33eaa23cc845a960b5f1c
2020-01-30 16:05:40 -05:00
John Sully f524c5ad9a Merge branch 'redis_merge' into keydb_pro_merge
Former-commit-id: 2a760ac3b2cf12e45a9db9d0c2efe6efc4dc2aed
2020-01-29 21:30:20 -05:00
John Sully ad4bc5d943 Merge branch 'redis_merge' into keydb_pro_merge
Former-commit-id: 2a760ac3b2cf12e45a9db9d0c2efe6efc4dc2aed
2020-01-29 21:30:20 -05:00
John Sully 3e632d80da TLS Thread Safety fixes
Former-commit-id: e98a5fc108c5448307a8cc38182c79263f01102a
2020-01-29 21:21:47 -05:00
John Sully 476ed25b4c fix leak in cron
Former-commit-id: c1f4e344bdaf21bc74fae6e1b0cb7fc1ce687e62
2020-01-29 19:03:18 -05:00
John Sully 91b61b8d7d Merge branch 'redis_merge' into keydb_pro_merge
Former-commit-id: e4f455a991b468a7abea169e5672d3039a8645f9
2020-01-29 15:57:43 -05:00
John Sully cc44673870 Merge branch 'redis_merge' into keydb_pro_merge
Former-commit-id: e4f455a991b468a7abea169e5672d3039a8645f9
2020-01-29 15:57:43 -05:00
John Sully 7d51657b73 TLS compile fixes
Former-commit-id: 0516809832cf22557592d15f39d64162fcd5083d
2020-01-29 15:57:25 -05:00
John Sully 9889ff22a9 Merge branch 'redis_merge' into keydb_pro_merge
Former-commit-id: e10d9de29059f42193560712991df0950eeef679
2020-01-29 13:43:45 -05:00
John Sully 417c99f963 Merge branch 'redis_merge' into keydb_pro_merge
Former-commit-id: e10d9de29059f42193560712991df0950eeef679
2020-01-29 13:43:45 -05:00
John Sully 6e1aefc675 Fix active rep not merging on sync and add tests
Former-commit-id: fcb77d0431b195553eb1cd563286e5441f0c94cd
2020-01-29 13:26:04 -05:00
John Sully 035ed9712c Merge KeyDB 6
Former-commit-id: 9129b98c12b0da856bbda3eb68b4ddc7530693c9
2020-01-29 12:55:23 -05:00
John Sully ee520d4f7f Merge KeyDB 6
Former-commit-id: 9129b98c12b0da856bbda3eb68b4ddc7530693c9
2020-01-29 12:55:23 -05:00
John Sully 1e465a7ac8 Yet more multithreading fixes
Former-commit-id: 9f23062ebdf389f0c95e1f4ab22c36ca96060e1f
2020-01-28 21:42:55 -05:00
John Sully 4021faa713 failure to post a function is not fatal unless we wrote part of a command (should be impossible)
Former-commit-id: e1c642a033ab0157a66571189e81817cb84fd421
2020-01-28 21:41:56 -05:00
John Sully f5e5c13762 CRON jobs were running half as often as required
Former-commit-id: cc6df8ce9ee6697807a3c1e3d62c0b1a8463f039
2020-01-28 21:40:40 -05:00
John Sully f4ba29a73d CRON jobs were running half as often as required
Former-commit-id: a8f758144b8d79f9816ede3ae86c5c2d5d7d10dd
2020-01-28 21:39:56 -05:00
John Sully f3e2377839 Support C++14 and remove dependency on future standard 2a
Former-commit-id: 7ba1920069821bf369cae40926e0ac82923ad784
2020-01-28 19:06:33 -05:00
John Sully 3a4e936a80 More threading fixes from merge
Former-commit-id: 1542b06ddf6cfd52061a90c2e59b80f455298ffe
2020-01-28 17:54:00 -05:00
John Sully aba9864c16 reenable multithreading after merge
Former-commit-id: e3bde46b8a071327ba4381fad96fe5975cd759c5
2020-01-27 19:59:04 -05:00
John Sully 70fadafd49 cron reliability
Former-commit-id: 325857f684b3f6512a36946271593567244d0470
2020-01-27 18:31:02 -05:00
John Sully fb7e05e4c3 fix expire test failures during overwrite
Former-commit-id: 452e1ee9335801fd85e6b6cedbf2d4fe4abeb8de
2020-01-27 18:26:23 -05:00
John Sully 1bfe7d0804 Fix most tests (still some failures)
Former-commit-id: 5a7b9a3b1e3b6cb8e2aa2b18e96b5c0c13a59c8a
2020-01-27 18:16:19 -05:00
John Sully d815f5e0b5 Merge remote-tracking branch 'redis/6.0' into redis_merge
Former-commit-id: 6c77453720e0451158376df5511ed8c121d47d35
2020-01-27 02:55:48 -05:00
John Sully 60d8d53f7a Missing cron files
Former-commit-id: 2e2dbe83a072873392ce4b3b7fe65efe5b0f6a4d
2020-01-21 19:51:16 -05:00
John Sully bc59c77c7a Initial implementation of the CRON command
Former-commit-id: 252be9ef448c7d702ca30f24df684bffb427b317
2020-01-21 19:50:28 -05:00
John Sully 39bff104c9 Bump version
Former-commit-id: db165cadc280d6e9220ba451701e65bb8ae71b00
2020-01-20 19:20:50 -05:00
John Sully eef595ed2d Fix build break for X64
Former-commit-id: 76590fdce3ccf7bf3124832f6034c31caf7a8269
2020-01-12 01:28:30 -05:00
John Sully 5523e73b64 Fix build break for X64
Former-commit-id: 76590fdce3ccf7bf3124832f6034c31caf7a8269
2020-01-12 01:28:30 -05:00
John Sully bc84e6ca67 Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: 4f39ca139f15a5f585f829937a46a56f20644db0
2020-01-12 01:27:22 -05:00
John Sully b86875766f Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: 4f39ca139f15a5f585f829937a46a56f20644db0
2020-01-12 01:27:22 -05:00
John Sully 3d652e8c09 Fix snapshot consolidation bugs and reduce log noise
Former-commit-id: 7f3cb2981529277d3f02dceb2f60e7aa8385847d
2020-01-12 01:22:44 -05:00
John Sully 423f462c88 Fix snapshot consolidation bugs and reduce log noise
Former-commit-id: 7f3cb2981529277d3f02dceb2f60e7aa8385847d
2020-01-12 01:22:44 -05:00
John Sully 4fbc2c8076 remove debug printfs
Former-commit-id: 3dbd455321e4a2ee47a24662e164eac0e5614965
2020-01-12 01:20:52 -05:00
John Sully 59f32f2e6f remove debug printfs
Former-commit-id: 3dbd455321e4a2ee47a24662e164eac0e5614965
2020-01-12 01:20:52 -05:00
John Sully 2a80007451 Merge branch 'moar_perf' into keydbpro_moarperf
Former-commit-id: d0990a465c3c5c29b71f239d84a875af40699281
2020-01-11 22:06:20 -05:00
John Sully 63c374627a Merge branch 'moar_perf' into keydbpro_moarperf
Former-commit-id: d0990a465c3c5c29b71f239d84a875af40699281
2020-01-11 22:06:20 -05:00
John Sully bbba342da8 Avoid locking as late as possible
Former-commit-id: 0d647af1f0844dc5277ae4bd5992d4380ecffc73
2020-01-11 19:28:13 -05:00
John Sully ba6270c4ee Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: bc4121777f92e1730c11a5f0d735c066697fc79b
2020-01-11 16:35:06 -05:00
John Sully 017468577b Avoid crash due to excessive posted functions for AOF rewrite
Former-commit-id: eb0246382fcd9e4091966f0138aa1f01938ab9a6
2020-01-11 16:34:30 -05:00
John Sully 0e67292d01 Avoid crash due to excessive posted functions for AOF rewrite
Former-commit-id: 777129934e6d4e8f3cc189ad8607283f5b13cf2c
2020-01-11 16:34:09 -05:00
John Sully 71c926ecc0 Merge branch 'unstable' into RELEASE_5
Former-commit-id: dbbd20bcef39a7580afce09969e8112dee8d08fe
2020-01-10 17:46:23 -05:00
John Sully 345e66cc37 Ignore other flags after pro is enabled since we won't understand them
Former-commit-id: 9bbb5fdb3d3e2b40fc9536dde78e380db6867408
2020-01-10 17:46:02 -05:00
John Sully 8c7930daa8 Update README.md
Former-commit-id: 51c522152786d003b26c17f4dcb4c2b73548b559
2020-01-10 14:21:11 -05:00
John Sully d0b2b67836 Update graphs
Former-commit-id: 583dc7ef668d5855c1037800385c52180f96a497
2020-01-10 14:19:44 -05:00
John Sully c99154e3af Merge branch 'unstable' into RELEASE_5
Former-commit-id: 5edbc2b2fc8b051ffb45941a8163f0e34a12ac0b
2020-01-06 14:24:49 -05:00
John Sully 9d17d6a0bb pro launch should respect KEYDB_PRO_DIRECTORY
Former-commit-id: 76c596884c8e291eacf6188fcd839d416b9b3aa8
2020-01-06 14:24:37 -05:00
John Sully 40d52e3611 Add license key lib for aarch64
Former-commit-id: 8b804d91e3dc810b6d8cc585dd3747ba962ead18
2020-01-06 19:16:48 +00:00
John Sully f023696345 Add license key lib for aarch64
Former-commit-id: 8b804d91e3dc810b6d8cc585dd3747ba962ead18
2020-01-06 19:16:48 +00:00
John Sully 76be9ec3d0 Bump version
Former-commit-id: 4770a5f208a417d2a5b31d76bc766941c2059926
2020-01-06 12:07:57 -05:00
John Sully 35e7b88a75 Merge branch 'unstable' into RELEASE_5
Former-commit-id: e2afb5a74459884ad6959cffa8cf07a731db8c07
2020-01-06 12:07:11 -05:00
John Sully 0d5dd27136 Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: 08f9a2bdb34a3370408a35dbb5cb9d5341c63c14
2020-01-06 12:04:00 -05:00
John Sully d530ae0efa Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: 3d63d38aae762c60a22154109827ebfd46aae2a5
2020-01-05 20:19:55 -05:00
John Sully 55b0e44b35 Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: 3d63d38aae762c60a22154109827ebfd46aae2a5
2020-01-05 20:19:55 -05:00
John Sully 0702f54742 Add new flags to example configuration file
Former-commit-id: 752c4854ec62752c2ab5bac23ffc8f0a04451dd1
2020-01-05 20:19:28 -05:00
John Sully bb356920c7 Enforce seperate license keys for connected replicas
Former-commit-id: bc005cb50b1010a2bc9170e261cd93dba849c35f
2020-01-04 17:15:06 -05:00
John Sully 8eec466d49 Enforce seperate license keys for connected replicas
Former-commit-id: bc005cb50b1010a2bc9170e261cd93dba849c35f
2020-01-04 17:15:06 -05:00
John Sully a15c350d08 Additional flash tests
Former-commit-id: 3f9b1a35821cb3a3bf82aabb180c13a9eddf4e93
2020-01-03 17:11:23 -05:00
John Sully 6d12595143 Additional flash tests
Former-commit-id: 3f9b1a35821cb3a3bf82aabb180c13a9eddf4e93
2020-01-03 17:11:23 -05:00
John Sully aeb32b2a66 Fix crash with subkey expire
Former-commit-id: 8e1d416714484ff6ff4242c5d9a24b1458bbfb7b
2020-01-03 17:06:07 -05:00
John Sully b85237fa69 Fix crash with subkey expire
Former-commit-id: 8e1d416714484ff6ff4242c5d9a24b1458bbfb7b
2020-01-03 17:06:07 -05:00
John Sully 2d37625f56 Merge branch 'unstable' into keydbpro
Former-commit-id: 76ddbed0708277443660ffab2a2289e120fe87cd
2020-01-03 16:53:40 -05:00
John Sully f3670fc38b Merge branch 'unstable' into keydbpro
Former-commit-id: 76ddbed0708277443660ffab2a2289e120fe87cd
2020-01-03 16:53:40 -05:00
John Sully e9d599c195 subkey expire testes
Former-commit-id: 47c17c4b66434167ced345c21cdcaecc401b17f2
2020-01-03 16:50:13 -05:00
John Sully c645cbcdc5 Add support for storing expirations in FLASH
Former-commit-id: 1dca07bd564042fce1b01d275641f35b918ae557
2020-01-03 15:53:36 -05:00
John Sully a295d987e2 Add support for storing expirations in FLASH
Former-commit-id: 1dca07bd564042fce1b01d275641f35b918ae557
2020-01-03 15:53:36 -05:00
John Sully 2f322f91ac Drop severity of master disconnect log when multimaster is enabled
Former-commit-id: 315212c426ad3c91466882a4f4f18ec8ddd9c9f3
2020-01-02 15:36:02 -05:00
John Sully e9d1c720fe Fix issue where expire is lost when performing a defrag
Former-commit-id: b2a8287270dc8a15f15cfcbb9267d11ce02553c9
2020-01-01 20:41:17 -05:00
John Sully cf4f8ed3a8 C++ wrapper classes for SDS
Former-commit-id: a649300ed28d4c6954af965b7bb8c65a6e028c23
2020-01-01 19:13:48 -05:00
John Sully 460085a1c0 Fix issue #130 due to fastlock timeout reduction
Former-commit-id: d670d17e926bef53596a194e6bec1b04be3f4005
2020-01-01 11:52:00 -05:00
John Sully cf178e36b6 Merge branch 'unstable' into keydbpro
Former-commit-id: 7ddcbb8ec0c842bd4a79b6e14ebd33616174e793
2019-12-27 18:17:36 -05:00
John Sully b0eae7b9d9 Merge branch 'unstable' into keydbpro
Former-commit-id: 7ddcbb8ec0c842bd4a79b6e14ebd33616174e793
2019-12-27 18:17:36 -05:00
John Sully 61ed2d7204 Fix some static analysis warnings
Former-commit-id: e6969d28863a696e53fd68b70f55a83fd8f0dc02
2019-12-27 18:17:22 -05:00
John Sully 0336682223 Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: b52725163ec6ea128102880be33c43437693cc9e
2019-12-27 17:46:51 -05:00
John Sully d6340577a2 Merge branch 'keydbpro' of https://github.com/JohnSully/KeyDB-Pro into keydbpro
Former-commit-id: b52725163ec6ea128102880be33c43437693cc9e
2019-12-27 17:46:51 -05:00
John Sully 28b7af218e Ignore dependency files
Former-commit-id: f18d973adcf38483400edac85e9258c37aa4e8e5
2019-12-27 17:46:16 -05:00
John Sully 50ea91c06a Ignore dependency files
Former-commit-id: f18d973adcf38483400edac85e9258c37aa4e8e5
2019-12-27 17:46:16 -05:00
John Sully 6722c5880f Ignore dependency files
Former-commit-id: ad0d51cdf102c430d4f35f7cd6eef4f6f0c05b96
2019-12-27 17:45:56 -05:00
John Sully 62ac2d08a4 Merge keydb community
Former-commit-id: b9dcd0997c3dfd3cd2a5908ba540bc4d389104a0
2019-12-27 17:44:48 -05:00
John Sully 63a2b84616 Merge keydb community
Former-commit-id: b9dcd0997c3dfd3cd2a5908ba540bc4d389104a0
2019-12-27 17:44:48 -05:00
John Sully a25a6226fb Make incremental building work with header files
Former-commit-id: 1fb8e73f08d52a38f31d4274943ddae129e9963a
2019-12-27 17:34:41 -05:00
John Sully b7cb9949c5 recommended rocksdb tuning
Former-commit-id: 2a634365f901968f9758d2d362f211b8e0fddc2a
2019-12-24 02:22:47 -05:00
John Sully cf8af9d405 recommended rocksdb tuning
Former-commit-id: 2a634365f901968f9758d2d362f211b8e0fddc2a
2019-12-24 02:22:47 -05:00
John Sully ded345bab6 Track key count accurately before we've committed to the database. Also use this to optimize DB lookups when all keys are in memory
Former-commit-id: 78c07f0276109a085761b7044d4edc63af26d3da
2019-12-24 00:03:38 -05:00
John Sully ed59f30fc0 Track key count accurately before we've committed to the database. Also use this to optimize DB lookups when all keys are in memory
Former-commit-id: 78c07f0276109a085761b7044d4edc63af26d3da
2019-12-24 00:03:38 -05:00
John Sully 5b1e6f0638 Perf remove extra lookup in rocksdb
Former-commit-id: 8074472c7a25572a53f1166911920c2cb168c141
2019-12-23 23:32:04 -05:00
John Sully 582980e753 Perf remove extra lookup in rocksdb
Former-commit-id: 8074472c7a25572a53f1166911920c2cb168c141
2019-12-23 23:32:04 -05:00
John Sully a1d2d9f1d9 More testing
Former-commit-id: 564d94f0653315ce05495a8d83ff8577a365c11b
2019-12-23 22:14:43 -05:00
John Sully 0100dc86ad More testing
Former-commit-id: 564d94f0653315ce05495a8d83ff8577a365c11b
2019-12-23 22:14:43 -05:00
John Sully c618597a46 Fix issue where database size is off when setting key with expire
Former-commit-id: 7796918bfb4a98bc056b3b8f4065f1416da8d89a
2019-12-23 22:07:33 -05:00
John Sully 3020f88e87 Fix issue where database size is off when setting key with expire
Former-commit-id: 7796918bfb4a98bc056b3b8f4065f1416da8d89a
2019-12-23 22:07:33 -05:00
John Sully 668339750d Add missing files
Former-commit-id: 4eadf8f0923ee70ffa3af329a4d636d508bfad8d
2019-12-23 19:07:53 -05:00
John Sully e839ffc3cc Add missing files
Former-commit-id: 4eadf8f0923ee70ffa3af329a4d636d508bfad8d
2019-12-23 19:07:53 -05:00
John Sully d14f8111af Add more test code, and fix bugs uncovered
Former-commit-id: 5362fa4b62f89cbc1e92e01c73a45c4e3718708b
2019-12-23 17:17:41 -05:00
John Sully d8d359ca8e Add more test code, and fix bugs uncovered
Former-commit-id: 5362fa4b62f89cbc1e92e01c73a45c4e3718708b
2019-12-23 17:17:41 -05:00
John Sully 6730f10af7 Key count is innacurate after overwrite
Former-commit-id: 180c5a8e401415cede36548ab8d01f3e4ff8fb7f
2019-12-22 19:41:36 -05:00
John Sully 6edce37d27 Key count is innacurate after overwrite
Former-commit-id: 180c5a8e401415cede36548ab8d01f3e4ff8fb7f
2019-12-22 19:41:36 -05:00
John Sully c7097327cb Add additional tests
Former-commit-id: e7d2c78e776b8262fd54caeb7b6bd210182e9bdb
2019-12-22 19:16:30 -05:00
John Sully 78cca4565c Add additional tests
Former-commit-id: e7d2c78e776b8262fd54caeb7b6bd210182e9bdb
2019-12-22 19:16:30 -05:00
John Sully 1dd79343c0 Fix FLASH eviction issue, the algo relies on correct key count
Former-commit-id: dc260a7f44fe197b9b0022d044d559be88bf91be
2019-12-22 18:38:10 -05:00
John Sully 11785d42e6 Fix FLASH eviction issue, the algo relies on correct key count
Former-commit-id: dc260a7f44fe197b9b0022d044d559be88bf91be
2019-12-22 18:38:10 -05:00
John Sully c28fa2f034 Optimization fails because dbAdd() will ensure the key
Former-commit-id: 1448b555c49fb5ba4a573a97681f7843ba02141f
2019-12-22 17:49:54 -05:00
John Sully acc7c35e71 Optimization fails because dbAdd() will ensure the key
Former-commit-id: 1448b555c49fb5ba4a573a97681f7843ba02141f
2019-12-22 17:49:54 -05:00
John Sully a64337e2d4 Merge remote-tracking branch 'nonfree/tests' into keydbpro
Former-commit-id: 180b059c05290aa403197bca819ec092c5ab326d
2019-12-22 17:31:05 -05:00
John Sully aec58edc35 Merge remote-tracking branch 'nonfree/tests' into keydbpro
Former-commit-id: 180b059c05290aa403197bca819ec092c5ab326d
2019-12-22 17:31:05 -05:00
John Sully e602ce7148 Fix issue where DELETE always returns 1 when using FLASH
Former-commit-id: 0574db59fdc740255388ae77d2ece8622898bb49
2019-12-22 17:30:15 -05:00
John Sully 2b2cc9124a Fix issue where DELETE always returns 1 when using FLASH
Former-commit-id: 0574db59fdc740255388ae77d2ece8622898bb49
2019-12-22 17:30:15 -05:00
John Sully f2a6017dff Multimaster requires Active Replication
Former-commit-id: 4dae1391b802521cb72bb945deece9046e50c667
2019-12-21 18:24:02 -05:00
Petr Vaněk 490db098b6 Rename redis.conf to keydb.conf
Former-commit-id: 22632f5f20284bbb19234056135aacc418de3035
2019-12-21 15:00:24 -05:00
Petr Vaněk 9736adde7f Rename default pid file
Former-commit-id: 7ba779c4cd80a7b32181d2a3b3e6cba95bf9c075
2019-12-21 15:00:24 -05:00
John Sully ab1e075297 Only override maxmemory settings if everything is default
Former-commit-id: 9fb240d49c61f5a69124a17cfc769095cadd3d98
2019-12-20 18:19:24 -05:00
John Sully 12ac880e82 Only override maxmemory settings if everything is default
Former-commit-id: 9fb240d49c61f5a69124a17cfc769095cadd3d98
2019-12-20 18:19:24 -05:00
John Sully 40637e12e9 Evicted flash no longer keeps the key around
Former-commit-id: 908b303d1a8dd032c092f0bc035361a09c0291a5
2019-12-20 17:45:07 -05:00
John Sully 7fbcf8a2e6 Evicted flash no longer keeps the key around
Former-commit-id: 908b303d1a8dd032c092f0bc035361a09c0291a5
2019-12-20 17:45:07 -05:00
John Sully d60bedff92 FLASH storage no longer keeps evicted keys in memory
Former-commit-id: 65c2b47c895d57231bbd3f451ecf1f6d9871f5f7
2019-12-19 17:30:31 -05:00
John Sully 8604bc7dbc FLASH storage no longer keeps evicted keys in memory
Former-commit-id: 65c2b47c895d57231bbd3f451ecf1f6d9871f5f7
2019-12-19 17:30:31 -05:00
John Sully 083845cf9c tests should use the new binary name
Former-commit-id: b4ee3c4ea57041d7c87ec228994ff5397bb6139f
2019-12-19 17:13:51 -05:00
John Sully 27e79af326 tests should use the new binary name
Former-commit-id: b4ee3c4ea57041d7c87ec228994ff5397bb6139f
2019-12-19 17:13:51 -05:00
John Sully b976be741d Fix crash when using rocksdb and jemalloc but scope it to just jemalloc
Former-commit-id: 6fa0cfd35fd1158f190db27bfb734ea2f763cb20
2019-12-19 15:44:09 -05:00
John Sully a6d5b0c6d1 Fix crash when using rocksdb and jemalloc but scope it to just jemalloc
Former-commit-id: 6fa0cfd35fd1158f190db27bfb734ea2f763cb20
2019-12-19 15:44:09 -05:00
John Sully 7604af108f add missing file
Former-commit-id: 24e85bc84f58bbfbef973eab64017a08e3f34d7d
2019-12-18 13:38:59 -05:00
John Sully bb9c3b2525 add missing file
Former-commit-id: 24e85bc84f58bbfbef973eab64017a08e3f34d7d
2019-12-18 13:38:59 -05:00
benschermel 4882b1de4e adding flash test
Former-commit-id: 879b17c053695ee09562e2ec320e269141e31fdb
2019-12-18 00:47:08 -05:00
benschermel d7a8e4bce2 adding flash test
Former-commit-id: 879b17c053695ee09562e2ec320e269141e31fdb
2019-12-18 00:47:08 -05:00
benschermel 52f80fd27e adding flash test
Former-commit-id: 8c0f0bd1b5c83027e64765f9942f284bdb8ebcb4
2019-12-18 00:24:07 -05:00
benschermel 90016d51cb adding flash test
Former-commit-id: 8c0f0bd1b5c83027e64765f9942f284bdb8ebcb4
2019-12-18 00:24:07 -05:00
John Sully 97cc5473db Implement subkey expires for sorted sets
Former-commit-id: 99a651ebc0a6c8347e363f88d01ba9a2a60d72b8
2019-12-18 00:10:05 -05:00
John Sully e8f1a0f7b5 Implement subkey expire for hashes
Former-commit-id: 0df57b1a599bb36188307259fadccf6f62c6a81a
2019-12-18 00:04:48 -05:00
John Sully b1137c0fc2 Launch the pro binary with --enable-pro
Former-commit-id: 0ff9e3683b5de8545a0a76715985c452d6033d8f
2019-12-17 23:52:19 -05:00
John Sully 2c78c504ae rename binary to keydb-pro-server
Former-commit-id: 717dd64fe33b997e8d05ca9ebfb598dbe1605990
2019-12-17 23:43:14 -05:00
John Sully 9a9a4643dd rename binary to keydb-pro-server
Former-commit-id: 717dd64fe33b997e8d05ca9ebfb598dbe1605990
2019-12-17 23:43:14 -05:00
John Sully 77d878cf67 Ignore enable-pro with no license key. makes it easier to launch a demo from the open source version
Former-commit-id: 31ab6bcd6f39f0a4a9e50a5af613b293eecfb4c2
2019-12-17 23:40:59 -05:00
John Sully d104465d84 Ignore enable-pro with no license key. makes it easier to launch a demo from the open source version
Former-commit-id: 31ab6bcd6f39f0a4a9e50a5af613b293eecfb4c2
2019-12-17 23:40:59 -05:00
John Sully 5ff2943b66 Implement license key checks
Former-commit-id: 62ed5b2956aebe70ef8cf758888098e1f4bb530b
2019-12-17 23:35:14 -05:00
John Sully 348ebea0d5 Implement license key checks
Former-commit-id: 62ed5b2956aebe70ef8cf758888098e1f4bb530b
2019-12-17 23:35:14 -05:00
John Sully f27b84b67c Implement pro badge and trial timeout
Former-commit-id: 9d6a284eb45c8a137c7f59645294b4fa4be389e5
2019-12-17 20:32:53 -05:00
John Sully f0cdad2c19 Implement pro badge and trial timeout
Former-commit-id: 9d6a284eb45c8a137c7f59645294b4fa4be389e5
2019-12-17 20:32:53 -05:00
John Sully 576f358078 Merge branch 'unstable' into advanced_db
Former-commit-id: 1f9cb22fd370741c2f60517376af5008c25704f5
2019-12-17 19:00:02 -05:00
John Sully 45feae74c0 Merge branch 'unstable' into advanced_db
Former-commit-id: 1f9cb22fd370741c2f60517376af5008c25704f5
2019-12-17 19:00:02 -05:00
John Sully 2c3d96dda8 Fix type in makefile
Former-commit-id: e4ecea416a0750cc23d23ff5587950123fe19073
2019-12-17 18:23:19 -05:00
John Sully 17e5f75e1e Enusre CXXFLAGS has the same settings as CFLAGS
Former-commit-id: 1a03e6c3e82198af6f0f2cf00b7b43fc65ff36cf
2019-12-17 17:49:51 -05:00
Petr Vaněk dbd86c4c27 Correct C++ related makefile variables
FINAL_CXXFLAGS should not inherit CFLAGS because they can contain C
specific options unsupported by C++.

REDIS_CXX should point to the C++ compiler rather than C.


Former-commit-id: 76daee5b310ea7eade65d7550a6e0cb2c89f82e0
2019-12-17 17:43:15 -05:00
John Sully dc82ff4139 Perf fixes for expire snapshots
Former-commit-id: da805e4442815c89e85ca7b9fc855dd11ef2a6c8
2019-12-17 17:39:04 -05:00
John Sully 7fb96a349c Perf fixes for expire snapshots
Former-commit-id: da805e4442815c89e85ca7b9fc855dd11ef2a6c8
2019-12-17 17:39:04 -05:00
John Sully aff0d270e1 Threading fixes
Former-commit-id: 4f1cec6abd72d6e215880f2ce7812e88509cd218
2019-12-16 22:08:18 -05:00
John Sully 6acd0680d7 Threading fixes
Former-commit-id: 4f1cec6abd72d6e215880f2ce7812e88509cd218
2019-12-16 22:08:18 -05:00
John Sully 7877c12732 complete snapshot handling of expires, may still be perf issues
Former-commit-id: 7c6cf4ba4696ba8a7b4069491e8ad0a583958bdc
2019-12-16 22:07:53 -05:00
John Sully f1b7575719 complete snapshot handling of expires, may still be perf issues
Former-commit-id: 7c6cf4ba4696ba8a7b4069491e8ad0a583958bdc
2019-12-16 22:07:53 -05:00
John Sully 09e774ebbd snapshots no longer have dangling keys in the expire set
Former-commit-id: 939b6b61084fbec7b7bd0ada49f6853e334f87dd
2019-12-16 21:14:16 -05:00
John Sully 6d41d774ba snapshots no longer have dangling keys in the expire set
Former-commit-id: 939b6b61084fbec7b7bd0ada49f6853e334f87dd
2019-12-16 21:14:16 -05:00
John Sully 709825a5d9 SDS refcounted type
Former-commit-id: 361d0308febd5da0c7291469ea7e922e7147c1d6
2019-12-16 20:16:51 -05:00
John Sully 6fca46cb02 SDS refcounted type
Former-commit-id: 361d0308febd5da0c7291469ea7e922e7147c1d6
2019-12-16 20:16:51 -05:00
John Sully 080b023e3d Extra expire validation on save
Former-commit-id: 037290cd2ec1b237df5236a86915d63d53fb48ce
2019-12-16 20:16:07 -05:00
John Sully 2ab9bbc36a Extra expire validation on save
Former-commit-id: 037290cd2ec1b237df5236a86915d63d53fb48ce
2019-12-16 20:16:07 -05:00
John Sully 06b93999a4 Merge the expire datastructs on endsnapshot
Former-commit-id: 968681ac37d1505a7b38628425f60e08b2cd41c4
2019-12-16 20:13:19 -05:00
John Sully 14197490b0 Merge the expire datastructs on endsnapshot
Former-commit-id: 968681ac37d1505a7b38628425f60e08b2cd41c4
2019-12-16 20:13:19 -05:00
John Sully aea9d6beb9 We shouldn't define libc functions...
Former-commit-id: 9da8b7e25b8f423dc0efa54f49307c425eeabc55
2019-12-16 20:11:01 -05:00
John Sully 6737e10f31 We shouldn't define libc functions...
Former-commit-id: 9da8b7e25b8f423dc0efa54f49307c425eeabc55
2019-12-16 20:11:01 -05:00
John Sully b1622e7558 Expireset should do a deep hash
Former-commit-id: cdcdf57dd1419ec09eab6579caf5e5ff9a5a242c
2019-12-16 19:06:07 -05:00
John Sully 0655825ea7 Expireset should do a deep hash
Former-commit-id: cdcdf57dd1419ec09eab6579caf5e5ff9a5a242c
2019-12-16 19:06:07 -05:00
John Sully 62c0d244c2 The mitigation was bogus, fix it so it works
Former-commit-id: c7f1e069bf7e7b6f5321f920af9a0ed80f3853b0
2019-12-16 18:40:55 -05:00
John Sully 42c1b90961 The mitigation was bogus, fix it so it works
Former-commit-id: c7f1e069bf7e7b6f5321f920af9a0ed80f3853b0
2019-12-16 18:40:55 -05:00
John Sully bdb97984bb IStorage related build issues
Former-commit-id: 45bc344bfe678a633a005506a690e86ddf2efd5f
2019-12-16 18:32:30 -05:00
John Sully fd079de3e8 IStorage related build issues
Former-commit-id: 45bc344bfe678a633a005506a690e86ddf2efd5f
2019-12-16 18:32:30 -05:00
Petr Vaněk 02c190c827 readme: fix typo
Former-commit-id: 9cc1137e35e4dca0790c27857f59737792caf815
2019-12-16 15:40:09 -05:00
John Sully 77e89a555a Try harder to free memory
Former-commit-id: 48f7c34c91c51ef06d9a1f4e8bc5f1f5cd88cfaa
2019-12-14 19:46:39 -05:00
John Sully 1b922dbc51 Try harder to free memory
Former-commit-id: 48f7c34c91c51ef06d9a1f4e8bc5f1f5cd88cfaa
2019-12-14 19:46:39 -05:00
John Sully dfb39344dc A bunch of bug fixes
Former-commit-id: 228339586a19874f869cf45dc3834a270f99768a
2019-12-10 01:01:45 -05:00
John Sully 6e026711f9 A bunch of bug fixes
Former-commit-id: 228339586a19874f869cf45dc3834a270f99768a
2019-12-10 01:01:45 -05:00
John Sully 93a3929918 Make the storage provider configurable, and show it in the info command
Former-commit-id: e201ce622ff3c7832d03c6b5759386f0efc23cdf
2019-12-09 21:07:37 -05:00
John Sully f6616bf89e Make the storage provider configurable, and show it in the info command
Former-commit-id: e201ce622ff3c7832d03c6b5759386f0efc23cdf
2019-12-09 21:07:37 -05:00
John Sully 645b94ba0c Add support for multiple databases with rocksdb
Former-commit-id: cfa3b760b00776876134692d42e25a60fcd8dea9
2019-12-09 20:45:58 -05:00
John Sully e9b2c28e1f Add support for multiple databases with rocksdb
Former-commit-id: cfa3b760b00776876134692d42e25a60fcd8dea9
2019-12-09 20:45:58 -05:00
Tais P. Hansen c5ea4d8def Fix keydb-cli crashing on read-only filesystem
Former-commit-id: 7fda84f7f03ebb8b78515ec8416357bf4c597336
2019-12-09 14:23:10 -05:00
John Sully 86419a30e7 Flash running well
Former-commit-id: 9cf393eb9fb69bcc7550cd8b83e1568b3f360310
2019-12-08 20:06:22 -05:00
John Sully f90fc5ed63 Flash running well
Former-commit-id: 9cf393eb9fb69bcc7550cd8b83e1568b3f360310
2019-12-08 20:06:22 -05:00
John Sully 35187dafb1 modify how the database array is stored so swaps are easier
Former-commit-id: 48fd6ec5ca69dd505d0e757862c09a898c19cf22
2019-12-08 16:49:59 -05:00
John Sully 869a09bcca modify how the database array is stored so swaps are easier
Former-commit-id: 48fd6ec5ca69dd505d0e757862c09a898c19cf22
2019-12-08 16:49:59 -05:00
John Sully 5fc1dffd0f Prevent extra copy of key
Former-commit-id: 9c3ef97039e59c6b820f71a90f8a9fb4eae8a7b1
2019-12-08 16:02:24 -05:00
John Sully b2db7e7887 Prevent extra copy of key
Former-commit-id: 9c3ef97039e59c6b820f71a90f8a9fb4eae8a7b1
2019-12-08 16:02:24 -05:00
John Sully b0419d1b2b Optimize remote storage by bulk saving keys after processing operations but before sending responses to clients
Former-commit-id: 63a6dc2a29680d5d3f3f245168ca7de5d6bee1eb
2019-12-08 10:56:05 -05:00
John Sully 253d480bb5 Optimize remote storage by bulk saving keys after processing operations but before sending responses to clients
Former-commit-id: 63a6dc2a29680d5d3f3f245168ca7de5d6bee1eb
2019-12-08 10:56:05 -05:00
John Sully c4e132a721 Initial RocksDB integration
Former-commit-id: 0de9e5b692c02e779e538ddd0a56d10215e501bb
2019-12-06 20:39:32 -05:00
John Sully 18277ba293 Initial RocksDB integration
Former-commit-id: 0de9e5b692c02e779e538ddd0a56d10215e501bb
2019-12-06 20:39:32 -05:00
John Sully 6ba6a24b0a Fixup IStorage uses
Former-commit-id: 5ea0ce143a79365fb3903c6fc7caeb1c9760b0cc
2019-12-06 17:43:28 -05:00
John Sully 40ac1ce547 Fixup IStorage uses
Former-commit-id: 5ea0ce143a79365fb3903c6fc7caeb1c9760b0cc
2019-12-06 17:43:28 -05:00
John Sully 9404391ed2 Initial standup of RocksDB dependency
Former-commit-id: 19bb40ffdc794cf9cafa9f4132a0facf1e074101
2019-12-06 17:33:18 -05:00
John Sully 0fa1f3211a Initial standup of RocksDB dependency
Former-commit-id: 19bb40ffdc794cf9cafa9f4132a0facf1e074101
2019-12-06 17:33:18 -05:00
John Sully 762ef3b584 Fix warning
Former-commit-id: 1d5ae423e039de437e8e48b5d15eb9908846bf04
2019-12-01 20:28:21 -05:00
John Sully 7a806fd610 Fix Issue #107
Former-commit-id: c6bc8d03091c6d66d91d5f9fb390da7119f1b684
2019-12-01 18:17:33 -05:00
John Sully 99c2ae46b9 Merge branch 'unstable' into advanced_db
Former-commit-id: d1ae8f2d1b03c0a79a36d710e4bb6594c37028b4
2019-11-30 00:52:33 -05:00
John Sully 7125ba7397 Fix deadlock in spinlock (mfence) also spin for less time before sleeping
Former-commit-id: 15375a1b499cb728bf2f91ce497e877fe054247c
2019-11-30 00:51:58 -05:00
John Sully e68e9ff76a It is permissible to call dictFind() while iterating
Former-commit-id: 43a598c145d5ea9f2c0b2a16f93f5a8cbb724e7e
2019-11-30 00:03:34 -05:00
John Sully 1afae448a6 Reduce snapshot window to 1 second instead of 10
Former-commit-id: 4f91f0503fe4eea1c20b977a5858ac345c3e7b9b
2019-11-29 22:21:49 -05:00
John Sully ea0211ec31 Bug: only update global flags for sync save
Former-commit-id: f01a7cf59bf965b35e5bb23e3ecbb7265ef8942a
2019-11-29 22:21:17 -05:00
John Sully c83c76b7b3 rehash MS does too little work before checking the time
Former-commit-id: 3e57b5c961f7dd91ddb24331eba9a3fa39b08fdd
2019-11-29 15:18:37 -05:00
John Sully 6c58f58ad3 Nested snapshot garbage collection. Works but huge fragmentation
Former-commit-id: 82b2a3f3dbf8f864d9157655b5422c69845c4019
2019-11-28 19:00:51 -05:00
John Sully 7f9ba0356e Fastlock should yield in ARM
Former-commit-id: 89fa34f5724462b3375cbcba04babd7bff1ee526
2019-11-28 14:26:43 -05:00
John Sully fcdebf8448 Ensure size() count is accurate, and fix find_threadsafe which didn't check children
Former-commit-id: ffa44b636afd4fe907c79fe7deebac3d1e091ee9
2019-11-25 17:50:40 -05:00
John Sully 9088942081 Move snapshot code into its own file
Former-commit-id: 4afd0a6ce650cc93a73ea3e4bb632226087dde37
2019-11-24 17:59:02 -05:00
John Sully 88aaf6feee Restrict the snapshot API
Former-commit-id: cbafb88f267a9480cdbde6a88e9e1992e8a85971
2019-11-24 17:53:06 -05:00
John Sully 893937fdab Get rid of key only iterate, the threadsafe is just as fast and key only users can ignore the robj
Former-commit-id: 29689a5ed6141c5b2019d41ccd4036e6ddd1a121
2019-11-24 15:45:17 -05:00
John Sully d20be920b6 Fix crash on shutdown
Former-commit-id: 6dc55cc0f838b3c82afb233985429b4e7fc5dfb1
2019-11-24 14:24:41 -05:00
John Sully 39244d9038 Fix multithreading data races
Former-commit-id: 80f6e5818fd575cb08a5f620c35eed1cd862eb57
2019-11-24 13:44:43 -05:00
John Sully 69b7399ab3 Fix warning
Former-commit-id: 1318b87013c61f7149127eae8e30caf887a6db7b
2019-11-23 19:19:54 -05:00
John Sully 94bd7d3322 Add support for nesting snapshots
Former-commit-id: 5e6c37f388233cc3f2d204ad17ac2897d3333a21
2019-11-23 19:02:50 -05:00
John Sully 72f675af9e Remove pending async writes if we're freeing the client
Former-commit-id: 8b5caad51136f1ed29a9e4c01ed984f6e7ff9c4c
2019-11-23 19:01:40 -05:00
John Sully 5effaeceb2 Add support for removing pending writes for clients we're about to free
Former-commit-id: 67c1fd322e1a12b1b22707d67713d60c97c34cef
2019-11-23 19:00:27 -05:00
John Sully 39449e6cb6 Add support for nested snapshots
Former-commit-id: 43456c7807152062d59b2a90597b6204f637f5cd
2019-11-22 20:53:36 -05:00
John Sully 3f33731174 Fix crash when client running async keys disconnects before keys finishes
Former-commit-id: dd9233c49d82c89a9d92b7251a56f91c2ee98e77
2019-11-21 20:40:58 -05:00
John Sully b0b236b94a Merge branch 'unstable' into advanced_db
Former-commit-id: 00ad497fb3f409dbfcaa62fa9ea5d793263eb13d
2019-11-21 20:21:48 -05:00
John Sully b4c90f3e99 Bump version
Former-commit-id: fae34bda5543b8aa20d8c91d5b7c1dea229c74c0
2019-11-21 20:16:42 -05:00
John Sully a72e46a4da Merge branch 'unstable' into RELEASE_5
Former-commit-id: da5e975eff2822e65c2f7c8bb76a5ee835b2c1ab
2019-11-21 20:16:23 -05:00
John Sully 5d08ff5ed4 Fix issue #83
Former-commit-id: 1fb6bea2799187e71e8a1a545b2ff5cc6a35ecd4
2019-11-21 20:05:16 -05:00
John Sully 627631dc55 Add missing dependency to dockerfile
Former-commit-id: 1f1a053ccbb05e5c0a767aef15535bd03b030616
2019-11-20 20:35:14 -05:00
John Sully a9d2453710 Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: a3180dfb7ea5a4776ebffcfcc121b8b1328f37bd
2019-11-20 19:44:43 -05:00
John Sully cff0abf580 Fix issue #107, active replicas do their own expires
Former-commit-id: f6af4196efcebb1bdf8e7bfb2625b97158aed993
2019-11-20 19:44:31 -05:00
John Sully aab294ccec Additional asserts ensuring the client is creating on the correct thread
Former-commit-id: efa150b4c8bd1d68225414975fa0560290cb11e4
2019-11-20 17:00:40 -05:00
John Sully c33670455e Update issue templates
Former-commit-id: 9bd5e872362762a1e09d22c83e9dd5420c837bc3
2019-11-20 16:25:33 -05:00
John Sully 0aabc6ebdb Update issue templates
Former-commit-id: e07f9be79b49a9f09122b62d9ca56b5deef290ad
2019-11-20 16:24:23 -05:00
John Sully dff4a45e15 Add missing files
Former-commit-id: 8fa2951e21c5c75a0bb4dc3ef50891123166b76a
2019-11-19 23:03:20 -05:00
John Sully 1fbe8ecad3 Clarify license
Former-commit-id: d0a7f219cd56edbe70bd8e93f21b39e6cd4836e2
2019-11-19 22:22:16 -05:00
John Sully 45794f4155 Run KEYS async
Former-commit-id: 214a54a815ff66ef4a1526da90296787240ecdf9
2019-11-19 22:12:52 -05:00
John Sully 7128c59083 Multiple threads should be able to get the same snapshot provided its not too old
Former-commit-id: 054331098ee18dfb1887fd2b0a67688ef894823e
2019-11-19 17:40:35 -05:00
John Sully 8f802a904a Ensure iterating the keyspace still works during background save
Former-commit-id: 23d7a8a293f253262801bc6ce88ad85e4e38f59a
2019-11-19 15:47:06 -05:00
John Sully 69930b8e48 Final design of forkless background save. expires NYI
Former-commit-id: e2dc24b441bf52b181c820c853e0bc7524254f3f
2019-11-18 19:47:12 -05:00
John Sully bfe21158ab Merge branch 'unstable' into advanced_db
Former-commit-id: 7530d93cd5c4a9fc4e6466abcf96edbdd8daea9e
2019-11-18 15:22:17 -05:00
John Sully f735307b8b Fix failure to wakeup from futex sleep due to fastlock_unlock reading the wrong offset in the asm version. Also fix false sharing in spinlock
Former-commit-id: 4af05e19146f4fba494512240c069dff7d9dafbe
2019-11-17 16:06:49 -05:00
John Sully 4af3901590 Revert "Debug sleep should apply to all threads"
This reverts commit 9ee2be0f86 [formerly 81dc38b3f3903855c66fab4ee895aa41f0217eb8].


Former-commit-id: eba116efee3f01ac6068496a86d91f14b9b28b9c
2019-11-17 15:39:47 -05:00
John Sully 44c8c01d66 Improve perf of reading cluster bitfield
Former-commit-id: b9f712c3fd1d1cd6fe4ca6d58cc4dba40e6b6c95
2019-11-17 14:52:12 -05:00
John Sully 0b0f377538 Merge branch 'unstable' of https://github.com/JohnSully/KeyDB into unstable
Former-commit-id: 71b3ff6f37b34a4865b1a4bbee52758241a10e3b
2019-11-14 21:21:46 -05:00
John Sully 520a1d64ec Cluster multithreading fixes
Former-commit-id: 1baf8fd5c9f8bde73728d831897c4749402fe712
2019-11-14 20:14:24 -05:00
John Sully 9ee2be0f86 Debug sleep should apply to all threads
Former-commit-id: 81dc38b3f3903855c66fab4ee895aa41f0217eb8
2019-11-14 19:57:29 -05:00
John Sully f4b4055980 killing clients should take effect ASAP
Former-commit-id: 3add051cefea27174af7cf031b9592f91a258ea1
2019-11-14 19:49:32 -05:00
John Sully b70a709b5c Improve AE Assert message
Former-commit-id: d0cd1804d173b846fb6bd5f8adfa6681ec5a8f17
2019-11-14 19:34:13 -05:00
John Sully 3b5a55cc66 Fix test failure with tcl8.5 (test only issue)
Former-commit-id: 15641a5070c2958a807c748cf7958e5627ada5c5
2019-11-04 17:31:29 -08:00
John Sully 6d06409ff2 Fix potential race in pubsub
Former-commit-id: 16c7c4a9f8eb1e28c61a2a836513e891a1c0c58d
2019-10-25 02:50:30 -04:00
John Sully 9dcab07b4a Fix potential race in pubsub
Former-commit-id: f68f521d8734b9d2e725ccd9f9414f893dd69c81
2019-10-25 02:44:14 -04:00
John Sully eb0618f9b6 bump version
Former-commit-id: 4315b22b22c5642829429f28a7521acbeca5765f
2019-10-25 01:00:28 -04:00
John Sully 5224419f15 Merge branch 'unstable' into RELEASE_5
Former-commit-id: 231c73a2f282c60d8df288eafcbc929fa9486a01
2019-10-24 23:39:18 -04:00
John Sully 40b7857176 Signals can happen on any thread, so look for the signal handler not the command on the callstack
Former-commit-id: 84c4b017ab720e9044af76882ec992f2c1cd19c0
2019-10-24 23:30:08 -04:00
John Sully aaef04e26d Two fixes: 1) Remove race conditions by not locking clients when async writing. 2) Don't derefence dangling pointers in lambda
Former-commit-id: ce3fcc50e89e74e617dedc07f3d21a0bdf98f75b
2019-10-24 23:07:02 -04:00
John Sully 5baf63a5f1 Sanitizers work with GCC too
Former-commit-id: 3a056f53e9c65df23c56bf11c0396d4f76573830
2019-10-24 23:05:39 -04:00
John Sully f1760c9f0a Remove the DB lock, its unnecessary
Former-commit-id: 066976fe4eef644421dd584246ab56442cd58d36
2019-10-24 20:18:48 -04:00
John Sully 3301cf8cde Remove unlocked KEYS command support, we will do this with snapshotting
Former-commit-id: 3c057f15734380aa1f468788e3e5a92dcdca2009
2019-10-24 20:18:11 -04:00
John Sully 08c04932e0 Build break, ensure C99 compatibility
Former-commit-id: c45063b30d09476ffa3ae0fa9cf0b3f38d44d09c
2019-10-23 13:38:07 -04:00
John Sully 2055bae986 Fix build break in TravisCI
Former-commit-id: aff7fffd2839c3578a6831dd54b0a511d3fefbe4
2019-10-23 13:31:39 -04:00
John Sully 3299e22e76 If a replica is about to be closed, don't wait on its lock (potential deadlock)
Former-commit-id: c39a751453dcc5a3dc5f829a85a4605e1feee203
2019-10-23 13:20:23 -04:00
John Sully 01b344e692 processEventsWhileBlocked needs to release the lock in a safe way
Former-commit-id: 4aaf236bb357e87657ccbb418e5de7229962cc46
2019-10-23 13:19:57 -04:00
John Sully 880a74a499 Remove race conditions
Former-commit-id: 01e0a2d5b43cd403f17afcddb95664921ead1ed6
2019-10-22 23:26:37 -04:00
John Sully a59a0d1d2a Optimize deadlock detection, fix callstack for ASM, and annotate locks
Note: This change moves our assembly code to use the GNU Assembler because NASM seems to be incapable of emitting the necessary debug information for callstack unwinding to work.

Former-commit-id: dca2c55128264a469c59652a1e9a30b8f6373b91
2019-10-22 21:34:51 -04:00
John Sully a5c9221034 Implement deadlock detection
Former-commit-id: b89f6c45e228e27b7f2b5cb055d7e1d768dcd904
2019-10-22 00:43:32 -04:00
John Sully 6cdcc880be Disable multithreaded KEYS due to bugs
Former-commit-id: 69eb966d849340187c3e1388865da5726e614328
2019-10-21 12:21:46 -04:00
John Sully 4daabdfa46 Remove performance zapping test code
Former-commit-id: e63916cf7fe5ea80725ac5e961a069e40f1efac9
2019-10-21 01:48:58 -04:00
John Sully a4323b828b reenable optimized string dup code
Former-commit-id: 11567781d6470bfc385173addc3fa9807e0345d5
2019-10-21 00:08:38 -04:00
John Sully faf7f597e2 Forkless background save. NOT OPTIMIZED
Former-commit-id: 5d1547b128e14973a8bcac2d719d4b8473fa0132
2019-10-20 23:54:05 -04:00
John Sully 931efd3bf8 Factor out dependencies on rdb_child_pid which will be going away
Former-commit-id: 1cdcf666724e14f2b876e1bf69c618f8f583a8a1
2019-10-17 23:10:45 -04:00
John Sully d723cceaf3 Dependencies for forkless RDB saving
Former-commit-id: 202ce77fea75a47aeb92c51a0c603f49803df0c0
2019-10-17 22:53:50 -04:00
John Sully cb4b144981 Ensure RDB saving only uses data from the persistent data struct, and cleanup inheritance
Former-commit-id: 57f8c61ddcc26c64c49a952d619b48ff1e02e5c6
2019-10-17 17:20:47 -04:00
John Sully c2e1af89a9 Support serializing all types
Former-commit-id: ab2d487dfdc91bbd1f4cf7072a129d1dd46ff64f
2019-10-16 14:23:28 -04:00
John Sully 07464f7161 Cleanup inheritance
Former-commit-id: eb5b1fd4ac657f5049aa70e951e0d9ed7b08712e
2019-10-16 13:45:36 -04:00
John Sully dda9ba6a24 Merge branch 'unstable' into advanced_db
Former-commit-id: f464e9159fae1e180b2b06b5fbd70a2db39816ae
2019-10-16 13:23:19 -04:00
John Sully b12a5fd0b5 Merge branch 'unstable' into RELEASE_5
Former-commit-id: 1708d8782c2049b8a8f2a5b7422c11b0b50b4df7
2019-10-16 12:47:06 -04:00
john@csquare.ca 638576cb26 Fix: ExpireMember does not update MVCC timestamp
Former-commit-id: a7510fc1d51e344c37c5ff2a926427036465351f
2019-10-16 12:38:15 -04:00
John Sully 24ac098254 expiremember should return the same results as expire
Former-commit-id: 1e194ba852a29d8e096b3aeeee6c7a0d4746ead3
2019-10-16 12:27:04 -04:00
John Sully 1ba982dc6a Fix crash adding expire to key with a subkey expire already set
Former-commit-id: ae91301dd8519a66446e72000b5dd0cd337eb579
2019-10-16 12:26:48 -04:00
John Sully 44fe48443a Fix clang warnings
Former-commit-id: 450961de2699f6ce08595b56d3fee5d8b9c8f077
2019-10-13 15:48:55 -04:00
John Sully 78ef4b7281 Fix failing travis CI build
Former-commit-id: ad0f8a6f461857b2749166b92e736d8a55e9b8bb
2019-10-13 15:41:53 -04:00
John Sully e1d1496f27 Merge branch 'advanced_db' of https://github.com/JohnSully/redis2 into advanced_db
Former-commit-id: 88154ddd80cbdecbfdf4bd0e7e4202e005488d38
2019-10-13 15:35:30 -04:00
eric-weaver be29e2bb9a add missing dependency
Former-commit-id: f2a974ebe63d4b12340c4a2cc92b76f40e14180d
2019-10-13 21:30:06 +02:00
Segmond 5da03fffab Update README.md
Typo, focuses spelled as focusses

Former-commit-id: b33c0e89235aa171e108a71ac1080d1aef24f4b6
2019-10-13 21:29:15 +02:00
John Sully 3af04c9dad Add the IStorage interface and wire it up
Former-commit-id: 922e1953fcc2f1917d4466cb234f8cb335bbdcee
2019-10-13 15:24:08 -04:00
John Sully 7354033c7c Isolate the persistent parts of the database from the runtime parts
Former-commit-id: f0b9bebad6b71792b2d8999ee3bd531f7e468aed
2019-10-13 15:24:08 -04:00
John Sully 75a71e33ef Hide the database dict
Former-commit-id: e8bcf9dda768ec2cbbe093f74c622daa27c3fc6e
2019-10-13 15:13:01 -04:00
John Sully 20de2531a8 Implement the lastmodified query for the OBJECT command
Former-commit-id: e45a9778a8538cc5a4fce25283f11489958de290
2019-10-13 14:12:09 -04:00
John Sully 996313e78c You are not allowed to set a subkey expire if the subkey does not exist
Former-commit-id: f237c7eb4aee44351ff846d99b8f79a4ea2c101f
2019-10-13 14:11:43 -04:00
John Sully 7420517eb0 Implement the EXPIREMEMBERAT command
Former-commit-id: 9408150a9d0c15a02ff34309a8f3b5f7610037b8
2019-10-13 13:15:13 -04:00
John Sully 2799ec0b9e Add millisecond support for EXPIREMEMBER command
Former-commit-id: e81644edb32eeba37761a0475a30ffad2e4b8f91
2019-10-13 12:57:50 -04:00
John Sully f39e8d7545 Update more slave instances to use replica (Issue #75)
Former-commit-id: 57cf1ee82eabc428d0c61621feb4be403e602a78
2019-10-13 12:29:20 -04:00
John Sully 30d84ce606 Update a few uses of slave to use the new replica terminology (Issue #75)
Former-commit-id: 564ecf4ed5e98ae7f5d4cfefe4f495db940268c2
2019-10-13 12:12:05 -04:00
John Sully 567ed02ac9 Fix an intermittent crash when replicationCron happens before slavesdb is update
Former-commit-id: fe25de309ac9d02399cc7884ab34a3bd582dafd8
2019-10-13 12:04:54 -04:00
John Sully bb5debe8dc Implement TTL and PERSIST commands for subkeys. Also ensure expiremember replaces any old subkey expiries
Former-commit-id: 6089ac634c62c7409449fbd91020407a59e58d52
2019-10-13 12:03:25 -04:00
John Sully 748e5c274f Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: 3fadd8c4e8bdb9a1f6723b6ba03c686eaa08259b
2019-10-13 10:03:01 -04:00
John Sully cf5f2399ef Fix issue #88 - don't let seperate KeyDB processes listen on the same port
Former-commit-id: 9b4ef8d6a9d0ad8aba59ebdcca899ad436d8e1aa
2019-10-13 10:02:21 -04:00
John Sully f645dd5769 Bump version
Former-commit-id: 5785598cb77859558caa80c0cb11f0324b68a308
2019-10-01 17:53:48 -04:00
Edgard Lorraine Messias 50c3cf61cc Fixed "Provides" name in chkconfig info
Former-commit-id: 4cb0c9444346c928428c53aa86024effb2339ff5
2019-10-01 13:44:58 -04:00
John Sully 3cd74406aa Merge branch 'unstable' into RELEASE_5
Former-commit-id: 33dcb00b47ec10517604fb7ad0928fe9c4f4a11d
2019-09-30 00:28:12 -04:00
John Sully 28ba013015 Expire DEL command place holder
Former-commit-id: 5e76fd5773e2daa5878f6c029042bf1d7fe4b66c
2019-09-30 00:01:23 -04:00
John Sully 0465db13f7 Fuzz mode is now an argument not based on the exe name
Former-commit-id: cf4908a3d5550d7ca5f573348cbc1dea6a7c1d30
2019-09-30 00:00:29 -04:00
John Sully 2f8f97ab39 finish up the RDB fuzz
Former-commit-id: c0ecad185ff304d13e690ec0f0223930865f9d24
2019-09-28 17:38:46 -04:00
John Sully 5e66060475 Fix double free in RDB load
Former-commit-id: e3ab73e061b675360c54896153c3299c73b5f7cb
2019-09-28 17:38:26 -04:00
John Sully 757f6163d1 RDB fuzz test cases
Former-commit-id: 872f4e26a6958a5aeb0bff5b6ac0591513ebe93b
2019-09-28 17:04:08 -04:00
John Sully ec0271428e RREPLAY command now takes a DB argument
Former-commit-id: 85b76e319fcfcf6301037b6edf6e6f4a316ec879
2019-09-28 14:59:44 -04:00
John Sully 9611d108ad Implement left and right shift BITOP operators
Former-commit-id: b35058545ad1b81b6851eb78e39772614421279f
2019-09-28 00:10:46 -04:00
John Sully 66c3ea2cc4 Fix leaking stale RDBs during multimaster sync
Former-commit-id: 7707e6f631019cf71b2f5a5138e4df7a59678823
2019-09-27 13:17:29 -04:00
John Sully 600e5e4ae7 Fix multi master bugs: 1. we fail to create the temp file. 2. We use a master RDB as our backup even though we merged databases (and therefore it is not representitive)
Former-commit-id: 7bfcb03e2ee9986a91c502f9157397a384a9d07b
2019-09-26 20:35:51 -04:00
John Sully 7bc9a3d020 Add the IStorage interface and wire it up
Former-commit-id: 16ffcb20c8bd12f7c1eecf81e6f9de734ed490dc
2019-09-20 14:52:22 -04:00
John Sully 47d7726af5 Isolate the persistent parts of the database from the runtime parts
Former-commit-id: 6369e06e6f1765ed1774a6ef2b4d8788ee9efd1a
2019-09-19 22:36:29 -04:00
John Sully c70c6fb21a Hide the database dict
Former-commit-id: fc5a34ee2b967c90bdcbf7f7c54cd06b9f6d3692
2019-09-19 17:44:42 -04:00
John Sully a40be21601 Fix issue where AOF events are posted to the wrong event loop and not properly cleaned up
Former-commit-id: aa3c95d2e723a303e0f69e26933088743f575dd3
2019-09-19 15:40:09 -04:00
John Sully ce91955dd4 Fix issue where AOF events are posted to the wrong event loop and not properly cleaned up
Former-commit-id: 13e18cd142a84f00ffec7668ce6409cd2b1ec024
2019-09-19 15:39:52 -04:00
John Sully d560ce88c1 KEYS now only blocks one database
Former-commit-id: 8b8275dd04eb1868198257f7c3ecd1ef3638a101
2019-09-12 18:51:10 -04:00
John Sully a6e3f1af63 bump version
Former-commit-id: 5ff5c27024777b8c1ca6662ec55695d88492ab3c
2019-09-06 13:31:40 -04:00
John Sully e184f55204 Fix issue where Active Replicas were commiting data to the wrong database under load
Former-commit-id: 729a0f2372092a54a6fbcedd26c1cf186f60a525
2019-09-06 13:30:28 -04:00
John Sully 702ca3986a Fix issue where Active Replicas were commiting data to the wrong database under load
Former-commit-id: e762269288e963e459e5fde7b0f1128e3eb71c31
2019-09-06 13:30:15 -04:00
John Sully cd46ab2d16 Acquire the lock for modules that don't acquire it before calling like they are supposed to
Former-commit-id: f370cc5a127ca5cbae65b836b688bf344319d811
2019-08-29 15:41:03 -04:00
John Sully 7962c57986 Bump version
Former-commit-id: 093789463ef8ffabfe025d0b543beb08715bb13c
2019-08-27 15:32:24 -04:00
John Sully d4f000db23 Fix race condition in PUB/SUB and other async reply commands where the client can be freed before our handler is executed on the client thread. When this occurs the client pointer is dangling
Former-commit-id: 6fdb6ce862f249ce9b9a26e6f2d362416f202ed6
2019-08-27 15:31:47 -04:00
John Sully e30a46485b Fix race condition in PUB/SUB and other async reply commands where the client can be freed before our handler is executed on the client thread. When this occurs the client pointer is dangling
Former-commit-id: 921d7918577b2fad463a87ac08d2e7b7c92d4530
2019-08-26 20:18:52 -04:00
John Sully 590cbf7677 Fix warnings on newer compilers
Former-commit-id: 3d60a9a5693ed2036132ea9e3f5f95693c1db322
2019-08-14 01:03:24 -04:00
benschermel 697f5a327a update readme (#71)
* update readme

* KeyDB must acknowledge its Redis origin and that while we have different opinions we are greatful to Antirez and Redis for the work they've done in this space.

* Update README.md


Former-commit-id: e31dfbc85812109e6db45719f55c177834fe9838
2019-08-06 19:25:13 -04:00
John Sully 616a354912 Optimize the new expire code
Former-commit-id: 7586b4532ab8b22315406ddce70f1a4b8e003a06
2019-08-02 21:31:05 -04:00
John Sully 8d2fc2a824 Fix test failures: Non active replicas are allowed to use shared int values
Former-commit-id: e038f375e2087660003f8df7629604a3b4c0c2c9
2019-07-30 17:11:15 -04:00
John Sully a4e13bf27d Acquire the lock for modules that don't acquire it before calling like they are supposed to
Former-commit-id: e1bbaa5c921bf3844e4209a583a35cd6466e7dcf
2019-07-30 16:54:25 -04:00
John Sully 78a7069633 Fix HLL corruption
Former-commit-id: 9d48475c17cb78b9bf03874f3a74a70281c8c8ce
2019-07-29 18:08:45 -04:00
John Sully d4b9cedc3e Fix crash setting expire on a key with an existing subkey expiration
Former-commit-id: 3d85bb5ace9ad435232b4ccf1f5a3792353a5a6a
2019-07-29 17:09:51 -04:00
John Sully db878e26c0 Fix crash in RediSearch
Former-commit-id: 33008e5912178354a8e1cc29c6da66ef88391ba5
2019-07-29 15:08:57 -04:00
John Sully 33fb3201f1 Fix crash in RediSearch
Former-commit-id: 185c607fb8aec9e39d0ae29365f86fe5586c50b2
2019-07-29 15:08:41 -04:00
John Sully 36649e4da4 RREPLAY failures should be logged
Former-commit-id: 3cdc24909ce14791866a15584c8ed5144401a57f
2019-07-24 22:49:55 -04:00
John Sully caf2051367 RREPLAY failures should be logged
Former-commit-id: 4d78c789872b27d7256c9b1750f2e7863d9af716
2019-07-24 22:49:30 -04:00
John Sully 88124e61f6 Issue #64 RREPLAY isn't binary safe. Add fix and test.
Former-commit-id: 0942a7fb8edd2aa52d6262210cb5c23c67ae5eaf
2019-07-24 22:31:44 -04:00
John Sully 356449b010 Issue #64 RREPLAY isn't binary safe. Add fix and test.
Former-commit-id: 90276ca36144f4c95f0131872084840a550053ec
2019-07-24 22:31:02 -04:00
John Sully 11bb381240 We can't set FExpire() on shared objects, issue #66
Former-commit-id: e72ea94dee73b111e1986a770fcb4f4e8506f620
2019-07-23 23:39:47 -04:00
John Sully 10c45eb6f5 Merge pull request #65 from JohnSully/subexpire
EXPIREMEMBER Command Implementation

Former-commit-id: fd491401068e23ba43f5ffd165823c6e01df18bd
2019-07-23 19:06:57 -04:00
John Sully e6d3d6a7d6 Subexpire entries should load/save
Former-commit-id: eadd159583c97c8234489b1985320fd6184e1487
2019-07-23 18:53:59 -04:00
John Sully e590e4ad25 Fix buggy rebase
Former-commit-id: 239ac0ba9ce605ae207de034a5969463279e11c7
2019-07-23 18:53:59 -04:00
John Sully fca3b7dd09 Fix merge conflict
Former-commit-id: 09dc0ade84426eba14d2f10e69422e8969e92a10
2019-07-23 18:53:59 -04:00
John Sully 659523f945 Plumb support for sub expires to all expire related code
Former-commit-id: 3c23497dcffc7100feb3122b0e86269b870f21cf
2019-07-23 18:53:59 -04:00
John Sully c8250bf974 Fix crash with traditional expiration
Former-commit-id: 0321613bc7db7e3192939debe3836882ff2a976e
2019-07-23 18:53:58 -04:00
John Sully bdc64d75dd Initial prototype of EXPIREMEMBER command
Former-commit-id: 2aa343634fae084f43e09a7d245c1737bd2284be
2019-07-23 18:53:58 -04:00
John Sully 6ff076e130 New expire datastructure and algorithm. Allows us to expire in sublinear time
Former-commit-id: 082bbbead58c4792f0cfb06a3f301024991e993a
2019-07-23 18:49:31 -04:00
John Sully 670fe74367 Merge pull request #50 from JohnSully/expire
New Expire Datastructure which is faster and more memory efficient.  This allows us to process expiries in sublinear time.

Former-commit-id: 9e5cec55c80579bd0eaaabd90628a0b52a257f44
2019-07-23 18:40:48 -04:00
John Sully 646913d71b Support TTL stats with the new expire datastructure
Former-commit-id: e773b3078b9016400539922b58ae7f5463bc4ff6
2019-07-23 18:30:10 -04:00
John Sully 84f990ee0b Implement hash table stats and fixup the hash function based on the results
Former-commit-id: 7e01df05408a9b4d8750bd582e448b5da0398ca9
2019-07-23 18:30:10 -04:00
John Sully 6e50b616f5 Add back missing file lost in rebase
Former-commit-id: b7a6e8934e8623543530845f0421a0ff3893e904
2019-07-23 18:30:10 -04:00
John Sully 7e879ce592 Add back file erroniously deleted in rebase
Former-commit-id: ec606ed0449014ab67cf800930efea482bed14a6
2019-07-23 18:30:10 -04:00
John Sully 5774fc05b2 never make last minute changes before commiting
Former-commit-id: a03c149e9dbe196b426972647a32f6a18344c71c
2019-07-23 18:30:10 -04:00
John Sully be37d092a3 Fix a few potential assert crashes
Former-commit-id: 0eca78d32d9ac7b70f1a5d5560529a15182d966b
2019-07-23 18:30:10 -04:00
John Sully 9466ff7837 New expire datastructure and algorithm. Allows us to expire in sublinear time
Former-commit-id: 627da9a2d68d68c0dc73661cebd62d1ce16f462b
2019-07-23 18:30:10 -04:00
John Sully 2d12c70c81 Any +x bit is acceptable
Former-commit-id: 8c1a2b57848c55b5872f4debeb4c441ef3a5bbeb
2019-07-19 15:26:17 -04:00
John Sully 227d3a4f17 Any +x bit is acceptable
Former-commit-id: cbbcaecb2e5c7fe84e87eeee13f6ec60c3894ea4
2019-07-19 01:42:05 -04:00
John Sully b2f14f148f Modules must have execute permissions to load
Former-commit-id: 2406c9c724cfcab3c7eef48a686ec83f65e897e7
2019-07-19 01:31:10 -04:00
antirez 0103d0663b RDB: make sure to abort on LZF encoding error.
Former-commit-id: f42ac8f07a91993cce72d4e022c584c8b2a6fb90
2019-07-19 01:03:16 -04:00
antirez 37bc18f648 RDB: handle encoding errors with rdbExitReportCorruptRDB().
Without such change, the diskless replicas, when loading RDB files from
the socket will not abort when a broken RDB file gets loaded. This is
potentially unsafe, because right now Redis is not able to guarantee
that encoding errors are safe from the POV of memory corruptions (for
instance the LZF library may not be safe against untrusted data?) so
better to abort when the RDB file we are going to load is corrupted.

Instead I/O errors are still returned to the caller without aborting,
so that in case of short read the diskless replica can try again.


Former-commit-id: ea4dc9e37ad02245b7156c12b58ed284f9705d94
2019-07-19 01:02:49 -04:00
John Sully 47cc255d75 Fix bad merge in SCAN KEYS command
Former-commit-id: fd5d1255b5b197e3537fefc8102bf2cbe3b0b7ac
2019-07-19 00:43:23 -04:00
John Sully f5cecd25f6 Merge commit '9c1932beeb6e307c2fbeadcfff8954e517189ae8' into unstable
Former-commit-id: 8d9e324a49acbd90b5e8f892f638eff5c7c36d91
2019-07-19 00:32:43 -04:00
John Sully 7dbbd27ccf Merge commit '985e5b2c608eade2a60e50a6a177f13381c9c8d8' into unstable
Former-commit-id: 2dccb6c8b7c1b8cf658d8d619f97cb3d85e7310d
2019-07-19 00:01:56 -04:00
John Sully 68e06b043f Fix compile errors from merges
Former-commit-id: 7577d0bb8c360a2eab06296479f5f2b69b3ad12f
2019-07-18 23:35:51 -04:00
Angus Pearson 630c9293ec Add char* typeNameCanonicalize(robj*) to remove duplicate code between SCAN and TYPE commands,
and to keep OBJ_* enum to string canonicalization in one place.


Former-commit-id: cf4cf045d9d5eccbedd403df83af7ac99a2d1519
2019-07-18 23:31:31 -04:00
John Sully 000b15338e Merge commit '2af8ebe14743ad88fd15af2ea91862b0667e94ce' into unstable
Former-commit-id: 1b63ffe1082866e3ee769d5aaa48d76ad16ddb72
2019-07-18 23:28:56 -04:00
Madelyn Olson eb360ca485 Fixed some spelling issues in ACL codepath including user facing error
Former-commit-id: def911a4154d9541d923f57c7dd3401e35e736f9
2019-07-18 23:28:36 -04:00
John Sully 13ae9e6896 Merge commit '214555b02ea448c444fb6a32ecfc5f312fc052b8' into unstable
Former-commit-id: 10d1b55fd7de81e2ae20edce886636e7d91ec90d
2019-07-18 23:26:46 -04:00
John Sully aad11f3c43 Merge commit '4bbaf621a12f6ec22ec7dad6a2282b7908660497' into unstable
Former-commit-id: 32dd3372bb15a78132730c6c53694d188d94b1ec
2019-07-18 23:22:36 -04:00
John Sully 2158be2950 Merge commit '525fc336ef5172f1eddbf18cbbfc1a32b054c9e2' into unstable
Former-commit-id: f599cb4eb637a9c404f3776829e355ce5fa183b7
2019-07-18 23:21:13 -04:00
John Sully 53216530ae Merge commit '9eea57cc311e62a49358e09af7baebce9da9053f' into unstable
Former-commit-id: 66d55984d19760ce8c8745744a8e8f93b4f447af
2019-07-18 23:20:46 -04:00
John Sully a552dd4fce Merge commit '3f4f7aff1aa6abf8cad1726941d4c33b3bfbc9b8' into unstable
Former-commit-id: 6b57f3c5c0b67e90fea889c07e8bffe71ef7db03
2019-07-18 23:18:42 -04:00
antirez 9ba6aa7d64 Test: fix slowlog test false positive.
In fast systems "SLOWLOG RESET" is fast enough to don't be logged even
when the time limit is "1" sometimes. Leading to false positives such
as:

[err]: SLOWLOG - can be disabled in tests/unit/slowlog.tcl
Expected '1' to be equal to '0'


Former-commit-id: 522adb3a6ef20e986b32de3652ad1b0661e4b98b
2019-07-18 23:12:52 -04:00
antirez d91f364b93 Make comment in getClientOutputBufferMemoryUsage() describing the present.
Former-commit-id: 17573d9893de537c0ecbe2fae03a31749c9b45ac
2019-07-18 23:12:39 -04:00
antirez 451a81d30d Fix test false positive introduced by threaded I/O.
Now clients that are ready to be terminated asynchronously are processed
more often in beforeSleep() instead of being processed in serverCron().
This means that the test will not be able to catch the moment the client
was terminated, also note that the 'omem' figure now changes in big
steps, because of the new client output buffers layout.

So we have to change the test range in order to accomodate for that.
Yet the test is useful enough to be worth taking, even if its precision
is reduced by this commit. Probably if we get more problems, a thing
that makes sense is just to check that the limit is < 200k. That's more
than enough actually.


Former-commit-id: 5b5bca9a3c3e9003957b8aaa92ece879c4046a78
2019-07-18 23:12:05 -04:00
John Sully d54e3dbc32 Release version 5
Former-commit-id: 19526fae7c7fbef269fa1d19655506ef3b97e76d
2019-07-18 20:50:40 -04:00
John Sully e539f8d1e0 Active Replicas should always use their own slaveseldb variable when sending/saving rdbs - never those of their masters. This is because the Active Replica is also simultaneously a master
Former-commit-id: e2d84f2694ca4faef312b27768721aba0b793c09
2019-07-18 20:50:20 -04:00
John Sully abe01b15f6 remove unnecessary variables
Former-commit-id: b6a0e130e57102dfc65341fa80aa6c6e8deff3f9
2019-07-18 19:37:49 -04:00
John Sully 2ba45ceaa5 Fix issue #59 - Test replicaof config variable
Former-commit-id: 3ab63913a24b118fe9ebeba5bab5afe466c786b9
2019-07-18 19:22:49 -04:00
John Sully 7e09365cab Add support for sanitizers and fix issues they have found
Former-commit-id: 5a96f407f17ef53bb10d31baf198d9f8761ff358
2019-07-18 18:39:42 -04:00
John Sully 8be2711505 Resolve race on neterr variable
Former-commit-id: ba15c5e4015fb691bbacf1a1ecf7e23a554b06cf
2019-07-18 17:11:28 -04:00
John Sully ba88f3e27b Make object refcounts atomic, technically it doesn't need to be currently but the semantics are complicated and error prone. This is much safer with little performance impact
Former-commit-id: 36991bdc7244898b8bd52ccf9b6f6275c1b6b6d8
2019-07-18 15:49:12 -04:00
John Sully 29d267bc1b Suppress initialized data sanitizer warnings
Former-commit-id: 116f5d80390c700a0e4000d2a9bbf627b76aa023
2019-07-18 15:49:03 -04:00
John Sully 21fd9bfec2 Another RESP3 regression
Former-commit-id: ab09a93b8b30589e457b5b0a89728c0c1106e1ab
2019-07-17 22:57:52 -04:00
John Sully a4fd05f993 Fix Issue #58
Former-commit-id: 5290d41362a3dfc2dd558b1998ef8e0bd5c16af3
2019-07-17 02:34:02 -04:00
John Sully 6d9ca5be4f Shared objects should be marked as such
Former-commit-id: 99414b64329d0b8c1ce66d7d6a1fc5c7db30eaa7
2019-07-16 18:32:01 -04:00
John Sully b3dacfc408 Crash when aborting SYNC with a master on a thread other than main
Former-commit-id: b7e86fde18e92be2f979c61b7cbb27e6f7864546
2019-07-15 14:55:41 -04:00
John Sully 029c1e1f38 Implement test mode to make finding bugs easier
Former-commit-id: afa28b9a3ea7561853b175ded40112dc09686209
2019-07-15 14:55:18 -04:00
John Sully 027875e38f Blocked clients can stall when under low load
Former-commit-id: afb712bdd3f59b70b40ec181c2effc29efd890a0
2019-07-13 16:44:11 -04:00
John Sully be0d5bb5cc Give the active-rep more time to sync for test reliability
Former-commit-id: 1325197b1fabb902b10ae42bdb3d0e10b23c723f
2019-07-12 23:52:07 -04:00
John Sully ef804bca9e Fix more locking deadlocks
Former-commit-id: 9d379d065f7b9d352c4eeff202edbcbbd733b763
2019-07-12 23:51:45 -04:00
John Sully 1cc6b11a20 Fix deadlock with client and ae locks
Former-commit-id: 0326e52ede59df932f073e7e97811f746b523b43
2019-07-12 20:46:50 -04:00
John Sully 1e1551aebf Add Active Replication tests
Former-commit-id: f6ae5c118219260bdcaaffe2a4cafaf121f7ceb8
2019-07-12 03:54:41 -04:00
John Sully 220fe79648 FIX: The dabase count configuration is not respected
Former-commit-id: 7296751ff765a8eac849e07fd81ae3d5dd6b4686
2019-07-12 02:13:37 -04:00
John Sully a0d37f8631 Update README.md
Former-commit-id: 358a129f4236d7ecbc0eff1bc02f00fefbd390e3
2019-07-11 20:29:47 -04:00
John Sully 894145933a Fix compile errors on GCC v5
Former-commit-id: 02d825657fa9b0cfdf49b3c9830faec57cd24226
2019-07-11 20:20:01 -04:00
John Sully 8cf72072a8 Fix more accounting errors with active replication and the replication offset. Specifically we don't update repl_ack_off as frequently as we do reploff_skipped
Former-commit-id: a817a7106589f30058636d1c6119d8f92ea40d17
2019-07-11 19:20:12 -04:00
John Sully 59a61af518 Active Replicas are not slaves
Former-commit-id: 064f958ee093aa3949e0c4529255be18517da502
2019-07-11 18:51:20 -04:00
John Sully 48b7ab8e65 Fix active replication offset synchronization accounting, and enable the wait command
Former-commit-id: 6657f4f69d7056aa57e9e974dee8a5d191b32105
2019-07-11 17:00:23 -04:00
John Sully c739783454 lazyfree needs to consume more memory to be detectable
Former-commit-id: 0234ece6c77398a340112108659536e2d7a78c47
2019-07-06 00:53:40 -04:00
John Sully e18da1c9fb Redis only does this in beforeSleep function - doing extra calls like we do causes test issues
Former-commit-id: 20540b126e30e4e2ff09421563c6d5c5a29859a1
2019-07-06 00:53:20 -04:00
John Sully e85866db2e Add back user space buffering of RDB save
Former-commit-id: e61b399a071de75a33c5eac5f75cefbec1b3319b
2019-07-06 00:36:23 -04:00
John Sully e154e23d2f We can use less memory in the client output buffers. Its OK
Former-commit-id: d427f3f725fbc2334f6f3ca3f5947d61a1d42167
2019-07-05 23:43:01 -04:00
John Sully f4f0f91101 Fix additional warning related to new() overloads
Former-commit-id: ad0b76d10f836d0c16c309d064fe5420065f555c
2019-07-05 23:42:39 -04:00
John Sully 7bcfb804f6 Fix additional warnings
Former-commit-id: 360027efe9260058673f6a5b47e81792f69c76f8
2019-06-27 16:29:36 -04:00
John Sully 61750f8d89 Fix mac build breaks
Former-commit-id: 9c6e4b353a03d6c601572982ff517f7cd6f0781d
2019-06-27 15:04:09 -04:00
John Sully 0e45882715 Fix libcxxabi clang compile failure in travis, as well as bool issue due to old clang
Former-commit-id: 962196252e0c270997de26005705a2f8bbb82aa7
2019-06-18 00:42:01 -04:00
John Sully a575cf9ef0 Bump travis compiler version
Former-commit-id: acefee2b38440c424b078c67299294884ef55785
2019-06-18 00:42:01 -04:00
John Sully 35911ddbad Fix Travis CI issue
Former-commit-id: ea62a50e135c08569ecac7d4bcf9fa6e003ff412
2019-06-17 23:56:23 -04:00
John Sully 1766230c04 Fix issues with relaxed memory model architectures
Former-commit-id: 1e426ff051ba08fb19607e82354fcd2b5df4d555
2019-06-17 23:00:12 -04:00
John Sully e973c2fe0d Remove unnecessary recursive lock
Former-commit-id: c4a6a2c7809510b0bb0f652ac262bc7fcd0c5635
2019-06-17 23:00:12 -04:00
John Sully 6f1c7e036b missing file :)
Former-commit-id: 31e919e0f081247850802bb4c47c1f9fcfc387f6
2019-06-17 23:00:12 -04:00
John Sully 471bf99f08 Fix test failures due to assert
Former-commit-id: 76e067d1c62b15f2aca59b5d69cbb54505c9578f
2019-06-17 23:00:12 -04:00
John Sully 033df6c68d convert the pending write list to a vector for better performance and less cache thrashing
Former-commit-id: c01008c98a0004b75437c1ea85401aa26a6108b0
2019-06-17 23:00:12 -04:00
John Sully 02385957b3 Move more code out of the GIL
Former-commit-id: 0cf10dce8a39a4f508b1d5579107a655cf6d86ff
2019-06-17 23:00:12 -04:00
John Sully e79a854178 Remove an unnecessary lock that eats performance
Former-commit-id: 4b79986becce48b77c965010c4cc2daa25e7ca04
2019-06-17 23:00:12 -04:00
John Sully e263d0e735 Even the next up thread should sleep in the futex
Former-commit-id: a97f0e30b4363bddc5f90516b10aac3008b164aa
2019-06-17 23:00:12 -04:00
John Sully 9700367892 Fallback to a futex if we spin for a long time
Former-commit-id: 078c38d213323656525d8043d6d924c574e47195
2019-06-17 23:00:12 -04:00
John Sully 4e694fd1c4 Enable load balancing of UNIX sockets across threads
Former-commit-id: 1477a539b47d87cde2a7e2ee8671d3401a9c7cef
2019-06-11 01:34:36 -04:00
John Sully e41df8e221 Fix crash adding duplicate replica. Just send an error instead
Former-commit-id: ea58503a3f9a0946483d2ece2c03887795c9d9fe
2019-06-02 15:50:50 -04:00
John Sully 665a6a238f Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: 5b562bc67e548086982a5b83b270610c9e789176
2019-06-01 03:23:21 -04:00
John Sully 98585950e5 Implement MOTD feature in keydb-cli
Former-commit-id: b2c75f2f3567590b85e0ccf2416e45de63db9fe3
2019-05-21 15:12:12 -04:00
John Sully 56aae1a6c4 Update README.md
Former-commit-id: 2bd7ec98a498689cbff1ae91e05e16d19ce922a8
2019-05-21 00:04:12 -04:00
John Sully 620f811191 Fix regressions from RESP3 changes in commit c8304b099d
Former-commit-id: 2e0787734944ad09af89135a252ea6c07233e5c0
2019-05-20 23:39:44 -04:00
John Sully 82acc285a2 The unstable branch doesn't have a version #
Former-commit-id: 2479366797c5bbbde7b7ee3acdcbcb1c110198ec
2019-05-20 16:12:26 -04:00
John Sully da6a421bf6 Fix double unlock
Former-commit-id: 384d945fee94a09b9160756a2fc7941feafb6157
2019-05-20 15:52:04 -04:00
John Sully 212c889608 Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: 9c39bb3a6afb9911085aeb2436fbeb081c55c9ce
2019-05-20 10:57:59 -04:00
John Sully 5f4b447d53 Protocol regression from RESP3 work
Former-commit-id: 7f866c1395c677a93c9cc6fcb90e8e0955ce130a
2019-05-20 10:57:37 -04:00
Qix ce34624014 cast void data pointer to const char * to fix gcc
Former-commit-id: ddd3df8c636c791f5c27e5e7dc415432fad42fcd
2019-05-19 16:24:39 -04:00
John Sully 150441cbde Fix build breaks on some older compilers
Former-commit-id: 527ba329760d3a7f8da260129df319591154609e
2019-05-18 20:58:48 -04:00
John Sully 7b2ac1bc1e Fix build break on some compilers
Former-commit-id: b6da679720f6898b6e6bc98fa4fa1141cb8d7e7b
2019-05-18 20:41:05 -04:00
John Sully 0ca41fdce6 Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: ff353ff8dd949e87e51a759575d72668aa4c1bd0
2019-05-18 20:25:23 -04:00
John Sully 4eee4c96ac Print nicer error messages for uncaught exceptions
Former-commit-id: eb1e772c08c3d8c622cbc412f720dc0c49801a44
2019-05-18 20:24:29 -04:00
John Sully 215ec572fe Fix: Active replication falls behind under high load
Former-commit-id: 6163e7facaf36dd43cfb2f2e4173267fe93a4ae1
2019-05-18 20:23:20 -04:00
John Sully f71f61fbcf Update Active Replication wiki links
Former-commit-id: 4d665b64ced168e76a8e58cce06ac1084536fe90
2019-05-11 21:53:30 -04:00
John Sully 8e7d51236f Fix a few issues from the merge
Former-commit-id: 71d2af42cb7361224c8bfe033e92fe29290d553f
2019-05-11 19:26:59 -04:00
John Sully 944f31e11a Make lazy free test more reliable
Former-commit-id: 39c69cb5401684b1794194694dceb792d717bbe2
2019-05-11 17:57:35 -04:00
John Sully bba04e1e14 Merge branch 'unstable' of https://github.com/antirez/redis into MergeRedis
Note: some tests failing

Former-commit-id: 065650df21bcb9cfe342e7a35864fa4f3a3ff219
2019-05-11 02:20:34 -04:00
John Sully 86d6215a09 Add byline to logo
Former-commit-id: e7fc25ad3d5ffeb1466e53568b38f091df6e4bbe
2019-05-10 23:48:14 -04:00
John Sully eff5eb497c Fix CentOS build failure
Former-commit-id: 5f0d1de77a926842bea48b750c787106abfb508b
2019-05-09 19:54:34 -04:00
John Sully 4a9f8889be Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: 9bcdb6a5f6e386304faa25554d1d5f9c1f3955c2
2019-05-09 19:16:50 -04:00
John Sully 618f46eb80 build break fix
Former-commit-id: 51020f3dd24ed32c33e731c757f73573b7657581
2019-05-09 19:16:31 -04:00
John Sully b39b6fd379 Fix issue #11
Former-commit-id: dfd8be6d265368217fec35d21076b247cc29faef
2019-05-09 19:14:10 -04:00
John Sully dd6eca3319 Fix typo
Former-commit-id: 6c65fed3f027b406d779d6c7d7d7cd6c1aad82b4
2019-05-09 19:06:58 -04:00
John Sully 0513e95713 Add missing file
Former-commit-id: 75efcd3d9d170c7d3855b8b446cc598645c1d645
2019-05-09 19:05:09 -04:00
John Sully 028aac3b3f Change debug messages to reference KeyDB
Former-commit-id: f3517212f3e12c3815ba55b8a6e181c30f424867
2019-05-09 19:03:50 -04:00
John Sully 6da2115174 Fix module locking issues
Former-commit-id: cc351851e2ee6a57c9fb0b8d45ae29bc0200896f
2019-05-09 19:00:27 -04:00
John Sully d6cb1bae74 refactor server global into a pointer (so that threadsafe commands can set this to NULL to prove they don't rely on it
Former-commit-id: 1abfb5828b5ee569d4373e40255a0eb87434759d
2019-04-21 14:01:10 -04:00
John Sully ddebaad770 Factor out some normally const globals
Former-commit-id: e6ee321919efa1fae6643444b5df14add1f97830
2019-04-21 13:20:45 -04:00
John Sully 097e2f99d2 additional fix to rreplay forward compat
Former-commit-id: 2123fcb6cd59026bcd2b519e5966858a2f2d99c4
2019-04-20 01:36:23 -04:00
John Sully 5a0b933d1c Make rreplay forward compatible with extra future args
Former-commit-id: c45eaea5df1982a8f63fc1297484c6576a494839
2019-04-20 01:15:01 -04:00
John Sully 5a8971015d Tweak mvcc time format so rollovers are not an issue
Former-commit-id: bd02a04c990bc68fe697a95cad69c03421d093ab
2019-04-20 01:03:08 -04:00
John Sully c2ef57017e Timestamp writes to objects so we can be smarter about merging databases
Former-commit-id: 89d5a870a36ce0f978a51a8762df581b076a3628
2019-04-20 00:52:07 -04:00
John Sully 18a74fff64 Fix use uninitialized
Former-commit-id: 9e377fcf61a6e19971b97b746357f8f594fc3adb
2019-04-19 23:41:40 -04:00
John Sully ff16bd9b98 Additional MVCC work and fix memory leak loading objects from rdb
Former-commit-id: e0d2899a311695b8da853506afde8bdcc7192099
2019-04-19 22:54:42 -04:00
John Sully ced54bfc66 Add version override command for users that need compatibility with Redis
Former-commit-id: 1b53130d89c28fcd2ecf30fdf27c1321ab117313
2019-04-19 19:57:11 -04:00
John Sully 82ac0123e6 RREPLAY PERF: The UUID stack is unnecessary, RREPLAY itself can detect the cycle and call cancel()
Former-commit-id: be7c2edba07d6642e09cc066555c92636b4fac4e
2019-04-19 19:36:47 -04:00
John Sully a3deea8186 Detect cycles in mesh networks with multi master
Former-commit-id: 7a931c1d2a47b22c4c9b9f7ca693c764845f77bf
2019-04-19 19:31:11 -04:00
John Sully e77ecc28d6 Fix crash near boot when adding replicas and dumping database
Former-commit-id: 0c38e2267598067702626cbfde8bf13475641834
2019-04-19 17:08:54 -04:00
John Sully e2b161c24a Replication fake connection should inhereit the user and permission of the real connection
Former-commit-id: 2ee12add8eee4b78ee45ec26a170d6030466373b
2019-04-18 22:07:35 -04:00
John Sully efa4efb939 Start of MVCC support (and more C++)
Former-commit-id: 21dd60095553fba9b821bbbcefeaf4ae97250d5b
2019-04-16 23:16:03 -04:00
John Sully f2cc61c5df Fix module linking and crashing issues
Former-commit-id: e905eb992cf39d1ac3ad2212718d1c9ae558dd0a
2019-04-16 13:34:22 -04:00
John Sully ae7c4950c2 Fix replica authentication failure when masterauth is below replicaof in the config file
Former-commit-id: 6803f4671c583f565683276e28eb5a8033955fbc
2019-04-15 22:31:02 -04:00
John Sully 824fde28e6 Fix memory leak unsetting master
Former-commit-id: 933d45fb8ea2de68b6dd99c5a22d330fa3711b1b
2019-04-11 19:55:44 -04:00
John Sully 64cba896b7 Fix compile errors when MALLOC=memkind
Former-commit-id: c93134236dea2de30b5824819a2620aa33298f04
2019-04-11 19:40:45 -04:00
John Sully 4b2f29d10e Fix failure to respect masterauth issue #26
Former-commit-id: d8e1cb1de1d296c30953221b9f8f0ae00d7fd922
2019-04-11 19:08:12 -04:00
John Sully 2fa355d994 Fix addition RESP3 regressions (return empty set)
Former-commit-id: 17a1d7e138e3d16efb5eef557429448646a2ee7c
2019-04-08 16:52:57 -04:00
John Sully 17035ee011 Fix protocol break with hgetall and family
Former-commit-id: 40150e7ddf7b5048c4c9c00d1b4962e1211cc0c8
2019-04-08 13:52:02 -04:00
John Sully e014ce38f2 Move remaning files dependent on server.h over to C++
Former-commit-id: 6ff1be07f5d1659c8bee3ecffd1bb5b16cc697fd
2019-04-08 01:00:48 -04:00
John Sully 3aedf7205a Move dict to C++
Former-commit-id: d8c8915844f614fef5ed4c645bbf8d0cffcc97ec
2019-04-07 17:23:59 -04:00
John Sully 02660b4fc1 Port db to C++
Former-commit-id: 1ab0ae8fe63dd278a02e79957395b58f3fb1f244
2019-04-07 17:13:14 -04:00
John Sully fbf40c4bc2 Move a bunch of files to C++
Former-commit-id: b8452b712cc1fa077b1dc683818e75074a37594d
2019-04-07 16:54:56 -04:00
John Sully 68c7a7374d Make t_string C++
Former-commit-id: 9c81d4e6d64738766012c32b68dc690b5b5ed35e
2019-04-07 15:24:23 -04:00
John Sully c8fe14f7d0 Fix clang compile error
Former-commit-id: d0aeac3da2e53bbcc029fc15939547fb057c875a
2019-04-06 00:20:17 -04:00
John Sully 351f4deab6 Add RREPLAY command and put the issue of packet storms to rest. Fixes issue #24
Former-commit-id: 665720dd6dee443961b28c1f53e4b3965b9082b7
2019-04-06 00:14:27 -04:00
John Sully facbf3cbbf Fix regression in active replication caused by multimaster PR
Former-commit-id: 2028b17611d6119bd7aad9bda528b7d7e00cefe6
2019-04-04 16:50:40 -04:00
John Sully edd42ddc60 Merge pull request #23 from JohnSully/wip-multimaster
Wip multimaster

Former-commit-id: a8f798707f3d2d6b563eb493764559c0993dfcaa
2019-04-04 11:40:58 -07:00
John Sully 43a860b0ee All tests runs pass! YAYgit add src/cluster.c src/config.c !
Former-commit-id: 10ce9f88b668477f38f8fe13144f9a7cf22c7d31
2019-04-04 01:02:19 -04:00
John Sully 339ee81d71 Fix some more failing tests
Former-commit-id: f8a2d81b3d9fb80a67938807832f93d71362e774
2019-04-04 00:25:30 -04:00
John Sully 4cc78e47ee Merge branch 'unstable' into wip-multimaster
Former-commit-id: a79e37be953a263ee7a3b5607d02a61b5a8b154f
2019-04-03 00:12:13 -04:00
John Sully bf9921b7e1 Fix cluster test failure (not real issue)
Former-commit-id: aad720182b171093db1e0eb9d244c922e57c1792
2019-04-03 00:11:34 -04:00
John Sully 282b6f88f5 Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: 116d843083d8a8e7d802d315a4a3ec1fd4a12a10
2019-04-03 00:09:51 -04:00
John Sully 5d4a09b0da Fix failing tests due to build issue inhereted from Redis
Former-commit-id: fbf46ba9a9d312f2e23cb7419ffe16f60171b8c3
2019-04-03 00:09:26 -04:00
John Sully 364f3715af Merge branch 'unstable' of https://github.com/antirez/redis into unstable
Former-commit-id: fbee5282424d932f3fcf1377050c22a05170ab95
2019-04-03 00:00:38 -04:00
John Sully 76605c515b Cluster tests shouldn't crash (note: still not passing either)
Former-commit-id: 7a1e6f44249aeb483e8772f0bc0e31e72773a66a
2019-04-02 22:32:10 -04:00
John Sully 5425379b1d Multiple masters is no good if we keep dropping the database
Former-commit-id: 5e876de016c96b9c5fc21a3d7b400af9cc62af38
2019-04-02 21:47:21 -04:00
John Sully 051f090cdb Tests are passing! YAY!
Former-commit-id: f2d33e086462c9a5ede95e9203ee62227456bb75
2019-04-02 21:36:04 -04:00
John Sully e27ac2fd25 It compiles and doesn't crash immediately!
Former-commit-id: bfa8b8543553f3d7142eadc17bdef982952d1798
2019-04-02 16:47:05 -04:00
John Sully 95bbef87f0 Link to GUI
Former-commit-id: 7ede923d0471686d29f29477151c818d36dfb493
2019-03-31 14:37:54 -04:00
John Sully cb271ab9f4 Commit missing file
Former-commit-id: f10fdeacf65ef7679fa860a28b39f57eb1c29c1b
2019-03-28 17:56:14 -04:00
John Sully 8dd5d9ec70 Travis needs to install uuid-dev
Former-commit-id: f469f9bf13314e3166d687a25056fc0c9022be64
2019-03-28 16:18:26 -04:00
John Sully 383996db3e Implement database merging for Active Replicas
Former-commit-id: 8c2f90e1a7f284d410c55db728607ae54158979c
2019-03-28 15:12:43 -04:00
John Sully 4ff525c30c Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: 5ad6e514287648a8780122db056c83df53f4af77
2019-03-27 22:59:38 -04:00
John Sully ef07161c74 If no rdb file is specified and no s3 file is specified use the default RDB filename. If only S3 is specified use diskless sync
Former-commit-id: 69ad4707db551c1e3a9284a2852b7e6dea4a0ad7
2019-03-27 22:59:12 -04:00
John Sully 113c2113f5 Update README.md
Former-commit-id: 09d529db3df1be76f3efec9525dfaf3dcd05c72a
2019-03-27 21:52:08 -04:00
John Sully 8b6a165878 Update README.md
Former-commit-id: ddd3b5224a904edff6174d921b8f2292b17cdb19
2019-03-27 15:39:25 -04:00
John Sully e7f6c7f7c4 Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: e8ee4a42b384dfb8c328d51605b825505689ab9a
2019-03-26 20:39:56 -04:00
John Sully b6192ba84b SIGALRM should happen on a worker thread to make our tests happy
Former-commit-id: 331dffe7ceb75de0033b9a6501972500067b1286
2019-03-26 20:39:30 -04:00
John Sully 56c4e513f2 Make PSYNC2 tests more reliable on slower hardware
Former-commit-id: 9e3b1ef084c178db1313702014668aacf0fcf015
2019-03-26 18:59:31 -04:00
John Sully 444db1d606 Merge pull request #18 from DevopsDood/unstable
Update Readme for missing docker flag

Former-commit-id: e2fb35ac5d4e0cc10de2bb6b78eea91c39264e13
2019-03-26 09:49:53 -04:00
Richard Silver 1b9c809362 Update Readme for missing docker flag
Former-commit-id: af7cc9dbc5a8b2aa5f6d0a20b18b3aa7e346e5e4
2019-03-25 15:55:23 -07:00
John Sully 9780ed711e Give information on dependencies that need installation.
Former-commit-id: 7130f7acdfab7864e6cd5241b5e90c243f71edc1
2019-03-25 16:22:10 -04:00
John Sully f283f95a82 Add depenednecy on uuid-dev to dockerfile
Former-commit-id: 122e35766a80c09d3aae4d137e9b4b1042bbc110
2019-03-25 02:09:53 -04:00
John Sully d3c1a5220b Talk about active replica
Former-commit-id: 1df9a6dc45358c6cacabdd8d4fce62b11dc46071
2019-03-25 00:12:04 -04:00
John Sully 2b3781510b We don't corretly terminate our varargs
Former-commit-id: 2a984ee485e019d8afe12f87c5dd230294ee083d
2019-03-24 18:57:25 -04:00
John Sully da7bf3ce4f OS X build fixes
Former-commit-id: 2a806a5c20082652788870657da69760148b775f
2019-03-24 18:06:57 -04:00
John Sully ab463f56c9 Active Replica Support
Former-commit-id: e893dd6c681ef99dee9998912b8b512633ad5c75
2019-03-24 15:39:10 -04:00
John Sully eeea06c19e Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: 4c862cdd66ba7e477d57dd2ca6ea44f20c75e24a
2019-03-21 23:11:55 -04:00
John Sully c71e918fa3 Fix kqueue build error
Former-commit-id: 7c7e437b929ce4e6e5f5b145258050e1afce005f
2019-03-21 23:11:19 -04:00
John Sully 379b4b2999 Merge pull request #16 from gitter-badger/gitter-badge
Add a Gitter chat badge to README.md

Former-commit-id: c8dc4e4df4bf91528c7307c743a44c3ebfee2e18
2019-03-21 21:57:25 -04:00
John Sully 7c05b8cca1 Update README.md
Former-commit-id: c7a56a3df5b6ed8561bfdfba7ee2e725177ff67b
2019-03-21 21:26:00 -04:00
John Sully 4a06ca11aa Update README.md
Former-commit-id: 53b01947c7f8a1ac2c4df52b72da169d4e7e9365
2019-03-21 21:25:49 -04:00
The Gitter Badger d29d42c0de Add Gitter badge
Former-commit-id: e75c149652cdb575993a687ba3b3cd50631134a1
2019-03-22 01:24:32 +00:00
John Sully d1d870de08 Merge branch 'unstable' of https://github.com/antirez/redis into unstable
Former-commit-id: dc3c05d6101e33b5b157f49ed083bf641576e618
2019-03-21 20:15:59 -04:00
John Sully 39d480bd66 Merge pull request #15 from DevopsDood/unstable
Added docker builder for those that want it

Former-commit-id: f06307de106442db866feae1fa912514453be717
2019-03-21 19:54:00 -04:00
Richard Silver c1f627e2eb Merge branch 'unstable' of github.com:JohnSully/KeyDB into unstable
Former-commit-id: 8cad57e1f101ebdc1e398a7a07937a785f985961
2019-03-21 16:19:45 -07:00
Richard Silver 4072fd36d3 updated readme and Dockerfile to allow for tests to be run in container
Former-commit-id: 0b2925086d63bb0e1c22556f6fbef8358064986b
2019-03-21 16:18:37 -07:00
John Sully 57d5c59b18 comment issue
Former-commit-id: 332e87e8b5a29328c1e3dcfb36e65f8b9882f43e
2019-03-21 22:18:48 +00:00
John Sully 5a35e59fbe Polarity of the weak flag was wrong. We want to use the strong variant of atomic_compare_exchange always
Former-commit-id: 576b7a8b62e5b44d4a312d47a8b536d3c627845c
2019-03-21 22:17:04 +00:00
Richard Silver e41a19c7e6 Added build Dockerfile
Former-commit-id: e0c296338daa2a445775e7c2acf8fd0ef70f2bfe
2019-03-21 15:15:11 -07:00
John Sully 513580c847 Compile issues at O0 optimization
Former-commit-id: b1cb4d3a9c48beb95dfcfab9687de6045d9da6e3
2019-03-21 21:57:18 +00:00
John Sully 8e024ac47f ARM build fix: Don't use X64 asm here
Former-commit-id: c071e4103527f95f5d2c9cb48afc40178570d003
2019-03-20 04:14:33 +00:00
John Sully 1ab383033c Add debugging stats to the INFO command
Former-commit-id: 8866808f2af260d1cac63cef5bcb698fd32a919d
2019-03-19 22:04:33 -04:00
John Sully 02523c36a0 Add release badge
Former-commit-id: c52c6023cbbfc0e03b58c1dcfa0b965028d4a595
2019-03-19 20:54:36 -04:00
John Sully 1a4a23ca05 Add CI badge
Former-commit-id: 0e574366001f2c4fc8e86f0dc2e15b969dbbdc37
2019-03-19 20:46:25 -04:00
John Sully 432deefc58 Getting close! Maybe there was a better way to do this than checking in travis.yml files repeatedly but alas it works and doesn't affect people building locally
Former-commit-id: 28f7bbacb3176eabb6f47c4f1e3646b2eedda97b
2019-03-19 20:40:17 -04:00
John Sully 7f00991ede Clang build with libc malloc
Former-commit-id: 373432c6bad3b67c1dc8106280d5ca1b7eb567bc
2019-03-19 20:34:09 -04:00
John Sully 4c9f85c89c more clang travis fixes
Former-commit-id: 802aaca945ac658dd245ed7727409cdb2fc81f87
2019-03-19 20:26:35 -04:00
John Sully 24b15d39d2 Fix race condition building dependencies with multithreaded builds
Former-commit-id: 16308327ad6ffbe254b3a5945b9992f50210710d
2019-03-19 20:25:30 -04:00
John Sully b39e58d185 Will clang build now with travis?
Former-commit-id: b507e364492bc6e8207d793f802d7db217b27cdf
2019-03-19 20:00:52 -04:00
John Sully e0ed8f2892 clang build failure
Former-commit-id: ed97f78225433a1f8c28ffbe97d145841d6d4e8c
2019-03-19 19:55:03 -04:00
John Sully 7f65041d04 Travis clang dependencies
Former-commit-id: 887563be3742692dc1c4fa408b1bf765a6b31630
2019-03-19 19:50:28 -04:00
John Sully 6fec3aed6a Makefile ignores env CXXFLAGS
Former-commit-id: ca768b526748abf71fbb2454d1eaf7360e48ba64
2019-03-19 19:29:14 -04:00
John Sully 31d13255e6 No underscore
Former-commit-id: f53605cf52fc9b41d230062b6f365ba420a6a4a0
2019-03-19 19:22:27 -04:00
John Sully 1df261e596 Maybe this will make travis-ci stop using GCC headers when compiling with clang
Former-commit-id: f8582451e3abfe054a17b8ad1bb8c04a64e73a00
2019-03-19 19:12:15 -04:00
John Sully 7aa02c30dc Feature gate SO_INCOMING_CPU so we compile on older kernels
Former-commit-id: dd3788d792cfbc7dd75f944c6dbf46a999891eb3
2019-03-19 18:55:42 -04:00
John Sully 1736c1e777 typo
Former-commit-id: 0eb079e6069c7d8d79e3021351afceae20adb500
2019-03-19 18:40:50 -04:00
John Sully df709b9c18 It would be nice if our CI actually called make...
Former-commit-id: f671c0290990d2a53bbd5937ec295184b4db367d
2019-03-19 18:37:53 -04:00
John Sully 3e1b5875e9 Fix issues with travis config
Former-commit-id: b5c2bb1c0c11b154dade177be74f8e0a701a09f7
2019-03-19 18:31:45 -04:00
John Sully 8af05807f8 Let's try travis-ci
Former-commit-id: 49aa4a05c8df5afeea102038b68d57de9052681c
2019-03-19 18:27:54 -04:00
John 18fe66e2a9 Fix linker errors on some compilers due to sdslen()
Former-commit-id: 518df722b8d1552dbd1b8e48d69658abf88e79c5
2019-03-19 22:08:20 +00:00
John Sully 250775d275 KeyDB has different aims than the Redis project.
We believe software is for the user.  If a feature requires complicating the codebase
but simplifies our user's lives we will do it any time.  This should not be taken
as an outright rejection of the manifesto, as we agree on many points.


Former-commit-id: bedd5ed627b1c9e575201154b2b6e5a44b85e476
2019-03-19 01:36:03 -04:00
John Sully 697dbb88ce Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: 7b30708320d466f4defce5df701b08c4b0c6274c
2019-03-19 01:26:22 -04:00
John Sully bad26e41fb Merge branch 'unstable' of https://github.com/antirez/redis into unstable
Former-commit-id: bfd8bc3b49407068e5fcd28e860b902fb0dfd6e6
2019-03-19 01:26:10 -04:00
John Sully e9515b3c6e Hack to prevent build errors on some machines due to missing throw()
Former-commit-id: 1dfd6f95bb5d847f1f067470900afd67b33cf9c4
2019-03-15 05:28:20 +00:00
John Sully 63df790252 Merge /home/john/repos/redis_clean into unstable
Former-commit-id: c7d151da7d058080511f41101ee5df4ec091c196
2019-03-14 14:22:41 -04:00
John Sully 830fa87cee Merge branch 'unstable' of https://github.com/antirez/redis into unstable
Former-commit-id: 341b4ae738acc6e8eb9ac12f0c7bc1ad1a3f5c64
2019-03-14 14:22:27 -04:00
John Sully 895ea29ae3 Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: 1f8f625bc804f3e7b71b259cc7978293c3ef8a2f
2019-03-13 18:08:59 -04:00
John Sully 4d2e119563 Merge branch 'unstable' of https://github.com/antirez/redis into unstable
Lots of fixes and improvements from upstream.


Former-commit-id: 596c910774725443cb7a9e292f774dbefe57d81e
2019-03-13 18:08:22 -04:00
JohnSully 48f832bb5c Update README.md
Former-commit-id: c9cd2f74391564b817420ee070f6d131d295bab2
2019-03-13 16:57:40 -04:00
John Sully c2ce4b6392 Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: a3ed3bc248ea0bc1be48dbe272cb831662acdb10
2019-03-13 16:53:55 -04:00
John Sully 5280a0db7f Implement load database dumps from S3. We already save.
Former-commit-id: a0ad3f488d7170c30279eacb7bf2831edbd61354
2019-03-13 16:53:37 -04:00
JohnSully 2457b11fff Merge pull request #9 from 0xflotus/patch-1
fixed guarantees

Former-commit-id: 7f95ef85247e06fced1ff2479c7ba1615d7c239b
2019-03-13 12:22:29 -04:00
0xflotus c7e86106df fixed guarantees
Former-commit-id: 0e86d6fdcdda24f5b92d0273c93fbb4471447cfd
2019-03-13 15:14:34 +01:00
JohnSully 58c8eb21c1 Update README.md
Former-commit-id: aa2f3b703e3f7af56586fb3c7965cd0a9aa4ad2d
2019-03-12 14:38:03 -04:00
JohnSully b3e46026b7 formatting fixes
Former-commit-id: e3f236f6bb42550b139a141821cbfcecd1000978
2019-03-12 00:59:28 -04:00
JohnSully c11af651f2 Add charts to readme
Hotlink from medium, hope they don't mind.

Former-commit-id: 74bab0e9a63de2d9689638712f5b726fd543de3f
2019-03-12 00:55:03 -04:00
John Sully 423ab5f78f Merge branch 'unstable' of https://github.com/JohnSully/redis2 into RELEASE_0_9
Former-commit-id: 4ebca64accd8738c73ef8c05c66e0de1d35391fd
2019-03-11 20:54:14 -04:00
John Sully 3dcb767431 Werror is good for me, but not for people compiling on other compilers
Former-commit-id: 690f788ec3ecf1ecdc5a62171590ceecbe2a0391
2019-03-11 20:53:57 -04:00
JohnSully ddeb29f362 Explain how multithreading works
Former-commit-id: 470e9d3ba0b90bab43f664bc66e1fbae9d2b2c96
2019-03-11 20:37:57 -04:00
JohnSully f472e3fba4 Update README.md
Former-commit-id: 775ab46cd694f9705ca7999f05c55878dad89fb4
2019-03-11 19:38:20 -04:00
John Sully 6e4dee9687 Make storage.h C++ safe
Former-commit-id: 6bf67d298968b28481d09f244951630dc44c92a7
2019-03-09 13:42:08 -05:00
John Sully d2e0c2ef1a sizeof is too big
Former-commit-id: 78e43a4b439576f451ad120bef337bdb8980c0f2
2019-03-09 13:41:49 -05:00
John Sully 6f2f0c8d72 bump version
Former-commit-id: 46707e2bdc2836955d276e28439add47166dbe75
2019-03-07 19:13:59 -05:00
John Sully 90f358a03d Merge branch 'unstable' into RELEASE_0_9
Former-commit-id: c6f1b7c1177fed320f64928f209da4398fd4493a
2019-03-07 19:13:33 -05:00
John Sully 538df67ba9 Module threading fixes
Former-commit-id: 6e830e357135b02aef47e90fafcad9b08684a111
2019-03-07 19:13:01 -05:00
John Sully e82dafa276 Merge branch 'unstable' into RELEASE_0_9
Former-commit-id: c31d512debcc9ea6fe21f60743e62d3aa8572b8e
2019-03-06 16:39:15 -05:00
John Sully 34dcc23556 Limit server-threads to cores in the machine
Former-commit-id: 80175ff059662f0b72eaabaf4328c801c8f379d9
2019-03-06 16:39:02 -05:00
John Sully 3a22280da6 port server.c to server.cpp
Former-commit-id: a6d25b92df52e436e5cf8c23ecc258f68abda00f
2019-03-06 16:29:30 -05:00
John Sully 5bba6cd4f0 Set version
Former-commit-id: 10e7adc4286f454e9c2a53a7959728716b239968
2019-03-06 15:25:28 -05:00
John Sully 1364c71cb9 Don't send replies to slaves after we've queued them to be closed
Former-commit-id: 3ca5ceeed4419b5ddb8bf4a1a3553ef17c1bb8e6
2019-03-06 15:21:05 -05:00
John Sully 04d7bb8352 defer free
Former-commit-id: fcf2ce17fd049269c822b1a3bcb24d4566ae5776
2019-03-05 15:46:19 -05:00
John Sully 8291a3b761 Fix crash with paused clients (accessed when global lock is not acquired)
Former-commit-id: 713f1d98a73e85a5899cf1b2bae56d3f4500e0c9
2019-03-03 22:24:12 -05:00
John Sully f59cbeb37f Crash in Memory Doctor when all clients are slaves
Former-commit-id: acf69818fee53f1d1c37211819e9cd1b7c1bde5a
2019-03-03 13:56:47 -05:00
John Sully 0065113cf0 Fix issue #2, check posix return values
Former-commit-id: fbfec97ccdae8399ddd593e32bd1dd510718d0c6
2019-03-02 20:43:03 -05:00
John Sully ade064cb28 sds copies uninitialized data wasting time for everyone
Former-commit-id: fa7b8863924f97e2e708a9b7f832bc01219fd17a
2019-03-02 19:27:52 -05:00
John Sully eb5cd9cba6 Merge branch 'unstable' of https://github.com/antirez/redis into unstable
We want that awesome multithreaded benchmark


Former-commit-id: 97234040674f82a3c948b1151b3af9935ee950e6
2019-03-02 18:07:18 -05:00
John Sully de96c777f8 write fastlock_unlock in ASM... because its faster
Former-commit-id: 70bf74835f3c06ed0ad6abb92a7ab8826ee2fade
2019-03-02 16:47:27 -05:00
John Sully 6a2952102c Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: 535b158b637aa83bd95d9a1df28bb1a58a571922
2019-03-01 16:40:20 -05:00
John Sully 67d291ce06 tighten up the spinlock loop, and some other bikeshedding
Former-commit-id: 605cc93caaae97bbb4beb6ef7e5b5c4e7c1c063b
2019-03-01 13:29:21 -05:00
John Sully 4b8e69093f remove unnecessary logs
Former-commit-id: 47415c39882918ef2e83ed6ac087e5efef50215b
2019-02-28 13:57:58 -05:00
JohnSully fba69489d8 Update README.md
Former-commit-id: ab0365eaad85fd627a2da7f5b86527abfb526f58
2019-02-26 15:16:46 -05:00
John Sully e4041e18c9 Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: 24b0ad6baa299cc79e62c379e038d911efa4e681
2019-02-26 15:14:50 -05:00
John Sully 5257f22e7f Thread affinity feature (default disabled)
Former-commit-id: edb5b93d5b33c68a466cd53459d912343a4a1bf8
2019-02-26 15:14:35 -05:00
JohnSully 539555b7b0 Link to detailed benchmarking results and methodology.
Former-commit-id: f6790c39c8486041d15ea60735725f2f24506edd
2019-02-26 15:11:25 -05:00
JohnSully b0bfd7adb0 More fine tuning help. Hopefully we can automate this.
Former-commit-id: c3517a8070f15611c8198e4a652fd5e6cf147646
2019-02-26 03:30:37 -05:00
JohnSully fb05d4f84d Update benchmarking notes.
Former-commit-id: 147acabffbd7b4a582202d88521aa4bfe06f271d
2019-02-26 02:30:03 -05:00
John Sully 2a61d348e4 test code shouldn't be commited
Former-commit-id: 26eaee03cea28666b905fd137aa51d926d28b955
2019-02-26 00:21:37 -05:00
John Sully 07f64657e6 Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: c6320904c90678df4b5782c0953f8b63d1e3ca2a
2019-02-26 00:20:11 -05:00
John Sully 257429ad00 writes shouldn't be under the global lock
Former-commit-id: d35a80076aaf8ed241cbf689afdbfd8875d234f1
2019-02-26 00:19:38 -05:00
John Sully 2967d7e923 Option to disable ASM spinlock
Former-commit-id: 2fa1b112df7ffdf3a3881cd127f83f97b08a45f2
2019-02-26 00:00:04 -05:00
John Sully c3968ba459 Fix build break
Former-commit-id: 0aeaae654a01f6ba733d408e44cbc9523778835c
2019-02-26 01:10:07 +00:00
John Sully 20c1d65195 Rewrite our spinlock in assembly, pretty big performance improvement
Former-commit-id: b3c59d926ffb270f77c5b890d0ff365a8417b370
2019-02-25 18:21:27 -05:00
JohnSully 860afe02bd Formatting (more)
Former-commit-id: 15b4a0ec337386e209e646429fe1d907cf5fd484
2019-02-23 03:08:24 -05:00
John Sully e0eddee39b Update copyright to include additional authorship
Former-commit-id: 0f933b341046ffe9870d77d9003717d12ee2c1f2
2019-02-23 02:27:19 -05:00
John Sully 472b2f3a5b Merge branch 'unstable' of https://github.com/JohnSully/redis2 into unstable
Former-commit-id: 1a56dc2948d93391113e8e4180372457471f3b05
2019-02-23 02:25:00 -05:00
John Sully 9492019b61 Merge branch 'Multithread' into unstable
Former-commit-id: 6451edd213d7f2140be9ebc128270eef874b63f3
2019-02-23 02:24:23 -05:00
JohnSully ad78760cff More edits
Former-commit-id: 78a28466aec1a667733ed5b85ee5e6b29066adf3
2019-02-23 01:48:05 -05:00
JohnSully 30d172c9e0 type
Former-commit-id: 4caaaa351b121a14c3b64d28aa6a9393c3be4164
2019-02-23 01:33:27 -05:00
JohnSully cf450a71fd Formatting
Former-commit-id: 975d7226a2902fa1e6db0d8c2f63071b51357df2
2019-02-23 01:32:50 -05:00
JohnSully 2c69ea377f Initial rewrite of Readme
Former-commit-id: 779d053e5d764bb9cbe1b841bff455424d4d3e5a
2019-02-23 01:28:44 -05:00
John Sully ceb64cd9af Fastlock fixes
Former-commit-id: 79692749551e25ddf89590652bfae7de2440faf6
2019-02-10 22:00:19 -05:00
John Sully cdf373825b move ae to C++
Former-commit-id: 092d0fc3fcd21bbd4cde945ccee32196ceb4d5d6
2019-02-10 20:24:11 -05:00
John Sully e230855554 Keep pool allocator up to date (even though we aren't enabling it)
Former-commit-id: fd7389ed0ed3d502e56179ed5e6c91833a980ec0
2019-02-10 19:33:07 -05:00
John Sully 0c36b7be49 Prevent so many copies of sdslen getting added
Former-commit-id: 7ad943c9f7af5cbdf7150324cfea736458d8277f
2019-02-10 19:31:46 -05:00
John Sully df20ddc444 Performance enhancements!
Former-commit-id: ee19012f96c01834713cd903dc82c71839c5d279
2019-02-09 13:05:06 -05:00
John Sully 88638b1c72 Reduce memory usage for in place strings by 8 bytes
Former-commit-id: c65045b639913afe088d1e2f47d760d323a6d53f
2019-02-09 13:04:18 -05:00
John Sully 0411a1b87e complete rebranding with tests passing
Former-commit-id: 1a90d294fce94e1d8905df28e4922609c4b5b8df
2019-02-09 10:11:46 -05:00
John Sully bacbf3a13e Fix bug where we try to load a database with no name
Former-commit-id: 8c6b4e9af4d49cf8999992c856d64aa3ab20f30c
2019-02-09 07:56:45 -05:00
John Sully 897ac7e956 remove Redis branding
Former-commit-id: fe86a507d2bbefbf705f1318f36d27a445016948
2019-02-08 17:56:32 -05:00
John Sully a74a7c2629 Support AWS S3 saving via the s3 cli tools
Former-commit-id: b2fae6707411fdb2e14684ee2892f85d3edcd1b7
2019-02-06 01:06:48 -05:00
John Sully d0a713aca2 Merge branch 'unstable' of https://github.com/antirez/redis into unstable
Former-commit-id: e9d15233dee4b1cb4b20325ab1ff8d1836ad0a13
2019-02-06 00:09:39 -05:00
John Sully bc4a0de024 Make main headers C++ safe, and change rdb to use file descriptor instead of FILE pointer
Former-commit-id: 9830785eb415f7671e823569c6d5314656d75e6f
2019-02-05 23:36:40 -05:00
John Sully 4e98e1f289 complete malloc memory class work, and pass tests
Former-commit-id: 0b93f6ccb86564317809273b5c73c81c3b385158
2019-02-04 16:56:13 -05:00
John Sully 921488398f Properly integrate memkind
Former-commit-id: 11b067329438dcea2a02f5482962e78582a91ea7
2019-02-01 15:21:00 -05:00
John Sully 629c096da4 Merge commit '09a263e6076b3fd0fe3b094a2bfad7f93fc997d6' as 'deps/memkind/src'
Former-commit-id: 7758c643692be25c17573e67acc17d31c4234bd7
2019-02-01 14:45:39 -05:00
John Sully 7a7236749d template config
Former-commit-id: 0a2e59c9c179060361585a0f3d81d31563520bd4
2019-02-01 14:01:35 -05:00
John Sully 29c5308396 Support configurable file backed scratch
Former-commit-id: 156419641a1ad54da45b45c6213198b669bd9da8
2019-02-01 13:54:59 -05:00
John Sully 494b359d81 crash fixes
Former-commit-id: 2f71096389ef2a5122248529206a80e4a47de673
2019-01-30 01:15:10 -05:00
John Sully 5ea2ee209a Custom flash heap
Former-commit-id: d9fdd4ebe86633a73d995d7a0910f3f1ca133cdb
2019-01-29 18:10:46 -05:00
1522 changed files with 612 additions and 483046 deletions

No files matched your search

+18 -23
View File
@@ -8,52 +8,40 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: make
run: |
sudo apt-get update
sudo apt-get -y remove libzstd || true
sudo apt-get -y install uuid-dev libcurl4-openssl-dev libbz2-dev zlib1g-dev libsnappy-dev liblz4-dev libzstd-dev libgflags-dev
make BUILD_TLS=yes -j2 KEYDB_CFLAGS='-Werror' KEYDB_CXXFLAGS='-Werror'
sudo apt-get -y install uuid-dev libcurl4-openssl-dev
make KEYDB_CFLAGS='-Werror' KEYDB_CXXFLAGS='-Werror' BUILD_TLS=yes -j2
- name: gen-cert
run: ./utils/gen-test-certs.sh
- name: test-tls
run: |
sudo apt-get -y install tcl tcl-tls
./runtest --clients 1 --verbose --tls --config server-threads 3
./runtest --clients 2 --verbose --tls
- name: cluster-test
run: |
./runtest-cluster --tls --config server-threads 3
./runtest-cluster --tls
- name: sentinel test
run: |
./runtest-sentinel
- name: module tests
run: |
./runtest-moduleapi
- name: rotation test
run: |
./runtest-rotation
build-ubuntu-old:
runs-on: ubuntu-20.04
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- uses: actions/checkout@v1
- name: make -j2
run: |
sudo apt-get update
sudo apt-get -y remove libzstd || true
sudo apt-get -y install uuid-dev libcurl4-openssl-dev libbz2-dev zlib1g-dev libsnappy-dev liblz4-dev libzstd-dev libgflags-dev
sudo apt-get -y install uuid-dev libcurl4-openssl-dev
make -j2
build-macos-latest:
runs-on: macos-latest
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: make
run: make KEYDB_CFLAGS='-Werror' KEYDB_CXXFLAGS='-Werror' -j2
@@ -61,11 +49,18 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: recursive
- name: make
run: |
sudo apt-get update
sudo apt-get -y remove libzstd || true
sudo apt-get -y install uuid-dev libcurl4-openssl-dev libbz2-dev zlib1g-dev libsnappy-dev liblz4-dev libzstd-dev libgflags-dev
sudo apt-get -y install uuid-dev libcurl4-openssl-dev
make KEYDB_CFLAGS='-Werror' KEYDB_CXXFLAGS='-Werror' MALLOC=libc -j2
build-ubuntu-32bit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: make
run: |
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get -y install gcc-multilib g++-multilib libc6-dev-i386 lib32z1 uuid-dev:i386 libcurl4-openssl-dev:i386
make KEYDB_CFLAGS='-Werror' KEYDB_CXXFLAGS='-Werror' 32bit -j2
+3
View File
@@ -1,3 +1,6 @@
[submodule "deps/rocksdb"]
path = deps/rocksdb
url = https://github.com/facebook/rocksdb.git
[submodule "deps/depot_tools"]
path = deps/depot_tools
url = https://chromium.googlesource.com/chromium/tools/depot_tools.git
+4 -4
View File
@@ -4,7 +4,7 @@
##### KeyDB is now a part of Snap Inc! Check out the announcement [here](https://docs.keydb.dev/news/2022/05/12/keydb-joins-snap)
##### [Release v6.3.0](https://github.com/EQ-Alpha/KeyDB/releases/tag/v6.3.0) is here with major improvements as we consolidate our Open Source and Enterprise offerings into a single BSD-3 licensed project. See our [roadmap](https://docs.keydb.dev/docs/coming-soon) for details.
##### [Release v6.3.0](https://github.com/EQ-Alpha/KeyDB/releases/tag/v6.3.0) is here with major improvements as we consolodate our Open Source and Enterprise offerings into a single BSD-3 licensed project. See our [roadmap](https://docs.keydb.dev/docs/coming-soon) for details.
##### Want to extend KeyDB with Javascript? Try [ModJS](https://github.com/JohnSully/ModJS)
@@ -37,7 +37,7 @@ Because of this difference of opinion features which are right for KeyDB may not
Project Support
-------------------
The KeyDB team maintains this project as part of Snap Inc. KeyDB is used by Snap as part of its caching infrastructure and is fully open sourced. There is no separate commercial product and no paid support options available. We really value collaborating with the open source community and welcome PRs, bug reports, and open discussion. For community support or to get involved further with the project check out our community support options [here](https://docs.keydb.dev/docs/support) (slack, forum, meetup, github issues). Our team monitors these channels regularly.
The KeyDB team maintains this project as part of Snap Inc. KeyDB is used by Snap as part of its caching infrastructure and is fully open sourced. There is no separate commercial product and no paid support options available. We really value collaborating with the open source community and welcome PRs, bug reports, and open discussion. For community support or to get involved further with the project check out our community support options [here](https://docs.keydb.dev/docs/support) (slack, forum, meetup, github issues). Our team monitors these channlels regularly.
Additional Resources
@@ -141,9 +141,9 @@ To append a suffix to KeyDB program names, use:
***Note that the following dependencies may be needed:
% sudo apt-get install autoconf autotools-dev libnuma-dev libtool
KeyDB by default is built with TLS enabled. To build without TLS support, use:
To buik=ld with TLS support, use:
% make BUILD_TLS=no
% make BUILD_TLS=yes
Running the tests with TLS enabled (you will need `tcl-tls`
installed):
+1 -1
View File
@@ -95,7 +95,7 @@ JEMALLOC_LDFLAGS= $(LDFLAGS)
jemalloc: .make-prerequisites
@printf '%b %b\n' $(MAKECOLOR)MAKE$(ENDCOLOR) $(BINCOLOR)$@$(ENDCOLOR)
cd jemalloc && ./configure --with-version=5.2.1-0-g0 --with-lg-quantum=3 --disable-cxx CFLAGS="$(JEMALLOC_CFLAGS)" LDFLAGS="$(JEMALLOC_LDFLAGS)"
cd jemalloc && ./configure --with-version=5.2.1-0-g0 --with-lg-quantum=3 --with-jemalloc-prefix=je_ --disable-cxx CFLAGS="$(JEMALLOC_CFLAGS)" LDFLAGS="$(JEMALLOC_LDFLAGS)"
cd jemalloc && $(MAKE) CFLAGS="$(JEMALLOC_CFLAGS)" LDFLAGS="$(JEMALLOC_LDFLAGS)" lib/libjemalloc.a
.PHONY: jemalloc
Vendored Submodule
+1
Submodule deps/rocksdb added at e3169e3ea8.
-5
View File
@@ -1,5 +0,0 @@
# Complete list of style options can be found at:
# http://clang.llvm.org/docs/ClangFormatStyleOptions.html
---
BasedOnStyle: Google
...
-81
View File
@@ -1,81 +0,0 @@
make_config.mk
*.a
*.arc
*.d
*.dylib*
*.gcda
*.gcno
*.o
*.so
*.so.*
*_test
*_bench
*_stress
*.out
*.class
*.jar
*.*jnilib*
*.d-e
*.o-*
*.swp
*~
*.vcxproj
*.vcxproj.filters
*.sln
*.cmake
.watchmanconfig
CMakeCache.txt
CMakeFiles/
build/
ldb
manifest_dump
sst_dump
blob_dump
block_cache_trace_analyzer
tools/block_cache_analyzer/*.pyc
column_aware_encoding_exp
util/build_version.cc
build_tools/VALGRIND_LOGS/
coverage/COVERAGE_REPORT
.gdbhistory
.gdb_history
package/
unity.a
tags
etags
rocksdb_dump
rocksdb_undump
db_test2
trace_analyzer
trace_analyzer_test
block_cache_trace_analyzer
.DS_Store
java/out
java/target
java/test-libs
java/*.log
java/include/org_rocksdb_*.h
.idea/
*.iml
rocksdb.cc
rocksdb.h
unity.cc
java/crossbuild/.vagrant
.vagrant/
java/**/*.asc
java/javadoc
scan_build_report/
t
LOG
db_logs/
tp2/
fbcode/
fbcode
buckifier/*.pyc
-4
View File
@@ -1,4 +0,0 @@
extraction:
cpp:
index:
build_command: make static_lib
-126
View File
@@ -1,126 +0,0 @@
dist: xenial
language: cpp
os:
- linux
- osx
compiler:
- clang
- gcc
osx_image: xcode8.3
jdk:
- openjdk7
cache:
- ccache
- apt
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- curl
- g++-8
- libbz2-dev
- libgflags-dev
- libsnappy-dev
- mingw-w64
- zlib1g-dev
env:
- TEST_GROUP=platform_dependent # 16-18 minutes
- TEST_GROUP=1 # 33-35 minutes
- TEST_GROUP=2 # 18-20 minutes
- TEST_GROUP=3 # 20-22 minutes
- TEST_GROUP=4 # 12-14 minutes
# Run java tests
- JOB_NAME=java_test # 4-11 minutes
# Build ROCKSDB_LITE
- JOB_NAME=lite_build # 3-4 minutes
# Build examples
- JOB_NAME=examples # 5-7 minutes
- JOB_NAME=cmake # 3-5 minutes
- JOB_NAME=cmake-gcc8 # 3-5 minutes
- JOB_NAME=cmake-mingw # 3 minutes
matrix:
exclude:
- os: osx
env: TEST_GROUP=1
- os: osx
env: TEST_GROUP=2
- os: osx
env: TEST_GROUP=3
- os: osx
env: TEST_GROUP=4
- os: osx
env: JOB_NAME=cmake-gcc8
- os : osx
env: JOB_NAME=cmake-mingw
- os : linux
compiler: clang
- os : osx
compiler: gcc
# https://docs.travis-ci.com/user/caching/#ccache-cache
install:
- if [ "${TRAVIS_OS_NAME}" == osx ]; then
brew install ccache zstd lz4 snappy xz;
PATH=$PATH:/usr/local/opt/ccache/libexec;
fi
- if [ "${JOB_NAME}" == cmake-gcc8 ]; then
CC=gcc-8 && CXX=g++-8;
fi
- if [[ "${JOB_NAME}" == cmake* ]] && [ "${TRAVIS_OS_NAME}" == linux ]; then
mkdir cmake-dist && curl -sfSL https://github.com/Kitware/CMake/releases/download/v3.14.5/cmake-3.14.5-Linux-x86_64.tar.gz | tar --strip-components=1 -C cmake-dist -xz && export PATH=$PWD/cmake-dist/bin:$PATH;
fi
- if [[ "${JOB_NAME}" == java_test ]]; then
java -version && echo "JAVA_HOME=${JAVA_HOME}";
fi
before_script:
# Increase the maximum number of open file descriptors, since some tests use
# more FDs than the default limit.
- ulimit -n 8192
script:
- ${CXX} --version
- if [ `command -v ccache` ]; then ccache -C; fi
- case $TEST_GROUP in
platform_dependent)
OPT=-DTRAVIS V=1 ROCKSDBTESTS_END=db_block_cache_test make -j4 all_but_some_tests check_some
;;
1)
OPT=-DTRAVIS V=1 ROCKSDBTESTS_START=db_block_cache_test ROCKSDBTESTS_END=full_filter_block_test make -j4 check_some
;;
2)
OPT=-DTRAVIS V=1 make -j4 tools && OPT=-DTRAVIS V=1 ROCKSDBTESTS_START=full_filter_block_test ROCKSDBTESTS_END=write_batch_with_index_test make -j4 check_some
;;
3)
OPT=-DTRAVIS V=1 ROCKSDBTESTS_START=write_batch_with_index_test ROCKSDBTESTS_END=write_prepared_transaction_test make -j4 check_some
;;
4)
OPT=-DTRAVIS V=1 ROCKSDBTESTS_START=write_prepared_transaction_test make -j4 check_some
;;
esac
- case $JOB_NAME in
java_test)
OPT=-DTRAVIS V=1 make rocksdbjava jtest
;;
lite_build)
OPT='-DTRAVIS -DROCKSDB_LITE' V=1 make -j4 static_lib tools
;;
examples)
OPT=-DTRAVIS V=1 make -j4 static_lib && cd examples && make -j4
;;
cmake-mingw)
sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix;
mkdir build && cd build && cmake -DJNI=1 .. -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-g++ -DCMAKE_SYSTEM_NAME=Windows && make -j4 rocksdb rocksdbjni
;;
cmake*)
mkdir build && cd build && cmake -DJNI=1 .. -DCMAKE_BUILD_TYPE=Release && make -j4 rocksdb rocksdbjni
;;
esac
notifications:
email:
- leveldb@fb.com
webhooks:
- https://buildtimetrend.herokuapp.com/travis
-12
View File
@@ -1,12 +0,0 @@
Facebook Inc.
Facebook Engineering Team
Google Inc.
# Initial version authors:
Jeffrey Dean <jeff@google.com>
Sanjay Ghemawat <sanjay@google.com>
# Partial list of contributors:
Kevin Regan <kevin.d.regan@gmail.com>
Johan Bilien <jobi@litl.com>
Matthew Von-Maszewski <https://github.com/matthewvon> (Basho Technologies)
-1107
View File
File diff suppressed because it is too large. Load diff
-3
View File
@@ -1,3 +0,0 @@
# Code of Conduct
Facebook has adopted a Code of Conduct that we expect project participants to adhere to. Please [read the full text](https://code.facebook.com/codeofconduct) so that you can understand what actions will and will not be tolerated.
-17
View File
@@ -1,17 +0,0 @@
# Contributing to RocksDB
## Code of Conduct
The code of conduct is described in [`CODE_OF_CONDUCT.md`](CODE_OF_CONDUCT.md)
## Contributor License Agreement ("CLA")
In order to accept your pull request, we need you to submit a CLA. You
only need to do this once, so if you've done this for another Facebook
open source project, you're good to go. If you are submitting a pull
request for the first time, just let us know that you have completed
the CLA and we can cross-check with your GitHub username.
Complete your CLA here: <https://code.facebook.com/cla>
If you prefer to sign a paper copy, we can send you a PDF. Send us an
e-mail or create a new github issue to request the CLA in PDF format.
-339
View File
@@ -1,339 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
-24
View File
@@ -1,24 +0,0 @@
# RocksDB default options change log
## Unreleased
* delayed_write_rate takes the rate given by rate_limiter if not specified.
## 5.2
* Change the default of delayed slowdown value to 16MB/s and further increase the L0 stop condition to 36 files.
## 5.0 (11/17/2016)
* Options::allow_concurrent_memtable_write and Options::enable_write_thread_adaptive_yield are now true by default
* Options.level0_stop_writes_trigger default value changes from 24 to 32.
## 4.8.0 (5/2/2016)
* options.max_open_files changes from 5000 to -1. It improves performance, but users need to set file descriptor limit to be large enough and watch memory usage for index and bloom filters.
* options.base_background_compactions changes from max_background_compactions to 1. When users set higher max_background_compactions but the write throughput is not high, the writes are less spiky to disks.
* options.wal_recovery_mode changes from kTolerateCorruptedTailRecords to kPointInTimeRecovery. Avoid some false positive when file system or hardware reorder the writes for file data and metadata.
## 4.7.0 (4/8/2016)
* options.write_buffer_size changes from 4MB to 64MB.
* options.target_file_size_base changes from 2MB to 64MB.
* options.max_bytes_for_level_base changes from 10MB to 256MB.
* options.soft_pending_compaction_bytes_limit changes from 0 (disabled) to 64GB.
* options.hard_pending_compaction_bytes_limit changes from 0 (disabled) to 256GB.
* table_cache_numshardbits changes from 4 to 6.
* max_file_opening_threads changes from 1 to 16.
-16
View File
@@ -1,16 +0,0 @@
## RocksDB dump format
The version 1 RocksDB dump format is fairly simple:
1) The dump starts with the magic 8 byte identifier "ROCKDUMP"
2) The magic is followed by an 8 byte big-endian version which is 0x00000001.
3) Next are arbitrarily sized chunks of bytes prepended by 4 byte little endian number indicating how large each chunk is.
4) The first chunk is special and is a json string indicating some things about the creation of this dump. It contains the following keys:
* database-path: The path of the database this dump was created from.
* hostname: The hostname of the machine where the dump was created.
* creation-time: Unix seconds since epoc when this dump was created.
5) Following the info dump the slices paired into are key/value pairs.
-990
View File
@@ -1,990 +0,0 @@
# Rocksdb Change Log
## 6.4.6 (10/16/2019)
### Bug Fixes
* Fix a bug when partitioned filters and prefix search are used in conjunction, ::SeekForPrev could return invalid for an existing prefix. ::SeekForPrev might be called by the user, or internally on ::Prev, or within ::Seek if the return value involves Delete or a Merge operand.
## 6.4.5 (10/1/2019)
### Bug Fixes
* Revert the feature "Merging iterator to avoid child iterator reseek for some cases (#5286)" since it might cause strange results when reseek happens with a different iterator upper bound.
* Fix a bug in BlockBasedTableIterator that might return incorrect results when reseek happens with a different iterator upper bound.
## 6.4.4 (9/17/2019)
* Fix a bug introduced 6.3 which could cause wrong results in a corner case when prefix bloom filter is used and the iterator is reseeked.
## 6.4.2 (9/3/2019)
### Bug Fixes
* Fix a bug in file ingestion caused by incorrect file number allocation when the number of column families involved in the ingestion exceeds 2.
## 6.4.1 (8/20/2019)
### Bug Fixes
* Fix a bug where the compaction snapshot refresh feature is not disabled as advertised when `snap_refresh_nanos` is set to 0..
## 6.4.0 (7/30/2019)
### Default Option Change
* LRUCacheOptions.high_pri_pool_ratio is set to 0.5 (previously 0.0) by default, which means that by default midpoint insertion is enabled. The same change is made for the default value of high_pri_pool_ratio argument in NewLRUCache(). When block cache is not explictly created, the small block cache created by BlockBasedTable will still has this option to be 0.0.
* Change BlockBasedTableOptions.cache_index_and_filter_blocks_with_high_priority's default value from false to true.
### Public API Change
* Filter and compression dictionary blocks are now handled similarly to data blocks with regards to the block cache: instead of storing objects in the cache, only the blocks themselves are cached. In addition, filter and compression dictionary blocks (as well as filter partitions) no longer get evicted from the cache when a table is closed.
* Due to the above refactoring, block cache eviction statistics for filter and compression dictionary blocks are temporarily broken. We plan to reintroduce them in a later phase.
* The semantics of the per-block-type block read counts in the performance context now match those of the generic block_read_count.
* Errors related to the retrieval of the compression dictionary are now propagated to the user.
* db_bench adds a "benchmark" stats_history, which prints out the whole stats history.
* Overload GetAllKeyVersions() to support non-default column family.
* Added new APIs ExportColumnFamily() and CreateColumnFamilyWithImport() to support export and import of a Column Family. https://github.com/facebook/rocksdb/issues/3469
* ldb sometimes uses a string-append merge operator if no merge operator is passed in. This is to allow users to print keys from a DB with a merge operator.
* Replaces old Registra with ObjectRegistry to allow user to create custom object from string, also add LoadEnv() to Env.
* Added new overload of GetApproximateSizes which gets SizeApproximationOptions object and returns a Status. The older overloads are redirecting their calls to this new method and no longer assert if the include_flags doesn't have either of INCLUDE_MEMTABLES or INCLUDE_FILES bits set. It's recommended to use the new method only, as it is more type safe and returns a meaningful status in case of errors.
### New Features
* Add argument `--secondary_path` to ldb to open the database as the secondary instance. This would keep the original DB intact.
* Compression dictionary blocks are now prefetched and pinned in the cache (based on the customer's settings) the same way as index and filter blocks.
* Added DBOptions::log_readahead_size which specifies the number of bytes to prefetch when reading the log. This is mostly useful for reading a remotely located log, as it can save the number of round-trips. If 0 (default), then the prefetching is disabled.
* Support loading custom objects in unit tests. In the affected unit tests, RocksDB will create custom Env objects based on environment variable TEST_ENV_URI. Users need to make sure custom object types are properly registered. For example, a static library should expose a `RegisterCustomObjects` function. By linking the unit test binary with the static library, the unit test can execute this function.
### Performance Improvements
* Reduce iterator key comparision for upper/lower bound check.
* Improve performance of row_cache: make reads with newer snapshots than data in an SST file share the same cache key, except in some transaction cases.
* The compression dictionary is no longer copied to a new object upon retrieval.
### Bug Fixes
* Fix ingested file and directory not being fsync.
* Return TryAgain status in place of Corruption when new tail is not visible to TransactionLogIterator.
* Fixed a regression where the fill_cache read option also affected index blocks.
* Fixed an issue where using cache_index_and_filter_blocks==false affected partitions of partitioned indexes/filters as well.
## 6.3.1 (7/24/2019)
### Bug Fixes
* Fix auto rolling bug introduced in 6.3.0, which causes segfault if log file creation fails.
## 6.3.0 (6/18/2019)
### Public API Change
* Now DB::Close() will return Aborted() error when there is unreleased snapshot. Users can retry after all snapshots are released.
* Index blocks are now handled similarly to data blocks with regards to the block cache: instead of storing objects in the cache, only the blocks themselves are cached. In addition, index blocks no longer get evicted from the cache when a table is closed, can now use the compressed block cache (if any), and can be shared among multiple table readers.
* Partitions of partitioned indexes no longer affect the read amplification statistics.
* Due to the above refactoring, block cache eviction statistics for indexes are temporarily broken. We plan to reintroduce them in a later phase.
* options.keep_log_file_num will be enforced strictly all the time. File names of all log files will be tracked, which may take significantly amount of memory if options.keep_log_file_num is large and either of options.max_log_file_size or options.log_file_time_to_roll is set.
* Add initial support for Get/Put with user timestamps. Users can specify timestamps via ReadOptions and WriteOptions when calling DB::Get and DB::Put.
* Accessing a partition of a partitioned filter or index through a pinned reference is no longer considered a cache hit.
* Add C bindings for secondary instance, i.e. DBImplSecondary.
* Rate limited deletion of WALs is only enabled if DBOptions::wal_dir is not set, or explicitly set to db_name passed to DB::Open and DBOptions::db_paths is empty, or same as db_paths[0].path
### New Features
* Add an option `snap_refresh_nanos` (default to 0) to periodically refresh the snapshot list in compaction jobs. Assign to 0 to disable the feature.
* Add an option `unordered_write` which trades snapshot guarantees with higher write throughput. When used with WRITE_PREPARED transactions with two_write_queues=true, it offers higher throughput with however no compromise on guarantees.
* Allow DBImplSecondary to remove memtables with obsolete data after replaying MANIFEST and WAL.
* Add an option `failed_move_fall_back_to_copy` (default is true) for external SST ingestion. When `move_files` is true and hard link fails, ingestion falls back to copy if `failed_move_fall_back_to_copy` is true. Otherwise, ingestion reports an error.
### Performance Improvements
* Reduce binary search when iterator reseek into the same data block.
* DBIter::Next() can skip user key checking if previous entry's seqnum is 0.
* Merging iterator to avoid child iterator reseek for some cases
* Log Writer will flush after finishing the whole record, rather than a fragment.
* Lower MultiGet batching API latency by reading data blocks from disk in parallel
### General Improvements
* Added new status code kColumnFamilyDropped to distinguish between Column Family Dropped and DB Shutdown in progress.
* Improve ColumnFamilyOptions validation when creating a new column family.
### Bug Fixes
* Fix a bug in WAL replay of secondary instance by skipping write batches with older sequence numbers than the current last sequence number.
* Fix flush's/compaction's merge processing logic which allowed `Put`s covered by range tombstones to reappear. Note `Put`s may exist even if the user only ever called `Merge()` due to an internal conversion during compaction to the bottommost level.
* Fix/improve memtable earliest sequence assignment and WAL replay so that WAL entries of unflushed column families will not be skipped after replaying the MANIFEST and increasing db sequence due to another flushed/compacted column family.
* Fix a bug caused by secondary not skipping the beginning of new MANIFEST.
* On DB open, delete WAL trash files left behind in wal_dir
## 6.2.0 (4/30/2019)
### New Features
* Add an option `strict_bytes_per_sync` that causes a file-writing thread to block rather than exceed the limit on bytes pending writeback specified by `bytes_per_sync` or `wal_bytes_per_sync`.
* Improve range scan performance by avoiding per-key upper bound check in BlockBasedTableIterator.
* Introduce Periodic Compaction for Level style compaction. Files are re-compacted periodically and put in the same level.
* Block-based table index now contains exact highest key in the file, rather than an upper bound. This may improve Get() and iterator Seek() performance in some situations, especially when direct IO is enabled and block cache is disabled. A setting BlockBasedTableOptions::index_shortening is introduced to control this behavior. Set it to kShortenSeparatorsAndSuccessor to get the old behavior.
* When reading from option file/string/map, customized envs can be filled according to object registry.
* Improve range scan performance when using explicit user readahead by not creating new table readers for every iterator.
* Add index type BlockBasedTableOptions::IndexType::kBinarySearchWithFirstKey. It significantly reduces read amplification in some setups, especially for iterator seeks. It's not fully implemented yet: IO errors are not handled right.
### Public API Change
* Change the behavior of OptimizeForPointLookup(): move away from hash-based block-based-table index, and use whole key memtable filtering.
* Change the behavior of OptimizeForSmallDb(): use a 16MB block cache, put index and filter blocks into it, and cost the memtable size to it. DBOptions.OptimizeForSmallDb() and ColumnFamilyOptions.OptimizeForSmallDb() start to take an optional cache object.
* Added BottommostLevelCompaction::kForceOptimized to avoid double compacting newly compacted files in the bottommost level compaction of manual compaction. Note this option may prohibit the manual compaction to produce a single file in the bottommost level.
### Bug Fixes
* Adjust WriteBufferManager's dummy entry size to block cache from 1MB to 256KB.
* Fix a race condition between WritePrepared::Get and ::Put with duplicate keys.
* Fix crash when memtable prefix bloom is enabled and read/write a key out of domain of prefix extractor.
* Close a WAL file before another thread deletes it.
* Fix an assertion failure `IsFlushPending() == true` caused by one bg thread releasing the db mutex in ~ColumnFamilyData and another thread clearing `flush_requested_` flag.
## 6.1.1 (4/9/2019)
### New Features
* When reading from option file/string/map, customized comparators and/or merge operators can be filled according to object registry.
### Public API Change
### Bug Fixes
* Fix a bug in 2PC where a sequence of txn prepare, memtable flush, and crash could result in losing the prepared transaction.
* Fix a bug in Encryption Env which could cause encrypted files to be read beyond file boundaries.
## 6.1.0 (3/27/2019)
### New Features
* Introduce two more stats levels, kExceptHistogramOrTimers and kExceptTimers.
* Added a feature to perform data-block sampling for compressibility, and report stats to user.
* Add support for trace filtering.
* Add DBOptions.avoid_unnecessary_blocking_io. If true, we avoid file deletion when destorying ColumnFamilyHandle and Iterator. Instead, a job is scheduled to delete the files in background.
### Public API Change
* Remove bundled fbson library.
* statistics.stats_level_ becomes atomic. It is preferred to use statistics.set_stats_level() and statistics.get_stats_level() to access it.
* Introduce a new IOError subcode, PathNotFound, to indicate trying to open a nonexistent file or directory for read.
* Add initial support for multiple db instances sharing the same data in single-writer, multi-reader mode.
* Removed some "using std::xxx" from public headers.
### Bug Fixes
* Fix JEMALLOC_CXX_THROW macro missing from older Jemalloc versions, causing build failures on some platforms.
* Fix SstFileReader not able to open file ingested with write_glbal_seqno=true.
## 6.0.0 (2/19/2019)
### New Features
* Enabled checkpoint on readonly db (DBImplReadOnly).
* Make DB ignore dropped column families while committing results of atomic flush.
* RocksDB may choose to preopen some files even if options.max_open_files != -1. This may make DB open slightly longer.
* For users of dictionary compression with ZSTD v0.7.0+, we now reuse the same digested dictionary when compressing each of an SST file's data blocks for faster compression speeds.
* For all users of dictionary compression who set `cache_index_and_filter_blocks == true`, we now store dictionary data used for decompression in the block cache for better control over memory usage. For users of ZSTD v1.1.4+ who compile with -DZSTD_STATIC_LINKING_ONLY, this includes a digested dictionary, which is used to increase decompression speed.
* Add support for block checksums verification for external SST files before ingestion.
* Introduce stats history which periodically saves Statistics snapshots and added `GetStatsHistory` API to retrieve these snapshots.
* Add a place holder in manifest which indicate a record from future that can be safely ignored.
* Add support for trace sampling.
* Enable properties block checksum verification for block-based tables.
* For all users of dictionary compression, we now generate a separate dictionary for compressing each bottom-level SST file. Previously we reused a single dictionary for a whole compaction to bottom level. The new approach achieves better compression ratios; however, it uses more memory and CPU for buffering/sampling data blocks and training dictionaries.
* Add whole key bloom filter support in memtable.
* Files written by `SstFileWriter` will now use dictionary compression if it is configured in the file writer's `CompressionOptions`.
### Public API Change
* Disallow CompactionFilter::IgnoreSnapshots() = false, because it is not very useful and the behavior is confusing. The filter will filter everything if there is no snapshot declared by the time the compaction starts. However, users can define a snapshot after the compaction starts and before it finishes and this new snapshot won't be repeatable, because after the compaction finishes, some keys may be dropped.
* CompactionPri = kMinOverlappingRatio also uses compensated file size, which boosts file with lots of tombstones to be compacted first.
* Transaction::GetForUpdate is extended with a do_validate parameter with default value of true. If false it skips validating the snapshot before doing the read. Similarly ::Merge, ::Put, ::Delete, and ::SingleDelete are extended with assume_tracked with default value of false. If true it indicates that call is assumed to be after a ::GetForUpdate.
* `TableProperties::num_entries` and `TableProperties::num_deletions` now also account for number of range tombstones.
* Remove geodb, spatial_db, document_db, json_document, date_tiered_db, and redis_lists.
* With "ldb ----try_load_options", when wal_dir specified by the option file doesn't exist, ignore it.
* Change time resolution in FileOperationInfo.
* Deleting Blob files also go through SStFileManager.
* Remove CuckooHash memtable.
* The counter stat `number.block.not_compressed` now also counts blocks not compressed due to poor compression ratio.
* Remove ttl option from `CompactionOptionsFIFO`. The option has been deprecated and ttl in `ColumnFamilyOptions` is used instead.
* Support SST file ingestion across multiple column families via DB::IngestExternalFiles. See the function's comment about atomicity.
* Remove Lua compaction filter.
### Bug Fixes
* Fix a deadlock caused by compaction and file ingestion waiting for each other in the event of write stalls.
* Fix a memory leak when files with range tombstones are read in mmap mode and block cache is enabled
* Fix handling of corrupt range tombstone blocks such that corruptions cannot cause deleted keys to reappear
* Lock free MultiGet
* Fix incorrect `NotFound` point lookup result when querying the endpoint of a file that has been extended by a range tombstone.
* Fix with pipelined write, write leaders's callback failure lead to the whole write group fail.
### Change Default Options
* Change options.compaction_pri's default to kMinOverlappingRatio
## 5.18.0 (11/30/2018)
### New Features
* Introduced `JemallocNodumpAllocator` memory allocator. When being use, block cache will be excluded from core dump.
* Introduced `PerfContextByLevel` as part of `PerfContext` which allows storing perf context at each level. Also replaced `__thread` with `thread_local` keyword for perf_context. Added per-level perf context for bloom filter and `Get` query.
* With level_compaction_dynamic_level_bytes = true, level multiplier may be adjusted automatically when Level 0 to 1 compaction is lagged behind.
* Introduced DB option `atomic_flush`. If true, RocksDB supports flushing multiple column families and atomically committing the result to MANIFEST. Useful when WAL is disabled.
* Added `num_deletions` and `num_merge_operands` members to `TableProperties`.
* Added "rocksdb.min-obsolete-sst-number-to-keep" DB property that reports the lower bound on SST file numbers that are being kept from deletion, even if the SSTs are obsolete.
* Add xxhash64 checksum support
* Introduced `MemoryAllocator`, which lets the user specify custom memory allocator for block based table.
* Improved `DeleteRange` to prevent read performance degradation. The feature is no longer marked as experimental.
### Public API Change
* `DBOptions::use_direct_reads` now affects reads issued by `BackupEngine` on the database's SSTs.
* `NO_ITERATORS` is divided into two counters `NO_ITERATOR_CREATED` and `NO_ITERATOR_DELETE`. Both of them are only increasing now, just as other counters.
### Bug Fixes
* Fix corner case where a write group leader blocked due to write stall blocks other writers in queue with WriteOptions::no_slowdown set.
* Fix in-memory range tombstone truncation to avoid erroneously covering newer keys at a lower level, and include range tombstones in compacted files whose largest key is the range tombstone's start key.
* Properly set the stop key for a truncated manual CompactRange
* Fix slow flush/compaction when DB contains many snapshots. The problem became noticeable to us in DBs with 100,000+ snapshots, though it will affect others at different thresholds.
* Fix the bug that WriteBatchWithIndex's SeekForPrev() doesn't see the entries with the same key.
* Fix the bug where user comparator was sometimes fed with InternalKey instead of the user key. The bug manifests when during GenerateBottommostFiles.
* Fix a bug in WritePrepared txns where if the number of old snapshots goes beyond the snapshot cache size (128 default) the rest will not be checked when evicting a commit entry from the commit cache.
* Fixed Get correctness bug in the presence of range tombstones where merge operands covered by a range tombstone always result in NotFound.
* Start populating `NO_FILE_CLOSES` ticker statistic, which was always zero previously.
* The default value of NewBloomFilterPolicy()'s argument use_block_based_builder is changed to false. Note that this new default may cause large temp memory usage when building very large SST files.
## 5.17.0 (10/05/2018)
### Public API Change
* `OnTableFileCreated` will now be called for empty files generated during compaction. In that case, `TableFileCreationInfo::file_path` will be "(nil)" and `TableFileCreationInfo::file_size` will be zero.
* Add `FlushOptions::allow_write_stall`, which controls whether Flush calls start working immediately, even if it causes user writes to stall, or will wait until flush can be performed without causing write stall (similar to `CompactRangeOptions::allow_write_stall`). Note that the default value is false, meaning we add delay to Flush calls until stalling can be avoided when possible. This is behavior change compared to previous RocksDB versions, where Flush calls didn't check if they might cause stall or not.
* Application using PessimisticTransactionDB is expected to rollback/commit recovered transactions before starting new ones. This assumption is used to skip concurrency control during recovery.
* Expose column family id to `OnCompactionCompleted`.
### New Features
* TransactionOptions::skip_concurrency_control allows pessimistic transactions to skip the overhead of concurrency control. Could be used for optimizing certain transactions or during recovery.
### Bug Fixes
* Avoid creating empty SSTs and subsequently deleting them in certain cases during compaction.
* Sync CURRENT file contents during checkpoint.
## 5.16.3 (10/1/2018)
### Bug Fixes
* Fix crash caused when `CompactFiles` run with `CompactionOptions::compression == CompressionType::kDisableCompressionOption`. Now that setting causes the compression type to be chosen according to the column family-wide compression options.
## 5.16.2 (9/21/2018)
### Bug Fixes
* Fix bug in partition filters with format_version=4.
## 5.16.1 (9/17/2018)
### Bug Fixes
* Remove trace_analyzer_tool from rocksdb_lib target in TARGETS file.
* Fix RocksDB Java build and tests.
* Remove sync point in Block destructor.
## 5.16.0 (8/21/2018)
### Public API Change
* The merge operands are passed to `MergeOperator::ShouldMerge` in the reversed order relative to how they were merged (passed to FullMerge or FullMergeV2) for performance reasons
* GetAllKeyVersions() to take an extra argument of `max_num_ikeys`.
* Using ZSTD dictionary trainer (i.e., setting `CompressionOptions::zstd_max_train_bytes` to a nonzero value) now requires ZSTD version 1.1.3 or later.
### New Features
* Changes the format of index blocks by delta encoding the index values, which are the block handles. This saves the encoding of BlockHandle::offset of the non-head index entries in each restart interval. The feature is backward compatible but not forward compatible. It is disabled by default unless format_version 4 or above is used.
* Add a new tool: trace_analyzer. Trace_analyzer analyzes the trace file generated by using trace_replay API. It can convert the binary format trace file to a human readable txt file, output the statistics of the analyzed query types such as access statistics and size statistics, combining the dumped whole key space file to analyze, support query correlation analyzing, and etc. Current supported query types are: Get, Put, Delete, SingleDelete, DeleteRange, Merge, Iterator (Seek, SeekForPrev only).
* Add hash index support to data blocks, which helps reducing the cpu utilization of point-lookup operations. This feature is backward compatible with the data block created without the hash index. It is disabled by default unless BlockBasedTableOptions::data_block_index_type is set to data_block_index_type = kDataBlockBinaryAndHash.
### Bug Fixes
* Fix a bug in misreporting the estimated partition index size in properties block.
## 5.15.0 (7/17/2018)
### Public API Change
* Remove managed iterator. ReadOptions.managed is not effective anymore.
* For bottommost_compression, a compatible CompressionOptions is added via `bottommost_compression_opts`. To keep backward compatible, a new boolean `enabled` is added to CompressionOptions. For compression_opts, it will be always used no matter what value of `enabled` is. For bottommost_compression_opts, it will only be used when user set `enabled=true`, otherwise, compression_opts will be used for bottommost_compression as default.
* With LRUCache, when high_pri_pool_ratio > 0, midpoint insertion strategy will be enabled to put low-pri items to the tail of low-pri list (the midpoint) when they first inserted into the cache. This is to make cache entries never get hit age out faster, improving cache efficiency when large background scan presents.
* For users of `Statistics` objects created via `CreateDBStatistics()`, the format of the string returned by its `ToString()` method has changed.
* The "rocksdb.num.entries" table property no longer counts range deletion tombstones as entries.
### New Features
* Changes the format of index blocks by storing the key in their raw form rather than converting them to InternalKey. This saves 8 bytes per index key. The feature is backward compatible but not forward compatible. It is disabled by default unless format_version 3 or above is used.
* Avoid memcpy when reading mmap files with OpenReadOnly and max_open_files==-1.
* Support dynamically changing `ColumnFamilyOptions::ttl` via `SetOptions()`.
* Add a new table property, "rocksdb.num.range-deletions", which counts the number of range deletion tombstones in the table.
* Improve the performance of iterators doing long range scans by using readahead, when using direct IO.
* pin_top_level_index_and_filter (default true) in BlockBasedTableOptions can be used in combination with cache_index_and_filter_blocks to prefetch and pin the top-level index of partitioned index and filter blocks in cache. It has no impact when cache_index_and_filter_blocks is false.
* Write properties meta-block at the end of block-based table to save read-ahead IO.
### Bug Fixes
* Fix deadlock with enable_pipelined_write=true and max_successive_merges > 0
* Check conflict at output level in CompactFiles.
* Fix corruption in non-iterator reads when mmap is used for file reads
* Fix bug with prefix search in partition filters where a shared prefix would be ignored from the later partitions. The bug could report an eixstent key as missing. The bug could be triggered if prefix_extractor is set and partition filters is enabled.
* Change default value of `bytes_max_delete_chunk` to 0 in NewSstFileManager() as it doesn't work well with checkpoints.
* Fix a bug caused by not copying the block trailer with compressed SST file, direct IO, prefetcher and no compressed block cache.
* Fix write can stuck indefinitely if enable_pipelined_write=true. The issue exists since pipelined write was introduced in 5.5.0.
## 5.14.0 (5/16/2018)
### Public API Change
* Add a BlockBasedTableOption to align uncompressed data blocks on the smaller of block size or page size boundary, to reduce flash reads by avoiding reads spanning 4K pages.
* The background thread naming convention changed (on supporting platforms) to "rocksdb:<thread pool priority><thread number>", e.g., "rocksdb:low0".
* Add a new ticker stat rocksdb.number.multiget.keys.found to count number of keys successfully read in MultiGet calls
* Touch-up to write-related counters in PerfContext. New counters added: write_scheduling_flushes_compactions_time, write_thread_wait_nanos. Counters whose behavior was fixed or modified: write_memtable_time, write_pre_and_post_process_time, write_delay_time.
* Posix Env's NewRandomRWFile() will fail if the file doesn't exist.
* Now, `DBOptions::use_direct_io_for_flush_and_compaction` only applies to background writes, and `DBOptions::use_direct_reads` applies to both user reads and background reads. This conforms with Linux's `open(2)` manpage, which advises against simultaneously reading a file in buffered and direct modes, due to possibly undefined behavior and degraded performance.
* Iterator::Valid() always returns false if !status().ok(). So, now when doing a Seek() followed by some Next()s, there's no need to check status() after every operation.
* Iterator::Seek()/SeekForPrev()/SeekToFirst()/SeekToLast() always resets status().
* Introduced `CompressionOptions::kDefaultCompressionLevel`, which is a generic way to tell RocksDB to use the compression library's default level. It is now the default value for `CompressionOptions::level`. Previously the level defaulted to -1, which gave poor compression ratios in ZSTD.
### New Features
* Introduce TTL for level compaction so that all files older than ttl go through the compaction process to get rid of old data.
* TransactionDBOptions::write_policy can be configured to enable WritePrepared 2PC transactions. Read more about them in the wiki.
* Add DB properties "rocksdb.block-cache-capacity", "rocksdb.block-cache-usage", "rocksdb.block-cache-pinned-usage" to show block cache usage.
* Add `Env::LowerThreadPoolCPUPriority(Priority)` method, which lowers the CPU priority of background (esp. compaction) threads to minimize interference with foreground tasks.
* Fsync parent directory after deleting a file in delete scheduler.
* In level-based compaction, if bottom-pri thread pool was setup via `Env::SetBackgroundThreads()`, compactions to the bottom level will be delegated to that thread pool.
* `prefix_extractor` has been moved from ImmutableCFOptions to MutableCFOptions, meaning it can be dynamically changed without a DB restart.
### Bug Fixes
* Fsync after writing global seq number to the ingestion file in ExternalSstFileIngestionJob.
* Fix WAL corruption caused by race condition between user write thread and FlushWAL when two_write_queue is not set.
* Fix `BackupableDBOptions::max_valid_backups_to_open` to not delete backup files when refcount cannot be accurately determined.
* Fix memory leak when pin_l0_filter_and_index_blocks_in_cache is used with partitioned filters
* Disable rollback of merge operands in WritePrepared transactions to work around an issue in MyRocks. It can be enabled back by setting TransactionDBOptions::rollback_merge_operands to true.
* Fix wrong results by ReverseBytewiseComparator::FindShortSuccessor()
### Java API Changes
* Add `BlockBasedTableConfig.setBlockCache` to allow sharing a block cache across DB instances.
* Added SstFileManager to the Java API to allow managing SST files across DB instances.
## 5.13.0 (3/20/2018)
### Public API Change
* RocksDBOptionsParser::Parse()'s `ignore_unknown_options` argument will only be effective if the option file shows it is generated using a higher version of RocksDB than the current version.
* Remove CompactionEventListener.
### New Features
* SstFileManager now can cancel compactions if they will result in max space errors. SstFileManager users can also use SetCompactionBufferSize to specify how much space must be leftover during a compaction for auxiliary file functions such as logging and flushing.
* Avoid unnecessarily flushing in `CompactRange()` when the range specified by the user does not overlap unflushed memtables.
* If `ColumnFamilyOptions::max_subcompactions` is set greater than one, we now parallelize large manual level-based compactions.
* Add "rocksdb.live-sst-files-size" DB property to return total bytes of all SST files belong to the latest LSM tree.
* NewSstFileManager to add an argument bytes_max_delete_chunk with default 64MB. With this argument, a file larger than 64MB will be ftruncated multiple times based on this size.
### Bug Fixes
* Fix a leak in prepared_section_completed_ where the zeroed entries would not removed from the map.
* Fix WAL corruption caused by race condition between user write thread and backup/checkpoint thread.
## 5.12.0 (2/14/2018)
### Public API Change
* Iterator::SeekForPrev is now a pure virtual method. This is to prevent user who implement the Iterator interface fail to implement SeekForPrev by mistake.
* Add `include_end` option to make the range end exclusive when `include_end == false` in `DeleteFilesInRange()`.
* Add `CompactRangeOptions::allow_write_stall`, which makes `CompactRange` start working immediately, even if it causes user writes to stall. The default value is false, meaning we add delay to `CompactRange` calls until stalling can be avoided when possible. Note this delay is not present in previous RocksDB versions.
* Creating checkpoint with empty directory now returns `Status::InvalidArgument`; previously, it returned `Status::IOError`.
* Adds a BlockBasedTableOption to turn off index block compression.
* Close() method now returns a status when closing a db.
### New Features
* Improve the performance of iterators doing long range scans by using readahead.
* Add new function `DeleteFilesInRanges()` to delete files in multiple ranges at once for better performance.
* FreeBSD build support for RocksDB and RocksJava.
* Improved performance of long range scans with readahead.
* Updated to and now continuously tested in Visual Studio 2017.
### Bug Fixes
* Fix `DisableFileDeletions()` followed by `GetSortedWalFiles()` to not return obsolete WAL files that `PurgeObsoleteFiles()` is going to delete.
* Fix Handle error return from WriteBuffer() during WAL file close and DB close.
* Fix advance reservation of arena block addresses.
* Fix handling of empty string as checkpoint directory.
## 5.11.0 (01/08/2018)
### Public API Change
* Add `autoTune` and `getBytesPerSecond()` to RocksJava RateLimiter
### New Features
* Add a new histogram stat called rocksdb.db.flush.micros for memtable flush.
* Add "--use_txn" option to use transactional API in db_stress.
* Disable onboard cache for compaction output in Windows platform.
* Improve the performance of iterators doing long range scans by using readahead.
### Bug Fixes
* Fix a stack-use-after-scope bug in ForwardIterator.
* Fix builds on platforms including Linux, Windows, and PowerPC.
* Fix buffer overrun in backup engine for DBs with huge number of files.
* Fix a mislabel bug for bottom-pri compaction threads.
* Fix DB::Flush() keep waiting after flush finish under certain condition.
## 5.10.0 (12/11/2017)
### Public API Change
* When running `make` with environment variable `USE_SSE` set and `PORTABLE` unset, will use all machine features available locally. Previously this combination only compiled SSE-related features.
### New Features
* Provide lifetime hints when writing files on Linux. This reduces hardware write-amp on storage devices supporting multiple streams.
* Add a DB stat, `NUMBER_ITER_SKIP`, which returns how many internal keys were skipped during iterations (e.g., due to being tombstones or duplicate versions of a key).
* Add PerfContext counters, `key_lock_wait_count` and `key_lock_wait_time`, which measure the number of times transactions wait on key locks and total amount of time waiting.
### Bug Fixes
* Fix IOError on WAL write doesn't propagate to write group follower
* Make iterator invalid on merge error.
* Fix performance issue in `IngestExternalFile()` affecting databases with large number of SST files.
* Fix possible corruption to LSM structure when `DeleteFilesInRange()` deletes a subset of files spanned by a `DeleteRange()` marker.
## 5.9.0 (11/1/2017)
### Public API Change
* `BackupableDBOptions::max_valid_backups_to_open == 0` now means no backups will be opened during BackupEngine initialization. Previously this condition disabled limiting backups opened.
* `DBOptions::preserve_deletes` is a new option that allows one to specify that DB should not drop tombstones for regular deletes if they have sequence number larger than what was set by the new API call `DB::SetPreserveDeletesSequenceNumber(SequenceNumber seqnum)`. Disabled by default.
* API call `DB::SetPreserveDeletesSequenceNumber(SequenceNumber seqnum)` was added, users who wish to preserve deletes are expected to periodically call this function to advance the cutoff seqnum (all deletes made before this seqnum can be dropped by DB). It's user responsibility to figure out how to advance the seqnum in the way so the tombstones are kept for the desired period of time, yet are eventually processed in time and don't eat up too much space.
* `ReadOptions::iter_start_seqnum` was added;
if set to something > 0 user will see 2 changes in iterators behavior 1) only keys written with sequence larger than this parameter would be returned and 2) the `Slice` returned by iter->key() now points to the memory that keep User-oriented representation of the internal key, rather than user key. New struct `FullKey` was added to represent internal keys, along with a new helper function `ParseFullKey(const Slice& internal_key, FullKey* result);`.
* Deprecate trash_dir param in NewSstFileManager, right now we will rename deleted files to <name>.trash instead of moving them to trash directory
* Allow setting a custom trash/DB size ratio limit in the SstFileManager, after which files that are to be scheduled for deletion are deleted immediately, regardless of any delete ratelimit.
* Return an error on write if write_options.sync = true and write_options.disableWAL = true to warn user of inconsistent options. Previously we will not write to WAL and not respecting the sync options in this case.
### New Features
* CRC32C is now using the 3-way pipelined SSE algorithm `crc32c_3way` on supported platforms to improve performance. The system will choose to use this algorithm on supported platforms automatically whenever possible. If PCLMULQDQ is not supported it will fall back to the old Fast_CRC32 algorithm.
* `DBOptions::writable_file_max_buffer_size` can now be changed dynamically.
* `DBOptions::bytes_per_sync`, `DBOptions::compaction_readahead_size`, and `DBOptions::wal_bytes_per_sync` can now be changed dynamically, `DBOptions::wal_bytes_per_sync` will flush all memtables and switch to a new WAL file.
* Support dynamic adjustment of rate limit according to demand for background I/O. It can be enabled by passing `true` to the `auto_tuned` parameter in `NewGenericRateLimiter()`. The value passed as `rate_bytes_per_sec` will still be respected as an upper-bound.
* Support dynamically changing `ColumnFamilyOptions::compaction_options_fifo`.
* Introduce `EventListener::OnStallConditionsChanged()` callback. Users can implement it to be notified when user writes are stalled, stopped, or resumed.
* Add a new db property "rocksdb.estimate-oldest-key-time" to return oldest data timestamp. The property is available only for FIFO compaction with compaction_options_fifo.allow_compaction = false.
* Upon snapshot release, recompact bottommost files containing deleted/overwritten keys that previously could not be dropped due to the snapshot. This alleviates space-amp caused by long-held snapshots.
* Support lower bound on iterators specified via `ReadOptions::iterate_lower_bound`.
* Support for differential snapshots (via iterator emitting the sequence of key-values representing the difference between DB state at two different sequence numbers). Supports preserving and emitting puts and regular deletes, doesn't support SingleDeletes, MergeOperator, Blobs and Range Deletes.
### Bug Fixes
* Fix a potential data inconsistency issue during point-in-time recovery. `DB:Open()` will abort if column family inconsistency is found during PIT recovery.
* Fix possible metadata corruption in databases using `DeleteRange()`.
## 5.8.0 (08/30/2017)
### Public API Change
* Users of `Statistics::getHistogramString()` will see fewer histogram buckets and different bucket endpoints.
* `Slice::compare` and BytewiseComparator `Compare` no longer accept `Slice`s containing nullptr.
* `Transaction::Get` and `Transaction::GetForUpdate` variants with `PinnableSlice` added.
### New Features
* Add Iterator::Refresh(), which allows users to update the iterator state so that they can avoid some initialization costs of recreating iterators.
* Replace dynamic_cast<> (except unit test) so people can choose to build with RTTI off. With make, release mode is by default built with -fno-rtti and debug mode is built without it. Users can override it by setting USE_RTTI=0 or 1.
* Universal compactions including the bottom level can be executed in a dedicated thread pool. This alleviates head-of-line blocking in the compaction queue, which cause write stalling, particularly in multi-instance use cases. Users can enable this feature via `Env::SetBackgroundThreads(N, Env::Priority::BOTTOM)`, where `N > 0`.
* Allow merge operator to be called even with a single merge operand during compactions, by appropriately overriding `MergeOperator::AllowSingleOperand`.
* Add `DB::VerifyChecksum()`, which verifies the checksums in all SST files in a running DB.
* Block-based table support for disabling checksums by setting `BlockBasedTableOptions::checksum = kNoChecksum`.
### Bug Fixes
* Fix wrong latencies in `rocksdb.db.get.micros`, `rocksdb.db.write.micros`, and `rocksdb.sst.read.micros`.
* Fix incorrect dropping of deletions during intra-L0 compaction.
* Fix transient reappearance of keys covered by range deletions when memtable prefix bloom filter is enabled.
* Fix potentially wrong file smallest key when range deletions separated by snapshot are written together.
## 5.7.0 (07/13/2017)
### Public API Change
* DB property "rocksdb.sstables" now prints keys in hex form.
### New Features
* Measure estimated number of reads per file. The information can be accessed through DB::GetColumnFamilyMetaData or "rocksdb.sstables" DB property.
* RateLimiter support for throttling background reads, or throttling the sum of background reads and writes. This can give more predictable I/O usage when compaction reads more data than it writes, e.g., due to lots of deletions.
* [Experimental] FIFO compaction with TTL support. It can be enabled by setting CompactionOptionsFIFO.ttl > 0.
* Introduce `EventListener::OnBackgroundError()` callback. Users can implement it to be notified of errors causing the DB to enter read-only mode, and optionally override them.
* Partitioned Index/Filters exiting the experimental mode. To enable partitioned indexes set index_type to kTwoLevelIndexSearch and to further enable partitioned filters set partition_filters to true. To configure the partition size set metadata_block_size.
### Bug Fixes
* Fix discarding empty compaction output files when `DeleteRange()` is used together with subcompactions.
## 5.6.0 (06/06/2017)
### Public API Change
* Scheduling flushes and compactions in the same thread pool is no longer supported by setting `max_background_flushes=0`. Instead, users can achieve this by configuring their high-pri thread pool to have zero threads.
* Replace `Options::max_background_flushes`, `Options::max_background_compactions`, and `Options::base_background_compactions` all with `Options::max_background_jobs`, which automatically decides how many threads to allocate towards flush/compaction.
* options.delayed_write_rate by default take the value of options.rate_limiter rate.
* Replace global variable `IOStatsContext iostats_context` with `IOStatsContext* get_iostats_context()`; replace global variable `PerfContext perf_context` with `PerfContext* get_perf_context()`.
### New Features
* Change ticker/histogram statistics implementations to use core-local storage. This improves aggregation speed compared to our previous thread-local approach, particularly for applications with many threads.
* Users can pass a cache object to write buffer manager, so that they can cap memory usage for memtable and block cache using one single limit.
* Flush will be triggered when 7/8 of the limit introduced by write_buffer_manager or db_write_buffer_size is triggered, so that the hard threshold is hard to hit.
* Introduce WriteOptions.low_pri. If it is true, low priority writes will be throttled if the compaction is behind.
* `DB::IngestExternalFile()` now supports ingesting files into a database containing range deletions.
### Bug Fixes
* Shouldn't ignore return value of fsync() in flush.
## 5.5.0 (05/17/2017)
### New Features
* FIFO compaction to support Intra L0 compaction too with CompactionOptionsFIFO.allow_compaction=true.
* DB::ResetStats() to reset internal stats.
* Statistics::Reset() to reset user stats.
* ldb add option --try_load_options, which will open DB with its own option file.
* Introduce WriteBatch::PopSavePoint to pop the most recent save point explicitly.
* Support dynamically change `max_open_files` option via SetDBOptions()
* Added DB::CreateColumnFamilie() and DB::DropColumnFamilies() to bulk create/drop column families.
* Add debugging function `GetAllKeyVersions` to see internal versions of a range of keys.
* Support file ingestion with universal compaction style
* Support file ingestion behind with option `allow_ingest_behind`
* New option enable_pipelined_write which may improve write throughput in case writing from multiple threads and WAL enabled.
### Bug Fixes
* Fix the bug that Direct I/O uses direct reads for non-SST file
## 5.4.0 (04/11/2017)
### Public API Change
* random_access_max_buffer_size no longer has any effect
* Removed Env::EnableReadAhead(), Env::ShouldForwardRawRequest()
* Support dynamically change `stats_dump_period_sec` option via SetDBOptions().
* Added ReadOptions::max_skippable_internal_keys to set a threshold to fail a request as incomplete when too many keys are being skipped when using iterators.
* DB::Get in place of std::string accepts PinnableSlice, which avoids the extra memcpy of value to std::string in most of cases.
* PinnableSlice releases the pinned resources that contain the value when it is destructed or when ::Reset() is called on it.
* The old API that accepts std::string, although discouraged, is still supported.
* Replace Options::use_direct_writes with Options::use_direct_io_for_flush_and_compaction. Read Direct IO wiki for details.
* Added CompactionEventListener and EventListener::OnFlushBegin interfaces.
### New Features
* Memtable flush can be avoided during checkpoint creation if total log file size is smaller than a threshold specified by the user.
* Introduce level-based L0->L0 compactions to reduce file count, so write delays are incurred less often.
* (Experimental) Partitioning filters which creates an index on the partitions. The feature can be enabled by setting partition_filters when using kFullFilter. Currently the feature also requires two-level indexing to be enabled. Number of partitions is the same as the number of partitions for indexes, which is controlled by metadata_block_size.
## 5.3.0 (03/08/2017)
### Public API Change
* Remove disableDataSync option.
* Remove timeout_hint_us option from WriteOptions. The option has been deprecated and has no effect since 3.13.0.
* Remove option min_partial_merge_operands. Partial merge operands will always be merged in flush or compaction if there are more than one.
* Remove option verify_checksums_in_compaction. Compaction will always verify checksum.
### Bug Fixes
* Fix the bug that iterator may skip keys
## 5.2.0 (02/08/2017)
### Public API Change
* NewLRUCache() will determine number of shard bits automatically based on capacity, if the user doesn't pass one. This also impacts the default block cache when the user doesn't explict provide one.
* Change the default of delayed slowdown value to 16MB/s and further increase the L0 stop condition to 36 files.
* Options::use_direct_writes and Options::use_direct_reads are now ready to use.
* (Experimental) Two-level indexing that partition the index and creates a 2nd level index on the partitions. The feature can be enabled by setting kTwoLevelIndexSearch as IndexType and configuring index_per_partition.
### New Features
* Added new overloaded function GetApproximateSizes that allows to specify if memtable stats should be computed only without computing SST files' stats approximations.
* Added new function GetApproximateMemTableStats that approximates both number of records and size of memtables.
* Add Direct I/O mode for SST file I/O
### Bug Fixes
* RangeSync() should work if ROCKSDB_FALLOCATE_PRESENT is not set
* Fix wrong results in a data race case in Get()
* Some fixes related to 2PC.
* Fix bugs of data corruption in direct I/O
## 5.1.0 (01/13/2017)
* Support dynamically change `delete_obsolete_files_period_micros` option via SetDBOptions().
* Added EventListener::OnExternalFileIngested which will be called when IngestExternalFile() add a file successfully.
* BackupEngine::Open and BackupEngineReadOnly::Open now always return error statuses matching those of the backup Env.
### Bug Fixes
* Fix the bug that if 2PC is enabled, checkpoints may loss some recent transactions.
* When file copying is needed when creating checkpoints or bulk loading files, fsync the file after the file copying.
## 5.0.0 (11/17/2016)
### Public API Change
* Options::max_bytes_for_level_multiplier is now a double along with all getters and setters.
* Support dynamically change `delayed_write_rate` and `max_total_wal_size` options via SetDBOptions().
* Introduce DB::DeleteRange for optimized deletion of large ranges of contiguous keys.
* Support dynamically change `delayed_write_rate` option via SetDBOptions().
* Options::allow_concurrent_memtable_write and Options::enable_write_thread_adaptive_yield are now true by default.
* Remove Tickers::SEQUENCE_NUMBER to avoid confusion if statistics object is shared among RocksDB instance. Alternatively DB::GetLatestSequenceNumber() can be used to get the same value.
* Options.level0_stop_writes_trigger default value changes from 24 to 32.
* New compaction filter API: CompactionFilter::FilterV2(). Allows to drop ranges of keys.
* Removed flashcache support.
* DB::AddFile() is deprecated and is replaced with DB::IngestExternalFile(). DB::IngestExternalFile() remove all the restrictions that existed for DB::AddFile.
### New Features
* Add avoid_flush_during_shutdown option, which speeds up DB shutdown by not flushing unpersisted data (i.e. with disableWAL = true). Unpersisted data will be lost. The options is dynamically changeable via SetDBOptions().
* Add memtable_insert_with_hint_prefix_extractor option. The option is mean to reduce CPU usage for inserting keys into memtable, if keys can be group by prefix and insert for each prefix are sequential or almost sequential. See include/rocksdb/options.h for more details.
* Add LuaCompactionFilter in utilities. This allows developers to write compaction filters in Lua. To use this feature, LUA_PATH needs to be set to the root directory of Lua.
* No longer populate "LATEST_BACKUP" file in backup directory, which formerly contained the number of the latest backup. The latest backup can be determined by finding the highest numbered file in the "meta/" subdirectory.
## 4.13.0 (10/18/2016)
### Public API Change
* DB::GetOptions() reflect dynamic changed options (i.e. through DB::SetOptions()) and return copy of options instead of reference.
* Added Statistics::getAndResetTickerCount().
### New Features
* Add DB::SetDBOptions() to dynamic change base_background_compactions and max_background_compactions.
* Added Iterator::SeekForPrev(). This new API will seek to the last key that less than or equal to the target key.
## 4.12.0 (9/12/2016)
### Public API Change
* CancelAllBackgroundWork() flushes all memtables for databases containing writes that have bypassed the WAL (writes issued with WriteOptions::disableWAL=true) before shutting down background threads.
* Merge options source_compaction_factor, max_grandparent_overlap_bytes and expanded_compaction_factor into max_compaction_bytes.
* Remove ImmutableCFOptions.
* Add a compression type ZSTD, which can work with ZSTD 0.8.0 or up. Still keep ZSTDNotFinal for compatibility reasons.
### New Features
* Introduce NewClockCache, which is based on CLOCK algorithm with better concurrent performance in some cases. It can be used to replace the default LRU-based block cache and table cache. To use it, RocksDB need to be linked with TBB lib.
* Change ticker/histogram statistics implementations to accumulate data in thread-local storage, which improves CPU performance by reducing cache coherency costs. Callers of CreateDBStatistics do not need to change anything to use this feature.
* Block cache mid-point insertion, where index and filter block are inserted into LRU block cache with higher priority. The feature can be enabled by setting BlockBasedTableOptions::cache_index_and_filter_blocks_with_high_priority to true and high_pri_pool_ratio > 0 when creating NewLRUCache.
## 4.11.0 (8/1/2016)
### Public API Change
* options.memtable_prefix_bloom_huge_page_tlb_size => memtable_huge_page_size. When it is set, RocksDB will try to allocate memory from huge page for memtable too, rather than just memtable bloom filter.
### New Features
* A tool to migrate DB after options change. See include/rocksdb/utilities/option_change_migration.h.
* Add ReadOptions.background_purge_on_iterator_cleanup. If true, we avoid file deletion when destorying iterators.
## 4.10.0 (7/5/2016)
### Public API Change
* options.memtable_prefix_bloom_bits changes to options.memtable_prefix_bloom_bits_ratio and deprecate options.memtable_prefix_bloom_probes
* enum type CompressionType and PerfLevel changes from char to unsigned char. Value of all PerfLevel shift by one.
* Deprecate options.filter_deletes.
### New Features
* Add avoid_flush_during_recovery option.
* Add a read option background_purge_on_iterator_cleanup to avoid deleting files in foreground when destroying iterators. Instead, a job is scheduled in high priority queue and would be executed in a separate background thread.
* RepairDB support for column families. RepairDB now associates data with non-default column families using information embedded in the SST/WAL files (4.7 or later). For data written by 4.6 or earlier, RepairDB associates it with the default column family.
* Add options.write_buffer_manager which allows users to control total memtable sizes across multiple DB instances.
## 4.9.0 (6/9/2016)
### Public API changes
* Add bottommost_compression option, This option can be used to set a specific compression algorithm for the bottommost level (Last level containing files in the DB).
* Introduce CompactionJobInfo::compression, This field state the compression algorithm used to generate the output files of the compaction.
* Deprecate BlockBaseTableOptions.hash_index_allow_collision=false
* Deprecate options builder (GetOptions()).
### New Features
* Introduce NewSimCache() in rocksdb/utilities/sim_cache.h. This function creates a block cache that is able to give simulation results (mainly hit rate) of simulating block behavior with a configurable cache size.
## 4.8.0 (5/2/2016)
### Public API Change
* Allow preset compression dictionary for improved compression of block-based tables. This is supported for zlib, zstd, and lz4. The compression dictionary's size is configurable via CompressionOptions::max_dict_bytes.
* Delete deprecated classes for creating backups (BackupableDB) and restoring from backups (RestoreBackupableDB). Now, BackupEngine should be used for creating backups, and BackupEngineReadOnly should be used for restorations. For more details, see https://github.com/facebook/rocksdb/wiki/How-to-backup-RocksDB%3F
* Expose estimate of per-level compression ratio via DB property: "rocksdb.compression-ratio-at-levelN".
* Added EventListener::OnTableFileCreationStarted. EventListener::OnTableFileCreated will be called on failure case. User can check creation status via TableFileCreationInfo::status.
### New Features
* Add ReadOptions::readahead_size. If non-zero, NewIterator will create a new table reader which performs reads of the given size.
## 4.7.0 (4/8/2016)
### Public API Change
* rename options compaction_measure_io_stats to report_bg_io_stats and include flush too.
* Change some default options. Now default options will optimize for server-workloads. Also enable slowdown and full stop triggers for pending compaction bytes. These changes may cause sub-optimal performance or significant increase of resource usage. To avoid these risks, users can open existing RocksDB with options extracted from RocksDB option files. See https://github.com/facebook/rocksdb/wiki/RocksDB-Options-File for how to use RocksDB option files. Or you can call Options.OldDefaults() to recover old defaults. DEFAULT_OPTIONS_HISTORY.md will track change history of default options.
## 4.6.0 (3/10/2016)
### Public API Changes
* Change default of BlockBasedTableOptions.format_version to 2. It means default DB created by 4.6 or up cannot be opened by RocksDB version 3.9 or earlier.
* Added strict_capacity_limit option to NewLRUCache. If the flag is set to true, insert to cache will fail if no enough capacity can be free. Signature of Cache::Insert() is updated accordingly.
* Tickers [NUMBER_DB_NEXT, NUMBER_DB_PREV, NUMBER_DB_NEXT_FOUND, NUMBER_DB_PREV_FOUND, ITER_BYTES_READ] are not updated immediately. The are updated when the Iterator is deleted.
* Add monotonically increasing counter (DB property "rocksdb.current-super-version-number") that increments upon any change to the LSM tree.
### New Features
* Add CompactionPri::kMinOverlappingRatio, a compaction picking mode friendly to write amplification.
* Deprecate Iterator::IsKeyPinned() and replace it with Iterator::GetProperty() with prop_name="rocksdb.iterator.is.key.pinned"
## 4.5.0 (2/5/2016)
### Public API Changes
* Add a new perf context level between kEnableCount and kEnableTime. Level 2 now does not include timers for mutexes.
* Statistics of mutex operation durations will not be measured by default. If you want to have them enabled, you need to set Statistics::stats_level_ to kAll.
* DBOptions::delete_scheduler and NewDeleteScheduler() are removed, please use DBOptions::sst_file_manager and NewSstFileManager() instead
### New Features
* ldb tool now supports operations to non-default column families.
* Add kPersistedTier to ReadTier. This option allows Get and MultiGet to read only the persited data and skip mem-tables if writes were done with disableWAL = true.
* Add DBOptions::sst_file_manager. Use NewSstFileManager() in include/rocksdb/sst_file_manager.h to create a SstFileManager that can be used to track the total size of SST files and control the SST files deletion rate.
## 4.4.0 (1/14/2016)
### Public API Changes
* Change names in CompactionPri and add a new one.
* Deprecate options.soft_rate_limit and add options.soft_pending_compaction_bytes_limit.
* If options.max_write_buffer_number > 3, writes will be slowed down when writing to the last write buffer to delay a full stop.
* Introduce CompactionJobInfo::compaction_reason, this field include the reason to trigger the compaction.
* After slow down is triggered, if estimated pending compaction bytes keep increasing, slowdown more.
* Increase default options.delayed_write_rate to 2MB/s.
* Added a new parameter --path to ldb tool. --path accepts the name of either MANIFEST, SST or a WAL file. Either --db or --path can be used when calling ldb.
## 4.3.0 (12/8/2015)
### New Features
* CompactionFilter has new member function called IgnoreSnapshots which allows CompactionFilter to be called even if there are snapshots later than the key.
* RocksDB will now persist options under the same directory as the RocksDB database on successful DB::Open, CreateColumnFamily, DropColumnFamily, and SetOptions.
* Introduce LoadLatestOptions() in rocksdb/utilities/options_util.h. This function can construct the latest DBOptions / ColumnFamilyOptions used by the specified RocksDB intance.
* Introduce CheckOptionsCompatibility() in rocksdb/utilities/options_util.h. This function checks whether the input set of options is able to open the specified DB successfully.
### Public API Changes
* When options.db_write_buffer_size triggers, only the column family with the largest column family size will be flushed, not all the column families.
## 4.2.0 (11/9/2015)
### New Features
* Introduce CreateLoggerFromOptions(), this function create a Logger for provided DBOptions.
* Add GetAggregatedIntProperty(), which returns the sum of the GetIntProperty of all the column families.
* Add MemoryUtil in rocksdb/utilities/memory.h. It currently offers a way to get the memory usage by type from a list rocksdb instances.
### Public API Changes
* CompactionFilter::Context includes information of Column Family ID
* The need-compaction hint given by TablePropertiesCollector::NeedCompact() will be persistent and recoverable after DB recovery. This introduces a breaking format change. If you use this experimental feature, including NewCompactOnDeletionCollectorFactory() in the new version, you may not be able to directly downgrade the DB back to version 4.0 or lower.
* TablePropertiesCollectorFactory::CreateTablePropertiesCollector() now takes an option Context, containing the information of column family ID for the file being written.
* Remove DefaultCompactionFilterFactory.
## 4.1.0 (10/8/2015)
### New Features
* Added single delete operation as a more efficient way to delete keys that have not been overwritten.
* Added experimental AddFile() to DB interface that allow users to add files created by SstFileWriter into an empty Database, see include/rocksdb/sst_file_writer.h and DB::AddFile() for more info.
* Added support for opening SST files with .ldb suffix which enables opening LevelDB databases.
* CompactionFilter now supports filtering of merge operands and merge results.
### Public API Changes
* Added SingleDelete() to the DB interface.
* Added AddFile() to DB interface.
* Added SstFileWriter class.
* CompactionFilter has a new method FilterMergeOperand() that RocksDB applies to every merge operand during compaction to decide whether to filter the operand.
* We removed CompactionFilterV2 interfaces from include/rocksdb/compaction_filter.h. The functionality was deprecated already in version 3.13.
## 4.0.0 (9/9/2015)
### New Features
* Added support for transactions. See include/rocksdb/utilities/transaction.h for more info.
* DB::GetProperty() now accepts "rocksdb.aggregated-table-properties" and "rocksdb.aggregated-table-properties-at-levelN", in which case it returns aggregated table properties of the target column family, or the aggregated table properties of the specified level N if the "at-level" version is used.
* Add compression option kZSTDNotFinalCompression for people to experiment ZSTD although its format is not finalized.
* We removed the need for LATEST_BACKUP file in BackupEngine. We still keep writing it when we create new backups (because of backward compatibility), but we don't read it anymore.
### Public API Changes
* Removed class Env::RandomRWFile and Env::NewRandomRWFile().
* Renamed DBOptions.num_subcompactions to DBOptions.max_subcompactions to make the name better match the actual functionality of the option.
* Added Equal() method to the Comparator interface that can optionally be overwritten in cases where equality comparisons can be done more efficiently than three-way comparisons.
* Previous 'experimental' OptimisticTransaction class has been replaced by Transaction class.
## 3.13.0 (8/6/2015)
### New Features
* RollbackToSavePoint() in WriteBatch/WriteBatchWithIndex
* Add NewCompactOnDeletionCollectorFactory() in utilities/table_properties_collectors, which allows rocksdb to mark a SST file as need-compaction when it observes at least D deletion entries in any N consecutive entries in that SST file. Note that this feature depends on an experimental NeedCompact() API --- the result of this API will not persist after DB restart.
* Add DBOptions::delete_scheduler. Use NewDeleteScheduler() in include/rocksdb/delete_scheduler.h to create a DeleteScheduler that can be shared among multiple RocksDB instances to control the file deletion rate of SST files that exist in the first db_path.
### Public API Changes
* Deprecated WriteOptions::timeout_hint_us. We no longer support write timeout. If you really need this option, talk to us and we might consider returning it.
* Deprecated purge_redundant_kvs_while_flush option.
* Removed BackupEngine::NewBackupEngine() and NewReadOnlyBackupEngine() that were deprecated in RocksDB 3.8. Please use BackupEngine::Open() instead.
* Deprecated Compaction Filter V2. We are not aware of any existing use-cases. If you use this filter, your compile will break with RocksDB 3.13. Please let us know if you use it and we'll put it back in RocksDB 3.14.
* Env::FileExists now returns a Status instead of a boolean
* Add statistics::getHistogramString() to print detailed distribution of a histogram metric.
* Add DBOptions::skip_stats_update_on_db_open. When it is on, DB::Open() will run faster as it skips the random reads required for loading necessary stats from SST files to optimize compaction.
## 3.12.0 (7/2/2015)
### New Features
* Added experimental support for optimistic transactions. See include/rocksdb/utilities/optimistic_transaction.h for more info.
* Added a new way to report QPS from db_bench (check out --report_file and --report_interval_seconds)
* Added a cache for individual rows. See DBOptions::row_cache for more info.
* Several new features on EventListener (see include/rocksdb/listener.h):
- OnCompationCompleted() now returns per-compaction job statistics, defined in include/rocksdb/compaction_job_stats.h.
- Added OnTableFileCreated() and OnTableFileDeleted().
* Add compaction_options_universal.enable_trivial_move to true, to allow trivial move while performing universal compaction. Trivial move will happen only when all the input files are non overlapping.
### Public API changes
* EventListener::OnFlushCompleted() now passes FlushJobInfo instead of a list of parameters.
* DB::GetDbIdentity() is now a const function. If this function is overridden in your application, be sure to also make GetDbIdentity() const to avoid compile error.
* Move listeners from ColumnFamilyOptions to DBOptions.
* Add max_write_buffer_number_to_maintain option
* DB::CompactRange()'s parameter reduce_level is changed to change_level, to allow users to move levels to lower levels if allowed. It can be used to migrate a DB from options.level_compaction_dynamic_level_bytes=false to options.level_compaction_dynamic_level_bytes.true.
* Change default value for options.compaction_filter_factory and options.compaction_filter_factory_v2 to nullptr instead of DefaultCompactionFilterFactory and DefaultCompactionFilterFactoryV2.
* If CancelAllBackgroundWork is called without doing a flush after doing loads with WAL disabled, the changes which haven't been flushed before the call to CancelAllBackgroundWork will be lost.
* WBWIIterator::Entry() now returns WriteEntry instead of `const WriteEntry&`
* options.hard_rate_limit is deprecated.
* When options.soft_rate_limit or options.level0_slowdown_writes_trigger is triggered, the way to slow down writes is changed to: write rate to DB is limited to to options.delayed_write_rate.
* DB::GetApproximateSizes() adds a parameter to allow the estimation to include data in mem table, with default to be not to include. It is now only supported in skip list mem table.
* DB::CompactRange() now accept CompactRangeOptions instead of multiple parameters. CompactRangeOptions is defined in include/rocksdb/options.h.
* CompactRange() will now skip bottommost level compaction for level based compaction if there is no compaction filter, bottommost_level_compaction is introduced in CompactRangeOptions to control when it's possible to skip bottommost level compaction. This mean that if you want the compaction to produce a single file you need to set bottommost_level_compaction to BottommostLevelCompaction::kForce.
* Add Cache.GetPinnedUsage() to get the size of memory occupied by entries that are in use by the system.
* DB:Open() will fail if the compression specified in Options is not linked with the binary. If you see this failure, recompile RocksDB with compression libraries present on your system. Also, previously our default compression was snappy. This behavior is now changed. Now, the default compression is snappy only if it's available on the system. If it isn't we change the default to kNoCompression.
* We changed how we account for memory used in block cache. Previously, we only counted the sum of block sizes currently present in block cache. Now, we count the actual memory usage of the blocks. For example, a block of size 4.5KB will use 8KB memory with jemalloc. This might decrease your memory usage and possibly decrease performance. Increase block cache size if you see this happening after an upgrade.
* Add BackupEngineImpl.options_.max_background_operations to specify the maximum number of operations that may be performed in parallel. Add support for parallelized backup and restore.
* Add DB::SyncWAL() that does a WAL sync without blocking writers.
## 3.11.0 (5/19/2015)
### New Features
* Added a new API Cache::SetCapacity(size_t capacity) to dynamically change the maximum configured capacity of the cache. If the new capacity is less than the existing cache usage, the implementation will try to lower the usage by evicting the necessary number of elements following a strict LRU policy.
* Added an experimental API for handling flashcache devices (blacklists background threads from caching their reads) -- NewFlashcacheAwareEnv
* If universal compaction is used and options.num_levels > 1, compact files are tried to be stored in none-L0 with smaller files based on options.target_file_size_base. The limitation of DB size when using universal compaction is greatly mitigated by using more levels. You can set num_levels = 1 to make universal compaction behave as before. If you set num_levels > 1 and want to roll back to a previous version, you need to compact all files to a big file in level 0 (by setting target_file_size_base to be large and CompactRange(<cf_handle>, nullptr, nullptr, true, 0) and reopen the DB with the same version to rewrite the manifest, and then you can open it using previous releases.
* More information about rocksdb background threads are available in Env::GetThreadList(), including the number of bytes read / written by a compaction job, mem-table size and current number of bytes written by a flush job and many more. Check include/rocksdb/thread_status.h for more detail.
### Public API changes
* TablePropertiesCollector::AddUserKey() is added to replace TablePropertiesCollector::Add(). AddUserKey() exposes key type, sequence number and file size up to now to users.
* DBOptions::bytes_per_sync used to apply to both WAL and table files. As of 3.11 it applies only to table files. If you want to use this option to sync WAL in the background, please use wal_bytes_per_sync
## 3.10.0 (3/24/2015)
### New Features
* GetThreadStatus() is now able to report detailed thread status, including:
- Thread Operation including flush and compaction.
- The stage of the current thread operation.
- The elapsed time in micros since the current thread operation started.
More information can be found in include/rocksdb/thread_status.h. In addition, when running db_bench with --thread_status_per_interval, db_bench will also report thread status periodically.
* Changed the LRU caching algorithm so that referenced blocks (by iterators) are never evicted. This change made parameter removeScanCountLimit obsolete. Because of that NewLRUCache doesn't take three arguments anymore. table_cache_remove_scan_limit option is also removed
* By default we now optimize the compilation for the compilation platform (using -march=native). If you want to build portable binary, use 'PORTABLE=1' before the make command.
* We now allow level-compaction to place files in different paths by
specifying them in db_paths along with the target_size.
Lower numbered levels will be placed earlier in the db_paths and higher
numbered levels will be placed later in the db_paths vector.
* Potentially big performance improvements if you're using RocksDB with lots of column families (100-1000)
* Added BlockBasedTableOptions.format_version option, which allows user to specify which version of block based table he wants. As a general guideline, newer versions have more features, but might not be readable by older versions of RocksDB.
* Added new block based table format (version 2), which you can enable by setting BlockBasedTableOptions.format_version = 2. This format changes how we encode size information in compressed blocks and should help with memory allocations if you're using Zlib or BZip2 compressions.
* MemEnv (env that stores data in memory) is now available in default library build. You can create it by calling NewMemEnv().
* Add SliceTransform.SameResultWhenAppended() to help users determine it is safe to apply prefix bloom/hash.
* Block based table now makes use of prefix bloom filter if it is a full fulter.
* Block based table remembers whether a whole key or prefix based bloom filter is supported in SST files. Do a sanity check when reading the file with users' configuration.
* Fixed a bug in ReadOnlyBackupEngine that deleted corrupted backups in some cases, even though the engine was ReadOnly
* options.level_compaction_dynamic_level_bytes, a feature to allow RocksDB to pick dynamic base of bytes for levels. With this feature turned on, we will automatically adjust max bytes for each level. The goal of this feature is to have lower bound on size amplification. For more details, see comments in options.h.
* Added an abstract base class WriteBatchBase for write batches
* Fixed a bug where we start deleting files of a dropped column families even if there are still live references to it
### Public API changes
* Deprecated skip_log_error_on_recovery and table_cache_remove_scan_count_limit options.
* Logger method logv with log level parameter is now virtual
### RocksJava
* Added compression per level API.
* MemEnv is now available in RocksJava via RocksMemEnv class.
* lz4 compression is now included in rocksjava static library when running `make rocksdbjavastatic`.
* Overflowing a size_t when setting rocksdb options now throws an IllegalArgumentException, which removes the necessity for a developer to catch these Exceptions explicitly.
## 3.9.0 (12/8/2014)
### New Features
* Add rocksdb::GetThreadList(), which in the future will return the current status of all
rocksdb-related threads. We will have more code instruments in the following RocksDB
releases.
* Change convert function in rocksdb/utilities/convenience.h to return Status instead of boolean.
Also add support for nested options in convert function
### Public API changes
* New API to create a checkpoint added. Given a directory name, creates a new
database which is an image of the existing database.
* New API LinkFile added to Env. If you implement your own Env class, an
implementation of the API LinkFile will have to be provided.
* MemTableRep takes MemTableAllocator instead of Arena
### Improvements
* RocksDBLite library now becomes smaller and will be compiled with -fno-exceptions flag.
## 3.8.0 (11/14/2014)
### Public API changes
* BackupEngine::NewBackupEngine() was deprecated; please use BackupEngine::Open() from now on.
* BackupableDB/RestoreBackupableDB have new GarbageCollect() methods, which will clean up files from corrupt and obsolete backups.
* BackupableDB/RestoreBackupableDB have new GetCorruptedBackups() methods which list corrupt backups.
### Cleanup
* Bunch of code cleanup, some extra warnings turned on (-Wshadow, -Wshorten-64-to-32, -Wnon-virtual-dtor)
### New features
* CompactFiles and EventListener, although they are still in experimental state
* Full ColumnFamily support in RocksJava.
## 3.7.0 (11/6/2014)
### Public API changes
* Introduce SetOptions() API to allow adjusting a subset of options dynamically online
* Introduce 4 new convenient functions for converting Options from string: GetColumnFamilyOptionsFromMap(), GetColumnFamilyOptionsFromString(), GetDBOptionsFromMap(), GetDBOptionsFromString()
* Remove WriteBatchWithIndex.Delete() overloads using SliceParts
* When opening a DB, if options.max_background_compactions is larger than the existing low pri pool of options.env, it will enlarge it. Similarly, options.max_background_flushes is larger than the existing high pri pool of options.env, it will enlarge it.
## 3.6.0 (10/7/2014)
### Disk format changes
* If you're using RocksDB on ARM platforms and you're using default bloom filter, there is a disk format change you need to be aware of. There are three steps you need to do when you convert to new release: 1. turn off filter policy, 2. compact the whole database, 3. turn on filter policy
### Behavior changes
* We have refactored our system of stalling writes. Any stall-related statistics' meanings are changed. Instead of per-write stall counts, we now count stalls per-epoch, where epochs are periods between flushes and compactions. You'll find more information in our Tuning Perf Guide once we release RocksDB 3.6.
* When disableDataSync=true, we no longer sync the MANIFEST file.
* Add identity_as_first_hash property to CuckooTable. SST file needs to be rebuilt to be opened by reader properly.
### Public API changes
* Change target_file_size_base type to uint64_t from int.
* Remove allow_thread_local. This feature was proved to be stable, so we are turning it always-on.
## 3.5.0 (9/3/2014)
### New Features
* Add include/utilities/write_batch_with_index.h, providing a utility class to query data out of WriteBatch when building it.
* Move BlockBasedTable related options to BlockBasedTableOptions from Options. Change corresponding JNI interface. Options affected include:
no_block_cache, block_cache, block_cache_compressed, block_size, block_size_deviation, block_restart_interval, filter_policy, whole_key_filtering. filter_policy is changed to shared_ptr from a raw pointer.
* Remove deprecated options: disable_seek_compaction and db_stats_log_interval
* OptimizeForPointLookup() takes one parameter for block cache size. It now builds hash index, bloom filter, and block cache.
### Public API changes
* The Prefix Extractor used with V2 compaction filters is now passed user key to SliceTransform::Transform instead of unparsed RocksDB key.
## 3.4.0 (8/18/2014)
### New Features
* Support Multiple DB paths in universal style compactions
* Add feature of storing plain table index and bloom filter in SST file.
* CompactRange() will never output compacted files to level 0. This used to be the case when all the compaction input files were at level 0.
* Added iterate_upper_bound to define the extent upto which the forward iterator will return entries. This will prevent iterating over delete markers and overwritten entries for edge cases where you want to break out the iterator anyways. This may improve performance in case there are a large number of delete markers or overwritten entries.
### Public API changes
* DBOptions.db_paths now is a vector of a DBPath structure which indicates both of path and target size
* NewPlainTableFactory instead of bunch of parameters now accepts PlainTableOptions, which is defined in include/rocksdb/table.h
* Moved include/utilities/*.h to include/rocksdb/utilities/*.h
* Statistics APIs now take uint32_t as type instead of Tickers. Also make two access functions getTickerCount and histogramData const
* Add DB property rocksdb.estimate-num-keys, estimated number of live keys in DB.
* Add DB::GetIntProperty(), which returns DB properties that are integer as uint64_t.
* The Prefix Extractor used with V2 compaction filters is now passed user key to SliceTransform::Transform instead of unparsed RocksDB key.
## 3.3.0 (7/10/2014)
### New Features
* Added JSON API prototype.
* HashLinklist reduces performance outlier caused by skewed bucket by switching data in the bucket from linked list to skip list. Add parameter threshold_use_skiplist in NewHashLinkListRepFactory().
* RocksDB is now able to reclaim storage space more effectively during the compaction process. This is done by compensating the size of each deletion entry by the 2X average value size, which makes compaction to be triggered by deletion entries more easily.
* Add TimeOut API to write. Now WriteOptions have a variable called timeout_hint_us. With timeout_hint_us set to non-zero, any write associated with this timeout_hint_us may be aborted when it runs longer than the specified timeout_hint_us, and it is guaranteed that any write completes earlier than the specified time-out will not be aborted due to the time-out condition.
* Add a rate_limiter option, which controls total throughput of flush and compaction. The throughput is specified in bytes/sec. Flush always has precedence over compaction when available bandwidth is constrained.
### Public API changes
* Removed NewTotalOrderPlainTableFactory because it is not used and implemented semantically incorrect.
## 3.2.0 (06/20/2014)
### Public API changes
* We removed seek compaction as a concept from RocksDB because:
1) It makes more sense for spinning disk workloads, while RocksDB is primarily designed for flash and memory,
2) It added some complexity to the important code-paths,
3) None of our internal customers were really using it.
Because of that, Options::disable_seek_compaction is now obsolete. It is still a parameter in Options, so it does not break the build, but it does not have any effect. We plan to completely remove it at some point, so we ask users to please remove this option from your code base.
* Add two parameters to NewHashLinkListRepFactory() for logging on too many entries in a hash bucket when flushing.
* Added new option BlockBasedTableOptions::hash_index_allow_collision. When enabled, prefix hash index for block-based table will not store prefix and allow hash collision, reducing memory consumption.
### New Features
* PlainTable now supports a new key encoding: for keys of the same prefix, the prefix is only written once. It can be enabled through encoding_type parameter of NewPlainTableFactory()
* Add AdaptiveTableFactory, which is used to convert from a DB of PlainTable to BlockBasedTabe, or vise versa. It can be created using NewAdaptiveTableFactory()
### Performance Improvements
* Tailing Iterator re-implemeted with ForwardIterator + Cascading Search Hint , see ~20% throughput improvement.
## 3.1.0 (05/21/2014)
### Public API changes
* Replaced ColumnFamilyOptions::table_properties_collectors with ColumnFamilyOptions::table_properties_collector_factories
### New Features
* Hash index for block-based table will be materialized and reconstructed more efficiently. Previously hash index is constructed by scanning the whole table during every table open.
* FIFO compaction style
## 3.0.0 (05/05/2014)
### Public API changes
* Added _LEVEL to all InfoLogLevel enums
* Deprecated ReadOptions.prefix and ReadOptions.prefix_seek. Seek() defaults to prefix-based seek when Options.prefix_extractor is supplied. More detail is documented in https://github.com/facebook/rocksdb/wiki/Prefix-Seek-API-Changes
* MemTableRepFactory::CreateMemTableRep() takes info logger as an extra parameter.
### New Features
* Column family support
* Added an option to use different checksum functions in BlockBasedTableOptions
* Added ApplyToAllCacheEntries() function to Cache
## 2.8.0 (04/04/2014)
* Removed arena.h from public header files.
* By default, checksums are verified on every read from database
* Change default value of several options, including: paranoid_checks=true, max_open_files=5000, level0_slowdown_writes_trigger=20, level0_stop_writes_trigger=24, disable_seek_compaction=true, max_background_flushes=1 and allow_mmap_writes=false
* Added is_manual_compaction to CompactionFilter::Context
* Added "virtual void WaitForJoin()" in class Env. Default operation is no-op.
* Removed BackupEngine::DeleteBackupsNewerThan() function
* Added new option -- verify_checksums_in_compaction
* Changed Options.prefix_extractor from raw pointer to shared_ptr (take ownership)
Changed HashSkipListRepFactory and HashLinkListRepFactory constructor to not take SliceTransform object (use Options.prefix_extractor implicitly)
* Added Env::GetThreadPoolQueueLen(), which returns the waiting queue length of thread pools
* Added a command "checkconsistency" in ldb tool, which checks
if file system state matches DB state (file existence and file sizes)
* Separate options related to block based table to a new struct BlockBasedTableOptions.
* WriteBatch has a new function Count() to return total size in the batch, and Data() now returns a reference instead of a copy
* Add more counters to perf context.
* Supports several more DB properties: compaction-pending, background-errors and cur-size-active-mem-table.
### New Features
* If we find one truncated record at the end of the MANIFEST or WAL files,
we will ignore it. We assume that writers of these records were interrupted
and that we can safely ignore it.
* A new SST format "PlainTable" is added, which is optimized for memory-only workloads. It can be created through NewPlainTableFactory() or NewTotalOrderPlainTableFactory().
* A new mem table implementation hash linked list optimizing for the case that there are only few keys for each prefix, which can be created through NewHashLinkListRepFactory().
* Merge operator supports a new function PartialMergeMulti() to allow users to do partial merges against multiple operands.
* Now compaction filter has a V2 interface. It buffers the kv-pairs sharing the same key prefix, process them in batches, and return the batched results back to DB. The new interface uses a new structure CompactionFilterContext for the same purpose as CompactionFilter::Context in V1.
* Geo-spatial support for locations and radial-search.
## 2.7.0 (01/28/2014)
### Public API changes
* Renamed `StackableDB::GetRawDB()` to `StackableDB::GetBaseDB()`.
* Renamed `WriteBatch::Data()` `const std::string& Data() const`.
* Renamed class `TableStats` to `TableProperties`.
* Deleted class `PrefixHashRepFactory`. Please use `NewHashSkipListRepFactory()` instead.
* Supported multi-threaded `EnableFileDeletions()` and `DisableFileDeletions()`.
* Added `DB::GetOptions()`.
* Added `DB::GetDbIdentity()`.
### New Features
* Added [BackupableDB](https://github.com/facebook/rocksdb/wiki/How-to-backup-RocksDB%3F)
* Implemented [TailingIterator](https://github.com/facebook/rocksdb/wiki/Tailing-Iterator), a special type of iterator that
doesn't create a snapshot (can be used to read newly inserted data)
and is optimized for doing sequential reads.
* Added property block for table, which allows (1) a table to store
its metadata and (2) end user to collect and store properties they
are interested in.
* Enabled caching index and filter block in block cache (turned off by default).
* Supported error report when doing manual compaction.
* Supported additional Linux platform flavors and Mac OS.
* Put with `SliceParts` - Variant of `Put()` that gathers output like `writev(2)`
* Bug fixes and code refactor for compatibility with upcoming Column
Family feature.
### Performance Improvements
* Huge benchmark performance improvements by multiple efforts. For example, increase in readonly QPS from about 530k in 2.6 release to 1.1 million in 2.7 [1]
* Speeding up a way RocksDB deleted obsolete files - no longer listing the whole directory under a lock -- decrease in p99
* Use raw pointer instead of shared pointer for statistics: [5b825d](https://github.com/facebook/rocksdb/commit/5b825d6964e26ec3b4bb6faa708ebb1787f1d7bd) -- huge increase in performance -- shared pointers are slow
* Optimized locking for `Get()` -- [1fdb3f](https://github.com/facebook/rocksdb/commit/1fdb3f7dc60e96394e3e5b69a46ede5d67fb976c) -- 1.5x QPS increase for some workloads
* Cache speedup - [e8d40c3](https://github.com/facebook/rocksdb/commit/e8d40c31b3cca0c3e1ae9abe9b9003b1288026a9)
* Implemented autovector, which allocates first N elements on stack. Most of vectors in RocksDB are small. Also, we never want to allocate heap objects while holding a mutex. -- [c01676e4](https://github.com/facebook/rocksdb/commit/c01676e46d3be08c3c140361ef1f5884f47d3b3c)
* Lots of efforts to move malloc, memcpy and IO outside of locks
-202
View File
@@ -1,202 +0,0 @@
## Compilation
**Important**: If you plan to run RocksDB in production, don't compile using default
`make` or `make all`. That will compile RocksDB in debug mode, which is much slower
than release mode.
RocksDB's library should be able to compile without any dependency installed,
although we recommend installing some compression libraries (see below).
We do depend on newer gcc/clang with C++11 support.
There are few options when compiling RocksDB:
* [recommended] `make static_lib` will compile librocksdb.a, RocksDB static library. Compiles static library in release mode.
* `make shared_lib` will compile librocksdb.so, RocksDB shared library. Compiles shared library in release mode.
* `make check` will compile and run all the unit tests. `make check` will compile RocksDB in debug mode.
* `make all` will compile our static library, and all our tools and unit tests. Our tools
depend on gflags. You will need to have gflags installed to run `make all`. This will compile RocksDB in debug mode. Don't
use binaries compiled by `make all` in production.
* By default the binary we produce is optimized for the platform you're compiling on
(`-march=native` or the equivalent). SSE4.2 will thus be enabled automatically if your
CPU supports it. To print a warning if your CPU does not support SSE4.2, build with
`USE_SSE=1 make static_lib` or, if using CMake, `cmake -DFORCE_SSE42=ON`. If you want
to build a portable binary, add `PORTABLE=1` before your make commands, like this:
`PORTABLE=1 make static_lib`.
## Dependencies
* You can link RocksDB with following compression libraries:
- [zlib](http://www.zlib.net/) - a library for data compression.
- [bzip2](http://www.bzip.org/) - a library for data compression.
- [lz4](https://github.com/lz4/lz4) - a library for extremely fast data compression.
- [snappy](http://google.github.io/snappy/) - a library for fast
data compression.
- [zstandard](http://www.zstd.net) - Fast real-time compression
algorithm.
* All our tools depend on:
- [gflags](https://gflags.github.io/gflags/) - a library that handles
command line flags processing. You can compile rocksdb library even
if you don't have gflags installed.
* If you wish to build the RocksJava static target, then cmake is required for building Snappy.
## Supported platforms
* **Linux - Ubuntu**
* Upgrade your gcc to version at least 4.8 to get C++11 support.
* Install gflags. First, try: `sudo apt-get install libgflags-dev`
If this doesn't work and you're using Ubuntu, here's a nice tutorial:
(http://askubuntu.com/questions/312173/installing-gflags-12-04)
* Install snappy. This is usually as easy as:
`sudo apt-get install libsnappy-dev`.
* Install zlib. Try: `sudo apt-get install zlib1g-dev`.
* Install bzip2: `sudo apt-get install libbz2-dev`.
* Install lz4: `sudo apt-get install liblz4-dev`.
* Install zstandard: `sudo apt-get install libzstd-dev`.
* **Linux - CentOS / RHEL**
* Upgrade your gcc to version at least 4.8 to get C++11 support:
`yum install gcc48-c++`
* Install gflags:
git clone https://github.com/gflags/gflags.git
cd gflags
git checkout v2.0
./configure && make && sudo make install
**Notice**: Once installed, please add the include path for gflags to your `CPATH` environment variable and the
lib path to `LIBRARY_PATH`. If installed with default settings, the include path will be `/usr/local/include`
and the lib path will be `/usr/local/lib`.
* Install snappy:
sudo yum install snappy snappy-devel
* Install zlib:
sudo yum install zlib zlib-devel
* Install bzip2:
sudo yum install bzip2 bzip2-devel
* Install lz4:
sudo yum install lz4-devel
* Install ASAN (optional for debugging):
sudo yum install libasan
* Install zstandard:
wget https://github.com/facebook/zstd/archive/v1.1.3.tar.gz
mv v1.1.3.tar.gz zstd-1.1.3.tar.gz
tar zxvf zstd-1.1.3.tar.gz
cd zstd-1.1.3
make && sudo make install
* **OS X**:
* Install latest C++ compiler that supports C++ 11:
* Update XCode: run `xcode-select --install` (or install it from XCode App's settting).
* Install via [homebrew](http://brew.sh/).
* If you're first time developer in MacOS, you still need to run: `xcode-select --install` in your command line.
* run `brew tap homebrew/versions; brew install gcc48 --use-llvm` to install gcc 4.8 (or higher).
* run `brew install rocksdb`
* **FreeBSD** (11.01):
* You can either install RocksDB from the Ports system using `cd /usr/ports/databases/rocksdb && make install`, or you can follow the details below to install dependencies and compile from source code:
* Install the dependencies for RocksDB:
export BATCH=YES
cd /usr/ports/devel/gmake && make install
cd /usr/ports/devel/gflags && make install
cd /usr/ports/archivers/snappy && make install
cd /usr/ports/archivers/bzip2 && make install
cd /usr/ports/archivers/liblz4 && make install
cd /usr/ports/archivesrs/zstd && make install
cd /usr/ports/devel/git && make install
* Install the dependencies for RocksJava (optional):
export BATCH=yes
cd /usr/ports/java/openjdk7 && make install
* Build RocksDB from source:
cd ~
git clone https://github.com/facebook/rocksdb.git
cd rocksdb
gmake static_lib
* Build RocksJava from source (optional):
cd rocksdb
export JAVA_HOME=/usr/local/openjdk7
gmake rocksdbjava
* **OpenBSD** (6.3/-current):
* As RocksDB is not available in the ports yet you have to build it on your own:
* Install the dependencies for RocksDB:
pkg_add gmake gflags snappy bzip2 lz4 zstd git jdk bash findutils gnuwatch
* Build RocksDB from source:
cd ~
git clone https://github.com/facebook/rocksdb.git
cd rocksdb
gmake static_lib
* Build RocksJava from source (optional):
cd rocksdb
export JAVA_HOME=/usr/local/jdk-1.8.0
export PATH=$PATH:/usr/local/jdk-1.8.0/bin
gmake rocksdbjava
* **iOS**:
* Run: `TARGET_OS=IOS make static_lib`. When building the project which uses rocksdb iOS library, make sure to define two important pre-processing macros: `ROCKSDB_LITE` and `IOS_CROSS_COMPILE`.
* **Windows**:
* For building with MS Visual Studio 13 you will need Update 4 installed.
* Read and follow the instructions at CMakeLists.txt
* Or install via [vcpkg](https://github.com/microsoft/vcpkg)
* run `vcpkg install rocksdb:x64-windows`
* **AIX 6.1**
* Install AIX Toolbox rpms with gcc
* Use these environment variables:
export PORTABLE=1
export CC=gcc
export AR="ar -X64"
export EXTRA_ARFLAGS=-X64
export EXTRA_CFLAGS=-maix64
export EXTRA_CXXFLAGS=-maix64
export PLATFORM_LDFLAGS="-static-libstdc++ -static-libgcc"
export LIBPATH=/opt/freeware/lib
export JAVA_HOME=/usr/java8_64
export PATH=/opt/freeware/bin:$PATH
* **Solaris Sparc**
* Install GCC 4.8.2 and higher.
* Use these environment variables:
export CC=gcc
export EXTRA_CFLAGS=-m64
export EXTRA_CXXFLAGS=-m64
export EXTRA_LDFLAGS=-m64
export PORTABLE=1
export PLATFORM_LDFLAGS="-static-libstdc++ -static-libgcc"
-22
View File
@@ -1,22 +0,0 @@
This is the list of all known third-party language bindings for RocksDB. If something is missing, please open a pull request to add it.
* Java - https://github.com/facebook/rocksdb/tree/master/java
* Python
* http://python-rocksdb.readthedocs.io/en/latest/
* http://pyrocksdb.readthedocs.org/en/latest/ (unmaintained)
* Perl - https://metacpan.org/pod/RocksDB
* Node.js - https://npmjs.org/package/rocksdb
* Go - https://github.com/tecbot/gorocksdb
* Ruby - http://rubygems.org/gems/rocksdb-ruby
* Haskell - https://hackage.haskell.org/package/rocksdb-haskell
* PHP - https://github.com/Photonios/rocksdb-php
* C# - https://github.com/warrenfalk/rocksdb-sharp
* Rust
* https://github.com/pingcap/rust-rocksdb (used in production fork of https://github.com/spacejam/rust-rocksdb)
* https://github.com/spacejam/rust-rocksdb
* https://github.com/bh1xuw/rust-rocks
* D programming language - https://github.com/b1naryth1ef/rocksdb
* Erlang - https://gitlab.com/barrel-db/erlang-rocksdb
* Elixir - https://github.com/urbint/rox
* Nim - https://github.com/status-im/nim-rocksdb
* Swift and Objective-C (iOS/OSX) - https://github.com/iabudiab/ObjectiveRocks
-202
View File
@@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-29
View File
@@ -1,29 +0,0 @@
This contains code that is from LevelDB, and that code is under the following license:
Copyright (c) 2011 The LevelDB Authors. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above
copyright notice, this list of conditions and the following disclaimer
in the documentation and/or other materials provided with the
distribution.
* Neither the name of Google Inc. nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-2047
View File
File diff suppressed because it is too large. Load diff
-31
View File
@@ -1,31 +0,0 @@
## RocksDB: A Persistent Key-Value Store for Flash and RAM Storage
[![Linux/Mac Build Status](https://travis-ci.org/facebook/rocksdb.svg?branch=master)](https://travis-ci.org/facebook/rocksdb)
[![Windows Build status](https://ci.appveyor.com/api/projects/status/fbgfu0so3afcno78/branch/master?svg=true)](https://ci.appveyor.com/project/Facebook/rocksdb/branch/master)
[![PPC64le Build Status](http://140.211.168.68:8080/buildStatus/icon?job=Rocksdb)](http://140.211.168.68:8080/job/Rocksdb)
RocksDB is developed and maintained by Facebook Database Engineering Team.
It is built on earlier work on [LevelDB](https://github.com/google/leveldb) by Sanjay Ghemawat (sanjay@google.com)
and Jeff Dean (jeff@google.com)
This code is a library that forms the core building block for a fast
key value server, especially suited for storing data on flash drives.
It has a Log-Structured-Merge-Database (LSM) design with flexible tradeoffs
between Write-Amplification-Factor (WAF), Read-Amplification-Factor (RAF)
and Space-Amplification-Factor (SAF). It has multi-threaded compactions,
making it specially suitable for storing multiple terabytes of data in a
single database.
Start with example usage here: https://github.com/facebook/rocksdb/tree/master/examples
See the [github wiki](https://github.com/facebook/rocksdb/wiki) for more explanation.
The public interface is in `include/`. Callers should not include or
rely on the details of any other header files in this package. Those
internal APIs may be changed without warning.
Design discussions are conducted in https://www.facebook.com/groups/rocksdb.dev/
## License
RocksDB is dual-licensed under both the GPLv2 (found in the COPYING file in the root directory) and Apache 2.0 License (found in the LICENSE.Apache file in the root directory). You may select, at your option, one of the above-listed licenses.
-21
View File
@@ -1,21 +0,0 @@
# RocksDBLite
RocksDBLite is a project focused on mobile use cases, which don't need a lot of fancy things we've built for server workloads and they are very sensitive to binary size. For that reason, we added a compile flag ROCKSDB_LITE that comments out a lot of the nonessential code and keeps the binary lean.
Some examples of the features disabled by ROCKSDB_LITE:
* compiled-in support for LDB tool
* No backupable DB
* No support for replication (which we provide in form of TransactionalIterator)
* No advanced monitoring tools
* No special-purpose memtables that are highly optimized for specific use cases
* No Transactions
When adding a new big feature to RocksDB, please add ROCKSDB_LITE compile guard if:
* Nobody from mobile really needs your feature,
* Your feature is adding a lot of weight to the binary.
Don't add ROCKSDB_LITE compile guard if:
* It would introduce a lot of code complexity. Compile guards make code harder to read. It's a trade-off.
* Your feature is not adding a lot of weight.
If unsure, ask. :)
-1458
View File
File diff suppressed because it is too large. Load diff
-98
View File
@@ -1,98 +0,0 @@
This document lists users of RocksDB and their use cases. If you are using RocksDB, please open a pull request and add yourself to the list.
## Facebook
At Facebook, we use RocksDB as storage engines in multiple data management services and a backend for many different stateful services, including:
1. MyRocks -- https://github.com/MySQLOnRocksDB/mysql-5.6
2. MongoRocks -- https://github.com/mongodb-partners/mongo-rocks
3. ZippyDB -- Facebook's distributed key-value store with Paxos-style replication, built on top of RocksDB.[1] https://www.youtube.com/watch?v=DfiN7pG0D0khtt
4. Laser -- Laser is a high query throughput, low (millisecond) latency, key-value storage service built on top of RocksDB.[1]
4. Dragon -- a distributed graph query engine. https://code.facebook.com/posts/1737605303120405/dragon-a-distributed-graph-query-engine/
5. Stylus -- a low-level stream processing framework writtenin C++.[1]
6. LogDevice -- a distributed data store for logs [2]
[1] https://research.facebook.com/publications/realtime-data-processing-at-facebook/
[2] https://code.facebook.com/posts/357056558062811/logdevice-a-distributed-data-store-for-logs/
## LinkedIn
Two different use cases at Linkedin are using RocksDB as a storage engine:
1. LinkedIn's follow feed for storing user's activities. Check out the blog post: https://engineering.linkedin.com/blog/2016/03/followfeed--linkedin-s-feed-made-faster-and-smarter
2. Apache Samza, open source framework for stream processing
Learn more about those use cases in a Tech Talk by Ankit Gupta and Naveen Somasundaram: http://www.youtube.com/watch?v=plqVp_OnSzg
## Yahoo
Yahoo is using RocksDB as a storage engine for their biggest distributed data store Sherpa. Learn more about it here: http://yahooeng.tumblr.com/post/120730204806/sherpa-scales-new-heights
## CockroachDB
CockroachDB is an open-source geo-replicated transactional database. They are using RocksDB as their storage engine. Check out their github: https://github.com/cockroachdb/cockroach
## DNANexus
DNANexus is using RocksDB to speed up processing of genomics data.
You can learn more from this great blog post by Mike Lin: http://devblog.dnanexus.com/faster-bam-sorting-with-samtools-and-rocksdb/
## Iron.io
Iron.io is using RocksDB as a storage engine for their distributed queueing system.
Learn more from Tech Talk by Reed Allman: http://www.youtube.com/watch?v=HTjt6oj-RL4
## Tango Me
Tango is using RocksDB as a graph storage to store all users' connection data and other social activity data.
## Turn
Turn is using RocksDB as a storage layer for their key/value store, serving at peak 2.4MM QPS out of different datacenters.
Check out our RocksDB Protobuf merge operator at: https://github.com/vladb38/rocksdb_protobuf
## Santanader UK/Cloudera Profession Services
Check out their blog post: http://blog.cloudera.com/blog/2015/08/inside-santanders-near-real-time-data-ingest-architecture/
## Airbnb
Airbnb is using RocksDB as a storage engine for their personalized search service. You can learn more about it here: https://www.youtube.com/watch?v=ASQ6XMtogMs
## Alluxio
[Alluxio](https://www.alluxio.io) uses RocksDB to serve and scale file system metadata to beyond 1 Billion files. The detailed design and implementation is described in this engineering blog:
https://www.alluxio.io/blog/scalable-metadata-service-in-alluxio-storing-billions-of-files/
## Pinterest
Pinterest's Object Retrieval System uses RocksDB for storage: https://www.youtube.com/watch?v=MtFEVEs_2Vo
## Smyte
[Smyte](https://www.smyte.com/) uses RocksDB as the storage layer for their core key-value storage, high-performance counters and time-windowed HyperLogLog services.
## Rakuten Marketing
[Rakuten Marketing](https://marketing.rakuten.com/) uses RocksDB as the disk cache layer for the real-time bidding service in their Performance DSP.
## VWO, Wingify
[VWO's](https://vwo.com/) Smart Code checker and URL helper uses RocksDB to store all the URLs where VWO's Smart Code is installed.
## quasardb
[quasardb](https://www.quasardb.net) is a high-performance, distributed, transactional key-value database that integrates well with in-memory analytics engines such as Apache Spark.
quasardb uses a heavily tuned RocksDB as its persistence layer.
## Netflix
[Netflix](http://techblog.netflix.com/2016/05/application-data-caching-using-ssds.html) Netflix uses RocksDB on AWS EC2 instances with local SSD drives to cache application data.
## TiKV
[TiKV](https://github.com/pingcap/tikv) is a GEO-replicated, high-performance, distributed, transactional key-value database. TiKV is powered by Rust and Raft. TiKV uses RocksDB as its persistence layer.
## Apache Flink
[Apache Flink](https://flink.apache.org/news/2016/03/08/release-1.0.0.html) uses RocksDB to store state locally on a machine.
## Dgraph
[Dgraph](https://github.com/dgraph-io/dgraph) is an open-source, scalable, distributed, low latency, high throughput Graph database .They use RocksDB to store state locally on a machine.
## Uber
[Uber](http://eng.uber.com/cherami/) uses RocksDB as a durable and scalable task queue.
## 360 Pika
[360](http://www.360.cn/) [Pika](https://github.com/Qihoo360/pika) is a nosql compatible with redis. With the huge amount of data stored, redis may suffer for a capacity bottleneck, and pika was born for solving it. It has widely been widely used in many company
## LzLabs
LzLabs is using RocksDB as a storage engine in their multi-database distributed framework to store application configuration and user data.
## ProfaneDB
[ProfaneDB](https://profanedb.gitlab.io/) is a database for Protocol Buffers, and uses RocksDB for storage. It is accessible via gRPC, and the schema is defined using directly `.proto` files.
## IOTA Foundation
[IOTA Foundation](https://www.iota.org/) is using RocksDB in the [IOTA Reference Implementation (IRI)](https://github.com/iotaledger/iri) to store the local state of the Tangle. The Tangle is the first open-source distributed ledger powering the future of the Internet of Things.
-39
View File
@@ -1,39 +0,0 @@
# Vagrant file
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |v|
v.memory = 4096
v.cpus = 2
end
config.vm.define "ubuntu14" do |box|
box.vm.box = "ubuntu/trusty64"
end
config.vm.define "centos65" do |box|
box.vm.box = "chef/centos-6.5"
end
config.vm.define "centos7" do |box|
box.vm.box = "centos/7"
box.vm.provision "shell", path: "build_tools/setup_centos7.sh"
end
config.vm.define "FreeBSD10" do |box|
box.vm.guest = :freebsd
box.vm.box = "robin/freebsd-10"
# FreeBSD does not support 'mount_virtualbox_shared_folder', use NFS
box.vm.synced_folder ".", "/vagrant", :nfs => true, id: "vagrant-root"
box.vm.network "private_network", ip: "10.0.1.10"
# build everything after creating VM, skip using --no-provision
box.vm.provision "shell", inline: <<-SCRIPT
pkg install -y gmake clang35
export CXX=/usr/local/bin/clang++35
cd /vagrant
gmake clean
gmake all OPT=-g
SCRIPT
end
end
-228
View File
@@ -1,228 +0,0 @@
# Microsoft Contribution Notes
## Contributors
* Alexander Zinoviev https://github.com/zinoale
* Dmitri Smirnov https://github.com/yuslepukhin
* Praveen Rao https://github.com/PraveenSinghRao
* Sherlock Huang https://github.com/SherlockNoMad
## Introduction
RocksDB is a well proven open source key-value persistent store, optimized for fast storage. It provides scalability with number of CPUs and storage IOPS, to support IO-bound, in-memory and write-once workloads, most importantly, to be flexible to allow for innovation.
As Microsoft Bing team we have been continuously pushing hard to improve the scalability, efficiency of platform and eventually benefit Bing end-user satisfaction. We would like to explore the opportunity to embrace open source, RocksDB here, to use, enhance and customize for our usage, and also contribute back to the RocksDB community. Herein, we are pleased to offer this RocksDB port for Windows platform.
These notes describe some decisions and changes we had to make with regards to porting RocksDB on Windows. We hope this will help both reviewers and users of the Windows port.
We are open for comments and improvements.
## OS specifics
All of the porting, testing and benchmarking was done on Windows Server 2012 R2 Datacenter 64-bit but to the best of our knowledge there is not a specific API we used during porting that is unsupported on other Windows OS after Vista.
## Porting goals
We strive to achieve the following goals:
* make use of the existing porting interface of RocksDB
* make minimum [WY2]modifications within platform independent code.
* make all unit test pass both in debug and release builds.
* Note: latest introduction of SyncPoint seems to disable running db_test in Release.
* make performance on par with published benchmarks accounting for HW differences
* we would like to keep the port code inline with the master branch with no forking
## Build system
We have chosen CMake as a widely accepted build system to build the Windows port. It is very fast and convenient.
At the same time it generates Visual Studio projects that are both usable from a command line and IDE.
The top-level CMakeLists.txt file contains description of all targets and build rules. It also provides brief instructions on how to build the software for Windows. One more build related file is thirdparty.inc that also resides on the top level. This file must be edited to point to actual third party libraries location.
We think that it would be beneficial to merge the existing make-based build system and the new cmake-based build system into a single one to use on all platforms.
All building and testing was done for 64-bit. We have not conducted any testing for 32-bit and early reports indicate that it will not run on 32-bit.
## C++ and STL notes
We had to make some minimum changes within the portable files that either account for OS differences or the shortcomings of C++11 support in the current version of the MS compiler. Most or all of them are expected to be fixed in the upcoming compiler releases.
We plan to use this port for our business purposes here at Bing and this provided business justification for this port. This also means, we do not have at present to choose the compiler version at will.
* Certain headers that are not present and not necessary on Windows were simply `#ifndef OS_WIN` in a few places (`unistd.h`)
* All posix specific headers were replaced to port/port.h which worked well
* Replaced `dirent.h` for `port/port_dirent.h` (very few places) with the implementation of the relevant interfaces within `rocksdb::port` namespace
* Replaced `sys/time.h` to `port/sys_time.h` (few places) implemented equivalents within `rocksdb::port`
* `printf %z` specification is not supported on Windows. To imitate existing standards we came up with a string macro `ROCKSDB_PRIszt` which expands to `zu` on posix systems and to `Iu` on windows.
* in class member initialization were moved to a __ctors in some cases
* `constexpr` is not supported. We had to replace `std::numeric_limits<>::max/min()` to its C macros for constants. Sometimes we had to make class members `static const` and place a definition within a .cc file.
* `constexpr` for functions was replaced to a template specialization (1 place)
* Union members that have non-trivial constructors were replaced to `char[]` in one place along with bug fixes (spatial experimental feature)
* Zero-sized arrays are deemed a non-standard extension which we converted to 1 size array and that should work well for the purposes of these classes.
* `std::chrono` lacks nanoseconds support (fixed in the upcoming release of the STL) and we had to use `QueryPerfCounter()` within env_win.cc
* Function local statics initialization is still not safe. Used `std::once` to mitigate within WinEnv.
## Windows Environments notes
We endeavored to make it functionally on par with posix_env. This means we replicated the functionality of the thread pool and other things as precise as possible, including:
* Replicate posix logic using std:thread primitives.
* Implement all posix_env disk access functionality.
* Set `use_os_buffer=false` to disable OS disk buffering for WinWritableFile and WinRandomAccessFile.
* Replace `pread/pwrite` with `WriteFile/ReadFile` with `OVERLAPPED` structure.
* Use `SetFileInformationByHandle` to compensate absence of `fallocate`.
### In detail
Even though Windows provides its own efficient thread-pool implementation we chose to replicate posix logic using `std::thread` primitives. This allows anyone to quickly detect any changes within the posix source code and replicate them within windows env. This has proven to work very well. At the same time for anyone who wishes to replace the built-in thread-pool can do so using RocksDB stackable environments.
For disk access we implemented all of the functionality present within the posix_env which includes memory mapped files, random access, rate-limiter support etc.
The `use_os_buffer` flag on Posix platforms currently denotes disabling read-ahead log via `fadvise` mechanism. Windows does not have `fadvise` system call. What is more, it implements disk cache in a way that differs from Linux greatly. It’s not an uncommon practice on Windows to perform un-buffered disk access to gain control of the memory consumption. We think that in our use case this may also be a good configuration option at the expense of disk throughput. To compensate one may increase the configured in-memory cache size instead. Thus we have chosen `use_os_buffer=false` to disable OS disk buffering for `WinWritableFile` and `WinRandomAccessFile`. The OS imposes restrictions on the alignment of the disk offsets, buffers used and the amount of data that is read/written when accessing files in un-buffered mode. When the option is true, the classes behave in a standard way. This allows to perform writes and reads in cases when un-buffered access does not make sense such as WAL and MANIFEST.
We have replaced `pread/pwrite` with `WriteFile/ReadFile` with `OVERLAPPED` structure so we can atomically seek to the position of the disk operation but still perform the operation synchronously. Thus we able to emulate that functionality of `pread/pwrite` reasonably well. The only difference is that the file pointer is not returned to its original position but that hardly matters given the random nature of access.
We used `SetFileInformationByHandle` both to truncate files after writing a full final page to disk and to pre-allocate disk space for faster I/O thus compensating for the absence of `fallocate` although some differences remain. For example, the pre-allocated space is not filled with zeros like on Linux, however, on a positive note, the end of file position is also not modified after pre-allocation.
RocksDB renames, copies and deletes files at will even though they may be opened with another handle at the same time. We had to relax and allow nearly all the concurrent access permissions possible.
## Thread-Local Storage
Thread-Local storage plays a significant role for RocksDB performance. Rather than creating a separate implementation we chose to create inline wrappers that forward `pthread_specific` calls to Windows `Tls` interfaces within `rocksdb::port` namespace. This leaves the existing meat of the logic in tact and unchanged and just as maintainable.
To mitigate the lack of thread local storage cleanup on thread-exit we added a limited amount of windows specific code within the same thread_local.cc file that injects a cleanup callback into a `"__tls"` structure within `".CRT$XLB"` data segment. This approach guarantees that the callback is invoked regardless of whether RocksDB used within an executable, standalone DLL or within another DLL.
## Jemalloc usage
When RocksDB is used with Jemalloc the latter needs to be initialized before any of the C++ globals or statics. To accomplish that we injected an initialization routine into `".CRT$XCT"` that is automatically invoked by the runtime before initializing static objects. je-uninit is queued to `atexit()`.
The jemalloc redirecting `new/delete` global operators are used by the linker providing certain conditions are met. See build section in these notes.
## Stack Trace and Unhandled Exception Handler
We decided not to implement these two features because the hosting program as a rule has these two things in it.
We experienced no inconveniences debugging issues in the debugger or analyzing process dumps if need be and thus we did not
see this as a priority.
## Performance results
### Setup
All of the benchmarks are run on the same set of machines. Here are the details of the test setup:
* 2 Intel(R) Xeon(R) E5 2450 0 @ 2.10 GHz (total 16 cores)
* 2 XK0480GDQPH SSD Device, total 894GB free disk
* Machine has 128 GB of RAM
* Operating System: Windows Server 2012 R2 Datacenter
* 100 Million keys; each key is of size 10 bytes, each value is of size 800 bytes
* total database size is ~76GB
* The performance result is based on RocksDB 3.11.
* The parameters used, unless specified, were exactly the same as published in the GitHub Wiki page.
### RocksDB on flash storage
#### Test 1. Bulk Load of keys in Random Order
Version 3.11
* Total Run Time: 17.6 min
* Fillrandom: 5.480 micros/op 182465 ops/sec; 142.0 MB/s
* Compact: 486056544.000 micros/op 0 ops/sec
Version 3.10
* Total Run Time: 16.2 min
* Fillrandom: 5.018 micros/op 199269 ops/sec; 155.1 MB/s
* Compact: 441313173.000 micros/op 0 ops/sec;
#### Test 2. Bulk Load of keys in Sequential Order
Version 3.11
* Fillseq: 4.944 micros/op 202k ops/sec; 157.4 MB/s
Version 3.10
* Fillseq: 4.105 micros/op 243.6k ops/sec; 189.6 MB/s
#### Test 3. Random Write
Version 3.11
* Unbuffered I/O enabled
* Overwrite: 52.661 micros/op 18.9k ops/sec; 14.8 MB/s
Version 3.10
* Unbuffered I/O enabled
* Overwrite: 52.661 micros/op 18.9k ops/sec;
#### Test 4. Random Read
Version 3.11
* Unbuffered I/O enabled
* Readrandom: 15.716 micros/op 63.6k ops/sec; 49.5 MB/s
Version 3.10
* Unbuffered I/O enabled
* Readrandom: 15.548 micros/op 64.3k ops/sec;
#### Test 5. Multi-threaded read and single-threaded write
Version 3.11
* Unbuffered I/O enabled
* Readwhilewriting: 25.128 micros/op 39.7k ops/sec;
Version 3.10
* Unbuffered I/O enabled
* Readwhilewriting: 24.854 micros/op 40.2k ops/sec;
### RocksDB In Memory
#### Test 1. Point Lookup
Version 3.11
80K writes/sec
* Write Rate Achieved: 40.5k write/sec;
* Readwhilewriting: 0.314 micros/op 3187455 ops/sec; 364.8 MB/s (715454999 of 715454999 found)
Version 3.10
* Write Rate Achieved: 50.6k write/sec
* Readwhilewriting: 0.316 micros/op 3162028 ops/sec; (719576999 of 719576999 found)
*10K writes/sec*
Version 3.11
* Write Rate Achieved: 5.8k/s write/sec
* Readwhilewriting: 0.246 micros/op 4062669 ops/sec; 464.9 MB/s (915481999 of 915481999 found)
Version 3.10
* Write Rate Achieved: 5.8k/s write/sec
* Readwhilewriting: 0.244 micros/op 4106253 ops/sec; (927986999 of 927986999 found)
#### Test 2. Prefix Range Query
Version 3.11
80K writes/sec
* Write Rate Achieved: 46.3k/s write/sec
* Readwhilewriting: 0.362 micros/op 2765052 ops/sec; 316.4 MB/s (611549999 of 611549999 found)
Version 3.10
* Write Rate Achieved: 45.8k/s write/sec
* Readwhilewriting: 0.317 micros/op 3154941 ops/sec; (708158999 of 708158999 found)
Version 3.11
10K writes/sec
* Write Rate Achieved: 5.78k write/sec
* Readwhilewriting: 0.269 micros/op 3716692 ops/sec; 425.3 MB/s (837401999 of 837401999 found)
Version 3.10
* Write Rate Achieved: 5.7k write/sec
* Readwhilewriting: 0.261 micros/op 3830152 ops/sec; (863482999 of 863482999 found)
We think that there is still big room to improve the performance, which will be an ongoing effort for us.
-67
View File
@@ -1,67 +0,0 @@
version: 1.0.{build}
image: Visual Studio 2017
environment:
JAVA_HOME: C:\Program Files\Java\jdk1.8.0
THIRDPARTY_HOME: $(APPVEYOR_BUILD_FOLDER)\thirdparty
SNAPPY_HOME: $(THIRDPARTY_HOME)\snappy-1.1.7
SNAPPY_INCLUDE: $(SNAPPY_HOME);$(SNAPPY_HOME)\build
SNAPPY_LIB_DEBUG: $(SNAPPY_HOME)\build\Debug\snappy.lib
SNAPPY_LIB_RELEASE: $(SNAPPY_HOME)\build\Release\snappy.lib
LZ4_HOME: $(THIRDPARTY_HOME)\lz4-1.8.3
LZ4_INCLUDE: $(LZ4_HOME)\lib
LZ4_LIB_DEBUG: $(LZ4_HOME)\visual\VS2010\bin\x64_Debug\liblz4_static.lib
LZ4_LIB_RELEASE: $(LZ4_HOME)\visual\VS2010\bin\x64_Release\liblz4_static.lib
ZSTD_HOME: $(THIRDPARTY_HOME)\zstd-1.4.0
ZSTD_INCLUDE: $(ZSTD_HOME)\lib;$(ZSTD_HOME)\lib\dictBuilder
ZSTD_LIB_DEBUG: $(ZSTD_HOME)\build\VS2010\bin\x64_Debug\libzstd_static.lib
ZSTD_LIB_RELEASE: $(ZSTD_HOME)\build\VS2010\bin\x64_Release\libzstd_static.lib
install:
- md %THIRDPARTY_HOME%
- echo "Building Snappy dependency..."
- cd %THIRDPARTY_HOME%
- curl -fsSL -o snappy-1.1.7.zip https://github.com/google/snappy/archive/1.1.7.zip
- unzip snappy-1.1.7.zip
- cd snappy-1.1.7
- mkdir build
- cd build
- cmake -DCMAKE_GENERATOR_PLATFORM=x64 ..
- msbuild Snappy.sln /p:Configuration=Debug /p:Platform=x64
- msbuild Snappy.sln /p:Configuration=Release /p:Platform=x64
- echo "Building LZ4 dependency..."
- cd %THIRDPARTY_HOME%
- curl -fsSL -o lz4-1.8.3.zip https://github.com/lz4/lz4/archive/v1.8.3.zip
- unzip lz4-1.8.3.zip
- cd lz4-1.8.3\visual\VS2010
- ps: $CMD="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.com"; & $CMD lz4.sln /upgrade
- msbuild lz4.sln /p:Configuration=Debug /p:Platform=x64
- msbuild lz4.sln /p:Configuration=Release /p:Platform=x64
- echo "Building ZStd dependency..."
- cd %THIRDPARTY_HOME%
- curl -fsSL -o zstd-1.4.0.zip https://github.com/facebook/zstd/archive/v1.4.0.zip
- unzip zstd-1.4.0.zip
- cd zstd-1.4.0\build\VS2010
- ps: $CMD="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\devenv.com"; & $CMD zstd.sln /upgrade
- msbuild zstd.sln /p:Configuration=Debug /p:Platform=x64
- msbuild zstd.sln /p:Configuration=Release /p:Platform=x64
before_build:
- md %APPVEYOR_BUILD_FOLDER%\build
- cd %APPVEYOR_BUILD_FOLDER%\build
- cmake -G "Visual Studio 15 Win64" -DOPTDBG=1 -DPORTABLE=1 -DSNAPPY=1 -DLZ4=1 -DZSTD=1 -DXPRESS=1 -DJNI=1 ..
- cd ..
build:
project: build\rocksdb.sln
parallel: true
verbosity: normal
test:
test_script:
- ps: build_tools\run_ci_db_test.ps1 -SuiteRun db_basic_test,db_test2,db_test,env_basic_test,env_test -Concurrency 8
on_failure:
- cmd: 7z a build-failed.zip %APPVEYOR_BUILD_FOLDER%\build\ && appveyor PushArtifact build-failed.zip
-231
View File
@@ -1,231 +0,0 @@
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
from targets_builder import TARGETSBuilder
import json
import os
import fnmatch
import sys
from util import ColorString
# This script generates TARGETS file for Buck.
# Buck is a build tool specifying dependencies among different build targets.
# User can pass extra dependencies as a JSON object via command line, and this
# script can include these dependencies in the generate TARGETS file.
# Usage:
# $python buckifier/buckify_rocksdb.py
# (This generates a TARGET file without user-specified dependency for unit
# tests.)
# $python buckifier/buckify_rocksdb.py \
# '{"fake": { \
# "extra_deps": [":test_dep", "//fakes/module:mock1"], \
# "extra_compiler_flags": ["-DROCKSDB_LITE", "-Os"], \
# } \
# }'
# (Generated TARGETS file has test_dep and mock1 as dependencies for RocksDB
# unit tests, and will use the extra_compiler_flags to compile the unit test
# source.)
# tests to export as libraries for inclusion in other projects
_EXPORTED_TEST_LIBS = ["env_basic_test"]
# Parse src.mk files as a Dictionary of
# VAR_NAME => list of files
def parse_src_mk(repo_path):
src_mk = repo_path + "/src.mk"
src_files = {}
for line in open(src_mk):
line = line.strip()
if len(line) == 0 or line[0] == '#':
continue
if '=' in line:
current_src = line.split('=')[0].strip()
src_files[current_src] = []
elif '.cc' in line:
src_path = line.split('.cc')[0].strip() + '.cc'
src_files[current_src].append(src_path)
return src_files
# get all .cc / .c files
def get_cc_files(repo_path):
cc_files = []
for root, dirnames, filenames in os.walk(repo_path): # noqa: B007 T25377293 Grandfathered in
root = root[(len(repo_path) + 1):]
if "java" in root:
# Skip java
continue
for filename in fnmatch.filter(filenames, '*.cc'):
cc_files.append(os.path.join(root, filename))
for filename in fnmatch.filter(filenames, '*.c'):
cc_files.append(os.path.join(root, filename))
return cc_files
# Get tests from Makefile
def get_tests(repo_path):
Makefile = repo_path + "/Makefile"
# Dictionary TEST_NAME => IS_PARALLEL
tests = {}
found_tests = False
for line in open(Makefile):
line = line.strip()
if line.startswith("TESTS ="):
found_tests = True
elif found_tests:
if line.endswith("\\"):
# remove the trailing \
line = line[:-1]
line = line.strip()
tests[line] = False
else:
# we consumed all the tests
break
found_parallel_tests = False
for line in open(Makefile):
line = line.strip()
if line.startswith("PARALLEL_TEST ="):
found_parallel_tests = True
elif found_parallel_tests:
if line.endswith("\\"):
# remove the trailing \
line = line[:-1]
line = line.strip()
tests[line] = True
else:
# we consumed all the parallel tests
break
return tests
# Parse extra dependencies passed by user from command line
def get_dependencies():
deps_map = {
''.encode('ascii'): {
'extra_deps'.encode('ascii'): [],
'extra_compiler_flags'.encode('ascii'): []
}
}
if len(sys.argv) < 2:
return deps_map
def encode_dict(data):
rv = {}
for k, v in data.items():
if isinstance(k, unicode):
k = k.encode('ascii')
if isinstance(v, unicode):
v = v.encode('ascii')
elif isinstance(v, list):
v = [x.encode('ascii') for x in v]
elif isinstance(v, dict):
v = encode_dict(v)
rv[k] = v
return rv
extra_deps = json.loads(sys.argv[1], object_hook=encode_dict)
for target_alias, deps in extra_deps.items():
deps_map[target_alias] = deps
return deps_map
# Prepare TARGETS file for buck
def generate_targets(repo_path, deps_map):
print(ColorString.info("Generating TARGETS"))
# parsed src.mk file
src_mk = parse_src_mk(repo_path)
# get all .cc files
cc_files = get_cc_files(repo_path)
# get tests from Makefile
tests = get_tests(repo_path)
if src_mk is None or cc_files is None or tests is None:
return False
TARGETS = TARGETSBuilder("%s/TARGETS" % repo_path)
# rocksdb_lib
TARGETS.add_library(
"rocksdb_lib",
src_mk["LIB_SOURCES"] +
src_mk["TOOL_LIB_SOURCES"])
# rocksdb_test_lib
TARGETS.add_library(
"rocksdb_test_lib",
src_mk.get("MOCK_LIB_SOURCES", []) +
src_mk.get("TEST_LIB_SOURCES", []) +
src_mk.get("EXP_LIB_SOURCES", []) +
src_mk.get("ANALYZER_LIB_SOURCES", []),
[":rocksdb_lib"])
# rocksdb_tools_lib
TARGETS.add_library(
"rocksdb_tools_lib",
src_mk.get("BENCH_LIB_SOURCES", []) +
src_mk.get("ANALYZER_LIB_SOURCES", []) +
["test_util/testutil.cc"],
[":rocksdb_lib"])
print("Extra dependencies:\n{0}".format(str(deps_map)))
# test for every test we found in the Makefile
for target_alias, deps in deps_map.items():
for test in sorted(tests):
match_src = [src for src in cc_files if ("/%s.c" % test) in src]
if len(match_src) == 0:
print(ColorString.warning("Cannot find .cc file for %s" % test))
continue
elif len(match_src) > 1:
print(ColorString.warning("Found more than one .cc for %s" % test))
print(match_src)
continue
assert(len(match_src) == 1)
is_parallel = tests[test]
test_target_name = \
test if not target_alias else test + "_" + target_alias
TARGETS.register_test(
test_target_name,
match_src[0],
is_parallel,
deps['extra_deps'],
deps['extra_compiler_flags'])
if test in _EXPORTED_TEST_LIBS:
test_library = "%s_lib" % test_target_name
TARGETS.add_library(test_library, match_src, [":rocksdb_test_lib"])
TARGETS.flush_tests()
print(ColorString.info("Generated TARGETS Summary:"))
print(ColorString.info("- %d libs" % TARGETS.total_lib))
print(ColorString.info("- %d binarys" % TARGETS.total_bin))
print(ColorString.info("- %d tests" % TARGETS.total_test))
return True
def get_rocksdb_path():
# rocksdb = {script_dir}/..
script_dir = os.path.dirname(sys.argv[0])
script_dir = os.path.abspath(script_dir)
rocksdb_path = os.path.abspath(
os.path.join(script_dir, "../"))
return rocksdb_path
def exit_with_error(msg):
print(ColorString.error(msg))
sys.exit(1)
def main():
deps_map = get_dependencies()
# Generate TARGETS file for buck
ok = generate_targets(get_rocksdb_path(), deps_map)
if not ok:
exit_with_error("Failed to generate TARGETS files")
if __name__ == "__main__":
main()
-6
View File
@@ -1,6 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
# Create a tmp directory for the test to use
TEST_DIR=$(mktemp -d /dev/shm/fbcode_rocksdb_XXXXXXX)
# shellcheck disable=SC2068
TEST_TMPDIR="$TEST_DIR" $@ && rm -rf "$TEST_DIR"
-74
View File
@@ -1,74 +0,0 @@
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import targets_cfg
def pretty_list(lst, indent=8):
if lst is None or len(lst) == 0:
return ""
if len(lst) == 1:
return "\"%s\"" % lst[0]
separator = "\",\n%s\"" % (" " * indent)
res = separator.join(sorted(lst))
res = "\n" + (" " * indent) + "\"" + res + "\",\n" + (" " * (indent - 4))
return res
class TARGETSBuilder:
def __init__(self, path):
self.path = path
self.targets_file = open(path, 'w')
self.targets_file.write(targets_cfg.rocksdb_target_header)
self.total_lib = 0
self.total_bin = 0
self.total_test = 0
self.tests_cfg = ""
def __del__(self):
self.targets_file.close()
def add_library(self, name, srcs, deps=None, headers=None):
headers_attr_prefix = ""
if headers is None:
headers_attr_prefix = "auto_"
headers = "AutoHeaders.RECURSIVE_GLOB"
self.targets_file.write(targets_cfg.library_template.format(
name=name,
srcs=pretty_list(srcs),
headers_attr_prefix=headers_attr_prefix,
headers=headers,
deps=pretty_list(deps)))
self.total_lib = self.total_lib + 1
def add_binary(self, name, srcs, deps=None):
self.targets_file.write(targets_cfg.binary_template % (
name,
pretty_list(srcs),
pretty_list(deps)))
self.total_bin = self.total_bin + 1
def register_test(self,
test_name,
src,
is_parallel,
extra_deps,
extra_compiler_flags):
exec_mode = "serial"
if is_parallel:
exec_mode = "parallel"
self.tests_cfg += targets_cfg.test_cfg_template % (
test_name,
str(src),
str(exec_mode),
extra_deps,
extra_compiler_flags)
self.total_test = self.total_test + 1
def flush_tests(self):
self.targets_file.write(targets_cfg.unittests_template % self.tests_cfg)
self.tests_cfg = ""
-173
View File
@@ -1,173 +0,0 @@
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
rocksdb_target_header = """load("@fbcode_macros//build_defs:auto_headers.bzl", "AutoHeaders")
load("@fbcode_macros//build_defs:cpp_library.bzl", "cpp_library")
load(":defs.bzl", "test_binary")
REPO_PATH = package_name() + "/"
ROCKSDB_COMPILER_FLAGS = [
"-fno-builtin-memcmp",
# Needed to compile in fbcode
"-Wno-expansion-to-defined",
# Added missing flags from output of build_detect_platform
"-Wnarrowing",
"-DROCKSDB_NO_DYNAMIC_EXTENSION",
]
ROCKSDB_EXTERNAL_DEPS = [
("bzip2", None, "bz2"),
("snappy", None, "snappy"),
("zlib", None, "z"),
("gflags", None, "gflags"),
("lz4", None, "lz4"),
("zstd", None),
("tbb", None),
("googletest", None, "gtest"),
]
ROCKSDB_OS_DEPS = [
(
"linux",
["third-party//numa:numa"],
),
]
ROCKSDB_OS_PREPROCESSOR_FLAGS = [
(
"linux",
[
"-DOS_LINUX",
"-DROCKSDB_FALLOCATE_PRESENT",
"-DROCKSDB_MALLOC_USABLE_SIZE",
"-DROCKSDB_PTHREAD_ADAPTIVE_MUTEX",
"-DROCKSDB_RANGESYNC_PRESENT",
"-DROCKSDB_SCHED_GETCPU_PRESENT",
"-DHAVE_SSE42",
"-DNUMA",
],
),
(
"macos",
["-DOS_MACOSX"],
),
]
ROCKSDB_PREPROCESSOR_FLAGS = [
"-DROCKSDB_PLATFORM_POSIX",
"-DROCKSDB_LIB_IO_POSIX",
"-DROCKSDB_SUPPORT_THREAD_LOCAL",
# Flags to enable libs we include
"-DSNAPPY",
"-DZLIB",
"-DBZIP2",
"-DLZ4",
"-DZSTD",
"-DZSTD_STATIC_LINKING_ONLY",
"-DGFLAGS=gflags",
"-DTBB",
# Added missing flags from output of build_detect_platform
"-DROCKSDB_BACKTRACE",
# Directories with files for #include
"-I" + REPO_PATH + "include/",
"-I" + REPO_PATH,
]
ROCKSDB_ARCH_PREPROCESSOR_FLAGS = {
"x86_64": [
"-DHAVE_PCLMUL",
],
}
build_mode = read_config("fbcode", "build_mode")
is_opt_mode = build_mode.startswith("opt")
# -DNDEBUG is added by default in opt mode in fbcode. But adding it twice
# doesn't harm and avoid forgetting to add it.
ROCKSDB_COMPILER_FLAGS += (["-DNDEBUG"] if is_opt_mode else [])
sanitizer = read_config("fbcode", "sanitizer")
# Do not enable jemalloc if sanitizer presents. RocksDB will further detect
# whether the binary is linked with jemalloc at runtime.
ROCKSDB_OS_PREPROCESSOR_FLAGS += ([(
"linux",
["-DROCKSDB_JEMALLOC"],
)] if sanitizer == "" else [])
ROCKSDB_OS_DEPS += ([(
"linux",
["third-party//jemalloc:headers"],
)] if sanitizer == "" else [])
"""
library_template = """
cpp_library(
name = "{name}",
srcs = [{srcs}],
{headers_attr_prefix}headers = {headers},
arch_preprocessor_flags = ROCKSDB_ARCH_PREPROCESSOR_FLAGS,
compiler_flags = ROCKSDB_COMPILER_FLAGS,
os_deps = ROCKSDB_OS_DEPS,
os_preprocessor_flags = ROCKSDB_OS_PREPROCESSOR_FLAGS,
preprocessor_flags = ROCKSDB_PREPROCESSOR_FLAGS,
deps = [{deps}],
external_deps = ROCKSDB_EXTERNAL_DEPS,
)
"""
binary_template = """
cpp_binary(
name = "%s",
srcs = [%s],
arch_preprocessor_flags = ROCKSDB_ARCH_PREPROCESSOR_FLAGS,
compiler_flags = ROCKSDB_COMPILER_FLAGS,
preprocessor_flags = ROCKSDB_PREPROCESSOR_FLAGS,
deps = [%s],
external_deps = ROCKSDB_EXTERNAL_DEPS,
)
"""
test_cfg_template = """ [
"%s",
"%s",
"%s",
%s,
%s,
],
"""
unittests_template = """
# [test_name, test_src, test_type, extra_deps, extra_compiler_flags]
ROCKS_TESTS = [
%s]
# Generate a test rule for each entry in ROCKS_TESTS
# Do not build the tests in opt mode, since SyncPoint and other test code
# will not be included.
[
test_binary(
extra_compiler_flags = extra_compiler_flags,
extra_deps = extra_deps,
parallelism = parallelism,
rocksdb_arch_preprocessor_flags = ROCKSDB_ARCH_PREPROCESSOR_FLAGS,
rocksdb_compiler_flags = ROCKSDB_COMPILER_FLAGS,
rocksdb_external_deps = ROCKSDB_EXTERNAL_DEPS,
rocksdb_os_deps = ROCKSDB_OS_DEPS,
rocksdb_os_preprocessor_flags = ROCKSDB_OS_PREPROCESSOR_FLAGS,
rocksdb_preprocessor_flags = ROCKSDB_PREPROCESSOR_FLAGS,
test_cc = test_cc,
test_name = test_name,
)
for test_name, test_cc, parallelism, extra_deps, extra_compiler_flags in ROCKS_TESTS
if not is_opt_mode
]
"""
-108
View File
@@ -1,108 +0,0 @@
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
"""
This module keeps commonly used components.
"""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import subprocess
import os
import time
class ColorString:
""" Generate colorful strings on terminal """
HEADER = '\033[95m'
BLUE = '\033[94m'
GREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
@staticmethod
def _make_color_str(text, color):
return "".join([color, text.encode('utf-8'), ColorString.ENDC])
@staticmethod
def ok(text):
if ColorString.is_disabled:
return text
return ColorString._make_color_str(text, ColorString.GREEN)
@staticmethod
def info(text):
if ColorString.is_disabled:
return text
return ColorString._make_color_str(text, ColorString.BLUE)
@staticmethod
def header(text):
if ColorString.is_disabled:
return text
return ColorString._make_color_str(text, ColorString.HEADER)
@staticmethod
def error(text):
if ColorString.is_disabled:
return text
return ColorString._make_color_str(text, ColorString.FAIL)
@staticmethod
def warning(text):
if ColorString.is_disabled:
return text
return ColorString._make_color_str(text, ColorString.WARNING)
is_disabled = False
def run_shell_command(shell_cmd, cmd_dir=None):
""" Run a single shell command.
@returns a tuple of shell command return code, stdout, stderr """
if cmd_dir is not None and not os.path.exists(cmd_dir):
run_shell_command("mkdir -p %s" % cmd_dir)
start = time.time()
print("\t>>> Running: " + shell_cmd)
p = subprocess.Popen(shell_cmd,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
cwd=cmd_dir)
stdout, stderr = p.communicate()
end = time.time()
# Report time if we spent more than 5 minutes executing a command
execution_time = end - start
if execution_time > (60 * 5):
mins = (execution_time / 60)
secs = (execution_time % 60)
print("\t>time spent: %d minutes %d seconds" % (mins, secs))
return p.returncode, stdout, stderr
def run_shell_commands(shell_cmds, cmd_dir=None, verbose=False):
""" Execute a sequence of shell commands, which is equivalent to
running `cmd1 && cmd2 && cmd3`
@returns boolean indication if all commands succeeds.
"""
if cmd_dir:
print("\t=== Set current working directory => %s" % cmd_dir)
for shell_cmd in shell_cmds:
ret_code, stdout, stderr = run_shell_command(shell_cmd, cmd_dir)
if stdout:
if verbose or ret_code != 0:
print(ColorString.info("stdout: \n"), stdout)
if stderr:
# contents in stderr is not necessarily to be error messages.
if verbose or ret_code != 0:
print(ColorString.error("stderr: \n"), stderr)
if ret_code != 0:
return False
return True
-377
View File
@@ -1,377 +0,0 @@
<?php
// Copyright 2004-present Facebook. All Rights Reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
// Name of the environment variables which need to be set by the entity which
// triggers continuous runs so that code at the end of the file gets executed
// and Sandcastle run starts.
const ENV_POST_RECEIVE_HOOK = "POST_RECEIVE_HOOK";
const ENV_HTTPS_APP_VALUE = "HTTPS_APP_VALUE";
const ENV_HTTPS_TOKEN_VALUE = "HTTPS_TOKEN_VALUE";
const PRIMARY_TOKEN_FILE = '/home/krad/.sandcastle';
const CONT_RUN_ALIAS = "leveldb";
//////////////////////////////////////////////////////////////////////
/* Run tests in sandcastle */
function postURL($diffID, $url) {
assert(strlen($diffID) > 0);
assert(is_numeric($diffID));
assert(strlen($url) > 0);
$cmd_args = array(
'diff_id' => (int)$diffID,
'name' => sprintf(
'click here for sandcastle tests for D%d',
(int)$diffID
),
'link' => $url
);
$cmd = 'echo ' . escapeshellarg(json_encode($cmd_args))
. ' | arc call-conduit differential.updateunitresults';
shell_exec($cmd);
}
function buildUpdateTestStatusCmd($diffID, $test, $status) {
assert(strlen($diffID) > 0);
assert(is_numeric($diffID));
assert(strlen($test) > 0);
assert(strlen($status) > 0);
$cmd_args = array(
'diff_id' => (int)$diffID,
'name' => $test,
'result' => $status
);
$cmd = 'echo ' . escapeshellarg(json_encode($cmd_args))
. ' | arc call-conduit differential.updateunitresults';
return $cmd;
}
function updateTestStatus($diffID, $test) {
assert(strlen($diffID) > 0);
assert(is_numeric($diffID));
assert(strlen($test) > 0);
shell_exec(buildUpdateTestStatusCmd($diffID, $test, "waiting"));
}
function getSteps($applyDiff, $diffID, $username, $test) {
assert(strlen($username) > 0);
assert(strlen($test) > 0);
if ($applyDiff) {
assert(strlen($diffID) > 0);
assert(is_numeric($diffID));
$arcrc_content = (PHP_OS == "Darwin" ?
exec("cat ~/.arcrc | gzip -f | base64") :
exec("cat ~/.arcrc | gzip -f | base64 -w0"));
assert(strlen($arcrc_content) > 0);
// Sandcastle machines don't have arc setup. We copy the user certificate
// and authenticate using that in Sandcastle.
$setup = array(
"name" => "Setup arcrc",
"shell" => "echo " . escapeshellarg($arcrc_content) . " | base64 --decode"
. " | gzip -d > ~/.arcrc",
"user" => "root"
);
// arc demands certain permission on its config.
// also fix the sticky bit issue in sandcastle
$fix_permission = array(
"name" => "Fix environment",
"shell" => "chmod 600 ~/.arcrc && chmod +t /dev/shm",
"user" => "root"
);
// Construct the steps in the order of execution.
$steps[] = $setup;
$steps[] = $fix_permission;
}
// fbcode is a sub-repo. We cannot patch until we add it to ignore otherwise
// Git thinks it is an uncommitted change.
$fix_git_ignore = array(
"name" => "Fix git ignore",
"shell" => "echo fbcode >> .git/info/exclude",
"user" => "root"
);
// This fixes "FATAL: ThreadSanitizer can not mmap the shadow memory"
// Source:
// https://github.com/google/sanitizers/wiki/ThreadSanitizerCppManual#FAQ
$fix_kernel_issue = array(
"name" => "Fix kernel issue with tsan",
"shell" => "echo 2 >/proc/sys/kernel/randomize_va_space",
"user" => "root"
);
$steps[] = $fix_git_ignore;
$steps[] = $fix_kernel_issue;
// This will be the command used to execute particular type of tests.
$cmd = "";
if ($applyDiff) {
// Patch the code (keep your fingures crossed).
$patch = array(
"name" => "Patch " . $diffID,
"shell" => "arc --arcrc-file ~/.arcrc "
. "patch --nocommit --diff " . escapeshellarg($diffID),
"user" => "root"
);
$steps[] = $patch;
updateTestStatus($diffID, $test);
$cmd = buildUpdateTestStatusCmd($diffID, $test, "running") . "; ";
}
// Run the actual command.
$cmd = $cmd . "J=$(nproc) ./build_tools/precommit_checker.py " .
escapeshellarg($test) . "; exit_code=$?; ";
if ($applyDiff) {
$cmd = $cmd . "([[ \$exit_code -eq 0 ]] &&"
. buildUpdateTestStatusCmd($diffID, $test, "pass") . ")"
. "||" . buildUpdateTestStatusCmd($diffID, $test, "fail")
. "; ";
}
// shell command to sort the tests based on exit code and print
// the output of the log files.
$cat_sorted_logs = "
while read code log_file;
do echo \"################ cat \$log_file [exit_code : \$code] ################\";
cat \$log_file;
done < <(tail -n +2 LOG | sort -k7,7n -k4,4gr | awk '{print \$7,\$NF}')";
// Shell command to cat all log files
$cat_all_logs = "for f in `ls t/!(run-*)`; do echo \$f;cat \$f; done";
// If LOG file exist use it to cat log files sorted by exit code, otherwise
// cat everything
$logs_cmd = "if [ -f LOG ]; then {$cat_sorted_logs}; else {$cat_all_logs}; fi";
$cmd = $cmd . " cat /tmp/precommit-check.log"
. "; shopt -s extglob; {$logs_cmd}"
. "; shopt -u extglob; [[ \$exit_code -eq 0 ]]";
assert(strlen($cmd) > 0);
$run_test = array(
"name" => "Run " . $test,
"shell" => $cmd,
"user" => "root",
"parser" => "python build_tools/error_filter.py " . escapeshellarg($test),
);
$steps[] = $run_test;
if ($applyDiff) {
// Clean up the user arc config we are using.
$cleanup = array(
"name" => "Arc cleanup",
"shell" => "rm -f ~/.arcrc",
"user" => "root"
);
$steps[] = $cleanup;
}
assert(count($steps) > 0);
return $steps;
}
function getSandcastleConfig() {
$sandcastle_config = array();
$cwd = getcwd();
$cwd_token_file = "{$cwd}/.sandcastle";
// This is a case when we're executed from a continuous run. Fetch the values
// from the environment.
if (getenv(ENV_POST_RECEIVE_HOOK)) {
$sandcastle_config[0] = getenv(ENV_HTTPS_APP_VALUE);
$sandcastle_config[1] = getenv(ENV_HTTPS_TOKEN_VALUE);
} else {
// This is a typical `[p]arc diff` case. Fetch the values from the specific
// configuration files.
for ($i = 0; $i < 50; $i++) {
if (file_exists(PRIMARY_TOKEN_FILE) ||
file_exists($cwd_token_file)) {
break;
}
// If we failed to fetch the tokens, sleep for 0.2 second and try again
usleep(200000);
}
assert(file_exists(PRIMARY_TOKEN_FILE) ||
file_exists($cwd_token_file));
// Try the primary location first, followed by a secondary.
if (file_exists(PRIMARY_TOKEN_FILE)) {
$cmd = 'cat ' . PRIMARY_TOKEN_FILE;
} else {
$cmd = 'cat ' . escapeshellarg($cwd_token_file);
}
assert(strlen($cmd) > 0);
$sandcastle_config = explode(':', rtrim(shell_exec($cmd)));
}
// In this case be very explicit about the implications.
if (count($sandcastle_config) != 2) {
echo "Sandcastle configuration files don't contain valid information " .
"or the necessary environment variables aren't defined. Unable " .
"to validate the code changes.";
exit(1);
}
assert(strlen($sandcastle_config[0]) > 0);
assert(strlen($sandcastle_config[1]) > 0);
assert(count($sandcastle_config) > 0);
return $sandcastle_config;
}
// This function can be called either from `[p]arc diff` command or during
// the Git post-receive hook.
function startTestsInSandcastle($applyDiff, $workflow, $diffID) {
// Default options don't terminate on failure, but that's what we want. In
// the current case we use assertions intentionally as "terminate on failure
// invariants".
assert_options(ASSERT_BAIL, true);
// In case of a diff we'll send notificatios to the author. Else it'll go to
// the entire team because failures indicate that build quality has regressed.
$username = $applyDiff ? exec("whoami") : CONT_RUN_ALIAS;
assert(strlen($username) > 0);
if ($applyDiff) {
assert($workflow);
assert(strlen($diffID) > 0);
assert(is_numeric($diffID));
}
// List of tests we want to run in Sandcastle.
$tests = array("unit", "unit_non_shm", "unit_481", "clang_unit", "tsan",
"asan", "lite_test", "valgrind", "release", "release_481",
"clang_release", "clang_analyze", "code_cov",
"java_build", "no_compression", "unity", "ubsan");
$send_email_template = array(
'type' => 'email',
'triggers' => array('fail'),
'emails' => array($username . '@fb.com'),
);
// Construct a job definition for each test and add it to the master plan.
foreach ($tests as $test) {
$stepName = "RocksDB diff " . $diffID . " test " . $test;
if (!$applyDiff) {
$stepName = "RocksDB continuous integration test " . $test;
}
$arg[] = array(
"name" => $stepName,
"report" => array($send_email_template),
"steps" => getSteps($applyDiff, $diffID, $username, $test)
);
}
// We cannot submit the parallel execution master plan to Sandcastle and
// need supply the job plan as a determinator. So we construct a small job
// that will spit out the master job plan which Sandcastle will parse and
// execute. Why compress the job definitions? Otherwise we run over the max
// string size.
$cmd = "echo " . base64_encode(json_encode($arg))
. (PHP_OS == "Darwin" ?
" | gzip -f | base64" :
" | gzip -f | base64 -w0");
assert(strlen($cmd) > 0);
$arg_encoded = shell_exec($cmd);
assert(strlen($arg_encoded) > 0);
$runName = "Run diff " . $diffID . "for user " . $username;
if (!$applyDiff) {
$runName = "RocksDB continuous integration build and test run";
}
$command = array(
"name" => $runName,
"steps" => array()
);
$command["steps"][] = array(
"name" => "Generate determinator",
"shell" => "echo " . $arg_encoded . " | base64 --decode | gzip -d"
. " | base64 --decode",
"determinator" => true,
"user" => "root"
);
// Submit to Sandcastle.
$url = 'https://interngraph.intern.facebook.com/sandcastle/create';
$job = array(
'command' => 'SandcastleUniversalCommand',
'args' => $command,
'capabilities' => array(
'vcs' => 'rocksdb-int-git',
'type' => 'lego',
),
'hash' => 'origin/master',
'user' => $username,
'alias' => 'rocksdb-precommit',
'tags' => array('rocksdb'),
'description' => 'Rocksdb precommit job',
);
// Fetch the configuration necessary to submit a successful HTTPS request.
$sandcastle_config = getSandcastleConfig();
$app = $sandcastle_config[0];
$token = $sandcastle_config[1];
$cmd = 'curl -s -k '
. ' -F app=' . escapeshellarg($app)
. ' -F token=' . escapeshellarg($token)
. ' -F job=' . escapeshellarg(json_encode($job))
.' ' . escapeshellarg($url);
$output = shell_exec($cmd);
assert(strlen($output) > 0);
// Extract Sandcastle URL from the response.
preg_match('/url": "(.+)"/', $output, $sandcastle_url);
assert(count($sandcastle_url) > 0, "Unable to submit Sandcastle request.");
assert(strlen($sandcastle_url[1]) > 0, "Unable to extract Sandcastle URL.");
if ($applyDiff) {
echo "\nSandcastle URL: " . $sandcastle_url[1] . "\n";
// Ask Phabricator to display it on the diff UI.
postURL($diffID, $sandcastle_url[1]);
} else {
echo "Continuous integration started Sandcastle tests. You can look at ";
echo "the progress at:\n" . $sandcastle_url[1] . "\n";
}
}
// Continuous run cript will set the environment variable and based on that
// we'll trigger the execution of tests in Sandcastle. In that case we don't
// need to apply any diffs and there's no associated workflow either.
if (getenv(ENV_POST_RECEIVE_HOOK)) {
startTestsInSandcastle(
false /* $applyDiff */,
NULL /* $workflow */,
NULL /* $diffID */);
}
-111
View File
@@ -1,111 +0,0 @@
#!/usr/bin/python
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
# amalgamate.py creates an amalgamation from a unity build.
# It can be run with either Python 2 or 3.
# An amalgamation consists of a header that includes the contents of all public
# headers and a source file that includes the contents of all source files and
# private headers.
#
# This script works by starting with the unity build file and recursively expanding
# #include directives. If the #include is found in a public include directory,
# that header is expanded into the amalgamation header.
#
# A particular header is only expanded once, so this script will
# break if there are multiple inclusions of the same header that are expected to
# expand differently. Similarly, this type of code causes issues:
#
# #ifdef FOO
# #include "bar.h"
# // code here
# #else
# #include "bar.h" // oops, doesn't get expanded
# // different code here
# #endif
#
# The solution is to move the include out of the #ifdef.
from __future__ import print_function
import argparse
from os import path
import re
import sys
include_re = re.compile('^[ \t]*#include[ \t]+"(.*)"[ \t]*$')
included = set()
excluded = set()
def find_header(name, abs_path, include_paths):
samedir = path.join(path.dirname(abs_path), name)
if path.exists(samedir):
return samedir
for include_path in include_paths:
include_path = path.join(include_path, name)
if path.exists(include_path):
return include_path
return None
def expand_include(include_path, f, abs_path, source_out, header_out, include_paths, public_include_paths):
if include_path in included:
return False
included.add(include_path)
with open(include_path) as f:
print('#line 1 "{}"'.format(include_path), file=source_out)
process_file(f, include_path, source_out, header_out, include_paths, public_include_paths)
return True
def process_file(f, abs_path, source_out, header_out, include_paths, public_include_paths):
for (line, text) in enumerate(f):
m = include_re.match(text)
if m:
filename = m.groups()[0]
# first check private headers
include_path = find_header(filename, abs_path, include_paths)
if include_path:
if include_path in excluded:
source_out.write(text)
expanded = False
else:
expanded = expand_include(include_path, f, abs_path, source_out, header_out, include_paths, public_include_paths)
else:
# now try public headers
include_path = find_header(filename, abs_path, public_include_paths)
if include_path:
# found public header
expanded = False
if include_path in excluded:
source_out.write(text)
else:
expand_include(include_path, f, abs_path, header_out, None, public_include_paths, [])
else:
sys.exit("unable to find {}, included in {} on line {}".format(filename, abs_path, line))
if expanded:
print('#line {} "{}"'.format(line+1, abs_path), file=source_out)
elif text != "#pragma once\n":
source_out.write(text)
def main():
parser = argparse.ArgumentParser(description="Transform a unity build into an amalgamation")
parser.add_argument("source", help="source file")
parser.add_argument("-I", action="append", dest="include_paths", help="include paths for private headers")
parser.add_argument("-i", action="append", dest="public_include_paths", help="include paths for public headers")
parser.add_argument("-x", action="append", dest="excluded", help="excluded header files")
parser.add_argument("-o", dest="source_out", help="output C++ file", required=True)
parser.add_argument("-H", dest="header_out", help="output C++ header file", required=True)
args = parser.parse_args()
include_paths = list(map(path.abspath, args.include_paths or []))
public_include_paths = list(map(path.abspath, args.public_include_paths or []))
excluded.update(map(path.abspath, args.excluded or []))
filename = args.source
abs_path = path.abspath(filename)
with open(filename) as f, open(args.source_out, 'w') as source_out, open(args.header_out, 'w') as header_out:
print('#line 1 "{}"'.format(filename), file=source_out)
print('#include "{}"'.format(header_out.name), file=source_out)
process_file(f, abs_path, source_out, header_out, include_paths, public_include_paths)
if __name__ == "__main__":
main()
-663
View File
@@ -1,663 +0,0 @@
#!/usr/bin/env bash
#
# Detects OS we're compiling on and outputs a file specified by the first
# argument, which in turn gets read while processing Makefile.
#
# The output will set the following variables:
# CC C Compiler path
# CXX C++ Compiler path
# PLATFORM_LDFLAGS Linker flags
# JAVA_LDFLAGS Linker flags for RocksDBJava
# JAVA_STATIC_LDFLAGS Linker flags for RocksDBJava static build
# PLATFORM_SHARED_EXT Extension for shared libraries
# PLATFORM_SHARED_LDFLAGS Flags for building shared library
# PLATFORM_SHARED_CFLAGS Flags for compiling objects for shared library
# PLATFORM_CCFLAGS C compiler flags
# PLATFORM_CXXFLAGS C++ compiler flags. Will contain:
# PLATFORM_SHARED_VERSIONED Set to 'true' if platform supports versioned
# shared libraries, empty otherwise.
# FIND Command for the find utility
# WATCH Command for the watch utility
#
# The PLATFORM_CCFLAGS and PLATFORM_CXXFLAGS might include the following:
#
# -DROCKSDB_PLATFORM_POSIX if posix-platform based
# -DSNAPPY if the Snappy library is present
# -DLZ4 if the LZ4 library is present
# -DZSTD if the ZSTD library is present
# -DNUMA if the NUMA library is present
# -DTBB if the TBB library is present
#
# Using gflags in rocksdb:
# Our project depends on gflags, which requires users to take some extra steps
# before they can compile the whole repository:
# 1. Install gflags. You may download it from here:
# https://gflags.github.io/gflags/ (Mac users can `brew install gflags`)
# 2. Once installed, add the include path for gflags to your CPATH env var and
# the lib path to LIBRARY_PATH. If installed with default settings, the lib
# will be /usr/local/lib and the include path will be /usr/local/include
OUTPUT=$1
if test -z "$OUTPUT"; then
echo "usage: $0 <output-filename>" >&2
exit 1
fi
# we depend on C++11
PLATFORM_CXXFLAGS="-std=c++11"
# we currently depend on POSIX platform
COMMON_FLAGS="-DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX"
# Default to fbcode gcc on internal fb machines
if [ -z "$ROCKSDB_NO_FBCODE" -a -d /mnt/gvfs/third-party ]; then
FBCODE_BUILD="true"
# If we're compiling with TSAN we need pic build
PIC_BUILD=$COMPILE_WITH_TSAN
if [ -n "$ROCKSDB_FBCODE_BUILD_WITH_481" ]; then
# we need this to build with MySQL. Don't use for other purposes.
source "$PWD/build_tools/fbcode_config4.8.1.sh"
elif [ -n "$ROCKSDB_FBCODE_BUILD_WITH_5xx" ]; then
source "$PWD/build_tools/fbcode_config.sh"
else
source "$PWD/build_tools/fbcode_config_platform007.sh"
fi
fi
# Delete existing output, if it exists
rm -f "$OUTPUT"
touch "$OUTPUT"
if test -z "$CC"; then
if [ -x "$(command -v cc)" ]; then
CC=cc
elif [ -x "$(command -v clang)" ]; then
CC=clang
else
CC=cc
fi
fi
if test -z "$CXX"; then
if [ -x "$(command -v g++)" ]; then
CXX=g++
elif [ -x "$(command -v clang++)" ]; then
CXX=clang++
else
CXX=g++
fi
fi
# Detect OS
if test -z "$TARGET_OS"; then
TARGET_OS=`uname -s`
fi
if test -z "$TARGET_ARCHITECTURE"; then
TARGET_ARCHITECTURE=`uname -m`
fi
if test -z "$CLANG_SCAN_BUILD"; then
CLANG_SCAN_BUILD=scan-build
fi
if test -z "$CLANG_ANALYZER"; then
CLANG_ANALYZER=$(command -v clang++ 2> /dev/null)
fi
if test -z "$FIND"; then
FIND=find
fi
if test -z "$WATCH"; then
WATCH=watch
fi
COMMON_FLAGS="$COMMON_FLAGS ${CFLAGS}"
CROSS_COMPILE=
PLATFORM_CCFLAGS=
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS"
PLATFORM_SHARED_EXT="so"
PLATFORM_SHARED_LDFLAGS="-Wl,--no-as-needed -shared -Wl,-soname -Wl,"
PLATFORM_SHARED_CFLAGS="-fPIC"
PLATFORM_SHARED_VERSIONED=true
# generic port files (working on all platform by #ifdef) go directly in /port
GENERIC_PORT_FILES=`cd "$ROCKSDB_ROOT"; find port -name '*.cc' | tr "\n" " "`
# On GCC, we pick libc's memcmp over GCC's memcmp via -fno-builtin-memcmp
case "$TARGET_OS" in
Darwin)
PLATFORM=OS_MACOSX
COMMON_FLAGS="$COMMON_FLAGS -DOS_MACOSX"
PLATFORM_SHARED_EXT=dylib
PLATFORM_SHARED_LDFLAGS="-dynamiclib -install_name "
# PORT_FILES=port/darwin/darwin_specific.cc
;;
IOS)
PLATFORM=IOS
COMMON_FLAGS="$COMMON_FLAGS -DOS_MACOSX -DIOS_CROSS_COMPILE -DROCKSDB_LITE"
PLATFORM_SHARED_EXT=dylib
PLATFORM_SHARED_LDFLAGS="-dynamiclib -install_name "
CROSS_COMPILE=true
PLATFORM_SHARED_VERSIONED=
;;
Linux)
PLATFORM=OS_LINUX
COMMON_FLAGS="$COMMON_FLAGS -DOS_LINUX"
if [ -z "$USE_CLANG" ]; then
COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp"
else
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -latomic"
fi
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lpthread -lrt"
# PORT_FILES=port/linux/linux_specific.cc
;;
SunOS)
PLATFORM=OS_SOLARIS
COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_SOLARIS -m64"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lpthread -lrt -static-libstdc++ -static-libgcc -m64"
# PORT_FILES=port/sunos/sunos_specific.cc
;;
AIX)
PLATFORM=OS_AIX
CC=gcc
COMMON_FLAGS="$COMMON_FLAGS -maix64 -pthread -fno-builtin-memcmp -D_REENTRANT -DOS_AIX -D__STDC_FORMAT_MACROS"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -pthread -lpthread -lrt -maix64 -static-libstdc++ -static-libgcc"
# PORT_FILES=port/aix/aix_specific.cc
;;
FreeBSD)
PLATFORM=OS_FREEBSD
CXX=clang++
COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_FREEBSD"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lpthread"
# PORT_FILES=port/freebsd/freebsd_specific.cc
;;
NetBSD)
PLATFORM=OS_NETBSD
COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_NETBSD"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lpthread -lgcc_s"
# PORT_FILES=port/netbsd/netbsd_specific.cc
;;
OpenBSD)
PLATFORM=OS_OPENBSD
CXX=clang++
COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_OPENBSD"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -pthread"
# PORT_FILES=port/openbsd/openbsd_specific.cc
FIND=gfind
WATCH=gnuwatch
;;
DragonFly)
PLATFORM=OS_DRAGONFLYBSD
COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_DRAGONFLYBSD"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lpthread"
# PORT_FILES=port/dragonfly/dragonfly_specific.cc
;;
Cygwin)
PLATFORM=CYGWIN
PLATFORM_SHARED_CFLAGS=""
PLATFORM_CXXFLAGS="-std=gnu++11"
COMMON_FLAGS="$COMMON_FLAGS -DCYGWIN"
if [ -z "$USE_CLANG" ]; then
COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp"
else
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -latomic"
fi
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lpthread -lrt"
# PORT_FILES=port/linux/linux_specific.cc
;;
OS_ANDROID_CROSSCOMPILE)
PLATFORM=OS_ANDROID
COMMON_FLAGS="$COMMON_FLAGS -fno-builtin-memcmp -D_REENTRANT -DOS_ANDROID -DROCKSDB_PLATFORM_POSIX"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS " # All pthread features are in the Android C library
# PORT_FILES=port/android/android.cc
CROSS_COMPILE=true
;;
*)
echo "Unknown platform!" >&2
exit 1
esac
PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS ${CXXFLAGS}"
JAVA_LDFLAGS="$PLATFORM_LDFLAGS"
JAVA_STATIC_LDFLAGS="$PLATFORM_LDFLAGS"
if [ "$CROSS_COMPILE" = "true" -o "$FBCODE_BUILD" = "true" ]; then
# Cross-compiling; do not try any compilation tests.
# Also don't need any compilation tests if compiling on fbcode
true
else
if ! test $ROCKSDB_DISABLE_FALLOCATE; then
# Test whether fallocate is available
$CXX $CFLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <fcntl.h>
#include <linux/falloc.h>
int main() {
int fd = open("/dev/null", 0);
fallocate(fd, FALLOC_FL_KEEP_SIZE, 0, 1024);
}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DROCKSDB_FALLOCATE_PRESENT"
fi
fi
if ! test $ROCKSDB_DISABLE_SNAPPY; then
# Test whether Snappy library is installed
# http://code.google.com/p/snappy/
$CXX $CFLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <snappy.h>
int main() {}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DSNAPPY"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lsnappy"
JAVA_LDFLAGS="$JAVA_LDFLAGS -lsnappy"
fi
fi
if ! test $ROCKSDB_DISABLE_GFLAGS; then
# Test whether gflags library is installed
# http://gflags.github.io/gflags/
# check if the namespace is gflags
$CXX $CFLAGS -x c++ - -o /dev/null 2>/dev/null << EOF
#include <gflags/gflags.h>
int main() {}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DGFLAGS=1"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lgflags"
else
# check if namespace is google
$CXX $CFLAGS -x c++ - -o /dev/null 2>/dev/null << EOF
#include <gflags/gflags.h>
using namespace google;
int main() {}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DGFLAGS=google"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lgflags"
fi
fi
fi
if ! test $ROCKSDB_DISABLE_ZLIB; then
# Test whether zlib library is installed
$CXX $CFLAGS $COMMON_FLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <zlib.h>
int main() {}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DZLIB"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lz"
JAVA_LDFLAGS="$JAVA_LDFLAGS -lz"
fi
fi
if ! test $ROCKSDB_DISABLE_BZIP; then
# Test whether bzip library is installed
$CXX $CFLAGS $COMMON_FLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <bzlib.h>
int main() {}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DBZIP2"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lbz2"
JAVA_LDFLAGS="$JAVA_LDFLAGS -lbz2"
fi
fi
if ! test $ROCKSDB_DISABLE_LZ4; then
# Test whether lz4 library is installed
$CXX $CFLAGS $COMMON_FLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <lz4.h>
#include <lz4hc.h>
int main() {}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DLZ4"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -llz4"
JAVA_LDFLAGS="$JAVA_LDFLAGS -llz4"
fi
fi
if ! test $ROCKSDB_DISABLE_ZSTD; then
# Test whether zstd library is installed
$CXX $CFLAGS $COMMON_FLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <zstd.h>
int main() {}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DZSTD"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lzstd"
JAVA_LDFLAGS="$JAVA_LDFLAGS -lzstd"
fi
fi
if ! test $ROCKSDB_DISABLE_NUMA; then
# Test whether numa is available
$CXX $CFLAGS -x c++ - -o /dev/null -lnuma 2>/dev/null <<EOF
#include <numa.h>
#include <numaif.h>
int main() {}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DNUMA"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lnuma"
JAVA_LDFLAGS="$JAVA_LDFLAGS -lnuma"
fi
fi
if ! test $ROCKSDB_DISABLE_TBB; then
# Test whether tbb is available
$CXX $CFLAGS $LDFLAGS -x c++ - -o /dev/null -ltbb 2>/dev/null <<EOF
#include <tbb/tbb.h>
int main() {}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DTBB"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -ltbb"
JAVA_LDFLAGS="$JAVA_LDFLAGS -ltbb"
fi
fi
if ! test $ROCKSDB_DISABLE_JEMALLOC; then
# Test whether jemalloc is available
if echo 'int main() {}' | $CXX $CFLAGS -x c++ - -o /dev/null -ljemalloc \
2>/dev/null; then
# This will enable some preprocessor identifiers in the Makefile
JEMALLOC=1
# JEMALLOC can be enabled either using the flag (like here) or by
# providing direct link to the jemalloc library
WITH_JEMALLOC_FLAG=1
# check for JEMALLOC installed with HomeBrew
if [ "$PLATFORM" == "OS_MACOSX" ]; then
if hash brew 2>/dev/null && brew ls --versions jemalloc > /dev/null; then
JEMALLOC_VER=$(brew ls --versions jemalloc | tail -n 1 | cut -f 2 -d ' ')
JEMALLOC_INCLUDE="-I/usr/local/Cellar/jemalloc/${JEMALLOC_VER}/include"
JEMALLOC_LIB="/usr/local/Cellar/jemalloc/${JEMALLOC_VER}/lib/libjemalloc_pic.a"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS $JEMALLOC_LIB"
JAVA_STATIC_LDFLAGS="$JAVA_STATIC_LDFLAGS $JEMALLOC_LIB"
fi
fi
fi
fi
if ! test $JEMALLOC && ! test $ROCKSDB_DISABLE_TCMALLOC; then
# jemalloc is not available. Let's try tcmalloc
if echo 'int main() {}' | $CXX $CFLAGS -x c++ - -o /dev/null \
-ltcmalloc 2>/dev/null; then
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -ltcmalloc"
JAVA_LDFLAGS="$JAVA_LDFLAGS -ltcmalloc"
fi
fi
if ! test $ROCKSDB_DISABLE_MALLOC_USABLE_SIZE; then
# Test whether malloc_usable_size is available
$CXX $CFLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <malloc.h>
int main() {
size_t res = malloc_usable_size(0);
(void)res;
return 0;
}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DROCKSDB_MALLOC_USABLE_SIZE"
fi
fi
if ! test $ROCKSDB_DISABLE_PTHREAD_MUTEX_ADAPTIVE_NP; then
# Test whether PTHREAD_MUTEX_ADAPTIVE_NP mutex type is available
$CXX $CFLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <pthread.h>
int main() {
int x = PTHREAD_MUTEX_ADAPTIVE_NP;
(void)x;
return 0;
}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DROCKSDB_PTHREAD_ADAPTIVE_MUTEX"
fi
fi
if ! test $ROCKSDB_DISABLE_BACKTRACE; then
# Test whether backtrace is available
$CXX $CFLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <execinfo.h>
int main() {
void* frames[1];
backtrace_symbols(frames, backtrace(frames, 1));
return 0;
}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DROCKSDB_BACKTRACE"
else
# Test whether execinfo library is installed
$CXX $CFLAGS -lexecinfo -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <execinfo.h>
int main() {
void* frames[1];
backtrace_symbols(frames, backtrace(frames, 1));
}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DROCKSDB_BACKTRACE"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS -lexecinfo"
JAVA_LDFLAGS="$JAVA_LDFLAGS -lexecinfo"
fi
fi
fi
if ! test $ROCKSDB_DISABLE_PG; then
# Test if -pg is supported
$CXX $CFLAGS -pg -x c++ - -o /dev/null 2>/dev/null <<EOF
int main() {
return 0;
}
EOF
if [ "$?" = 0 ]; then
PROFILING_FLAGS=-pg
fi
fi
if ! test $ROCKSDB_DISABLE_SYNC_FILE_RANGE; then
# Test whether sync_file_range is supported for compatibility with an old glibc
$CXX $CFLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <fcntl.h>
int main() {
int fd = open("/dev/null", 0);
sync_file_range(fd, 0, 1024, SYNC_FILE_RANGE_WRITE);
}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DROCKSDB_RANGESYNC_PRESENT"
fi
fi
if ! test $ROCKSDB_DISABLE_SCHED_GETCPU; then
# Test whether sched_getcpu is supported
$CXX $CFLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <sched.h>
int main() {
int cpuid = sched_getcpu();
(void)cpuid;
}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DROCKSDB_SCHED_GETCPU_PRESENT"
fi
fi
if ! test $ROCKSDB_DISABLE_ALIGNED_NEW; then
# Test whether c++17 aligned-new is supported
$CXX $PLATFORM_CXXFLAGS -faligned-new -x c++ - -o /dev/null 2>/dev/null <<EOF
struct alignas(1024) t {int a;};
int main() {}
EOF
if [ "$?" = 0 ]; then
PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS -faligned-new -DHAVE_ALIGNED_NEW"
fi
fi
fi
# TODO(tec): Fix -Wshorten-64-to-32 errors on FreeBSD and enable the warning.
# -Wshorten-64-to-32 breaks compilation on FreeBSD i386
if ! [ "$TARGET_OS" = FreeBSD -a "$TARGET_ARCHITECTURE" = i386 ]; then
# Test whether -Wshorten-64-to-32 is available
$CXX $CFLAGS -x c++ - -o /dev/null -Wshorten-64-to-32 2>/dev/null <<EOF
int main() {}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -Wshorten-64-to-32"
fi
fi
# shall we use HDFS?
if test "$USE_HDFS"; then
if test -z "$JAVA_HOME"; then
echo "JAVA_HOME has to be set for HDFS usage." >&2
exit 1
fi
HDFS_CCFLAGS="$HDFS_CCFLAGS -I$JAVA_HOME/include -I$JAVA_HOME/include/linux -DUSE_HDFS -I$HADOOP_HOME/include"
HDFS_LDFLAGS="$HDFS_LDFLAGS -lhdfs -L$JAVA_HOME/jre/lib/amd64 -L$HADOOP_HOME/lib/native"
HDFS_LDFLAGS="$HDFS_LDFLAGS -L$JAVA_HOME/jre/lib/amd64/server -L$GLIBC_RUNTIME_PATH/lib"
HDFS_LDFLAGS="$HDFS_LDFLAGS -ldl -lverify -ljava -ljvm"
COMMON_FLAGS="$COMMON_FLAGS $HDFS_CCFLAGS"
PLATFORM_LDFLAGS="$PLATFORM_LDFLAGS $HDFS_LDFLAGS"
JAVA_LDFLAGS="$JAVA_LDFLAGS $HDFS_LDFLAGS"
fi
if test -z "$PORTABLE"; then
if test -n "`echo $TARGET_ARCHITECTURE | grep ^ppc64`"; then
# Tune for this POWER processor, treating '+' models as base models
POWER=`LD_SHOW_AUXV=1 /bin/true | grep AT_PLATFORM | grep -E -o power[0-9]+`
COMMON_FLAGS="$COMMON_FLAGS -mcpu=$POWER -mtune=$POWER "
elif test -n "`echo $TARGET_ARCHITECTURE | grep ^s390x`"; then
COMMON_FLAGS="$COMMON_FLAGS -march=z10 "
elif test -n "`echo $TARGET_ARCHITECTURE | grep -e^arm -e^aarch64`"; then
# TODO: Handle this with approprite options.
COMMON_FLAGS="$COMMON_FLAGS"
elif test -n "`echo $TARGET_ARCHITECTURE | grep ^aarch64`"; then
COMMON_FLAGS="$COMMON_FLAGS"
elif [ "$TARGET_OS" == "IOS" ]; then
COMMON_FLAGS="$COMMON_FLAGS"
elif [ "$TARGET_OS" != "AIX" ] && [ "$TARGET_OS" != "SunOS" ]; then
COMMON_FLAGS="$COMMON_FLAGS -march=native "
elif test "$USE_SSE"; then
COMMON_FLAGS="$COMMON_FLAGS -msse4.2 -mpclmul"
fi
elif test "$USE_SSE"; then
COMMON_FLAGS="$COMMON_FLAGS -msse4.2 -mpclmul"
fi
$CXX $PLATFORM_CXXFLAGS $COMMON_FLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <cstdint>
#include <nmmintrin.h>
int main() {
volatile uint32_t x = _mm_crc32_u32(0, 0);
(void)x;
}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DHAVE_SSE42"
elif test "$USE_SSE"; then
echo "warning: USE_SSE specified but compiler could not use SSE intrinsics, disabling" >&2
exit 1
fi
$CXX $PLATFORM_CXXFLAGS $COMMON_FLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#include <cstdint>
#include <wmmintrin.h>
int main() {
const auto a = _mm_set_epi64x(0, 0);
const auto b = _mm_set_epi64x(0, 0);
const auto c = _mm_clmulepi64_si128(a, b, 0x00);
auto d = _mm_cvtsi128_si64(c);
(void)d;
}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DHAVE_PCLMUL"
elif test "$USE_SSE"; then
echo "warning: USE_SSE specified but compiler could not use PCLMUL intrinsics, disabling" >&2
exit 1
fi
# iOS doesn't support thread-local storage, but this check would erroneously
# succeed because the cross-compiler flags are added by the Makefile, not this
# script.
if [ "$PLATFORM" != IOS ]; then
$CXX $COMMON_FLAGS -x c++ - -o /dev/null 2>/dev/null <<EOF
#if defined(_MSC_VER) && !defined(__thread)
#define __thread __declspec(thread)
#endif
int main() {
static __thread int tls;
(void)tls;
}
EOF
if [ "$?" = 0 ]; then
COMMON_FLAGS="$COMMON_FLAGS -DROCKSDB_SUPPORT_THREAD_LOCAL"
fi
fi
if [ "$FBCODE_BUILD" != "true" -a "$PLATFORM" = OS_LINUX ]; then
$CXX $COMMON_FLAGS $PLATFORM_SHARED_CFLAGS -x c++ -c - -o test_dl.o 2>/dev/null <<EOF
void dummy_func() {}
EOF
if [ "$?" = 0 ]; then
$CXX $COMMON_FLAGS $PLATFORM_SHARED_LDFLAGS test_dl.o -o /dev/null 2>/dev/null
if [ "$?" = 0 ]; then
EXEC_LDFLAGS+="-ldl"
rm -f test_dl.o
fi
fi
fi
PLATFORM_CCFLAGS="$PLATFORM_CCFLAGS $COMMON_FLAGS"
PLATFORM_CXXFLAGS="$PLATFORM_CXXFLAGS $COMMON_FLAGS"
VALGRIND_VER="$VALGRIND_VER"
ROCKSDB_MAJOR=`build_tools/version.sh major`
ROCKSDB_MINOR=`build_tools/version.sh minor`
ROCKSDB_PATCH=`build_tools/version.sh patch`
echo "CC=$CC" >> "$OUTPUT"
echo "CXX=$CXX" >> "$OUTPUT"
echo "PLATFORM=$PLATFORM" >> "$OUTPUT"
echo "PLATFORM_LDFLAGS=$PLATFORM_LDFLAGS" >> "$OUTPUT"
echo "JAVA_LDFLAGS=$JAVA_LDFLAGS" >> "$OUTPUT"
echo "JAVA_STATIC_LDFLAGS=$JAVA_STATIC_LDFLAGS" >> "$OUTPUT"
echo "VALGRIND_VER=$VALGRIND_VER" >> "$OUTPUT"
echo "PLATFORM_CCFLAGS=$PLATFORM_CCFLAGS" >> "$OUTPUT"
echo "PLATFORM_CXXFLAGS=$PLATFORM_CXXFLAGS" >> "$OUTPUT"
echo "PLATFORM_SHARED_CFLAGS=$PLATFORM_SHARED_CFLAGS" >> "$OUTPUT"
echo "PLATFORM_SHARED_EXT=$PLATFORM_SHARED_EXT" >> "$OUTPUT"
echo "PLATFORM_SHARED_LDFLAGS=$PLATFORM_SHARED_LDFLAGS" >> "$OUTPUT"
echo "PLATFORM_SHARED_VERSIONED=$PLATFORM_SHARED_VERSIONED" >> "$OUTPUT"
echo "EXEC_LDFLAGS=$EXEC_LDFLAGS" >> "$OUTPUT"
echo "JEMALLOC_INCLUDE=$JEMALLOC_INCLUDE" >> "$OUTPUT"
echo "JEMALLOC_LIB=$JEMALLOC_LIB" >> "$OUTPUT"
echo "ROCKSDB_MAJOR=$ROCKSDB_MAJOR" >> "$OUTPUT"
echo "ROCKSDB_MINOR=$ROCKSDB_MINOR" >> "$OUTPUT"
echo "ROCKSDB_PATCH=$ROCKSDB_PATCH" >> "$OUTPUT"
echo "CLANG_SCAN_BUILD=$CLANG_SCAN_BUILD" >> "$OUTPUT"
echo "CLANG_ANALYZER=$CLANG_ANALYZER" >> "$OUTPUT"
echo "PROFILING_FLAGS=$PROFILING_FLAGS" >> "$OUTPUT"
echo "FIND=$FIND" >> "$OUTPUT"
echo "WATCH=$WATCH" >> "$OUTPUT"
# This will enable some related identifiers for the preprocessor
if test -n "$JEMALLOC"; then
echo "JEMALLOC=1" >> "$OUTPUT"
fi
# Indicates that jemalloc should be enabled using -ljemalloc flag
# The alternative is to porvide a direct link to the library via JEMALLOC_LIB
# and JEMALLOC_INCLUDE
if test -n "$WITH_JEMALLOC_FLAG"; then
echo "WITH_JEMALLOC_FLAG=$WITH_JEMALLOC_FLAG" >> "$OUTPUT"
fi
echo "LUA_PATH=$LUA_PATH" >> "$OUTPUT"
-137
View File
@@ -1,137 +0,0 @@
#!/usr/bin/env bash
#
# Copyright (c) 2016, Facebook. All rights reserved.
#
# Overall wrapper script for RocksDB continuous builds. The implementation is a
# trivial pulling scheme. We loop infinitely, check if any new changes have been
# committed, if yes then trigger a Sandcastle run, and finally go to sleep again
# for a certain interval.
#
SRC_GIT_REPO=/data/git/rocksdb-public
error=0
function log {
DATE=`date +%Y-%m-%d:%H:%M:%S`
# shellcheck disable=SC2068
echo $DATE $@
}
function log_err {
# shellcheck disable=SC2145
log "ERROR: $@ Error code: $error."
}
function update_repo_status {
# Update the parent first.
pushd $SRC_GIT_REPO
# This is a fatal error. Something in the environment isn't right and we will
# terminate the execution.
error=$?
if [ ! $error -eq 0 ]; then
log_err "Where is $SRC_GIT_REPO?"
exit $error
fi
HTTPS_PROXY=fwdproxy:8080 git fetch -f
error=$?
if [ ! $error -eq 0 ]; then
log_err "git fetch -f failed."
popd
return $error
fi
git update-ref refs/heads/master refs/remotes/origin/master
error=$?
if [ ! $error -eq 0 ]; then
log_err "git update-ref failed."
popd
return $error
fi
popd
# We're back in an instance-specific directory. Get the latest changes.
git pull --rebase
error=$?
if [ ! $error -eq 0 ]; then
log_err "git pull --rebase failed."
return $error
fi
}
#
# Execution starts here.
#
# Path to the determinator from the root of the RocksDB repo.
CONTRUN_DETERMINATOR=./build_tools/RocksDBCommonHelper.php
# Value of the previous commit.
PREV_COMMIT=
log "Starting to monitor for new RocksDB changes ..."
log "Running under `pwd` as `whoami`."
# Paranoia. Make sure that we're using the right branch.
git checkout master
error=$?
if [ ! $error -eq 0 ]; then
log_err "This is not good. Can't checkout master. Bye-bye!"
exit 1
fi
# We'll run forever and let the execution environment terminate us if we'll
# exceed whatever timeout is set for the job.
while true;
do
# Get the latest changes committed.
update_repo_status
error=$?
if [ $error -eq 0 ]; then
LAST_COMMIT=`git log -1 | head -1 | grep commit | awk '{ print $2; }'`
log "Last commit is '$LAST_COMMIT', previous commit is '$PREV_COMMIT'."
if [ "$PREV_COMMIT" == "$LAST_COMMIT" ]; then
log "There were no changes since the last time I checked. Going to sleep."
else
if [ ! -z "$LAST_COMMIT" ]; then
log "New code has been committed or previous commit not known. " \
"Will trigger the tests."
PREV_COMMIT=$LAST_COMMIT
log "Updated previous commit to '$PREV_COMMIT'."
#
# This is where we'll trigger the Sandcastle run. The values for
# HTTPS_APP_VALUE and HTTPS_APP_VALUE will be set in the container we're
# running in.
#
POST_RECEIVE_HOOK=1 php $CONTRUN_DETERMINATOR
error=$?
if [ $error -eq 0 ]; then
log "Sandcastle run successfully triggered."
else
log_err "Failed to trigger Sandcastle run."
fi
else
log_err "Previous commit not updated. Don't know what the last one is."
fi
fi
else
log_err "Getting latest changes failed. Will skip running tests for now."
fi
# Always sleep, even if errors happens while trying to determine the latest
# commit. This will prevent us terminating in case of transient errors.
log "Will go to sleep for 5 minutes."
sleep 5m
done
-19
View File
@@ -1,19 +0,0 @@
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
GCC_BASE=/mnt/gvfs/third-party2/gcc/112ec378fec7002ad3e09afde022e656049f7191/5.x/centos7-native/c447969
CLANG_BASE=/mnt/gvfs/third-party2/llvm-fb/04999bdb3ce81a11073535dcb00b5e13dc1cbaf5/stable/centos7-native/c9f9104
LIBGCC_BASE=/mnt/gvfs/third-party2/libgcc/92b0c8e5c8eecc71eb042594ce1ab3413799b385/5.x/gcc-5-glibc-2.23/339d858
GLIBC_BASE=/mnt/gvfs/third-party2/glibc/3d8698d5973ba94f41620a80a67e4457fdf01e90/2.23/gcc-5-glibc-2.23/ca1d1c0
SNAPPY_BASE=/mnt/gvfs/third-party2/snappy/7f9bdaada18f59bc27ec2b0871eb8a6144343aef/1.1.3/gcc-5-glibc-2.23/9bc6787
ZLIB_BASE=/mnt/gvfs/third-party2/zlib/22c2d65676fb7c23cfa797c4f6937f38b026f3cf/1.2.8/gcc-5-glibc-2.23/9bc6787
BZIP2_BASE=/mnt/gvfs/third-party2/bzip2/dc49a21c5fceec6456a7a28a94dcd16690af1337/1.0.6/gcc-5-glibc-2.23/9bc6787
LZ4_BASE=/mnt/gvfs/third-party2/lz4/907b498203d297947f3bb70b9466f47e100f1873/r131/gcc-5-glibc-2.23/9bc6787
ZSTD_BASE=/mnt/gvfs/third-party2/zstd/af6628a46758f1a15484a1760cd7294164bc5ba1/1.3.5/gcc-5-glibc-2.23/03859b5
GFLAGS_BASE=/mnt/gvfs/third-party2/gflags/0b9929d2588991c65a57168bf88aff2db87c5d48/2.2.0/gcc-5-glibc-2.23/9bc6787
JEMALLOC_BASE=/mnt/gvfs/third-party2/jemalloc/b1a0e56c1e3e6929813a4331ade3a58ff083afbb/master/gcc-5-glibc-2.23/aa64d6b
NUMA_BASE=/mnt/gvfs/third-party2/numa/9cbf2460284c669ed19c3ccb200a71f7dd7e53c7/2.0.11/gcc-5-glibc-2.23/9bc6787
LIBUNWIND_BASE=/mnt/gvfs/third-party2/libunwind/bf3d7497fe4e6d007354f0adffa16ce3003f8338/1.3/gcc-5-glibc-2.23/b443de1
TBB_BASE=/mnt/gvfs/third-party2/tbb/ff4e0b093534704d8abab678a4fd7f5ea7b094c7/2018_U5/gcc-5-glibc-2.23/9bc6787
KERNEL_HEADERS_BASE=/mnt/gvfs/third-party2/kernel-headers/b5c4a61a5c483ba24722005ae07895971a2ac707/4.0.9-36_fbk5_2933_gd092e3f/gcc-5-glibc-2.23/da39a3e
BINUTILS_BASE=/mnt/gvfs/third-party2/binutils/55031de95a2b46c82948743419a603b3d6aefe28/2.29.1/centos7-native/da39a3e
VALGRIND_BASE=/mnt/gvfs/third-party2/valgrind/f3f697a28122e6bcd513273dd9c1ff23852fc59f/3.13.0/gcc-5-glibc-2.23/9bc6787
LUA_BASE=/mnt/gvfs/third-party2/lua/f0cd714433206d5139df61659eb7b28b1dea6683/5.2.3/gcc-5-glibc-2.23/65372bd
-20
View File
@@ -1,20 +0,0 @@
# shellcheck disable=SC2148
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
GCC_BASE=/mnt/gvfs/third-party2/gcc/cf7d14c625ce30bae1a4661c2319c5a283e4dd22/4.8.1/centos6-native/cc6c9dc
CLANG_BASE=/mnt/gvfs/third-party2/llvm-fb/8598c375b0e94e1448182eb3df034704144a838d/stable/centos6-native/3f16ddd
LIBGCC_BASE=/mnt/gvfs/third-party2/libgcc/d6e0a7da6faba45f5e5b1638f9edd7afc2f34e7d/4.8.1/gcc-4.8.1-glibc-2.17/8aac7fc
GLIBC_BASE=/mnt/gvfs/third-party2/glibc/d282e6e8f3d20f4e40a516834847bdc038e07973/2.17/gcc-4.8.1-glibc-2.17/99df8fc
SNAPPY_BASE=/mnt/gvfs/third-party2/snappy/8c38a4c1e52b4c2cc8a9cdc31b9c947ed7dbfcb4/1.1.3/gcc-4.8.1-glibc-2.17/c3f970a
ZLIB_BASE=/mnt/gvfs/third-party2/zlib/0882df3713c7a84f15abe368dc004581f20b39d7/1.2.8/gcc-4.8.1-glibc-2.17/c3f970a
BZIP2_BASE=/mnt/gvfs/third-party2/bzip2/740325875f6729f42d28deaa2147b0854f3a347e/1.0.6/gcc-4.8.1-glibc-2.17/c3f970a
LZ4_BASE=/mnt/gvfs/third-party2/lz4/0e790b441e2d9acd68d51e1d2e028f88c6a79ddf/r131/gcc-4.8.1-glibc-2.17/c3f970a
ZSTD_BASE=/mnt/gvfs/third-party2/zstd/9455f75ff7f4831dc9fda02a6a0f8c68922fad8f/1.0.0/gcc-4.8.1-glibc-2.17/c3f970a
GFLAGS_BASE=/mnt/gvfs/third-party2/gflags/f001a51b2854957676d07306ef3abf67186b5c8b/2.1.1/gcc-4.8.1-glibc-2.17/c3f970a
JEMALLOC_BASE=/mnt/gvfs/third-party2/jemalloc/fc8a13ca1fffa4d0765c716c5a0b49f0c107518f/master/gcc-4.8.1-glibc-2.17/8d31e51
NUMA_BASE=/mnt/gvfs/third-party2/numa/17c514c4d102a25ca15f4558be564eeed76f4b6a/2.0.8/gcc-4.8.1-glibc-2.17/c3f970a
LIBUNWIND_BASE=/mnt/gvfs/third-party2/libunwind/ad576de2a1ea560c4d3434304f0fc4e079bede42/trunk/gcc-4.8.1-glibc-2.17/675d945
TBB_BASE=/mnt/gvfs/third-party2/tbb/9d9a554877d0c5bef330fe818ab7178806dd316a/4.0_update2/gcc-4.8.1-glibc-2.17/c3f970a
KERNEL_HEADERS_BASE=/mnt/gvfs/third-party2/kernel-headers/7c111ff27e0c466235163f00f280a9d617c3d2ec/4.0.9-36_fbk5_2933_gd092e3f/gcc-4.8.1-glibc-2.17/da39a3e
BINUTILS_BASE=/mnt/gvfs/third-party2/binutils/b7fd454c4b10c6a81015d4524ed06cdeab558490/2.26/centos6-native/da39a3e
VALGRIND_BASE=/mnt/gvfs/third-party2/valgrind/d7f4d4d86674a57668e3a96f76f0e17dd0eb8765/3.8.1/gcc-4.8.1-glibc-2.17/c3f970a
LUA_BASE=/mnt/gvfs/third-party2/lua/61e4abf5813bbc39bc4f548757ccfcadde175a48/5.2.3/centos6-native/730f94e
-19
View File
@@ -1,19 +0,0 @@
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
GCC_BASE=/mnt/gvfs/third-party2/gcc/6e8e715624fd15256a7970073387793dfcf79b46/7.x/centos7-native/b2ef2b6
CLANG_BASE=/mnt/gvfs/third-party2/llvm-fb/ef37e1faa1c29782abfac1ae65a291b9b7966f6d/stable/centos7-native/c9f9104
LIBGCC_BASE=/mnt/gvfs/third-party2/libgcc/c67031f0f739ac61575a061518d6ef5038f99f90/7.x/platform007/5620abc
GLIBC_BASE=/mnt/gvfs/third-party2/glibc/60d6f124a78798b73944f5ba87c2306ae3460153/2.26/platform007/f259413
SNAPPY_BASE=/mnt/gvfs/third-party2/snappy/7f9bdaada18f59bc27ec2b0871eb8a6144343aef/1.1.3/platform007/ca4da3d
ZLIB_BASE=/mnt/gvfs/third-party2/zlib/22c2d65676fb7c23cfa797c4f6937f38b026f3cf/1.2.8/platform007/ca4da3d
BZIP2_BASE=/mnt/gvfs/third-party2/bzip2/dc49a21c5fceec6456a7a28a94dcd16690af1337/1.0.6/platform007/ca4da3d
LZ4_BASE=/mnt/gvfs/third-party2/lz4/907b498203d297947f3bb70b9466f47e100f1873/r131/platform007/ca4da3d
ZSTD_BASE=/mnt/gvfs/third-party2/zstd/3ee276cbacfad3074e3f07bf826ac47f06970f4e/1.3.5/platform007/15a3614
GFLAGS_BASE=/mnt/gvfs/third-party2/gflags/0b9929d2588991c65a57168bf88aff2db87c5d48/2.2.0/platform007/ca4da3d
JEMALLOC_BASE=/mnt/gvfs/third-party2/jemalloc/9c910d36d6235cc40e8ff559358f1833452300ca/master/platform007/5b0f53e
NUMA_BASE=/mnt/gvfs/third-party2/numa/9cbf2460284c669ed19c3ccb200a71f7dd7e53c7/2.0.11/platform007/ca4da3d
LIBUNWIND_BASE=/mnt/gvfs/third-party2/libunwind/bf3d7497fe4e6d007354f0adffa16ce3003f8338/1.3/platform007/6f3e0a9
TBB_BASE=/mnt/gvfs/third-party2/tbb/ff4e0b093534704d8abab678a4fd7f5ea7b094c7/2018_U5/platform007/ca4da3d
KERNEL_HEADERS_BASE=/mnt/gvfs/third-party2/kernel-headers/b5c4a61a5c483ba24722005ae07895971a2ac707/fb/platform007/da39a3e
BINUTILS_BASE=/mnt/gvfs/third-party2/binutils/92ff90349e2f43ea0a8246d8b1cf17b6869013e3/2.29.1/centos7-native/da39a3e
VALGRIND_BASE=/mnt/gvfs/third-party2/valgrind/f3f697a28122e6bcd513273dd9c1ff23852fc59f/3.13.0/platform007/ca4da3d
LUA_BASE=/mnt/gvfs/third-party2/lua/f0cd714433206d5139df61659eb7b28b1dea6683/5.3.4/platform007/5007832
-3
View File
@@ -1,3 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
docker run -v $PWD:/rocks -w /rocks buildpack-deps make
-174
View File
@@ -1,174 +0,0 @@
# Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
# This source code is licensed under both the GPLv2 (found in the
# COPYING file in the root directory) and Apache 2.0 License
# (found in the LICENSE.Apache file in the root directory).
'''Filter for error messages in test output:
- Receives merged stdout/stderr from test on stdin
- Finds patterns of known error messages for test name (first argument)
- Prints those error messages to stdout
'''
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import re
import sys
class ErrorParserBase(object):
def parse_error(self, line):
'''Parses a line of test output. If it contains an error, returns a
formatted message describing the error; otherwise, returns None.
Subclasses must override this method.
'''
raise NotImplementedError
class GTestErrorParser(ErrorParserBase):
'''A parser that remembers the last test that began running so it can print
that test's name upon detecting failure.
'''
_GTEST_NAME_PATTERN = re.compile(r'\[ RUN \] (\S+)$')
# format: '<filename or "unknown file">:<line #>: Failure'
_GTEST_FAIL_PATTERN = re.compile(r'(unknown file|\S+:\d+): Failure$')
def __init__(self):
self._last_gtest_name = 'Unknown test'
def parse_error(self, line):
gtest_name_match = self._GTEST_NAME_PATTERN.match(line)
if gtest_name_match:
self._last_gtest_name = gtest_name_match.group(1)
return None
gtest_fail_match = self._GTEST_FAIL_PATTERN.match(line)
if gtest_fail_match:
return '%s failed: %s' % (
self._last_gtest_name, gtest_fail_match.group(1))
return None
class MatchErrorParser(ErrorParserBase):
'''A simple parser that returns the whole line if it matches the pattern.
'''
def __init__(self, pattern):
self._pattern = re.compile(pattern)
def parse_error(self, line):
if self._pattern.match(line):
return line
return None
class CompilerErrorParser(MatchErrorParser):
def __init__(self):
# format (compile error):
# '<filename>:<line #>:<column #>: error: <error msg>'
# format (link error):
# '<filename>:<line #>: error: <error msg>'
# The below regex catches both
super(CompilerErrorParser, self).__init__(r'\S+:\d+: error:')
class ScanBuildErrorParser(MatchErrorParser):
def __init__(self):
super(ScanBuildErrorParser, self).__init__(
r'scan-build: \d+ bugs found.$')
class DbCrashErrorParser(MatchErrorParser):
def __init__(self):
super(DbCrashErrorParser, self).__init__(r'\*\*\*.*\^$|TEST FAILED.')
class WriteStressErrorParser(MatchErrorParser):
def __init__(self):
super(WriteStressErrorParser, self).__init__(
r'ERROR: write_stress died with exitcode=\d+')
class AsanErrorParser(MatchErrorParser):
def __init__(self):
super(AsanErrorParser, self).__init__(
r'==\d+==ERROR: AddressSanitizer:')
class UbsanErrorParser(MatchErrorParser):
def __init__(self):
# format: '<filename>:<line #>:<column #>: runtime error: <error msg>'
super(UbsanErrorParser, self).__init__(r'\S+:\d+:\d+: runtime error:')
class ValgrindErrorParser(MatchErrorParser):
def __init__(self):
# just grab the summary, valgrind doesn't clearly distinguish errors
# from other log messages.
super(ValgrindErrorParser, self).__init__(r'==\d+== ERROR SUMMARY:')
class CompatErrorParser(MatchErrorParser):
def __init__(self):
super(CompatErrorParser, self).__init__(r'==== .*[Ee]rror.* ====$')
class TsanErrorParser(MatchErrorParser):
def __init__(self):
super(TsanErrorParser, self).__init__(r'WARNING: ThreadSanitizer:')
_TEST_NAME_TO_PARSERS = {
'punit': [CompilerErrorParser, GTestErrorParser],
'unit': [CompilerErrorParser, GTestErrorParser],
'release': [CompilerErrorParser, GTestErrorParser],
'unit_481': [CompilerErrorParser, GTestErrorParser],
'release_481': [CompilerErrorParser, GTestErrorParser],
'clang_unit': [CompilerErrorParser, GTestErrorParser],
'clang_release': [CompilerErrorParser, GTestErrorParser],
'clang_analyze': [CompilerErrorParser, ScanBuildErrorParser],
'code_cov': [CompilerErrorParser, GTestErrorParser],
'unity': [CompilerErrorParser, GTestErrorParser],
'lite': [CompilerErrorParser],
'lite_test': [CompilerErrorParser, GTestErrorParser],
'stress_crash': [CompilerErrorParser, DbCrashErrorParser],
'stress_crash_with_atomic_flush': [CompilerErrorParser, DbCrashErrorParser],
'write_stress': [CompilerErrorParser, WriteStressErrorParser],
'asan': [CompilerErrorParser, GTestErrorParser, AsanErrorParser],
'asan_crash': [CompilerErrorParser, AsanErrorParser, DbCrashErrorParser],
'asan_crash_with_atomic_flush': [CompilerErrorParser, AsanErrorParser, DbCrashErrorParser],
'ubsan': [CompilerErrorParser, GTestErrorParser, UbsanErrorParser],
'ubsan_crash': [CompilerErrorParser, UbsanErrorParser, DbCrashErrorParser],
'ubsan_crash_with_atomic_flush': [CompilerErrorParser, UbsanErrorParser, DbCrashErrorParser],
'valgrind': [CompilerErrorParser, GTestErrorParser, ValgrindErrorParser],
'tsan': [CompilerErrorParser, GTestErrorParser, TsanErrorParser],
'format_compatible': [CompilerErrorParser, CompatErrorParser],
'run_format_compatible': [CompilerErrorParser, CompatErrorParser],
'no_compression': [CompilerErrorParser, GTestErrorParser],
'run_no_compression': [CompilerErrorParser, GTestErrorParser],
'regression': [CompilerErrorParser],
'run_regression': [CompilerErrorParser],
}
def main():
if len(sys.argv) != 2:
return 'Usage: %s <test name>' % sys.argv[0]
test_name = sys.argv[1]
if test_name not in _TEST_NAME_TO_PARSERS:
return 'Unknown test name: %s' % test_name
error_parsers = []
for parser_cls in _TEST_NAME_TO_PARSERS[test_name]:
error_parsers.append(parser_cls())
for line in sys.stdin:
line = line.strip()
for error_parser in error_parsers:
error_msg = error_parser.parse_error(line)
if error_msg is not None:
print(error_msg)
if __name__ == '__main__':
sys.exit(main())
-55
View File
@@ -1,55 +0,0 @@
#!/bin/sh
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
# fail early
set -e
if test -z $ROCKSDB_PATH; then
ROCKSDB_PATH=~/rocksdb
fi
source $ROCKSDB_PATH/build_tools/fbcode_config4.8.1.sh
EXTRA_LDFLAGS=""
if test -z $ALLOC; then
# default
ALLOC=tcmalloc
elif [[ $ALLOC == "jemalloc" ]]; then
ALLOC=system
EXTRA_LDFLAGS+=" -Wl,--whole-archive $JEMALLOC_LIB -Wl,--no-whole-archive"
fi
# we need to force mongo to use static library, not shared
STATIC_LIB_DEP_DIR='build/static_library_dependencies'
test -d $STATIC_LIB_DEP_DIR || mkdir $STATIC_LIB_DEP_DIR
test -h $STATIC_LIB_DEP_DIR/`basename $SNAPPY_LIBS` || ln -s $SNAPPY_LIBS $STATIC_LIB_DEP_DIR
test -h $STATIC_LIB_DEP_DIR/`basename $LZ4_LIBS` || ln -s $LZ4_LIBS $STATIC_LIB_DEP_DIR
EXTRA_LDFLAGS+=" -L $STATIC_LIB_DEP_DIR"
set -x
EXTRA_CMD=""
if ! test -e version.json; then
# this is Mongo 3.0
EXTRA_CMD="--rocksdb \
--variant-dir=linux2/norm
--cxx=${CXX} \
--cc=${CC} \
--use-system-zlib" # add this line back to normal code path
# when https://jira.mongodb.org/browse/SERVER-19123 is resolved
fi
scons \
LINKFLAGS="$EXTRA_LDFLAGS $EXEC_LDFLAGS $PLATFORM_LDFLAGS" \
CCFLAGS="$CXXFLAGS -L $STATIC_LIB_DEP_DIR" \
LIBS="lz4 gcc stdc++" \
LIBPATH="$ROCKSDB_PATH" \
CPPPATH="$ROCKSDB_PATH/include" \
-j32 \
--allocator=$ALLOC \
--nostrip \
--opt=on \
--disable-minimum-compiler-version-enforcement \
--use-system-snappy \
--disable-warnings-as-errors \
$EXTRA_CMD $*
-162
View File
@@ -1,162 +0,0 @@
#!/bin/sh
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
#
# Set environment variables so that we can compile rocksdb using
# fbcode settings. It uses the latest g++ and clang compilers and also
# uses jemalloc
# Environment variables that change the behavior of this script:
# PIC_BUILD -- if true, it will only take pic versions of libraries from fbcode. libraries that don't have pic variant will not be included
BASEDIR=`dirname $BASH_SOURCE`
source "$BASEDIR/dependencies.sh"
CFLAGS=""
# libgcc
LIBGCC_INCLUDE="$LIBGCC_BASE/include"
LIBGCC_LIBS=" -L $LIBGCC_BASE/lib"
# glibc
GLIBC_INCLUDE="$GLIBC_BASE/include"
GLIBC_LIBS=" -L $GLIBC_BASE/lib"
# snappy
SNAPPY_INCLUDE=" -I $SNAPPY_BASE/include/"
if test -z $PIC_BUILD; then
SNAPPY_LIBS=" $SNAPPY_BASE/lib/libsnappy.a"
else
SNAPPY_LIBS=" $SNAPPY_BASE/lib/libsnappy_pic.a"
fi
CFLAGS+=" -DSNAPPY"
if test -z $PIC_BUILD; then
# location of zlib headers and libraries
ZLIB_INCLUDE=" -I $ZLIB_BASE/include/"
ZLIB_LIBS=" $ZLIB_BASE/lib/libz.a"
CFLAGS+=" -DZLIB"
# location of bzip headers and libraries
BZIP_INCLUDE=" -I $BZIP2_BASE/include/"
BZIP_LIBS=" $BZIP2_BASE/lib/libbz2.a"
CFLAGS+=" -DBZIP2"
LZ4_INCLUDE=" -I $LZ4_BASE/include/"
LZ4_LIBS=" $LZ4_BASE/lib/liblz4.a"
CFLAGS+=" -DLZ4"
fi
ZSTD_INCLUDE=" -I $ZSTD_BASE/include/"
if test -z $PIC_BUILD; then
ZSTD_LIBS=" $ZSTD_BASE/lib/libzstd.a"
else
ZSTD_LIBS=" $ZSTD_BASE/lib/libzstd_pic.a"
fi
CFLAGS+=" -DZSTD -DZSTD_STATIC_LINKING_ONLY"
# location of gflags headers and libraries
GFLAGS_INCLUDE=" -I $GFLAGS_BASE/include/"
if test -z $PIC_BUILD; then
GFLAGS_LIBS=" $GFLAGS_BASE/lib/libgflags.a"
else
GFLAGS_LIBS=" $GFLAGS_BASE/lib/libgflags_pic.a"
fi
CFLAGS+=" -DGFLAGS=gflags"
# location of jemalloc
JEMALLOC_INCLUDE=" -I $JEMALLOC_BASE/include/"
JEMALLOC_LIB=" $JEMALLOC_BASE/lib/libjemalloc.a"
if test -z $PIC_BUILD; then
# location of numa
NUMA_INCLUDE=" -I $NUMA_BASE/include/"
NUMA_LIB=" $NUMA_BASE/lib/libnuma.a"
CFLAGS+=" -DNUMA"
# location of libunwind
LIBUNWIND="$LIBUNWIND_BASE/lib/libunwind.a"
fi
# location of TBB
TBB_INCLUDE=" -isystem $TBB_BASE/include/"
if test -z $PIC_BUILD; then
TBB_LIBS="$TBB_BASE/lib/libtbb.a"
else
TBB_LIBS="$TBB_BASE/lib/libtbb_pic.a"
fi
CFLAGS+=" -DTBB"
# use Intel SSE support for checksum calculations
export USE_SSE=1
export PORTABLE=1
BINUTILS="$BINUTILS_BASE/bin"
AR="$BINUTILS/ar"
DEPS_INCLUDE="$SNAPPY_INCLUDE $ZLIB_INCLUDE $BZIP_INCLUDE $LZ4_INCLUDE $ZSTD_INCLUDE $GFLAGS_INCLUDE $NUMA_INCLUDE $TBB_INCLUDE"
STDLIBS="-L $GCC_BASE/lib64"
CLANG_BIN="$CLANG_BASE/bin"
CLANG_LIB="$CLANG_BASE/lib"
CLANG_SRC="$CLANG_BASE/../../src"
CLANG_ANALYZER="$CLANG_BIN/clang++"
CLANG_SCAN_BUILD="$CLANG_SRC/llvm/tools/clang/tools/scan-build/bin/scan-build"
if [ -z "$USE_CLANG" ]; then
# gcc
CC="$GCC_BASE/bin/gcc"
CXX="$GCC_BASE/bin/g++"
CFLAGS+=" -B$BINUTILS/gold"
CFLAGS+=" -isystem $GLIBC_INCLUDE"
CFLAGS+=" -isystem $LIBGCC_INCLUDE"
JEMALLOC=1
else
# clang
CLANG_INCLUDE="$CLANG_LIB/clang/stable/include"
CC="$CLANG_BIN/clang"
CXX="$CLANG_BIN/clang++"
KERNEL_HEADERS_INCLUDE="$KERNEL_HEADERS_BASE/include"
CFLAGS+=" -B$BINUTILS/gold -nostdinc -nostdlib"
CFLAGS+=" -isystem $LIBGCC_BASE/include/c++/5.x "
CFLAGS+=" -isystem $LIBGCC_BASE/include/c++/5.x/x86_64-facebook-linux "
CFLAGS+=" -isystem $GLIBC_INCLUDE"
CFLAGS+=" -isystem $LIBGCC_INCLUDE"
CFLAGS+=" -isystem $CLANG_INCLUDE"
CFLAGS+=" -isystem $KERNEL_HEADERS_INCLUDE/linux "
CFLAGS+=" -isystem $KERNEL_HEADERS_INCLUDE "
CFLAGS+=" -Wno-expansion-to-defined "
CXXFLAGS="-nostdinc++"
fi
CFLAGS+=" $DEPS_INCLUDE"
CFLAGS+=" -DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX -DROCKSDB_FALLOCATE_PRESENT -DROCKSDB_MALLOC_USABLE_SIZE -DROCKSDB_RANGESYNC_PRESENT -DROCKSDB_SCHED_GETCPU_PRESENT -DROCKSDB_SUPPORT_THREAD_LOCAL -DHAVE_SSE42"
CXXFLAGS+=" $CFLAGS"
EXEC_LDFLAGS=" $SNAPPY_LIBS $ZLIB_LIBS $BZIP_LIBS $LZ4_LIBS $ZSTD_LIBS $GFLAGS_LIBS $NUMA_LIB $TBB_LIBS"
EXEC_LDFLAGS+=" -B$BINUTILS/gold"
EXEC_LDFLAGS+=" -Wl,--dynamic-linker,/usr/local/fbcode/gcc-5-glibc-2.23/lib/ld.so"
EXEC_LDFLAGS+=" $LIBUNWIND"
EXEC_LDFLAGS+=" -Wl,-rpath=/usr/local/fbcode/gcc-5-glibc-2.23/lib"
# required by libtbb
EXEC_LDFLAGS+=" -ldl"
PLATFORM_LDFLAGS="$LIBGCC_LIBS $GLIBC_LIBS $STDLIBS -lgcc -lstdc++"
EXEC_LDFLAGS_SHARED="$SNAPPY_LIBS $ZLIB_LIBS $BZIP_LIBS $LZ4_LIBS $ZSTD_LIBS $GFLAGS_LIBS $TBB_LIBS"
VALGRIND_VER="$VALGRIND_BASE/bin/"
LUA_PATH="$LUA_BASE"
if test -z $PIC_BUILD; then
LUA_LIB=" $LUA_PATH/lib/liblua.a"
else
LUA_LIB=" $LUA_PATH/lib/liblua_pic.a"
fi
export CC CXX AR CFLAGS CXXFLAGS EXEC_LDFLAGS EXEC_LDFLAGS_SHARED VALGRIND_VER JEMALLOC_LIB JEMALLOC_INCLUDE CLANG_ANALYZER CLANG_SCAN_BUILD LUA_PATH LUA_LIB
-117
View File
@@ -1,117 +0,0 @@
#!/bin/sh
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
#
# Set environment variables so that we can compile rocksdb using
# fbcode settings. It uses the latest g++ compiler and also
# uses jemalloc
BASEDIR=`dirname $BASH_SOURCE`
source "$BASEDIR/dependencies_4.8.1.sh"
# location of libgcc
LIBGCC_INCLUDE="$LIBGCC_BASE/include"
LIBGCC_LIBS=" -L $LIBGCC_BASE/lib"
# location of glibc
GLIBC_INCLUDE="$GLIBC_BASE/include"
GLIBC_LIBS=" -L $GLIBC_BASE/lib"
# location of snappy headers and libraries
SNAPPY_INCLUDE=" -I $SNAPPY_BASE/include"
SNAPPY_LIBS=" $SNAPPY_BASE/lib/libsnappy.a"
# location of zlib headers and libraries
ZLIB_INCLUDE=" -I $ZLIB_BASE/include"
ZLIB_LIBS=" $ZLIB_BASE/lib/libz.a"
# location of bzip headers and libraries
BZIP2_INCLUDE=" -I $BZIP2_BASE/include/"
BZIP2_LIBS=" $BZIP2_BASE/lib/libbz2.a"
LZ4_INCLUDE=" -I $LZ4_BASE/include"
LZ4_LIBS=" $LZ4_BASE/lib/liblz4.a"
ZSTD_INCLUDE=" -I $ZSTD_BASE/include"
ZSTD_LIBS=" $ZSTD_BASE/lib/libzstd.a"
# location of gflags headers and libraries
GFLAGS_INCLUDE=" -I $GFLAGS_BASE/include/"
GFLAGS_LIBS=" $GFLAGS_BASE/lib/libgflags.a"
# location of jemalloc
JEMALLOC_INCLUDE=" -I $JEMALLOC_BASE/include"
JEMALLOC_LIB="$JEMALLOC_BASE/lib/libjemalloc.a"
# location of numa
NUMA_INCLUDE=" -I $NUMA_BASE/include/"
NUMA_LIB=" $NUMA_BASE/lib/libnuma.a"
# location of libunwind
LIBUNWIND="$LIBUNWIND_BASE/lib/libunwind.a"
# location of tbb
TBB_INCLUDE=" -isystem $TBB_BASE/include/"
TBB_LIBS="$TBB_BASE/lib/libtbb.a"
# use Intel SSE support for checksum calculations
export USE_SSE=1
export PORTABLE=1
BINUTILS="$BINUTILS_BASE/bin"
AR="$BINUTILS/ar"
DEPS_INCLUDE="$SNAPPY_INCLUDE $ZLIB_INCLUDE $BZIP2_INCLUDE $LZ4_INCLUDE $ZSTD_INCLUDE $GFLAGS_INCLUDE $NUMA_INCLUDE $TBB_INCLUDE"
STDLIBS="-L $GCC_BASE/lib64"
if [ -z "$USE_CLANG" ]; then
# gcc
CC="$GCC_BASE/bin/gcc"
CXX="$GCC_BASE/bin/g++"
CFLAGS="-B$BINUTILS/gold -m64 -mtune=generic"
CFLAGS+=" -isystem $GLIBC_INCLUDE"
CFLAGS+=" -isystem $LIBGCC_INCLUDE"
JEMALLOC=1
else
# clang
CLANG_BIN="$CLANG_BASE/bin"
CLANG_LIB="$CLANG_BASE/lib"
CLANG_INCLUDE="$CLANG_LIB/clang/*/include"
CC="$CLANG_BIN/clang"
CXX="$CLANG_BIN/clang++"
KERNEL_HEADERS_INCLUDE="$KERNEL_HEADERS_BASE/include/"
CFLAGS="-B$BINUTILS/gold -nostdinc -nostdlib"
CFLAGS+=" -isystem $LIBGCC_BASE/include/c++/4.8.1 "
CFLAGS+=" -isystem $LIBGCC_BASE/include/c++/4.8.1/x86_64-facebook-linux "
CFLAGS+=" -isystem $GLIBC_INCLUDE"
CFLAGS+=" -isystem $LIBGCC_INCLUDE"
CFLAGS+=" -isystem $CLANG_INCLUDE"
CFLAGS+=" -isystem $KERNEL_HEADERS_INCLUDE/linux "
CFLAGS+=" -isystem $KERNEL_HEADERS_INCLUDE "
CXXFLAGS="-nostdinc++"
fi
CFLAGS+=" $DEPS_INCLUDE"
CFLAGS+=" -DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX -DROCKSDB_FALLOCATE_PRESENT -DROCKSDB_MALLOC_USABLE_SIZE -DROCKSDB_RANGESYNC_PRESENT -DROCKSDB_SCHED_GETCPU_PRESENT -DROCKSDB_SUPPORT_THREAD_LOCAL -DHAVE_SSE42"
CFLAGS+=" -DSNAPPY -DGFLAGS=google -DZLIB -DBZIP2 -DLZ4 -DZSTD -DNUMA -DTBB"
CXXFLAGS+=" $CFLAGS"
EXEC_LDFLAGS=" $SNAPPY_LIBS $ZLIB_LIBS $BZIP2_LIBS $LZ4_LIBS $ZSTD_LIBS $GFLAGS_LIBS $NUMA_LIB $TBB_LIBS"
EXEC_LDFLAGS+=" -Wl,--dynamic-linker,/usr/local/fbcode/gcc-4.8.1-glibc-2.17/lib/ld.so"
EXEC_LDFLAGS+=" $LIBUNWIND"
EXEC_LDFLAGS+=" -Wl,-rpath=/usr/local/fbcode/gcc-4.8.1-glibc-2.17/lib"
# required by libtbb
EXEC_LDFLAGS+=" -ldl"
PLATFORM_LDFLAGS="$LIBGCC_LIBS $GLIBC_LIBS $STDLIBS -lgcc -lstdc++"
EXEC_LDFLAGS_SHARED="$SNAPPY_LIBS $ZLIB_LIBS $BZIP2_LIBS $LZ4_LIBS $ZSTD_LIBS $GFLAGS_LIBS"
VALGRIND_VER="$VALGRIND_BASE/bin/"
LUA_PATH="$LUA_BASE"
export CC CXX AR CFLAGS CXXFLAGS EXEC_LDFLAGS EXEC_LDFLAGS_SHARED VALGRIND_VER JEMALLOC_LIB JEMALLOC_INCLUDE LUA_PATH
-158
View File
@@ -1,158 +0,0 @@
#!/bin/sh
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
#
# Set environment variables so that we can compile rocksdb using
# fbcode settings. It uses the latest g++ and clang compilers and also
# uses jemalloc
# Environment variables that change the behavior of this script:
# PIC_BUILD -- if true, it will only take pic versions of libraries from fbcode. libraries that don't have pic variant will not be included
BASEDIR=`dirname $BASH_SOURCE`
source "$BASEDIR/dependencies_platform007.sh"
CFLAGS=""
# libgcc
LIBGCC_INCLUDE="$LIBGCC_BASE/include/c++/7.3.0"
LIBGCC_LIBS=" -L $LIBGCC_BASE/lib"
# glibc
GLIBC_INCLUDE="$GLIBC_BASE/include"
GLIBC_LIBS=" -L $GLIBC_BASE/lib"
# snappy
SNAPPY_INCLUDE=" -I $SNAPPY_BASE/include/"
if test -z $PIC_BUILD; then
SNAPPY_LIBS=" $SNAPPY_BASE/lib/libsnappy.a"
else
SNAPPY_LIBS=" $SNAPPY_BASE/lib/libsnappy_pic.a"
fi
CFLAGS+=" -DSNAPPY"
if test -z $PIC_BUILD; then
# location of zlib headers and libraries
ZLIB_INCLUDE=" -I $ZLIB_BASE/include/"
ZLIB_LIBS=" $ZLIB_BASE/lib/libz.a"
CFLAGS+=" -DZLIB"
# location of bzip headers and libraries
BZIP_INCLUDE=" -I $BZIP2_BASE/include/"
BZIP_LIBS=" $BZIP2_BASE/lib/libbz2.a"
CFLAGS+=" -DBZIP2"
LZ4_INCLUDE=" -I $LZ4_BASE/include/"
LZ4_LIBS=" $LZ4_BASE/lib/liblz4.a"
CFLAGS+=" -DLZ4"
fi
ZSTD_INCLUDE=" -I $ZSTD_BASE/include/"
if test -z $PIC_BUILD; then
ZSTD_LIBS=" $ZSTD_BASE/lib/libzstd.a"
else
ZSTD_LIBS=" $ZSTD_BASE/lib/libzstd_pic.a"
fi
CFLAGS+=" -DZSTD"
# location of gflags headers and libraries
GFLAGS_INCLUDE=" -I $GFLAGS_BASE/include/"
if test -z $PIC_BUILD; then
GFLAGS_LIBS=" $GFLAGS_BASE/lib/libgflags.a"
else
GFLAGS_LIBS=" $GFLAGS_BASE/lib/libgflags_pic.a"
fi
CFLAGS+=" -DGFLAGS=gflags"
# location of jemalloc
JEMALLOC_INCLUDE=" -I $JEMALLOC_BASE/include/"
JEMALLOC_LIB=" $JEMALLOC_BASE/lib/libjemalloc.a"
if test -z $PIC_BUILD; then
# location of numa
NUMA_INCLUDE=" -I $NUMA_BASE/include/"
NUMA_LIB=" $NUMA_BASE/lib/libnuma.a"
CFLAGS+=" -DNUMA"
# location of libunwind
LIBUNWIND="$LIBUNWIND_BASE/lib/libunwind.a"
fi
# location of TBB
TBB_INCLUDE=" -isystem $TBB_BASE/include/"
if test -z $PIC_BUILD; then
TBB_LIBS="$TBB_BASE/lib/libtbb.a"
else
TBB_LIBS="$TBB_BASE/lib/libtbb_pic.a"
fi
CFLAGS+=" -DTBB"
# use Intel SSE support for checksum calculations
export USE_SSE=1
export PORTABLE=1
BINUTILS="$BINUTILS_BASE/bin"
AR="$BINUTILS/ar"
DEPS_INCLUDE="$SNAPPY_INCLUDE $ZLIB_INCLUDE $BZIP_INCLUDE $LZ4_INCLUDE $ZSTD_INCLUDE $GFLAGS_INCLUDE $NUMA_INCLUDE $TBB_INCLUDE"
STDLIBS="-L $GCC_BASE/lib64"
CLANG_BIN="$CLANG_BASE/bin"
CLANG_LIB="$CLANG_BASE/lib"
CLANG_SRC="$CLANG_BASE/../../src"
CLANG_ANALYZER="$CLANG_BIN/clang++"
CLANG_SCAN_BUILD="$CLANG_SRC/llvm/tools/clang/tools/scan-build/bin/scan-build"
if [ -z "$USE_CLANG" ]; then
# gcc
CC="$GCC_BASE/bin/gcc"
CXX="$GCC_BASE/bin/g++"
CFLAGS+=" -B$BINUTILS/gold"
CFLAGS+=" -isystem $LIBGCC_INCLUDE"
CFLAGS+=" -isystem $GLIBC_INCLUDE"
JEMALLOC=1
else
# clang
CLANG_INCLUDE="$CLANG_LIB/clang/stable/include"
CC="$CLANG_BIN/clang"
CXX="$CLANG_BIN/clang++"
KERNEL_HEADERS_INCLUDE="$KERNEL_HEADERS_BASE/include"
CFLAGS+=" -B$BINUTILS/gold -nostdinc -nostdlib"
CFLAGS+=" -isystem $LIBGCC_BASE/include/c++/7.x "
CFLAGS+=" -isystem $LIBGCC_BASE/include/c++/7.x/x86_64-facebook-linux "
CFLAGS+=" -isystem $GLIBC_INCLUDE"
CFLAGS+=" -isystem $LIBGCC_INCLUDE"
CFLAGS+=" -isystem $CLANG_INCLUDE"
CFLAGS+=" -isystem $KERNEL_HEADERS_INCLUDE/linux "
CFLAGS+=" -isystem $KERNEL_HEADERS_INCLUDE "
CFLAGS+=" -Wno-expansion-to-defined "
CXXFLAGS="-nostdinc++"
fi
CFLAGS+=" $DEPS_INCLUDE"
CFLAGS+=" -DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX -DROCKSDB_FALLOCATE_PRESENT -DROCKSDB_MALLOC_USABLE_SIZE -DROCKSDB_RANGESYNC_PRESENT -DROCKSDB_SCHED_GETCPU_PRESENT -DROCKSDB_SUPPORT_THREAD_LOCAL -DHAVE_SSE42"
CXXFLAGS+=" $CFLAGS"
EXEC_LDFLAGS=" $SNAPPY_LIBS $ZLIB_LIBS $BZIP_LIBS $LZ4_LIBS $ZSTD_LIBS $GFLAGS_LIBS $NUMA_LIB $TBB_LIBS"
EXEC_LDFLAGS+=" -B$BINUTILS/gold"
EXEC_LDFLAGS+=" -Wl,--dynamic-linker,/usr/local/fbcode/platform007/lib/ld.so"
EXEC_LDFLAGS+=" $LIBUNWIND"
EXEC_LDFLAGS+=" -Wl,-rpath=/usr/local/fbcode/platform007/lib"
# required by libtbb
EXEC_LDFLAGS+=" -ldl"
PLATFORM_LDFLAGS="$LIBGCC_LIBS $GLIBC_LIBS $STDLIBS -lgcc -lstdc++"
EXEC_LDFLAGS_SHARED="$SNAPPY_LIBS $ZLIB_LIBS $BZIP_LIBS $LZ4_LIBS $ZSTD_LIBS $GFLAGS_LIBS $TBB_LIBS"
VALGRIND_VER="$VALGRIND_BASE/bin/"
# lua not supported because it's on track for deprecation, I think
LUA_PATH=
LUA_LIB=
export CC CXX AR CFLAGS CXXFLAGS EXEC_LDFLAGS EXEC_LDFLAGS_SHARED VALGRIND_VER JEMALLOC_LIB JEMALLOC_INCLUDE CLANG_ANALYZER CLANG_SCAN_BUILD LUA_PATH LUA_LIB
-123
View File
@@ -1,123 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
# If clang_format_diff.py command is not specfied, we assume we are able to
# access directly without any path.
if [ -z $CLANG_FORMAT_DIFF ]
then
CLANG_FORMAT_DIFF="clang-format-diff.py"
fi
# Check clang-format-diff.py
if ! which $CLANG_FORMAT_DIFF &> /dev/null
then
echo "You didn't have clang-format-diff.py and/or clang-format available in your computer!"
echo "You can download clang-format-diff.py by running: "
echo " curl --location http://goo.gl/iUW1u2 -o ${CLANG_FORMAT_DIFF}"
echo "You can download clang-format by running: "
echo " brew install clang-format"
echo "Then, move both files (i.e. ${CLANG_FORMAT_DIFF} and clang-format) to some directory within PATH=${PATH}"
exit 128
fi
# Check argparse, a library that clang-format-diff.py requires.
python 2>/dev/null << EOF
import argparse
EOF
if [ "$?" != 0 ]
then
echo "To run clang-format-diff.py, we'll need the library "argparse" to be"
echo "installed. You can try either of the follow ways to install it:"
echo " 1. Manually download argparse: https://pypi.python.org/pypi/argparse"
echo " 2. easy_install argparse (if you have easy_install)"
echo " 3. pip install argparse (if you have pip)"
exit 129
fi
# TODO(kailiu) following work is not complete since we still need to figure
# out how to add the modified files done pre-commit hook to git's commit index.
#
# Check if this script has already been added to pre-commit hook.
# Will suggest user to add this script to pre-commit hook if their pre-commit
# is empty.
# PRE_COMMIT_SCRIPT_PATH="`git rev-parse --show-toplevel`/.git/hooks/pre-commit"
# if ! ls $PRE_COMMIT_SCRIPT_PATH &> /dev/null
# then
# echo "Would you like to add this script to pre-commit hook, which will do "
# echo -n "the format check for all the affected lines before you check in (y/n):"
# read add_to_hook
# if [ "$add_to_hook" == "y" ]
# then
# ln -s `git rev-parse --show-toplevel`/build_tools/format-diff.sh $PRE_COMMIT_SCRIPT_PATH
# fi
# fi
set -e
uncommitted_code=`git diff HEAD`
LAST_MASTER=`git merge-base master HEAD`
# If there's no uncommitted changes, we assume user are doing post-commit
# format check, in which case we'll check the modified lines since last commit
# from master. Otherwise, we'll check format of the uncommitted code only.
if [ -z "$uncommitted_code" ]
then
# Check the format of last commit
diffs=$(git diff -U0 $LAST_MASTER^ | $CLANG_FORMAT_DIFF -p 1)
else
# Check the format of uncommitted lines,
diffs=$(git diff -U0 HEAD | $CLANG_FORMAT_DIFF -p 1)
fi
if [ -z "$diffs" ]
then
echo "Nothing needs to be reformatted!"
exit 0
fi
# Highlight the insertion/deletion from the clang-format-diff.py's output
COLOR_END="\033[0m"
COLOR_RED="\033[0;31m"
COLOR_GREEN="\033[0;32m"
echo -e "Detect lines that doesn't follow the format rules:\r"
# Add the color to the diff. lines added will be green; lines removed will be red.
echo "$diffs" |
sed -e "s/\(^-.*$\)/`echo -e \"$COLOR_RED\1$COLOR_END\"`/" |
sed -e "s/\(^+.*$\)/`echo -e \"$COLOR_GREEN\1$COLOR_END\"`/"
if [[ "$OPT" == *"-DTRAVIS"* ]]
then
exit 1
fi
echo -e "Would you like to fix the format automatically (y/n): \c"
# Make sure under any mode, we can read user input.
exec < /dev/tty
read to_fix
if [ "$to_fix" != "y" ]
then
exit 1
fi
# Do in-place format adjustment.
if [ -z "$uncommitted_code" ]
then
git diff -U0 $LAST_MASTER^ | $CLANG_FORMAT_DIFF -i -p 1
else
git diff -U0 HEAD^ | $CLANG_FORMAT_DIFF -i -p 1
fi
echo "Files reformatted!"
# Amend to last commit if user do the post-commit format check
if [ -z "$uncommitted_code" ]; then
echo -e "Would you like to amend the changes to last commit (`git log HEAD --oneline | head -1`)? (y/n): \c"
read to_amend
if [ "$to_amend" == "y" ]
then
git commit -a --amend --reuse-message HEAD
echo "Amended to last commit"
fi
fi
File diff suppressed because it is too large. Load diff
-134
View File
@@ -1,134 +0,0 @@
# shellcheck disable=SC1113
#/usr/bin/env bash
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
set -e
function log() {
echo "[+] $1"
}
function fatal() {
echo "[!] $1"
exit 1
}
function platform() {
local __resultvar=$1
if [[ -f "/etc/yum.conf" ]]; then
eval $__resultvar="centos"
elif [[ -f "/etc/dpkg/dpkg.cfg" ]]; then
eval $__resultvar="ubuntu"
else
fatal "Unknwon operating system"
fi
}
platform OS
function package() {
if [[ $OS = "ubuntu" ]]; then
if dpkg --get-selections | grep --quiet $1; then
log "$1 is already installed. skipping."
else
# shellcheck disable=SC2068
apt-get install $@ -y
fi
elif [[ $OS = "centos" ]]; then
if rpm -qa | grep --quiet $1; then
log "$1 is already installed. skipping."
else
# shellcheck disable=SC2068
yum install $@ -y
fi
fi
}
function detect_fpm_output() {
if [[ $OS = "ubuntu" ]]; then
export FPM_OUTPUT=deb
elif [[ $OS = "centos" ]]; then
export FPM_OUTPUT=rpm
fi
}
detect_fpm_output
function gem_install() {
if gem list | grep --quiet $1; then
log "$1 is already installed. skipping."
else
# shellcheck disable=SC2068
gem install $@
fi
}
function main() {
if [[ $# -ne 1 ]]; then
fatal "Usage: $0 <rocksdb_version>"
else
log "using rocksdb version: $1"
fi
if [[ -d /vagrant ]]; then
if [[ $OS = "ubuntu" ]]; then
package g++-4.8
export CXX=g++-4.8
# the deb would depend on libgflags2, but the static lib is the only thing
# installed by make install
package libgflags-dev
package ruby-all-dev
elif [[ $OS = "centos" ]]; then
pushd /etc/yum.repos.d
if [[ ! -f /etc/yum.repos.d/devtools-1.1.repo ]]; then
wget http://people.centos.org/tru/devtools-1.1/devtools-1.1.repo
fi
package devtoolset-1.1-gcc --enablerepo=testing-1.1-devtools-6
package devtoolset-1.1-gcc-c++ --enablerepo=testing-1.1-devtools-6
export CC=/opt/centos/devtoolset-1.1/root/usr/bin/gcc
export CPP=/opt/centos/devtoolset-1.1/root/usr/bin/cpp
export CXX=/opt/centos/devtoolset-1.1/root/usr/bin/c++
export PATH=$PATH:/opt/centos/devtoolset-1.1/root/usr/bin
popd
if ! rpm -qa | grep --quiet gflags; then
rpm -i https://github.com/schuhschuh/gflags/releases/download/v2.1.0/gflags-devel-2.1.0-1.amd64.rpm
fi
package ruby
package ruby-devel
package rubygems
package rpm-build
fi
fi
gem_install fpm
make static_lib
make install INSTALL_PATH=package
cd package
LIB_DIR=lib
if [[ -z "$ARCH" ]]; then
ARCH=$(getconf LONG_BIT)
fi
if [[ ("$FPM_OUTPUT" = "rpm") && ($ARCH -eq 64) ]]; then
mv lib lib64
LIB_DIR=lib64
fi
fpm \
-s dir \
-t $FPM_OUTPUT \
-n rocksdb \
-v $1 \
--prefix /usr \
--url http://rocksdb.org/ \
-m rocksdb@fb.com \
--license BSD \
--vendor Facebook \
--description "RocksDB is an embeddable persistent key-value store for fast storage." \
include $LIB_DIR
}
# shellcheck disable=SC2068
main $@
-209
View File
@@ -1,209 +0,0 @@
#!/usr/local/fbcode/gcc-4.9-glibc-2.20-fb/bin/python2.7
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
from __future__ import unicode_literals
import argparse
import commands
import subprocess
import sys
import re
import os
import time
#
# Simple logger
#
class Log:
def __init__(self, filename):
self.filename = filename
self.f = open(self.filename, 'w+', 0)
def caption(self, str):
line = "\n##### %s #####\n" % str
if self.f:
self.f.write("%s \n" % line)
else:
print(line)
def error(self, str):
data = "\n\n##### ERROR ##### %s" % str
if self.f:
self.f.write("%s \n" % data)
else:
print(data)
def log(self, str):
if self.f:
self.f.write("%s \n" % str)
else:
print(str)
#
# Shell Environment
#
class Env(object):
def __init__(self, logfile, tests):
self.tests = tests
self.log = Log(logfile)
def shell(self, cmd, path=os.getcwd()):
if path:
os.chdir(path)
self.log.log("==== shell session ===========================")
self.log.log("%s> %s" % (path, cmd))
status = subprocess.call("cd %s; %s" % (path, cmd), shell=True,
stdout=self.log.f, stderr=self.log.f)
self.log.log("status = %s" % status)
self.log.log("============================================== \n\n")
return status
def GetOutput(self, cmd, path=os.getcwd()):
if path:
os.chdir(path)
self.log.log("==== shell session ===========================")
self.log.log("%s> %s" % (path, cmd))
status, out = commands.getstatusoutput(cmd)
self.log.log("status = %s" % status)
self.log.log("out = %s" % out)
self.log.log("============================================== \n\n")
return status, out
#
# Pre-commit checker
#
class PreCommitChecker(Env):
def __init__(self, args):
Env.__init__(self, args.logfile, args.tests)
self.ignore_failure = args.ignore_failure
#
# Get commands for a given job from the determinator file
#
def get_commands(self, test):
status, out = self.GetOutput(
"RATIO=1 build_tools/rocksdb-lego-determinator %s" % test, ".")
return status, out
#
# Run a specific CI job
#
def run_test(self, test):
self.log.caption("Running test %s locally" % test)
# get commands for the CI job determinator
status, cmds = self.get_commands(test)
if status != 0:
self.log.error("Error getting commands for test %s" % test)
return False
# Parse the JSON to extract the commands to run
cmds = re.findall("'shell':'([^\']*)'", cmds)
if len(cmds) == 0:
self.log.log("No commands found")
return False
# Run commands
for cmd in cmds:
# Replace J=<..> with the local environment variable
if "J" in os.environ:
cmd = cmd.replace("J=1", "J=%s" % os.environ["J"])
cmd = cmd.replace("make ", "make -j%s " % os.environ["J"])
# Run the command
status = self.shell(cmd, ".")
if status != 0:
self.log.error("Error running command %s for test %s"
% (cmd, test))
return False
return True
#
# Run specified CI jobs
#
def run_tests(self):
if not self.tests:
self.log.error("Invalid args. Please provide tests")
return False
self.print_separator()
self.print_row("TEST", "RESULT")
self.print_separator()
result = True
for test in self.tests:
start_time = time.time()
self.print_test(test)
result = self.run_test(test)
elapsed_min = (time.time() - start_time) / 60
if not result:
self.log.error("Error running test %s" % test)
self.print_result("FAIL (%dm)" % elapsed_min)
if not self.ignore_failure:
return False
result = False
else:
self.print_result("PASS (%dm)" % elapsed_min)
self.print_separator()
return result
#
# Print a line
#
def print_separator(self):
print("".ljust(60, "-"))
#
# Print two colums
#
def print_row(self, c0, c1):
print("%s%s" % (c0.ljust(40), c1.ljust(20)))
def print_test(self, test):
print(test.ljust(40), end="")
sys.stdout.flush()
def print_result(self, result):
print(result.ljust(20))
#
# Main
#
parser = argparse.ArgumentParser(description='RocksDB pre-commit checker.')
# --log <logfile>
parser.add_argument('--logfile', default='/tmp/precommit-check.log',
help='Log file. Default is /tmp/precommit-check.log')
# --ignore_failure
parser.add_argument('--ignore_failure', action='store_true', default=False,
help='Stop when an error occurs')
# <test ....>
parser.add_argument('tests', nargs='+',
help='CI test(s) to run. e.g: unit punit asan tsan ubsan')
args = parser.parse_args()
checker = PreCommitChecker(args)
print("Please follow log %s" % checker.log.filename)
if not checker.run_tests():
print("Error running tests. Please check log file %s"
% checker.log.filename)
sys.exit(1)
sys.exit(0)
-414
View File
@@ -1,414 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
set -e
NUM=10000000
if [ $# -eq 1 ];then
DATA_DIR=$1
elif [ $# -eq 2 ];then
DATA_DIR=$1
STAT_FILE=$2
fi
# On the production build servers, set data and stat
# files/directories not in /tmp or else the tempdir cleaning
# scripts will make you very unhappy.
DATA_DIR=${DATA_DIR:-$(mktemp -t -d rocksdb_XXXX)}
STAT_FILE=${STAT_FILE:-$(mktemp -t -u rocksdb_test_stats_XXXX)}
function cleanup {
rm -rf $DATA_DIR
rm -f $STAT_FILE.fillseq
rm -f $STAT_FILE.readrandom
rm -f $STAT_FILE.overwrite
rm -f $STAT_FILE.memtablefillreadrandom
}
trap cleanup EXIT
if [ -z $GIT_BRANCH ]; then
git_br=`git rev-parse --abbrev-ref HEAD`
else
git_br=$(basename $GIT_BRANCH)
fi
if [ $git_br == "master" ]; then
git_br=""
else
git_br="."$git_br
fi
make release
# measure fillseq + fill up the DB for overwrite benchmark
./db_bench \
--benchmarks=fillseq \
--db=$DATA_DIR \
--use_existing_db=0 \
--bloom_bits=10 \
--num=$NUM \
--writes=$NUM \
--cache_size=6442450944 \
--cache_numshardbits=6 \
--table_cache_numshardbits=4 \
--open_files=55000 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 > ${STAT_FILE}.fillseq
# measure overwrite performance
./db_bench \
--benchmarks=overwrite \
--db=$DATA_DIR \
--use_existing_db=1 \
--bloom_bits=10 \
--num=$NUM \
--writes=$((NUM / 10)) \
--cache_size=6442450944 \
--cache_numshardbits=6 \
--table_cache_numshardbits=4 \
--open_files=55000 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 \
--threads=8 > ${STAT_FILE}.overwrite
# fill up the db for readrandom benchmark (1GB total size)
./db_bench \
--benchmarks=fillseq \
--db=$DATA_DIR \
--use_existing_db=0 \
--bloom_bits=10 \
--num=$NUM \
--writes=$NUM \
--cache_size=6442450944 \
--cache_numshardbits=6 \
--table_cache_numshardbits=4 \
--open_files=55000 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 \
--threads=1 > /dev/null
# measure readrandom with 6GB block cache
./db_bench \
--benchmarks=readrandom \
--db=$DATA_DIR \
--use_existing_db=1 \
--bloom_bits=10 \
--num=$NUM \
--reads=$((NUM / 5)) \
--cache_size=6442450944 \
--cache_numshardbits=6 \
--table_cache_numshardbits=4 \
--open_files=55000 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 \
--threads=16 > ${STAT_FILE}.readrandom
# measure readrandom with 6GB block cache and tailing iterator
./db_bench \
--benchmarks=readrandom \
--db=$DATA_DIR \
--use_existing_db=1 \
--bloom_bits=10 \
--num=$NUM \
--reads=$((NUM / 5)) \
--cache_size=6442450944 \
--cache_numshardbits=6 \
--table_cache_numshardbits=4 \
--open_files=55000 \
--use_tailing_iterator=1 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 \
--threads=16 > ${STAT_FILE}.readrandomtailing
# measure readrandom with 100MB block cache
./db_bench \
--benchmarks=readrandom \
--db=$DATA_DIR \
--use_existing_db=1 \
--bloom_bits=10 \
--num=$NUM \
--reads=$((NUM / 5)) \
--cache_size=104857600 \
--cache_numshardbits=6 \
--table_cache_numshardbits=4 \
--open_files=55000 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 \
--threads=16 > ${STAT_FILE}.readrandomsmallblockcache
# measure readrandom with 8k data in memtable
./db_bench \
--benchmarks=overwrite,readrandom \
--db=$DATA_DIR \
--use_existing_db=1 \
--bloom_bits=10 \
--num=$NUM \
--reads=$((NUM / 5)) \
--writes=512 \
--cache_size=6442450944 \
--cache_numshardbits=6 \
--table_cache_numshardbits=4 \
--write_buffer_size=1000000000 \
--open_files=55000 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 \
--threads=16 > ${STAT_FILE}.readrandom_mem_sst
# fill up the db for readrandom benchmark with filluniquerandom (1GB total size)
./db_bench \
--benchmarks=filluniquerandom \
--db=$DATA_DIR \
--use_existing_db=0 \
--bloom_bits=10 \
--num=$((NUM / 4)) \
--writes=$((NUM / 4)) \
--cache_size=6442450944 \
--cache_numshardbits=6 \
--table_cache_numshardbits=4 \
--open_files=55000 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 \
--threads=1 > /dev/null
# dummy test just to compact the data
./db_bench \
--benchmarks=readrandom \
--db=$DATA_DIR \
--use_existing_db=1 \
--bloom_bits=10 \
--num=$((NUM / 1000)) \
--reads=$((NUM / 1000)) \
--cache_size=6442450944 \
--cache_numshardbits=6 \
--table_cache_numshardbits=4 \
--open_files=55000 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 \
--threads=16 > /dev/null
# measure readrandom after load with filluniquerandom with 6GB block cache
./db_bench \
--benchmarks=readrandom \
--db=$DATA_DIR \
--use_existing_db=1 \
--bloom_bits=10 \
--num=$((NUM / 4)) \
--reads=$((NUM / 4)) \
--cache_size=6442450944 \
--cache_numshardbits=6 \
--table_cache_numshardbits=4 \
--open_files=55000 \
--disable_auto_compactions=1 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 \
--threads=16 > ${STAT_FILE}.readrandom_filluniquerandom
# measure readwhilewriting after load with filluniquerandom with 6GB block cache
./db_bench \
--benchmarks=readwhilewriting \
--db=$DATA_DIR \
--use_existing_db=1 \
--bloom_bits=10 \
--num=$((NUM / 4)) \
--reads=$((NUM / 4)) \
--benchmark_write_rate_limit=$(( 110 * 1024 )) \
--write_buffer_size=100000000 \
--cache_size=6442450944 \
--cache_numshardbits=6 \
--table_cache_numshardbits=4 \
--open_files=55000 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 \
--threads=16 > ${STAT_FILE}.readwhilewriting
# measure memtable performance -- none of the data gets flushed to disk
./db_bench \
--benchmarks=fillrandom,readrandom, \
--db=$DATA_DIR \
--use_existing_db=0 \
--num=$((NUM / 10)) \
--reads=$NUM \
--cache_size=6442450944 \
--cache_numshardbits=6 \
--table_cache_numshardbits=4 \
--write_buffer_size=1000000000 \
--open_files=55000 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 \
--value_size=10 \
--threads=16 > ${STAT_FILE}.memtablefillreadrandom
common_in_mem_args="--db=/dev/shm/rocksdb \
--num_levels=6 \
--key_size=20 \
--prefix_size=12 \
--keys_per_prefix=10 \
--value_size=100 \
--compression_type=none \
--compression_ratio=1 \
--hard_rate_limit=2 \
--write_buffer_size=134217728 \
--max_write_buffer_number=4 \
--level0_file_num_compaction_trigger=8 \
--level0_slowdown_writes_trigger=16 \
--level0_stop_writes_trigger=24 \
--target_file_size_base=134217728 \
--max_bytes_for_level_base=1073741824 \
--disable_wal=0 \
--wal_dir=/dev/shm/rocksdb \
--sync=0 \
--verify_checksum=1 \
--delete_obsolete_files_period_micros=314572800 \
--max_grandparent_overlap_factor=10 \
--use_plain_table=1 \
--open_files=-1 \
--mmap_read=1 \
--mmap_write=0 \
--memtablerep=prefix_hash \
--bloom_bits=10 \
--bloom_locality=1 \
--perf_level=0"
# prepare a in-memory DB with 50M keys, total DB size is ~6G
./db_bench \
$common_in_mem_args \
--statistics=0 \
--max_background_compactions=16 \
--max_background_flushes=16 \
--benchmarks=filluniquerandom \
--use_existing_db=0 \
--num=52428800 \
--threads=1 > /dev/null
# Readwhilewriting
./db_bench \
$common_in_mem_args \
--statistics=1 \
--max_background_compactions=4 \
--max_background_flushes=0 \
--benchmarks=readwhilewriting\
--use_existing_db=1 \
--duration=600 \
--threads=32 \
--benchmark_write_rate_limit=9502720 > ${STAT_FILE}.readwhilewriting_in_ram
# Seekrandomwhilewriting
./db_bench \
$common_in_mem_args \
--statistics=1 \
--max_background_compactions=4 \
--max_background_flushes=0 \
--benchmarks=seekrandomwhilewriting \
--use_existing_db=1 \
--use_tailing_iterator=1 \
--duration=600 \
--threads=32 \
--benchmark_write_rate_limit=9502720 > ${STAT_FILE}.seekwhilewriting_in_ram
# measure fillseq with bunch of column families
./db_bench \
--benchmarks=fillseq \
--num_column_families=500 \
--write_buffer_size=1048576 \
--db=$DATA_DIR \
--use_existing_db=0 \
--num=$NUM \
--writes=$NUM \
--open_files=55000 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 > ${STAT_FILE}.fillseq_lots_column_families
# measure overwrite performance with bunch of column families
./db_bench \
--benchmarks=overwrite \
--num_column_families=500 \
--write_buffer_size=1048576 \
--db=$DATA_DIR \
--use_existing_db=1 \
--num=$NUM \
--writes=$((NUM / 10)) \
--open_files=55000 \
--statistics=1 \
--histogram=1 \
--disable_wal=1 \
--sync=0 \
--threads=8 > ${STAT_FILE}.overwrite_lots_column_families
# send data to ods
function send_to_ods {
key="$1"
value="$2"
if [ -z $JENKINS_HOME ]; then
# running on devbox, just print out the values
echo $1 $2
return
fi
if [ -z "$value" ];then
echo >&2 "ERROR: Key $key doesn't have a value."
return
fi
curl -s "https://www.intern.facebook.com/intern/agent/ods_set.php?entity=rocksdb_build$git_br&key=$key&value=$value" \
--connect-timeout 60
}
function send_benchmark_to_ods {
bench="$1"
bench_key="$2"
file="$3"
QPS=$(grep $bench $file | awk '{print $5}')
P50_MICROS=$(grep $bench $file -A 6 | grep "Percentiles" | awk '{print $3}' )
P75_MICROS=$(grep $bench $file -A 6 | grep "Percentiles" | awk '{print $5}' )
P99_MICROS=$(grep $bench $file -A 6 | grep "Percentiles" | awk '{print $7}' )
send_to_ods rocksdb.build.$bench_key.qps $QPS
send_to_ods rocksdb.build.$bench_key.p50_micros $P50_MICROS
send_to_ods rocksdb.build.$bench_key.p75_micros $P75_MICROS
send_to_ods rocksdb.build.$bench_key.p99_micros $P99_MICROS
}
send_benchmark_to_ods overwrite overwrite $STAT_FILE.overwrite
send_benchmark_to_ods fillseq fillseq $STAT_FILE.fillseq
send_benchmark_to_ods readrandom readrandom $STAT_FILE.readrandom
send_benchmark_to_ods readrandom readrandom_tailing $STAT_FILE.readrandomtailing
send_benchmark_to_ods readrandom readrandom_smallblockcache $STAT_FILE.readrandomsmallblockcache
send_benchmark_to_ods readrandom readrandom_memtable_sst $STAT_FILE.readrandom_mem_sst
send_benchmark_to_ods readrandom readrandom_fillunique_random $STAT_FILE.readrandom_filluniquerandom
send_benchmark_to_ods fillrandom memtablefillrandom $STAT_FILE.memtablefillreadrandom
send_benchmark_to_ods readrandom memtablereadrandom $STAT_FILE.memtablefillreadrandom
send_benchmark_to_ods readwhilewriting readwhilewriting $STAT_FILE.readwhilewriting
send_benchmark_to_ods readwhilewriting readwhilewriting_in_ram ${STAT_FILE}.readwhilewriting_in_ram
send_benchmark_to_ods seekrandomwhilewriting seekwhilewriting_in_ram ${STAT_FILE}.seekwhilewriting_in_ram
send_benchmark_to_ods fillseq fillseq_lots_column_families ${STAT_FILE}.fillseq_lots_column_families
send_benchmark_to_ods overwrite overwrite_lots_column_families ${STAT_FILE}.overwrite_lots_column_families
-949
View File
@@ -1,949 +0,0 @@
#!/usr/bin/env bash
# This script is executed by Sandcastle
# to determine next steps to run
# Usage:
# EMAIL=<email> ONCALL=<email> TRIGGER=<trigger> SUBSCRIBER=<email> rocks_ci.py <test-name>
#
# Input Value
# -------------------------------------------------------------------------
# EMAIL Email address to report on trigger conditions
# ONCALL Email address to raise a task on failure
# TRIGGER Trigger conditions for email. Valid values are fail, warn, all
# SUBSCRIBER Email addresss to add as subscriber for task
#
#
# Report configuration
#
REPORT_EMAIL=
if [ ! -z $EMAIL ]; then
if [ -z $TRIGGER ]; then
TRIGGER="fail"
fi
REPORT_EMAIL="
{
'type':'email',
'triggers': [ '$TRIGGER' ],
'emails':['$EMAIL']
},"
fi
CREATE_TASK=
if [ ! -z $ONCALL ]; then
CREATE_TASK="
{
'type':'task',
'triggers':[ 'fail' ],
'priority':0,
'subscribers':[ '$SUBSCRIBER' ],
'tags':[ 'rocksdb', 'ci' ],
},"
fi
# For now, create the tasks using only the dedicated task creation tool.
CREATE_TASK=
REPORT=
if [[ ! -z $REPORT_EMAIL || ! -z $CREATE_TASK ]]; then
REPORT="'report': [
$REPORT_EMAIL
$CREATE_TASK
]"
fi
#
# Helper variables
#
CLEANUP_ENV="
{
'name':'Cleanup environment',
'shell':'rm -rf /dev/shm/rocksdb && mkdir /dev/shm/rocksdb && (chmod +t /dev/shm || true) && make clean',
'user':'root'
}"
UPLOAD_DB_DIR="
{
'name':'Upload database directory',
'shell':'tar -cvzf rocksdb_db.tar.gz /dev/shm/rocksdb/',
'user':'root',
'cleanup':true,
'provide_artifacts': [
{
'name':'rocksdb_db_dir',
'paths': ['rocksdb_db.tar.gz'],
'bundle': false,
},
],
}"
# We will eventually set the RATIO to 1, but we want do this
# in steps. RATIO=$(nproc) will make it work as J=1
if [ -z $RATIO ]; then
RATIO=$(nproc)
fi
if [ -z $PARALLEL_J ]; then
PARALLEL_J="J=$(expr $(nproc) / ${RATIO})"
fi
if [ -z $PARALLEL_j ]; then
PARALLEL_j="-j$(expr $(nproc) / ${RATIO})"
fi
PARALLELISM="$PARALLEL_J $PARALLEL_j"
DEBUG="OPT=-g"
SHM="TEST_TMPDIR=/dev/shm/rocksdb"
NON_SHM="TMPD=/tmp/rocksdb_test_tmp"
GCC_481="ROCKSDB_FBCODE_BUILD_WITH_481=1"
ASAN="COMPILE_WITH_ASAN=1"
CLANG="USE_CLANG=1"
# in gcc-5 there are known problems with TSAN like https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71090.
# using platform007 gives us gcc-8 or higher which has that bug fixed.
TSAN="ROCKSDB_FBCODE_BUILD_WITH_PLATFORM007=1 COMPILE_WITH_TSAN=1"
UBSAN="COMPILE_WITH_UBSAN=1"
TSAN_CRASH='CRASH_TEST_EXT_ARGS="--compression_type=zstd --log2_keys_per_lock=22"'
NON_TSAN_CRASH="CRASH_TEST_EXT_ARGS=--compression_type=zstd"
DISABLE_JEMALLOC="DISABLE_JEMALLOC=1"
HTTP_PROXY="https_proxy=http://fwdproxy.29.prn1:8080 http_proxy=http://fwdproxy.29.prn1:8080 ftp_proxy=http://fwdproxy.29.prn1:8080"
SETUP_JAVA_ENV="export $HTTP_PROXY; export JAVA_HOME=/usr/local/jdk-8u60-64/; export PATH=\$JAVA_HOME/bin:\$PATH"
PARSER="'parser':'python build_tools/error_filter.py $1'"
CONTRUN_NAME="ROCKSDB_CONTRUN_NAME"
# This code is getting called under various scenarios. What we care about is to
# understand when it's called from nightly contruns because in that case we'll
# create tasks for any failures. To follow the existing pattern, we'll check
# the value of $ONCALL. If it's a diff then just call `false` to make sure
# that errors will be properly propagated to the caller.
if [ ! -z $ONCALL ]; then
TASK_CREATION_TOOL="/usr/local/bin/mysql_mtr_filter --rocksdb --oncall $ONCALL"
else
TASK_CREATION_TOOL="false"
fi
#
# A mechanism to disable tests temporarily
#
DISABLE_COMMANDS="[
{
'name':'Disable test',
'oncall':'$ONCALL',
'steps': [
{
'name':'Job disabled. Please contact test owner',
'shell':'exit 1',
'user':'root'
},
],
}
]"
#
# RocksDB unit test
#
UNIT_TEST_COMMANDS="[
{
'name':'Rocksdb Unit Test',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Build and test RocksDB debug version',
'shell':'$SHM $DEBUG make $PARALLELISM check || $CONTRUN_NAME=check $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB unit test not under /dev/shm
#
UNIT_TEST_NON_SHM_COMMANDS="[
{
'name':'Rocksdb Unit Test',
'oncall':'$ONCALL',
'executeLocal': 'true',
'timeout': 86400,
'steps': [
$CLEANUP_ENV,
{
'name':'Build and test RocksDB debug version',
'timeout': 86400,
'shell':'$NON_SHM $DEBUG make $PARALLELISM check || $CONTRUN_NAME=non_shm_check $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB release build and unit tests
#
RELEASE_BUILD_COMMANDS="[
{
'name':'Rocksdb Release Build',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Build RocksDB release',
'shell':'make $PARALLEL_j release || $CONTRUN_NAME=release $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB unit test on gcc-4.8.1
#
UNIT_TEST_COMMANDS_481="[
{
'name':'Rocksdb Unit Test on GCC 4.8.1',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Build and test RocksDB debug version',
'shell':'$SHM $GCC_481 $DEBUG make $PARALLELISM check || $CONTRUN_NAME=unit_gcc_481_check $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB release build and unit tests
#
RELEASE_BUILD_COMMANDS_481="[
{
'name':'Rocksdb Release on GCC 4.8.1',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Build RocksDB release on GCC 4.8.1',
'shell':'$GCC_481 make $PARALLEL_j release || $CONTRUN_NAME=release_gcc481 $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB unit test with CLANG
#
CLANG_UNIT_TEST_COMMANDS="[
{
'name':'Rocksdb Unit Test',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Build and test RocksDB debug',
'shell':'$CLANG $SHM $DEBUG make $PARALLELISM check || $CONTRUN_NAME=clang_check $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB release build with CLANG
#
CLANG_RELEASE_BUILD_COMMANDS="[
{
'name':'Rocksdb CLANG Release Build',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Build RocksDB release',
'shell':'$CLANG make $PARALLEL_j release|| $CONTRUN_NAME=clang_release $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB analyze
#
CLANG_ANALYZE_COMMANDS="[
{
'name':'Rocksdb analyze',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'RocksDB build and analyze',
'shell':'$CLANG $SHM $DEBUG make $PARALLEL_j analyze || $CONTRUN_NAME=clang_analyze $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB code coverage
#
CODE_COV_COMMANDS="[
{
'name':'Rocksdb Unit Test Code Coverage',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Build, test and collect code coverage info',
'shell':'$SHM $DEBUG make $PARALLELISM coverage || $CONTRUN_NAME=coverage $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB unity
#
UNITY_COMMANDS="[
{
'name':'Rocksdb Unity',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Build, test unity test',
'shell':'$SHM $DEBUG V=1 make J=1 unity_test || $CONTRUN_NAME=unity_test $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# Build RocksDB lite
#
LITE_BUILD_COMMANDS="[
{
'name':'Rocksdb Lite build',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Build RocksDB debug version',
'shell':'make J=1 LITE=1 all check || $CONTRUN_NAME=lite $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# Report RocksDB lite binary size to scuba
REPORT_LITE_BINARY_SIZE_COMMANDS="[
{
'name':'Rocksdb Lite Binary Size',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Report RocksDB Lite binary size to scuba',
'shell':'tools/report_lite_binary_size.sh',
'user':'root',
},
],
]"
#
# RocksDB stress/crash test
#
STRESS_CRASH_TEST_COMMANDS="[
{
'name':'Rocksdb Stress and Crash Test',
'oncall':'$ONCALL',
'executeLocal': 'true',
'timeout': 86400,
'steps': [
$CLEANUP_ENV,
{
'name':'Build and run RocksDB debug stress tests',
'shell':'$SHM $DEBUG $NON_TSAN_CRASH make J=1 db_stress || $CONTRUN_NAME=db_stress $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
{
'name':'Build and run RocksDB debug crash tests',
'timeout': 86400,
'shell':'$SHM $DEBUG $NON_TSAN_CRASH make J=1 crash_test || $CONTRUN_NAME=crash_test $TASK_CREATION_TOOL',
'user':'root',
$PARSER
}
],
$REPORT
}
]"
#
# RocksDB stress/crash test with atomic flush
#
STRESS_CRASH_TEST_WITH_ATOMIC_FLUSH_COMMANDS="[
{
'name':'Rocksdb Stress and Crash Test with atomic flush',
'oncall':'$ONCALL',
'executeLocal': 'true',
'timeout': 86400,
'steps': [
$CLEANUP_ENV,
{
'name':'Build and run RocksDB debug stress tests',
'shell':'$SHM $DEBUG $NON_TSAN_CRASH make J=1 db_stress || $CONTRUN_NAME=db_stress $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
{
'name':'Build and run RocksDB debug crash tests with atomic flush',
'timeout': 86400,
'shell':'$SHM $DEBUG $NON_TSAN_CRASH make J=1 crash_test_with_atomic_flush || $CONTRUN_NAME=crash_test_with_atomic_flush $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
$UPLOAD_DB_DIR,
],
$REPORT
}
]"
# RocksDB write stress test.
# We run on disk device on purpose (i.e. no $SHM)
# because we want to add some randomness to fsync commands
WRITE_STRESS_COMMANDS="[
{
'name':'Rocksdb Write Stress Test',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Build and run RocksDB write stress tests',
'shell':'make write_stress && python tools/write_stress_runner.py --runtime_sec=3600 --db=/tmp/rocksdb_write_stress || $CONTRUN_NAME=write_stress $TASK_CREATION_TOOL',
'user':'root',
$PARSER
}
],
'artifacts': [{'name': 'database', 'paths': ['/tmp/rocksdb_write_stress']}],
$REPORT
}
]"
#
# RocksDB test under address sanitizer
#
ASAN_TEST_COMMANDS="[
{
'name':'Rocksdb Unit Test under ASAN',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Test RocksDB debug under ASAN',
'shell':'set -o pipefail && ($SHM $ASAN $DEBUG make $PARALLELISM asan_check || $CONTRUN_NAME=asan_check $TASK_CREATION_TOOL) |& /usr/facebook/ops/scripts/asan_symbolize.py -d',
'user':'root',
$PARSER
}
],
$REPORT
}
]"
#
# RocksDB crash testing under address sanitizer
#
ASAN_CRASH_TEST_COMMANDS="[
{
'name':'Rocksdb crash test under ASAN',
'oncall':'$ONCALL',
'executeLocal': 'true',
'timeout': 86400,
'steps': [
$CLEANUP_ENV,
{
'name':'Build and run RocksDB debug asan_crash_test',
'timeout': 86400,
'shell':'$SHM $DEBUG $NON_TSAN_CRASH make J=1 asan_crash_test || $CONTRUN_NAME=asan_crash_test $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB crash testing with atomic flush under address sanitizer
#
ASAN_CRASH_TEST_WITH_ATOMIC_FLUSH_COMMANDS="[
{
'name':'Rocksdb crash test with atomic flush under ASAN',
'oncall':'$ONCALL',
'executeLocal': 'true',
'timeout': 86400,
'steps': [
$CLEANUP_ENV,
{
'name':'Build and run RocksDB debug asan_crash_test_with_atomic_flush',
'timeout': 86400,
'shell':'$SHM $DEBUG $NON_TSAN_CRASH make J=1 asan_crash_test_with_atomic_flush || $CONTRUN_NAME=asan_crash_test_with_atomic_flush $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
$UPLOAD_DB_DIR,
],
$REPORT
}
]"
#
# RocksDB test under undefined behavior sanitizer
#
UBSAN_TEST_COMMANDS="[
{
'name':'Rocksdb Unit Test under UBSAN',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Test RocksDB debug under UBSAN',
'shell':'set -o pipefail && $SHM $UBSAN $DEBUG make $PARALLELISM ubsan_check || $CONTRUN_NAME=ubsan_check $TASK_CREATION_TOOL',
'user':'root',
$PARSER
}
],
$REPORT
}
]"
#
# RocksDB crash testing under udnefined behavior sanitizer
#
UBSAN_CRASH_TEST_COMMANDS="[
{
'name':'Rocksdb crash test under UBSAN',
'oncall':'$ONCALL',
'executeLocal': 'true',
'timeout': 86400,
'steps': [
$CLEANUP_ENV,
{
'name':'Build and run RocksDB debug ubsan_crash_test',
'timeout': 86400,
'shell':'$SHM $DEBUG $NON_TSAN_CRASH make J=1 ubsan_crash_test || $CONTRUN_NAME=ubsan_crash_test $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB crash testing with atomic flush under undefined behavior sanitizer
#
UBSAN_CRASH_TEST_WITH_ATOMIC_FLUSH_COMMANDS="[
{
'name':'Rocksdb crash test with atomic flush under UBSAN',
'oncall':'$ONCALL',
'executeLocal': 'true',
'timeout': 86400,
'steps': [
$CLEANUP_ENV,
{
'name':'Build and run RocksDB debug ubsan_crash_test_with_atomic_flush',
'timeout': 86400,
'shell':'$SHM $DEBUG $NON_TSAN_CRASH make J=1 ubsan_crash_test_with_atomic_flush || $CONTRUN_NAME=ubsan_crash_test_with_atomic_flush $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
$UPLOAD_DB_DIR,
],
$REPORT
}
]"
#
# RocksDB unit test under valgrind
#
VALGRIND_TEST_COMMANDS="[
{
'name':'Rocksdb Unit Test under valgrind',
'oncall':'$ONCALL',
'executeLocal': 'true',
'timeout': 86400,
'steps': [
$CLEANUP_ENV,
{
'name':'Run RocksDB debug unit tests',
'timeout': 86400,
'shell':'$SHM $DEBUG make $PARALLELISM valgrind_test || $CONTRUN_NAME=valgrind_check $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB test under TSAN
#
TSAN_UNIT_TEST_COMMANDS="[
{
'name':'Rocksdb Unit Test under TSAN',
'oncall':'$ONCALL',
'executeLocal': 'true',
'timeout': 86400,
'steps': [
$CLEANUP_ENV,
{
'name':'Run RocksDB debug unit test',
'timeout': 86400,
'shell':'set -o pipefail && $SHM $DEBUG $TSAN make $PARALLELISM check || $CONTRUN_NAME=tsan_check $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB crash test under TSAN
#
TSAN_CRASH_TEST_COMMANDS="[
{
'name':'Rocksdb Crash Test under TSAN',
'oncall':'$ONCALL',
'executeLocal': 'true',
'timeout': 86400,
'steps': [
$CLEANUP_ENV,
{
'name':'Compile and run',
'timeout': 86400,
'shell':'set -o pipefail && $SHM $DEBUG $TSAN $TSAN_CRASH CRASH_TEST_KILL_ODD=1887 make J=1 crash_test || $CONTRUN_NAME=tsan_crash_test $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB crash test with atomic flush under TSAN
#
TSAN_CRASH_TEST_WITH_ATOMIC_FLUSH_COMMANDS="[
{
'name':'Rocksdb Crash Test with atomic flush under TSAN',
'oncall':'$ONCALL',
'executeLocal': 'true',
'timeout': 86400,
'steps': [
$CLEANUP_ENV,
{
'name':'Compile and run',
'timeout': 86400,
'shell':'set -o pipefail && $SHM $DEBUG $TSAN $TSAN_CRASH CRASH_TEST_KILL_ODD=1887 make J=1 crash_test_with_atomic_flush || $CONTRUN_NAME=tsan_crash_test_with_atomic_flush $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
$UPLOAD_DB_DIR,
],
$REPORT
}
]"
#
# RocksDB format compatible
#
run_format_compatible()
{
export TEST_TMPDIR=/dev/shm/rocksdb
rm -rf /dev/shm/rocksdb
mkdir /dev/shm/rocksdb
tools/check_format_compatible.sh
}
FORMAT_COMPATIBLE_COMMANDS="[
{
'name':'Rocksdb Format Compatible tests',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Run RocksDB debug unit test',
'shell':'build_tools/rocksdb-lego-determinator run_format_compatible || $CONTRUN_NAME=run_format_compatible $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB no compression
#
run_no_compression()
{
export TEST_TMPDIR=/dev/shm/rocksdb
rm -rf /dev/shm/rocksdb
mkdir /dev/shm/rocksdb
make clean
cat build_tools/fbcode_config.sh | grep -iv dzstd | grep -iv dzlib | grep -iv dlz4 | grep -iv dsnappy | grep -iv dbzip2 > .tmp.fbcode_config.sh
mv .tmp.fbcode_config.sh build_tools/fbcode_config.sh
cat Makefile | grep -v tools/ldb_test.py > .tmp.Makefile
mv .tmp.Makefile Makefile
make $DEBUG J=1 check
}
NO_COMPRESSION_COMMANDS="[
{
'name':'Rocksdb No Compression tests',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Run RocksDB debug unit test',
'shell':'build_tools/rocksdb-lego-determinator run_no_compression || $CONTRUN_NAME=run_no_compression $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB regression
#
run_regression()
{
time -v bash -vx ./build_tools/regression_build_test.sh $(mktemp -d $WORKSPACE/leveldb.XXXX) $(mktemp leveldb_test_stats.XXXX)
# ======= report size to ODS ========
# parameters: $1 -- key, $2 -- value
function send_size_to_ods {
curl -s "https://www.intern.facebook.com/intern/agent/ods_set.php?entity=rocksdb_build&key=rocksdb.build_size.$1&value=$2" \
--connect-timeout 60
}
# === normal build ===
make clean
make -j$(nproc) static_lib
send_size_to_ods static_lib $(stat --printf="%s" librocksdb.a)
strip librocksdb.a
send_size_to_ods static_lib_stripped $(stat --printf="%s" librocksdb.a)
make -j$(nproc) shared_lib
send_size_to_ods shared_lib $(stat --printf="%s" `readlink -f librocksdb.so`)
strip `readlink -f librocksdb.so`
send_size_to_ods shared_lib_stripped $(stat --printf="%s" `readlink -f librocksdb.so`)
# === lite build ===
make clean
make LITE=1 -j$(nproc) static_lib
send_size_to_ods static_lib_lite $(stat --printf="%s" librocksdb.a)
strip librocksdb.a
send_size_to_ods static_lib_lite_stripped $(stat --printf="%s" librocksdb.a)
make LITE=1 -j$(nproc) shared_lib
send_size_to_ods shared_lib_lite $(stat --printf="%s" `readlink -f librocksdb.so`)
strip `readlink -f librocksdb.so`
send_size_to_ods shared_lib_lite_stripped $(stat --printf="%s" `readlink -f librocksdb.so`)
}
REGRESSION_COMMANDS="[
{
'name':'Rocksdb regression commands',
'oncall':'$ONCALL',
'steps': [
$CLEANUP_ENV,
{
'name':'Make and run script',
'shell':'build_tools/rocksdb-lego-determinator run_regression || $CONTRUN_NAME=run_regression $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
#
# RocksDB Java build
#
JAVA_BUILD_TEST_COMMANDS="[
{
'name':'Rocksdb Java Build',
'oncall':'$ONCALL',
'executeLocal': 'true',
'steps': [
$CLEANUP_ENV,
{
'name':'Build RocksDB for Java',
'shell':'$SETUP_JAVA_ENV; $SHM make rocksdbjava || $CONTRUN_NAME=rocksdbjava $TASK_CREATION_TOOL',
'user':'root',
$PARSER
},
],
$REPORT
}
]"
case $1 in
unit)
echo $UNIT_TEST_COMMANDS
;;
unit_non_shm)
echo $UNIT_TEST_NON_SHM_COMMANDS
;;
release)
echo $RELEASE_BUILD_COMMANDS
;;
unit_481)
echo $UNIT_TEST_COMMANDS_481
;;
release_481)
echo $RELEASE_BUILD_COMMANDS_481
;;
clang_unit)
echo $CLANG_UNIT_TEST_COMMANDS
;;
clang_release)
echo $CLANG_RELEASE_BUILD_COMMANDS
;;
clang_analyze)
echo $CLANG_ANALYZE_COMMANDS
;;
code_cov)
echo $CODE_COV_COMMANDS
;;
unity)
echo $UNITY_COMMANDS
;;
lite)
echo $LITE_BUILD_COMMANDS
;;
report_lite_binary_size)
echo $REPORT_LITE_BINARY_SIZE_COMMANDS
;;
stress_crash)
echo $STRESS_CRASH_TEST_COMMANDS
;;
stress_crash_with_atomic_flush)
echo $STRESS_CRASH_TEST_WITH_ATOMIC_FLUSH_COMMANDS
;;
write_stress)
echo $WRITE_STRESS_COMMANDS
;;
asan)
echo $ASAN_TEST_COMMANDS
;;
asan_crash)
echo $ASAN_CRASH_TEST_COMMANDS
;;
asan_crash_with_atomic_flush)
echo $ASAN_CRASH_TEST_WITH_ATOMIC_FLUSH_COMMANDS
;;
ubsan)
echo $UBSAN_TEST_COMMANDS
;;
ubsan_crash)
echo $UBSAN_CRASH_TEST_COMMANDS
;;
ubsan_crash_with_atomic_flush)
echo $UBSAN_CRASH_TEST_WITH_ATOMIC_FLUSH_COMMANDS
;;
valgrind)
echo $VALGRIND_TEST_COMMANDS
;;
tsan)
echo $TSAN_UNIT_TEST_COMMANDS
;;
tsan_crash)
echo $TSAN_CRASH_TEST_COMMANDS
;;
tsan_crash_with_atomic_flush)
echo $TSAN_CRASH_TEST_WITH_ATOMIC_FLUSH_COMMANDS
;;
format_compatible)
echo $FORMAT_COMPATIBLE_COMMANDS
;;
run_format_compatible)
run_format_compatible
;;
no_compression)
echo $NO_COMPRESSION_COMMANDS
;;
run_no_compression)
run_no_compression
;;
regression)
echo $REGRESSION_COMMANDS
;;
run_regression)
run_regression
;;
java_build)
echo $JAVA_BUILD_TEST_COMMANDS
;;
*)
echo "Invalid determinator command"
;;
esac
-487
View File
@@ -1,487 +0,0 @@
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
# This script enables you running RocksDB tests by running
# All the tests concurrently and utilizing all the cores
Param(
[switch]$EnableJE = $false, # Look for and use test executable, append _je to listed exclusions
[switch]$RunAll = $false, # Will attempt discover all *_test[_je].exe binaries and run all
# of them as Google suites. I.e. It will run test cases concurrently
# except those mentioned as $Run, those will run as individual test cases
# And any execlued with $ExcludeExes or $ExcludeCases
# It will also not run any individual test cases
# excluded but $ExcludeCasese
[switch]$RunAllExe = $false, # Look for and use test exdcutables, append _je to exclusions automatically
# It will attempt to run them in parallel w/o breaking them up on individual
# test cases. Those listed with $ExcludeExes will be excluded
[string]$SuiteRun = "", # Split test suites in test cases and run in parallel, not compatible with $RunAll
[string]$Run = "", # Run specified executables in parallel but do not split to test cases
[string]$ExcludeCases = "", # Exclude test cases, expects a comma separated list, no spaces
# Takes effect when $RunAll or $SuiteRun is specified. Must have full
# Test cases name including a group and a parameter if any
[string]$ExcludeExes = "", # Exclude exes from consideration, expects a comma separated list,
# no spaces. Takes effect only when $RunAll is specified
[string]$WorkFolder = "", # Direct tests to use that folder. SSD or Ram drive are better options.
# Number of async tasks that would run concurrently. Recommend a number below 64.
# However, CPU utlization really depends on the storage media. Recommend ram based disk.
# a value of 1 will run everything serially
[int]$Concurrency = 8,
[int]$Limit = -1 # -1 means do not limit for test purposes
)
# Folders and commands must be fullpath to run assuming
# the current folder is at the root of the git enlistment
$StartDate = (Get-Date)
$StartDate
$DebugPreference = "Continue"
# These tests are not google test suites and we should guard
# Against running them as suites
$RunOnly = New-Object System.Collections.Generic.HashSet[string]
$RunOnly.Add("c_test") | Out-Null
$RunOnly.Add("compact_on_deletion_collector_test") | Out-Null
$RunOnly.Add("merge_test") | Out-Null
$RunOnly.Add("stringappend_test") | Out-Null # Apparently incorrectly written
$RunOnly.Add("backupable_db_test") | Out-Null # Disabled
$RunOnly.Add("timer_queue_test") | Out-Null # Not a gtest
if($RunAll -and $SuiteRun -ne "") {
Write-Error "$RunAll and $SuiteRun are not compatible"
exit 1
}
if($RunAllExe -and $Run -ne "") {
Write-Error "$RunAllExe and $Run are not compatible"
exit 1
}
# If running under Appveyor assume that root
[string]$Appveyor = $Env:APPVEYOR_BUILD_FOLDER
if($Appveyor -ne "") {
$RootFolder = $Appveyor
} else {
$RootFolder = $PSScriptRoot -replace '\\build_tools', ''
}
$LogFolder = -Join($RootFolder, "\db_logs\")
$BinariesFolder = -Join($RootFolder, "\build\Debug\")
if($WorkFolder -eq "") {
# If TEST_TMPDIR is set use it
[string]$var = $Env:TEST_TMPDIR
if($var -eq "") {
$WorkFolder = -Join($RootFolder, "\db_tests\")
$Env:TEST_TMPDIR = $WorkFolder
} else {
$WorkFolder = $var
}
} else {
# Override from a command line
$Env:TEST_TMPDIR = $WorkFolder
}
Write-Output "Root: $RootFolder, WorkFolder: $WorkFolder"
Write-Output "BinariesFolder: $BinariesFolder, LogFolder: $LogFolder"
# Create test directories in the current folder
md -Path $WorkFolder -ErrorAction Ignore | Out-Null
md -Path $LogFolder -ErrorAction Ignore | Out-Null
$ExcludeCasesSet = New-Object System.Collections.Generic.HashSet[string]
if($ExcludeCases -ne "") {
Write-Host "ExcludeCases: $ExcludeCases"
$l = $ExcludeCases -split ' '
ForEach($t in $l) {
$ExcludeCasesSet.Add($t) | Out-Null
}
}
$ExcludeExesSet = New-Object System.Collections.Generic.HashSet[string]
if($ExcludeExes -ne "") {
Write-Host "ExcludeExe: $ExcludeExes"
$l = $ExcludeExes -split ' '
ForEach($t in $l) {
$ExcludeExesSet.Add($t) | Out-Null
}
}
# Extract the names of its tests by running db_test with --gtest_list_tests.
# This filter removes the "#"-introduced comments, and expands to
# fully-qualified names by changing input like this:
#
# DBTest.
# Empty
# WriteEmptyBatch
# MultiThreaded/MultiThreadedDBTest.
# MultiThreaded/0 # GetParam() = 0
# MultiThreaded/1 # GetParam() = 1
#
# into this:
#
# DBTest.Empty
# DBTest.WriteEmptyBatch
# MultiThreaded/MultiThreadedDBTest.MultiThreaded/0
# MultiThreaded/MultiThreadedDBTest.MultiThreaded/1
#
# Output into the parameter in a form TestName -> Log File Name
function ExtractTestCases([string]$GTestExe, $HashTable) {
$Tests = @()
# Run db_test to get a list of tests and store it into $a array
&$GTestExe --gtest_list_tests | tee -Variable Tests | Out-Null
# Current group
$Group=""
ForEach( $l in $Tests) {
# Leading whitespace is fine
$l = $l -replace '^\s+',''
# Trailing dot is a test group but no whitespace
if ($l -match "\.$" -and $l -notmatch "\s+") {
$Group = $l
} else {
# Otherwise it is a test name, remove leading space
$test = $l
# remove trailing comment if any and create a log name
$test = $test -replace '\s+\#.*',''
$test = "$Group$test"
if($ExcludeCasesSet.Contains($test)) {
Write-Warning "$test case is excluded"
continue
}
$test_log = $test -replace '[\./]','_'
$test_log += ".log"
$log_path = -join ($LogFolder, $test_log)
# Add to a hashtable
$HashTable.Add($test, $log_path);
}
}
}
# The function removes trailing .exe siffix if any,
# creates a name for the log file
# Then adds the test name if it was not excluded into
# a HashTable in a form of test_name -> log_path
function MakeAndAdd([string]$token, $HashTable) {
$test_name = $token -replace '.exe$', ''
$log_name = -join ($test_name, ".log")
$log_path = -join ($LogFolder, $log_name)
$HashTable.Add($test_name, $log_path)
}
# This function takes a list of Suites to run
# Lists all the test cases in each of the suite
# and populates HashOfHashes
# Ordered by suite(exe) @{ Exe = @{ TestCase = LogName }}
function ProcessSuites($ListOfSuites, $HashOfHashes) {
$suite_list = $ListOfSuites
# Problem: if you run --gtest_list_tests on
# a non Google Test executable then it will start executing
# and we will get nowhere
ForEach($suite in $suite_list) {
if($RunOnly.Contains($suite)) {
Write-Warning "$suite is excluded from running as Google test suite"
continue
}
if($EnableJE) {
$suite += "_je"
}
$Cases = [ordered]@{}
$Cases.Clear()
$suite_exe = -Join ($BinariesFolder, $suite)
ExtractTestCases -GTestExe $suite_exe -HashTable $Cases
if($Cases.Count -gt 0) {
$HashOfHashes.Add($suite, $Cases);
}
}
# Make logs and run
if($CasesToRun.Count -lt 1) {
Write-Error "Failed to extract tests from $SuiteRun"
exit 1
}
}
# This will contain all test executables to run
# Hash table that contains all non suite
# Test executable to run
$TestExes = [ordered]@{}
# Check for test exe that are not
# Google Test Suites
# Since this is explicitely mentioned it is not subject
# for exclusions
if($Run -ne "") {
$test_list = $Run -split ' '
ForEach($t in $test_list) {
if($EnableJE) {
$t += "_je"
}
MakeAndAdd -token $t -HashTable $TestExes
}
if($TestExes.Count -lt 1) {
Write-Error "Failed to extract tests from $Run"
exit 1
}
} elseif($RunAllExe) {
# Discover all the test binaries
if($EnableJE) {
$pattern = "*_test_je.exe"
} else {
$pattern = "*_test.exe"
}
$search_path = -join ($BinariesFolder, $pattern)
Write-Host "Binaries Search Path: $search_path"
$DiscoveredExe = @()
dir -Path $search_path | ForEach-Object {
$DiscoveredExe += ($_.Name)
}
# Remove exclusions
ForEach($e in $DiscoveredExe) {
$e = $e -replace '.exe$', ''
$bare_name = $e -replace '_je$', ''
if($ExcludeExesSet.Contains($bare_name)) {
Write-Warning "Test $e is excluded"
continue
}
MakeAndAdd -token $e -HashTable $TestExes
}
if($TestExes.Count -lt 1) {
Write-Error "Failed to discover test executables"
exit 1
}
}
# Ordered by exe @{ Exe = @{ TestCase = LogName }}
$CasesToRun = [ordered]@{}
if($SuiteRun -ne "") {
$suite_list = $SuiteRun -split ' '
ProcessSuites -ListOfSuites $suite_list -HashOfHashes $CasesToRun
} elseif ($RunAll) {
# Discover all the test binaries
if($EnableJE) {
$pattern = "*_test_je.exe"
} else {
$pattern = "*_test.exe"
}
$search_path = -join ($BinariesFolder, $pattern)
Write-Host "Binaries Search Path: $search_path"
$ListOfExe = @()
dir -Path $search_path | ForEach-Object {
$ListOfExe += ($_.Name)
}
# Exclude those in RunOnly from running as suites
$ListOfSuites = @()
ForEach($e in $ListOfExe) {
$e = $e -replace '.exe$', ''
$bare_name = $e -replace '_je$', ''
if($ExcludeExesSet.Contains($bare_name)) {
Write-Warning "Test $e is excluded"
continue
}
if($RunOnly.Contains($bare_name)) {
MakeAndAdd -token $e -HashTable $TestExes
} else {
$ListOfSuites += $bare_name
}
}
ProcessSuites -ListOfSuites $ListOfSuites -HashOfHashes $CasesToRun
}
# Invoke a test with a filter and redirect all output
$InvokeTestCase = {
param($exe, $test, $log);
&$exe --gtest_filter=$test > $log 2>&1
}
# Invoke all tests and redirect output
$InvokeTestAsync = {
param($exe, $log)
&$exe > $log 2>&1
}
# Hash that contains tests to rerun if any failed
# Those tests will be rerun sequentially
# $Rerun = [ordered]@{}
# Test limiting factor here
[int]$count = 0
# Overall status
[bool]$script:success = $true;
function RunJobs($Suites, $TestCmds, [int]$ConcurrencyVal)
{
# Array to wait for any of the running jobs
$jobs = @()
# Hash JobToLog
$JobToLog = @{}
# Wait for all to finish and get the results
while(($JobToLog.Count -gt 0) -or
($TestCmds.Count -gt 0) -or
($Suites.Count -gt 0)) {
# Make sure we have maximum concurrent jobs running if anything
# and the $Limit either not set or allows to proceed
while(($JobToLog.Count -lt $ConcurrencyVal) -and
((($TestCmds.Count -gt 0) -or ($Suites.Count -gt 0)) -and
(($Limit -lt 0) -or ($count -lt $Limit)))) {
# We always favore suites to run if available
[string]$exe_name = ""
[string]$log_path = ""
$Cases = @{}
if($Suites.Count -gt 0) {
# Will the first one
ForEach($e in $Suites.Keys) {
$exe_name = $e
$Cases = $Suites[$e]
break
}
[string]$test_case = ""
[string]$log_path = ""
ForEach($c in $Cases.Keys) {
$test_case = $c
$log_path = $Cases[$c]
break
}
Write-Host "Starting $exe_name::$test_case"
[string]$Exe = -Join ($BinariesFolder, $exe_name)
$job = Start-Job -Name "$exe_name::$test_case" -ArgumentList @($Exe,$test_case,$log_path) -ScriptBlock $InvokeTestCase
$JobToLog.Add($job, $log_path)
$Cases.Remove($test_case)
if($Cases.Count -lt 1) {
$Suites.Remove($exe_name)
}
} elseif ($TestCmds.Count -gt 0) {
ForEach($e in $TestCmds.Keys) {
$exe_name = $e
$log_path = $TestCmds[$e]
break
}
Write-Host "Starting $exe_name"
[string]$Exe = -Join ($BinariesFolder, $exe_name)
$job = Start-Job -Name $exe_name -ScriptBlock $InvokeTestAsync -ArgumentList @($Exe,$log_path)
$JobToLog.Add($job, $log_path)
$TestCmds.Remove($exe_name)
} else {
Write-Error "In the job loop but nothing to run"
exit 1
}
++$count
} # End of Job starting loop
if($JobToLog.Count -lt 1) {
break
}
$jobs = @()
foreach($k in $JobToLog.Keys) { $jobs += $k }
$completed = Wait-Job -Job $jobs -Any
$log = $JobToLog[$completed]
$JobToLog.Remove($completed)
$message = -join @($completed.Name, " State: ", ($completed.State))
$log_content = @(Get-Content $log)
if($completed.State -ne "Completed") {
$script:success = $false
Write-Warning $message
$log_content | Write-Warning
} else {
# Scan the log. If we find PASSED and no occurrence of FAILED
# then it is a success
[bool]$pass_found = $false
ForEach($l in $log_content) {
if(($l -match "^\[\s+FAILED") -or
($l -match "Assertion failed:")) {
$pass_found = $false
break
}
if(($l -match "^\[\s+PASSED") -or
($l -match " : PASSED$") -or
($l -match "^PASS$") -or # Special c_test case
($l -match "Passed all tests!") ) {
$pass_found = $true
}
}
if(!$pass_found) {
$script:success = $false;
Write-Warning $message
$log_content | Write-Warning
} else {
Write-Host $message
}
}
# Remove cached job info from the system
# Should be no output
Receive-Job -Job $completed | Out-Null
}
}
RunJobs -Suites $CasesToRun -TestCmds $TestExes -ConcurrencyVal $Concurrency
$EndDate = (Get-Date)
New-TimeSpan -Start $StartDate -End $EndDate |
ForEach-Object {
"Elapsed time: {0:g}" -f $_
}
if(!$script:success) {
# This does not succeed killing off jobs quick
# So we simply exit
# Remove-Job -Job $jobs -Force
# indicate failure using this exit code
exit 1
}
exit 0
-44
View File
@@ -1,44 +0,0 @@
#!/bin/bash
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
set -e
ROCKSDB_VERSION="5.10.3"
ZSTD_VERSION="1.1.3"
echo "This script configures CentOS with everything needed to build and run RocksDB"
yum update -y && yum install epel-release -y
yum install -y \
wget \
gcc-c++ \
snappy snappy-devel \
zlib zlib-devel \
bzip2 bzip2-devel \
lz4-devel \
libasan \
gflags
mkdir -pv /usr/local/rocksdb-${ROCKSDB_VERSION}
ln -sfT /usr/local/rocksdb-${ROCKSDB_VERSION} /usr/local/rocksdb
wget -qO /tmp/zstd-${ZSTD_VERSION}.tar.gz https://github.com/facebook/zstd/archive/v${ZSTD_VERSION}.tar.gz
wget -qO /tmp/rocksdb-${ROCKSDB_VERSION}.tar.gz https://github.com/facebook/rocksdb/archive/v${ROCKSDB_VERSION}.tar.gz
cd /tmp
tar xzvf zstd-${ZSTD_VERSION}.tar.gz
tar xzvf rocksdb-${ROCKSDB_VERSION}.tar.gz -C /usr/local/
echo "Installing ZSTD..."
pushd zstd-${ZSTD_VERSION}
make && make install
popd
echo "Compiling RocksDB..."
cd /usr/local/rocksdb
chown -R vagrant:vagrant /usr/local/rocksdb/
sudo -u vagrant make static_lib
cd examples/
sudo -u vagrant make all
sudo -u vagrant ./c_simple_example
-172
View File
@@ -1,172 +0,0 @@
#!/bin/sh
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
#
# Update dependencies.sh file with the latest avaliable versions
BASEDIR=$(dirname $0)
OUTPUT=""
function log_variable()
{
echo "$1=${!1}" >> "$OUTPUT"
}
TP2_LATEST="/mnt/vol/engshare/fbcode/third-party2"
## $1 => lib name
## $2 => lib version (if not provided, will try to pick latest)
## $3 => platform (if not provided, will try to pick latest gcc)
##
## get_lib_base will set a variable named ${LIB_NAME}_BASE to the lib location
function get_lib_base()
{
local lib_name=$1
local lib_version=$2
local lib_platform=$3
local result="$TP2_LATEST/$lib_name/"
# Lib Version
if [ -z "$lib_version" ] || [ "$lib_version" = "LATEST" ]; then
# version is not provided, use latest
result=`ls -dr1v $result/*/ | head -n1`
else
result="$result/$lib_version/"
fi
# Lib Platform
if [ -z "$lib_platform" ]; then
# platform is not provided, use latest gcc
result=`ls -dr1v $result/gcc-*[^fb]/ | head -n1`
else
echo $lib_platform
result="$result/$lib_platform/"
fi
result=`ls -1d $result/*/ | head -n1`
# lib_name => LIB_NAME_BASE
local __res_var=${lib_name^^}"_BASE"
__res_var=`echo $__res_var | tr - _`
# LIB_NAME_BASE=$result
eval $__res_var=`readlink -f $result`
log_variable $__res_var
}
###########################################################
# platform007 dependencies #
###########################################################
OUTPUT="$BASEDIR/dependencies_platform007.sh"
rm -f "$OUTPUT"
touch "$OUTPUT"
echo "Writing dependencies to $OUTPUT"
# Compilers locations
GCC_BASE=`readlink -f $TP2_LATEST/gcc/7.x/centos7-native/*/`
CLANG_BASE=`readlink -f $TP2_LATEST/llvm-fb/stable/centos7-native/*/`
log_variable GCC_BASE
log_variable CLANG_BASE
# Libraries locations
get_lib_base libgcc 7.x platform007
get_lib_base glibc 2.26 platform007
get_lib_base snappy LATEST platform007
get_lib_base zlib LATEST platform007
get_lib_base bzip2 LATEST platform007
get_lib_base lz4 LATEST platform007
get_lib_base zstd LATEST platform007
get_lib_base gflags LATEST platform007
get_lib_base jemalloc LATEST platform007
get_lib_base numa LATEST platform007
get_lib_base libunwind LATEST platform007
get_lib_base tbb LATEST platform007
get_lib_base kernel-headers fb platform007
get_lib_base binutils LATEST centos7-native
get_lib_base valgrind LATEST platform007
get_lib_base lua 5.3.4 platform007
git diff $OUTPUT
###########################################################
# 5.x dependencies #
###########################################################
OUTPUT="$BASEDIR/dependencies.sh"
rm -f "$OUTPUT"
touch "$OUTPUT"
echo "Writing dependencies to $OUTPUT"
# Compilers locations
GCC_BASE=`readlink -f $TP2_LATEST/gcc/5.x/centos7-native/*/`
CLANG_BASE=`readlink -f $TP2_LATEST/llvm-fb/stable/centos7-native/*/`
log_variable GCC_BASE
log_variable CLANG_BASE
# Libraries locations
get_lib_base libgcc 5.x gcc-5-glibc-2.23
get_lib_base glibc 2.23 gcc-5-glibc-2.23
get_lib_base snappy LATEST gcc-5-glibc-2.23
get_lib_base zlib LATEST gcc-5-glibc-2.23
get_lib_base bzip2 LATEST gcc-5-glibc-2.23
get_lib_base lz4 LATEST gcc-5-glibc-2.23
get_lib_base zstd LATEST gcc-5-glibc-2.23
get_lib_base gflags LATEST gcc-5-glibc-2.23
get_lib_base jemalloc LATEST gcc-5-glibc-2.23
get_lib_base numa LATEST gcc-5-glibc-2.23
get_lib_base libunwind LATEST gcc-5-glibc-2.23
get_lib_base tbb LATEST gcc-5-glibc-2.23
get_lib_base kernel-headers 4.0.9-36_fbk5_2933_gd092e3f gcc-5-glibc-2.23
get_lib_base binutils LATEST centos7-native
get_lib_base valgrind LATEST gcc-5-glibc-2.23
get_lib_base lua 5.2.3 gcc-5-glibc-2.23
git diff $OUTPUT
###########################################################
# 4.8.1 dependencies #
###########################################################
OUTPUT="$BASEDIR/dependencies_4.8.1.sh"
rm -f "$OUTPUT"
touch "$OUTPUT"
echo "Writing 4.8.1 dependencies to $OUTPUT"
# Compilers locations
GCC_BASE=`readlink -f $TP2_LATEST/gcc/4.8.1/centos6-native/*/`
CLANG_BASE=`readlink -f $TP2_LATEST/llvm-fb/stable/centos6-native/*/`
log_variable GCC_BASE
log_variable CLANG_BASE
# Libraries locations
get_lib_base libgcc 4.8.1 gcc-4.8.1-glibc-2.17
get_lib_base glibc 2.17 gcc-4.8.1-glibc-2.17
get_lib_base snappy LATEST gcc-4.8.1-glibc-2.17
get_lib_base zlib LATEST gcc-4.8.1-glibc-2.17
get_lib_base bzip2 LATEST gcc-4.8.1-glibc-2.17
get_lib_base lz4 LATEST gcc-4.8.1-glibc-2.17
get_lib_base zstd LATEST gcc-4.8.1-glibc-2.17
get_lib_base gflags LATEST gcc-4.8.1-glibc-2.17
get_lib_base jemalloc LATEST gcc-4.8.1-glibc-2.17
get_lib_base numa LATEST gcc-4.8.1-glibc-2.17
get_lib_base libunwind LATEST gcc-4.8.1-glibc-2.17
get_lib_base tbb 4.0_update2 gcc-4.8.1-glibc-2.17
get_lib_base kernel-headers LATEST gcc-4.8.1-glibc-2.17
get_lib_base binutils LATEST centos6-native
get_lib_base valgrind 3.8.1 gcc-4.8.1-glibc-2.17
get_lib_base lua 5.2.3 centos6-native
git diff $OUTPUT
-23
View File
@@ -1,23 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
if [ "$#" = "0" ]; then
echo "Usage: $0 major|minor|patch|full"
exit 1
fi
if [ "$1" = "major" ]; then
cat include/rocksdb/version.h | grep MAJOR | head -n1 | awk '{print $3}'
fi
if [ "$1" = "minor" ]; then
cat include/rocksdb/version.h | grep MINOR | head -n1 | awk '{print $3}'
fi
if [ "$1" = "patch" ]; then
cat include/rocksdb/version.h | grep PATCH | head -n1 | awk '{print $3}'
fi
if [ "$1" = "full" ]; then
awk '/#define ROCKSDB/ { env[$2] = $3 }
END { printf "%s.%s.%s\n", env["ROCKSDB_MAJOR"],
env["ROCKSDB_MINOR"],
env["ROCKSDB_PATCH"] }' \
include/rocksdb/version.h
fi
-281
View File
@@ -1,281 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
#ifndef GFLAGS
#include <cstdio>
int main() {
fprintf(stderr, "Please install gflags to run rocksdb tools\n");
return 1;
}
#else
#include <cinttypes>
#include <sys/types.h>
#include <stdio.h>
#include "port/port.h"
#include "rocksdb/cache.h"
#include "rocksdb/db.h"
#include "rocksdb/env.h"
#include "util/gflags_compat.h"
#include "util/mutexlock.h"
#include "util/random.h"
using GFLAGS_NAMESPACE::ParseCommandLineFlags;
static const uint32_t KB = 1024;
DEFINE_int32(threads, 16, "Number of concurrent threads to run.");
DEFINE_int64(cache_size, 8 * KB * KB,
"Number of bytes to use as a cache of uncompressed data.");
DEFINE_int32(num_shard_bits, 4, "shard_bits.");
DEFINE_int64(max_key, 1 * KB * KB * KB, "Max number of key to place in cache");
DEFINE_uint64(ops_per_thread, 1200000, "Number of operations per thread.");
DEFINE_bool(populate_cache, false, "Populate cache before operations");
DEFINE_int32(insert_percent, 40,
"Ratio of insert to total workload (expressed as a percentage)");
DEFINE_int32(lookup_percent, 50,
"Ratio of lookup to total workload (expressed as a percentage)");
DEFINE_int32(erase_percent, 10,
"Ratio of erase to total workload (expressed as a percentage)");
DEFINE_bool(use_clock_cache, false, "");
namespace rocksdb {
class CacheBench;
namespace {
void deleter(const Slice& /*key*/, void* value) {
delete reinterpret_cast<char *>(value);
}
// State shared by all concurrent executions of the same benchmark.
class SharedState {
public:
explicit SharedState(CacheBench* cache_bench)
: cv_(&mu_),
num_threads_(FLAGS_threads),
num_initialized_(0),
start_(false),
num_done_(0),
cache_bench_(cache_bench) {
}
~SharedState() {}
port::Mutex* GetMutex() {
return &mu_;
}
port::CondVar* GetCondVar() {
return &cv_;
}
CacheBench* GetCacheBench() const {
return cache_bench_;
}
void IncInitialized() {
num_initialized_++;
}
void IncDone() {
num_done_++;
}
bool AllInitialized() const {
return num_initialized_ >= num_threads_;
}
bool AllDone() const {
return num_done_ >= num_threads_;
}
void SetStart() {
start_ = true;
}
bool Started() const {
return start_;
}
private:
port::Mutex mu_;
port::CondVar cv_;
const uint64_t num_threads_;
uint64_t num_initialized_;
bool start_;
uint64_t num_done_;
CacheBench* cache_bench_;
};
// Per-thread state for concurrent executions of the same benchmark.
struct ThreadState {
uint32_t tid;
Random rnd;
SharedState* shared;
ThreadState(uint32_t index, SharedState* _shared)
: tid(index), rnd(1000 + index), shared(_shared) {}
};
} // namespace
class CacheBench {
public:
CacheBench() : num_threads_(FLAGS_threads) {
if (FLAGS_use_clock_cache) {
cache_ = NewClockCache(FLAGS_cache_size, FLAGS_num_shard_bits);
if (!cache_) {
fprintf(stderr, "Clock cache not supported.\n");
exit(1);
}
} else {
cache_ = NewLRUCache(FLAGS_cache_size, FLAGS_num_shard_bits);
}
}
~CacheBench() {}
void PopulateCache() {
Random rnd(1);
for (int64_t i = 0; i < FLAGS_cache_size; i++) {
uint64_t rand_key = rnd.Next() % FLAGS_max_key;
// Cast uint64* to be char*, data would be copied to cache
Slice key(reinterpret_cast<char*>(&rand_key), 8);
// do insert
cache_->Insert(key, new char[10], 1, &deleter);
}
}
bool Run() {
rocksdb::Env* env = rocksdb::Env::Default();
PrintEnv();
SharedState shared(this);
std::vector<ThreadState*> threads(num_threads_);
for (uint32_t i = 0; i < num_threads_; i++) {
threads[i] = new ThreadState(i, &shared);
env->StartThread(ThreadBody, threads[i]);
}
{
MutexLock l(shared.GetMutex());
while (!shared.AllInitialized()) {
shared.GetCondVar()->Wait();
}
// Record start time
uint64_t start_time = env->NowMicros();
// Start all threads
shared.SetStart();
shared.GetCondVar()->SignalAll();
// Wait threads to complete
while (!shared.AllDone()) {
shared.GetCondVar()->Wait();
}
// Record end time
uint64_t end_time = env->NowMicros();
double elapsed = static_cast<double>(end_time - start_time) * 1e-6;
uint32_t qps = static_cast<uint32_t>(
static_cast<double>(FLAGS_threads * FLAGS_ops_per_thread) / elapsed);
fprintf(stdout, "Complete in %.3f s; QPS = %u\n", elapsed, qps);
}
return true;
}
private:
std::shared_ptr<Cache> cache_;
uint32_t num_threads_;
static void ThreadBody(void* v) {
ThreadState* thread = reinterpret_cast<ThreadState*>(v);
SharedState* shared = thread->shared;
{
MutexLock l(shared->GetMutex());
shared->IncInitialized();
if (shared->AllInitialized()) {
shared->GetCondVar()->SignalAll();
}
while (!shared->Started()) {
shared->GetCondVar()->Wait();
}
}
thread->shared->GetCacheBench()->OperateCache(thread);
{
MutexLock l(shared->GetMutex());
shared->IncDone();
if (shared->AllDone()) {
shared->GetCondVar()->SignalAll();
}
}
}
void OperateCache(ThreadState* thread) {
for (uint64_t i = 0; i < FLAGS_ops_per_thread; i++) {
uint64_t rand_key = thread->rnd.Next() % FLAGS_max_key;
// Cast uint64* to be char*, data would be copied to cache
Slice key(reinterpret_cast<char*>(&rand_key), 8);
int32_t prob_op = thread->rnd.Uniform(100);
if (prob_op >= 0 && prob_op < FLAGS_insert_percent) {
// do insert
cache_->Insert(key, new char[10], 1, &deleter);
} else if (prob_op -= FLAGS_insert_percent &&
prob_op < FLAGS_lookup_percent) {
// do lookup
auto handle = cache_->Lookup(key);
if (handle) {
cache_->Release(handle);
}
} else if (prob_op -= FLAGS_lookup_percent &&
prob_op < FLAGS_erase_percent) {
// do erase
cache_->Erase(key);
}
}
}
void PrintEnv() const {
printf("RocksDB version : %d.%d\n", kMajorVersion, kMinorVersion);
printf("Number of threads : %d\n", FLAGS_threads);
printf("Ops per thread : %" PRIu64 "\n", FLAGS_ops_per_thread);
printf("Cache size : %" PRIu64 "\n", FLAGS_cache_size);
printf("Num shard bits : %d\n", FLAGS_num_shard_bits);
printf("Max key : %" PRIu64 "\n", FLAGS_max_key);
printf("Populate cache : %d\n", FLAGS_populate_cache);
printf("Insert percentage : %d%%\n", FLAGS_insert_percent);
printf("Lookup percentage : %d%%\n", FLAGS_lookup_percent);
printf("Erase percentage : %d%%\n", FLAGS_erase_percent);
printf("----------------------------\n");
}
};
} // namespace rocksdb
int main(int argc, char** argv) {
ParseCommandLineFlags(&argc, &argv, true);
if (FLAGS_threads <= 0) {
fprintf(stderr, "threads number <= 0\n");
exit(1);
}
rocksdb::CacheBench bench;
if (FLAGS_populate_cache) {
bench.PopulateCache();
}
if (bench.Run()) {
return 0;
} else {
return 1;
}
}
#endif // GFLAGS
-713
View File
@@ -1,713 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#include "rocksdb/cache.h"
#include <forward_list>
#include <functional>
#include <iostream>
#include <string>
#include <vector>
#include "cache/clock_cache.h"
#include "cache/lru_cache.h"
#include "test_util/testharness.h"
#include "util/coding.h"
#include "util/string_util.h"
namespace rocksdb {
// Conversions between numeric keys/values and the types expected by Cache.
static std::string EncodeKey(int k) {
std::string result;
PutFixed32(&result, k);
return result;
}
static int DecodeKey(const Slice& k) {
assert(k.size() == 4);
return DecodeFixed32(k.data());
}
static void* EncodeValue(uintptr_t v) { return reinterpret_cast<void*>(v); }
static int DecodeValue(void* v) {
return static_cast<int>(reinterpret_cast<uintptr_t>(v));
}
const std::string kLRU = "lru";
const std::string kClock = "clock";
void dumbDeleter(const Slice& /*key*/, void* /*value*/) {}
void eraseDeleter(const Slice& /*key*/, void* value) {
Cache* cache = reinterpret_cast<Cache*>(value);
cache->Erase("foo");
}
class CacheTest : public testing::TestWithParam<std::string> {
public:
static CacheTest* current_;
static void Deleter(const Slice& key, void* v) {
current_->deleted_keys_.push_back(DecodeKey(key));
current_->deleted_values_.push_back(DecodeValue(v));
}
static const int kCacheSize = 1000;
static const int kNumShardBits = 4;
static const int kCacheSize2 = 100;
static const int kNumShardBits2 = 2;
std::vector<int> deleted_keys_;
std::vector<int> deleted_values_;
std::shared_ptr<Cache> cache_;
std::shared_ptr<Cache> cache2_;
CacheTest()
: cache_(NewCache(kCacheSize, kNumShardBits, false)),
cache2_(NewCache(kCacheSize2, kNumShardBits2, false)) {
current_ = this;
}
~CacheTest() override {}
std::shared_ptr<Cache> NewCache(size_t capacity) {
auto type = GetParam();
if (type == kLRU) {
return NewLRUCache(capacity);
}
if (type == kClock) {
return NewClockCache(capacity);
}
return nullptr;
}
std::shared_ptr<Cache> NewCache(size_t capacity, int num_shard_bits,
bool strict_capacity_limit) {
auto type = GetParam();
if (type == kLRU) {
return NewLRUCache(capacity, num_shard_bits, strict_capacity_limit, 0.0);
}
if (type == kClock) {
return NewClockCache(capacity, num_shard_bits, strict_capacity_limit);
}
return nullptr;
}
int Lookup(std::shared_ptr<Cache> cache, int key) {
Cache::Handle* handle = cache->Lookup(EncodeKey(key));
const int r = (handle == nullptr) ? -1 : DecodeValue(cache->Value(handle));
if (handle != nullptr) {
cache->Release(handle);
}
return r;
}
void Insert(std::shared_ptr<Cache> cache, int key, int value,
int charge = 1) {
cache->Insert(EncodeKey(key), EncodeValue(value), charge,
&CacheTest::Deleter);
}
void Erase(std::shared_ptr<Cache> cache, int key) {
cache->Erase(EncodeKey(key));
}
int Lookup(int key) {
return Lookup(cache_, key);
}
void Insert(int key, int value, int charge = 1) {
Insert(cache_, key, value, charge);
}
void Erase(int key) {
Erase(cache_, key);
}
int Lookup2(int key) {
return Lookup(cache2_, key);
}
void Insert2(int key, int value, int charge = 1) {
Insert(cache2_, key, value, charge);
}
void Erase2(int key) {
Erase(cache2_, key);
}
};
CacheTest* CacheTest::current_;
TEST_P(CacheTest, UsageTest) {
// cache is std::shared_ptr and will be automatically cleaned up.
const uint64_t kCapacity = 100000;
auto cache = NewCache(kCapacity, 8, false);
size_t usage = 0;
char value[10] = "abcdef";
// make sure everything will be cached
for (int i = 1; i < 100; ++i) {
std::string key(i, 'a');
auto kv_size = key.size() + 5;
cache->Insert(key, reinterpret_cast<void*>(value), kv_size, dumbDeleter);
usage += kv_size;
ASSERT_EQ(usage, cache->GetUsage());
}
// make sure the cache will be overloaded
for (uint64_t i = 1; i < kCapacity; ++i) {
auto key = ToString(i);
cache->Insert(key, reinterpret_cast<void*>(value), key.size() + 5,
dumbDeleter);
}
// the usage should be close to the capacity
ASSERT_GT(kCapacity, cache->GetUsage());
ASSERT_LT(kCapacity * 0.95, cache->GetUsage());
}
TEST_P(CacheTest, PinnedUsageTest) {
// cache is std::shared_ptr and will be automatically cleaned up.
const uint64_t kCapacity = 100000;
auto cache = NewCache(kCapacity, 8, false);
size_t pinned_usage = 0;
char value[10] = "abcdef";
std::forward_list<Cache::Handle*> unreleased_handles;
// Add entries. Unpin some of them after insertion. Then, pin some of them
// again. Check GetPinnedUsage().
for (int i = 1; i < 100; ++i) {
std::string key(i, 'a');
auto kv_size = key.size() + 5;
Cache::Handle* handle;
cache->Insert(key, reinterpret_cast<void*>(value), kv_size, dumbDeleter,
&handle);
pinned_usage += kv_size;
ASSERT_EQ(pinned_usage, cache->GetPinnedUsage());
if (i % 2 == 0) {
cache->Release(handle);
pinned_usage -= kv_size;
ASSERT_EQ(pinned_usage, cache->GetPinnedUsage());
} else {
unreleased_handles.push_front(handle);
}
if (i % 3 == 0) {
unreleased_handles.push_front(cache->Lookup(key));
// If i % 2 == 0, then the entry was unpinned before Lookup, so pinned
// usage increased
if (i % 2 == 0) {
pinned_usage += kv_size;
}
ASSERT_EQ(pinned_usage, cache->GetPinnedUsage());
}
}
// check that overloading the cache does not change the pinned usage
for (uint64_t i = 1; i < 2 * kCapacity; ++i) {
auto key = ToString(i);
cache->Insert(key, reinterpret_cast<void*>(value), key.size() + 5,
dumbDeleter);
}
ASSERT_EQ(pinned_usage, cache->GetPinnedUsage());
// release handles for pinned entries to prevent memory leaks
for (auto handle : unreleased_handles) {
cache->Release(handle);
}
}
TEST_P(CacheTest, HitAndMiss) {
ASSERT_EQ(-1, Lookup(100));
Insert(100, 101);
ASSERT_EQ(101, Lookup(100));
ASSERT_EQ(-1, Lookup(200));
ASSERT_EQ(-1, Lookup(300));
Insert(200, 201);
ASSERT_EQ(101, Lookup(100));
ASSERT_EQ(201, Lookup(200));
ASSERT_EQ(-1, Lookup(300));
Insert(100, 102);
ASSERT_EQ(102, Lookup(100));
ASSERT_EQ(201, Lookup(200));
ASSERT_EQ(-1, Lookup(300));
ASSERT_EQ(1U, deleted_keys_.size());
ASSERT_EQ(100, deleted_keys_[0]);
ASSERT_EQ(101, deleted_values_[0]);
}
TEST_P(CacheTest, InsertSameKey) {
Insert(1, 1);
Insert(1, 2);
ASSERT_EQ(2, Lookup(1));
}
TEST_P(CacheTest, Erase) {
Erase(200);
ASSERT_EQ(0U, deleted_keys_.size());
Insert(100, 101);
Insert(200, 201);
Erase(100);
ASSERT_EQ(-1, Lookup(100));
ASSERT_EQ(201, Lookup(200));
ASSERT_EQ(1U, deleted_keys_.size());
ASSERT_EQ(100, deleted_keys_[0]);
ASSERT_EQ(101, deleted_values_[0]);
Erase(100);
ASSERT_EQ(-1, Lookup(100));
ASSERT_EQ(201, Lookup(200));
ASSERT_EQ(1U, deleted_keys_.size());
}
TEST_P(CacheTest, EntriesArePinned) {
Insert(100, 101);
Cache::Handle* h1 = cache_->Lookup(EncodeKey(100));
ASSERT_EQ(101, DecodeValue(cache_->Value(h1)));
ASSERT_EQ(1U, cache_->GetUsage());
Insert(100, 102);
Cache::Handle* h2 = cache_->Lookup(EncodeKey(100));
ASSERT_EQ(102, DecodeValue(cache_->Value(h2)));
ASSERT_EQ(0U, deleted_keys_.size());
ASSERT_EQ(2U, cache_->GetUsage());
cache_->Release(h1);
ASSERT_EQ(1U, deleted_keys_.size());
ASSERT_EQ(100, deleted_keys_[0]);
ASSERT_EQ(101, deleted_values_[0]);
ASSERT_EQ(1U, cache_->GetUsage());
Erase(100);
ASSERT_EQ(-1, Lookup(100));
ASSERT_EQ(1U, deleted_keys_.size());
ASSERT_EQ(1U, cache_->GetUsage());
cache_->Release(h2);
ASSERT_EQ(2U, deleted_keys_.size());
ASSERT_EQ(100, deleted_keys_[1]);
ASSERT_EQ(102, deleted_values_[1]);
ASSERT_EQ(0U, cache_->GetUsage());
}
TEST_P(CacheTest, EvictionPolicy) {
Insert(100, 101);
Insert(200, 201);
// Frequently used entry must be kept around
for (int i = 0; i < kCacheSize + 200; i++) {
Insert(1000+i, 2000+i);
ASSERT_EQ(101, Lookup(100));
}
ASSERT_EQ(101, Lookup(100));
ASSERT_EQ(-1, Lookup(200));
}
TEST_P(CacheTest, ExternalRefPinsEntries) {
Insert(100, 101);
Cache::Handle* h = cache_->Lookup(EncodeKey(100));
ASSERT_TRUE(cache_->Ref(h));
ASSERT_EQ(101, DecodeValue(cache_->Value(h)));
ASSERT_EQ(1U, cache_->GetUsage());
for (int i = 0; i < 3; ++i) {
if (i > 0) {
// First release (i == 1) corresponds to Ref(), second release (i == 2)
// corresponds to Lookup(). Then, since all external refs are released,
// the below insertions should push out the cache entry.
cache_->Release(h);
}
// double cache size because the usage bit in block cache prevents 100 from
// being evicted in the first kCacheSize iterations
for (int j = 0; j < 2 * kCacheSize + 100; j++) {
Insert(1000 + j, 2000 + j);
}
if (i < 2) {
ASSERT_EQ(101, Lookup(100));
}
}
ASSERT_EQ(-1, Lookup(100));
}
TEST_P(CacheTest, EvictionPolicyRef) {
Insert(100, 101);
Insert(101, 102);
Insert(102, 103);
Insert(103, 104);
Insert(200, 101);
Insert(201, 102);
Insert(202, 103);
Insert(203, 104);
Cache::Handle* h201 = cache_->Lookup(EncodeKey(200));
Cache::Handle* h202 = cache_->Lookup(EncodeKey(201));
Cache::Handle* h203 = cache_->Lookup(EncodeKey(202));
Cache::Handle* h204 = cache_->Lookup(EncodeKey(203));
Insert(300, 101);
Insert(301, 102);
Insert(302, 103);
Insert(303, 104);
// Insert entries much more than Cache capacity
for (int i = 0; i < kCacheSize + 200; i++) {
Insert(1000 + i, 2000 + i);
}
// Check whether the entries inserted in the beginning
// are evicted. Ones without extra ref are evicted and
// those with are not.
ASSERT_EQ(-1, Lookup(100));
ASSERT_EQ(-1, Lookup(101));
ASSERT_EQ(-1, Lookup(102));
ASSERT_EQ(-1, Lookup(103));
ASSERT_EQ(-1, Lookup(300));
ASSERT_EQ(-1, Lookup(301));
ASSERT_EQ(-1, Lookup(302));
ASSERT_EQ(-1, Lookup(303));
ASSERT_EQ(101, Lookup(200));
ASSERT_EQ(102, Lookup(201));
ASSERT_EQ(103, Lookup(202));
ASSERT_EQ(104, Lookup(203));
// Cleaning up all the handles
cache_->Release(h201);
cache_->Release(h202);
cache_->Release(h203);
cache_->Release(h204);
}
TEST_P(CacheTest, EvictEmptyCache) {
// Insert item large than capacity to trigger eviction on empty cache.
auto cache = NewCache(1, 0, false);
ASSERT_OK(cache->Insert("foo", nullptr, 10, dumbDeleter));
}
TEST_P(CacheTest, EraseFromDeleter) {
// Have deleter which will erase item from cache, which will re-enter
// the cache at that point.
std::shared_ptr<Cache> cache = NewCache(10, 0, false);
ASSERT_OK(cache->Insert("foo", nullptr, 1, dumbDeleter));
ASSERT_OK(cache->Insert("bar", cache.get(), 1, eraseDeleter));
cache->Erase("bar");
ASSERT_EQ(nullptr, cache->Lookup("foo"));
ASSERT_EQ(nullptr, cache->Lookup("bar"));
}
TEST_P(CacheTest, ErasedHandleState) {
// insert a key and get two handles
Insert(100, 1000);
Cache::Handle* h1 = cache_->Lookup(EncodeKey(100));
Cache::Handle* h2 = cache_->Lookup(EncodeKey(100));
ASSERT_EQ(h1, h2);
ASSERT_EQ(DecodeValue(cache_->Value(h1)), 1000);
ASSERT_EQ(DecodeValue(cache_->Value(h2)), 1000);
// delete the key from the cache
Erase(100);
// can no longer find in the cache
ASSERT_EQ(-1, Lookup(100));
// release one handle
cache_->Release(h1);
// still can't find in cache
ASSERT_EQ(-1, Lookup(100));
cache_->Release(h2);
}
TEST_P(CacheTest, HeavyEntries) {
// Add a bunch of light and heavy entries and then count the combined
// size of items still in the cache, which must be approximately the
// same as the total capacity.
const int kLight = 1;
const int kHeavy = 10;
int added = 0;
int index = 0;
while (added < 2*kCacheSize) {
const int weight = (index & 1) ? kLight : kHeavy;
Insert(index, 1000+index, weight);
added += weight;
index++;
}
int cached_weight = 0;
for (int i = 0; i < index; i++) {
const int weight = (i & 1 ? kLight : kHeavy);
int r = Lookup(i);
if (r >= 0) {
cached_weight += weight;
ASSERT_EQ(1000+i, r);
}
}
ASSERT_LE(cached_weight, kCacheSize + kCacheSize/10);
}
TEST_P(CacheTest, NewId) {
uint64_t a = cache_->NewId();
uint64_t b = cache_->NewId();
ASSERT_NE(a, b);
}
class Value {
public:
explicit Value(size_t v) : v_(v) { }
size_t v_;
};
namespace {
void deleter(const Slice& /*key*/, void* value) {
delete static_cast<Value *>(value);
}
} // namespace
TEST_P(CacheTest, ReleaseAndErase) {
std::shared_ptr<Cache> cache = NewCache(5, 0, false);
Cache::Handle* handle;
Status s = cache->Insert(EncodeKey(100), EncodeValue(100), 1,
&CacheTest::Deleter, &handle);
ASSERT_TRUE(s.ok());
ASSERT_EQ(5U, cache->GetCapacity());
ASSERT_EQ(1U, cache->GetUsage());
ASSERT_EQ(0U, deleted_keys_.size());
auto erased = cache->Release(handle, true);
ASSERT_TRUE(erased);
// This tests that deleter has been called
ASSERT_EQ(1U, deleted_keys_.size());
}
TEST_P(CacheTest, ReleaseWithoutErase) {
std::shared_ptr<Cache> cache = NewCache(5, 0, false);
Cache::Handle* handle;
Status s = cache->Insert(EncodeKey(100), EncodeValue(100), 1,
&CacheTest::Deleter, &handle);
ASSERT_TRUE(s.ok());
ASSERT_EQ(5U, cache->GetCapacity());
ASSERT_EQ(1U, cache->GetUsage());
ASSERT_EQ(0U, deleted_keys_.size());
auto erased = cache->Release(handle);
ASSERT_FALSE(erased);
// This tests that deleter is not called. When cache has free capacity it is
// not expected to immediately erase the released items.
ASSERT_EQ(0U, deleted_keys_.size());
}
TEST_P(CacheTest, SetCapacity) {
// test1: increase capacity
// lets create a cache with capacity 5,
// then, insert 5 elements, then increase capacity
// to 10, returned capacity should be 10, usage=5
std::shared_ptr<Cache> cache = NewCache(5, 0, false);
std::vector<Cache::Handle*> handles(10);
// Insert 5 entries, but not releasing.
for (size_t i = 0; i < 5; i++) {
std::string key = ToString(i+1);
Status s = cache->Insert(key, new Value(i + 1), 1, &deleter, &handles[i]);
ASSERT_TRUE(s.ok());
}
ASSERT_EQ(5U, cache->GetCapacity());
ASSERT_EQ(5U, cache->GetUsage());
cache->SetCapacity(10);
ASSERT_EQ(10U, cache->GetCapacity());
ASSERT_EQ(5U, cache->GetUsage());
// test2: decrease capacity
// insert 5 more elements to cache, then release 5,
// then decrease capacity to 7, final capacity should be 7
// and usage should be 7
for (size_t i = 5; i < 10; i++) {
std::string key = ToString(i+1);
Status s = cache->Insert(key, new Value(i + 1), 1, &deleter, &handles[i]);
ASSERT_TRUE(s.ok());
}
ASSERT_EQ(10U, cache->GetCapacity());
ASSERT_EQ(10U, cache->GetUsage());
for (size_t i = 0; i < 5; i++) {
cache->Release(handles[i]);
}
ASSERT_EQ(10U, cache->GetCapacity());
ASSERT_EQ(10U, cache->GetUsage());
cache->SetCapacity(7);
ASSERT_EQ(7, cache->GetCapacity());
ASSERT_EQ(7, cache->GetUsage());
// release remaining 5 to keep valgrind happy
for (size_t i = 5; i < 10; i++) {
cache->Release(handles[i]);
}
}
TEST_P(CacheTest, SetStrictCapacityLimit) {
// test1: set the flag to false. Insert more keys than capacity. See if they
// all go through.
std::shared_ptr<Cache> cache = NewLRUCache(5, 0, false);
std::vector<Cache::Handle*> handles(10);
Status s;
for (size_t i = 0; i < 10; i++) {
std::string key = ToString(i + 1);
s = cache->Insert(key, new Value(i + 1), 1, &deleter, &handles[i]);
ASSERT_OK(s);
ASSERT_NE(nullptr, handles[i]);
}
ASSERT_EQ(10, cache->GetUsage());
// test2: set the flag to true. Insert and check if it fails.
std::string extra_key = "extra";
Value* extra_value = new Value(0);
cache->SetStrictCapacityLimit(true);
Cache::Handle* handle;
s = cache->Insert(extra_key, extra_value, 1, &deleter, &handle);
ASSERT_TRUE(s.IsIncomplete());
ASSERT_EQ(nullptr, handle);
ASSERT_EQ(10, cache->GetUsage());
for (size_t i = 0; i < 10; i++) {
cache->Release(handles[i]);
}
// test3: init with flag being true.
std::shared_ptr<Cache> cache2 = NewLRUCache(5, 0, true);
for (size_t i = 0; i < 5; i++) {
std::string key = ToString(i + 1);
s = cache2->Insert(key, new Value(i + 1), 1, &deleter, &handles[i]);
ASSERT_OK(s);
ASSERT_NE(nullptr, handles[i]);
}
s = cache2->Insert(extra_key, extra_value, 1, &deleter, &handle);
ASSERT_TRUE(s.IsIncomplete());
ASSERT_EQ(nullptr, handle);
// test insert without handle
s = cache2->Insert(extra_key, extra_value, 1, &deleter);
// AS if the key have been inserted into cache but get evicted immediately.
ASSERT_OK(s);
ASSERT_EQ(5, cache2->GetUsage());
ASSERT_EQ(nullptr, cache2->Lookup(extra_key));
for (size_t i = 0; i < 5; i++) {
cache2->Release(handles[i]);
}
}
TEST_P(CacheTest, OverCapacity) {
size_t n = 10;
// a LRUCache with n entries and one shard only
std::shared_ptr<Cache> cache = NewCache(n, 0, false);
std::vector<Cache::Handle*> handles(n+1);
// Insert n+1 entries, but not releasing.
for (size_t i = 0; i < n + 1; i++) {
std::string key = ToString(i+1);
Status s = cache->Insert(key, new Value(i + 1), 1, &deleter, &handles[i]);
ASSERT_TRUE(s.ok());
}
// Guess what's in the cache now?
for (size_t i = 0; i < n + 1; i++) {
std::string key = ToString(i+1);
auto h = cache->Lookup(key);
ASSERT_TRUE(h != nullptr);
if (h) cache->Release(h);
}
// the cache is over capacity since nothing could be evicted
ASSERT_EQ(n + 1U, cache->GetUsage());
for (size_t i = 0; i < n + 1; i++) {
cache->Release(handles[i]);
}
// Make sure eviction is triggered.
cache->SetCapacity(n);
// cache is under capacity now since elements were released
ASSERT_EQ(n, cache->GetUsage());
// element 0 is evicted and the rest is there
// This is consistent with the LRU policy since the element 0
// was released first
for (size_t i = 0; i < n + 1; i++) {
std::string key = ToString(i+1);
auto h = cache->Lookup(key);
if (h) {
ASSERT_NE(i, 0U);
cache->Release(h);
} else {
ASSERT_EQ(i, 0U);
}
}
}
namespace {
std::vector<std::pair<int, int>> callback_state;
void callback(void* entry, size_t charge) {
callback_state.push_back({DecodeValue(entry), static_cast<int>(charge)});
}
};
TEST_P(CacheTest, ApplyToAllCacheEntiresTest) {
std::vector<std::pair<int, int>> inserted;
callback_state.clear();
for (int i = 0; i < 10; ++i) {
Insert(i, i * 2, i + 1);
inserted.push_back({i * 2, i + 1});
}
cache_->ApplyToAllCacheEntries(callback, true);
std::sort(inserted.begin(), inserted.end());
std::sort(callback_state.begin(), callback_state.end());
ASSERT_TRUE(inserted == callback_state);
}
TEST_P(CacheTest, DefaultShardBits) {
// test1: set the flag to false. Insert more keys than capacity. See if they
// all go through.
std::shared_ptr<Cache> cache = NewCache(16 * 1024L * 1024L);
ShardedCache* sc = dynamic_cast<ShardedCache*>(cache.get());
ASSERT_EQ(5, sc->GetNumShardBits());
cache = NewLRUCache(511 * 1024L, -1, true);
sc = dynamic_cast<ShardedCache*>(cache.get());
ASSERT_EQ(0, sc->GetNumShardBits());
cache = NewLRUCache(1024L * 1024L * 1024L, -1, true);
sc = dynamic_cast<ShardedCache*>(cache.get());
ASSERT_EQ(6, sc->GetNumShardBits());
}
TEST_P(CacheTest, GetCharge) {
Insert(1, 2);
Cache::Handle* h1 = cache_->Lookup(EncodeKey(1));
ASSERT_EQ(2, DecodeValue(cache_->Value(h1)));
ASSERT_EQ(1, cache_->GetCharge(h1));
cache_->Release(h1);
}
#ifdef SUPPORT_CLOCK_CACHE
std::shared_ptr<Cache> (*new_clock_cache_func)(size_t, int,
bool) = NewClockCache;
INSTANTIATE_TEST_CASE_P(CacheTestInstance, CacheTest,
testing::Values(kLRU, kClock));
#else
INSTANTIATE_TEST_CASE_P(CacheTestInstance, CacheTest, testing::Values(kLRU));
#endif // SUPPORT_CLOCK_CACHE
} // namespace rocksdb
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
-728
View File
@@ -1,728 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#include "cache/clock_cache.h"
#ifndef SUPPORT_CLOCK_CACHE
namespace rocksdb {
std::shared_ptr<Cache> NewClockCache(size_t /*capacity*/, int /*num_shard_bits*/,
bool /*strict_capacity_limit*/) {
// Clock cache not supported.
return nullptr;
}
} // namespace rocksdb
#else
#include <assert.h>
#include <atomic>
#include <deque>
// "tbb/concurrent_hash_map.h" requires RTTI if exception is enabled.
// Disable it so users can chooose to disable RTTI.
#ifndef ROCKSDB_USE_RTTI
#define TBB_USE_EXCEPTIONS 0
#endif
#include "tbb/concurrent_hash_map.h"
#include "cache/sharded_cache.h"
#include "port/port.h"
#include "util/autovector.h"
#include "util/mutexlock.h"
namespace rocksdb {
namespace {
// An implementation of the Cache interface based on CLOCK algorithm, with
// better concurrent performance than LRUCache. The idea of CLOCK algorithm
// is to maintain all cache entries in a circular list, and an iterator
// (the "head") pointing to the last examined entry. Eviction starts from the
// current head. Each entry is given a second chance before eviction, if it
// has been access since last examine. In contrast to LRU, no modification
// to the internal data-structure (except for flipping the usage bit) needs
// to be done upon lookup. This gives us oppertunity to implement a cache
// with better concurrency.
//
// Each cache entry is represented by a cache handle, and all the handles
// are arranged in a circular list, as describe above. Upon erase of an entry,
// we never remove the handle. Instead, the handle is put into a recycle bin
// to be re-use. This is to avoid memory dealocation, which is hard to deal
// with in concurrent environment.
//
// The cache also maintains a concurrent hash map for lookup. Any concurrent
// hash map implementation should do the work. We currently use
// tbb::concurrent_hash_map because it supports concurrent erase.
//
// Each cache handle has the following flags and counters, which are squeeze
// in an atomic interger, to make sure the handle always be in a consistent
// state:
//
// * In-cache bit: whether the entry is reference by the cache itself. If
// an entry is in cache, its key would also be available in the hash map.
// * Usage bit: whether the entry has been access by user since last
// examine for eviction. Can be reset by eviction.
// * Reference count: reference count by user.
//
// An entry can be reference only when it's in cache. An entry can be evicted
// only when it is in cache, has no usage since last examine, and reference
// count is zero.
//
// The follow figure shows a possible layout of the cache. Boxes represents
// cache handles and numbers in each box being in-cache bit, usage bit and
// reference count respectively.
//
// hash map:
// +-------+--------+
// | key | handle |
// +-------+--------+
// | "foo" | 5 |-------------------------------------+
// +-------+--------+ |
// | "bar" | 2 |--+ |
// +-------+--------+ | |
// | |
// head | |
// | | |
// circular list: | | |
// +-------+ +-------+ +-------+ +-------+ +-------+ +-------
// |(0,0,0)|---|(1,1,0)|---|(0,0,0)|---|(0,1,3)|---|(1,0,0)|---| ...
// +-------+ +-------+ +-------+ +-------+ +-------+ +-------
// | |
// +-------+ +-----------+
// | |
// +---+---+
// recycle bin: | 1 | 3 |
// +---+---+
//
// Suppose we try to insert "baz" into the cache at this point and the cache is
// full. The cache will first look for entries to evict, starting from where
// head points to (the second entry). It resets usage bit of the second entry,
// skips the third and fourth entry since they are not in cache, and finally
// evict the fifth entry ("foo"). It looks at recycle bin for available handle,
// grabs handle 3, and insert the key into the handle. The following figure
// shows the resulting layout.
//
// hash map:
// +-------+--------+
// | key | handle |
// +-------+--------+
// | "baz" | 3 |-------------+
// +-------+--------+ |
// | "bar" | 2 |--+ |
// +-------+--------+ | |
// | |
// | | head
// | | |
// circular list: | | |
// +-------+ +-------+ +-------+ +-------+ +-------+ +-------
// |(0,0,0)|---|(1,0,0)|---|(1,0,0)|---|(0,1,3)|---|(0,0,0)|---| ...
// +-------+ +-------+ +-------+ +-------+ +-------+ +-------
// | |
// +-------+ +-----------------------------------+
// | |
// +---+---+
// recycle bin: | 1 | 5 |
// +---+---+
//
// A global mutex guards the circular list, the head, and the recycle bin.
// We additionally require that modifying the hash map needs to hold the mutex.
// As such, Modifying the cache (such as Insert() and Erase()) require to
// hold the mutex. Lookup() only access the hash map and the flags associated
// with each handle, and don't require explicit locking. Release() has to
// acquire the mutex only when it releases the last reference to the entry and
// the entry has been erased from cache explicitly. A future improvement could
// be to remove the mutex completely.
//
// Benchmark:
// We run readrandom db_bench on a test DB of size 13GB, with size of each
// level:
//
// Level Files Size(MB)
// -------------------------
// L0 1 0.01
// L1 18 17.32
// L2 230 182.94
// L3 1186 1833.63
// L4 4602 8140.30
//
// We test with both 32 and 16 read threads, with 2GB cache size (the whole DB
// doesn't fits in) and 64GB cache size (the whole DB can fit in cache), and
// whether to put index and filter blocks in block cache. The benchmark runs
// with
// with RocksDB 4.10. We got the following result:
//
// Threads Cache Cache ClockCache LRUCache
// Size Index/Filter Throughput(MB/s) Hit Throughput(MB/s) Hit
// 32 2GB yes 466.7 85.9% 433.7 86.5%
// 32 2GB no 529.9 72.7% 532.7 73.9%
// 32 64GB yes 649.9 99.9% 507.9 99.9%
// 32 64GB no 740.4 99.9% 662.8 99.9%
// 16 2GB yes 278.4 85.9% 283.4 86.5%
// 16 2GB no 318.6 72.7% 335.8 73.9%
// 16 64GB yes 391.9 99.9% 353.3 99.9%
// 16 64GB no 433.8 99.8% 419.4 99.8%
// Cache entry meta data.
struct CacheHandle {
Slice key;
uint32_t hash;
void* value;
size_t charge;
void (*deleter)(const Slice&, void* value);
// Flags and counters associated with the cache handle:
// lowest bit: n-cache bit
// second lowest bit: usage bit
// the rest bits: reference count
// The handle is unused when flags equals to 0. The thread decreases the count
// to 0 is responsible to put the handle back to recycle_ and cleanup memory.
std::atomic<uint32_t> flags;
CacheHandle() = default;
CacheHandle(const CacheHandle& a) { *this = a; }
CacheHandle(const Slice& k, void* v,
void (*del)(const Slice& key, void* value))
: key(k), value(v), deleter(del) {}
CacheHandle& operator=(const CacheHandle& a) {
// Only copy members needed for deletion.
key = a.key;
value = a.value;
deleter = a.deleter;
return *this;
}
};
// Key of hash map. We store hash value with the key for convenience.
struct CacheKey {
Slice key;
uint32_t hash_value;
CacheKey() = default;
CacheKey(const Slice& k, uint32_t h) {
key = k;
hash_value = h;
}
static bool equal(const CacheKey& a, const CacheKey& b) {
return a.hash_value == b.hash_value && a.key == b.key;
}
static size_t hash(const CacheKey& a) {
return static_cast<size_t>(a.hash_value);
}
};
struct CleanupContext {
// List of values to be deleted, along with the key and deleter.
autovector<CacheHandle> to_delete_value;
// List of keys to be deleted.
autovector<const char*> to_delete_key;
};
// A cache shard which maintains its own CLOCK cache.
class ClockCacheShard final : public CacheShard {
public:
// Hash map type.
typedef tbb::concurrent_hash_map<CacheKey, CacheHandle*, CacheKey> HashTable;
ClockCacheShard();
~ClockCacheShard() override;
// Interfaces
void SetCapacity(size_t capacity) override;
void SetStrictCapacityLimit(bool strict_capacity_limit) override;
Status Insert(const Slice& key, uint32_t hash, void* value, size_t charge,
void (*deleter)(const Slice& key, void* value),
Cache::Handle** handle, Cache::Priority priority) override;
Cache::Handle* Lookup(const Slice& key, uint32_t hash) override;
// If the entry in in cache, increase reference count and return true.
// Return false otherwise.
//
// Not necessary to hold mutex_ before being called.
bool Ref(Cache::Handle* handle) override;
bool Release(Cache::Handle* handle, bool force_erase = false) override;
void Erase(const Slice& key, uint32_t hash) override;
bool EraseAndConfirm(const Slice& key, uint32_t hash,
CleanupContext* context);
size_t GetUsage() const override;
size_t GetPinnedUsage() const override;
void EraseUnRefEntries() override;
void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
bool thread_safe) override;
private:
static const uint32_t kInCacheBit = 1;
static const uint32_t kUsageBit = 2;
static const uint32_t kRefsOffset = 2;
static const uint32_t kOneRef = 1 << kRefsOffset;
// Helper functions to extract cache handle flags and counters.
static bool InCache(uint32_t flags) { return flags & kInCacheBit; }
static bool HasUsage(uint32_t flags) { return flags & kUsageBit; }
static uint32_t CountRefs(uint32_t flags) { return flags >> kRefsOffset; }
// Decrease reference count of the entry. If this decreases the count to 0,
// recycle the entry. If set_usage is true, also set the usage bit.
//
// returns true if a value is erased.
//
// Not necessary to hold mutex_ before being called.
bool Unref(CacheHandle* handle, bool set_usage, CleanupContext* context);
// Unset in-cache bit of the entry. Recycle the handle if necessary.
//
// returns true if a value is erased.
//
// Has to hold mutex_ before being called.
bool UnsetInCache(CacheHandle* handle, CleanupContext* context);
// Put the handle back to recycle_ list, and put the value associated with
// it into to-be-deleted list. It doesn't cleanup the key as it might be
// reused by another handle.
//
// Has to hold mutex_ before being called.
void RecycleHandle(CacheHandle* handle, CleanupContext* context);
// Delete keys and values in to-be-deleted list. Call the method without
// holding mutex, as destructors can be expensive.
void Cleanup(const CleanupContext& context);
// Examine the handle for eviction. If the handle is in cache, usage bit is
// not set, and referece count is 0, evict it from cache. Otherwise unset
// the usage bit.
//
// Has to hold mutex_ before being called.
bool TryEvict(CacheHandle* value, CleanupContext* context);
// Scan through the circular list, evict entries until we get enough capacity
// for new cache entry of specific size. Return true if success, false
// otherwise.
//
// Has to hold mutex_ before being called.
bool EvictFromCache(size_t charge, CleanupContext* context);
CacheHandle* Insert(const Slice& key, uint32_t hash, void* value,
size_t change,
void (*deleter)(const Slice& key, void* value),
bool hold_reference, CleanupContext* context);
// Guards list_, head_, and recycle_. In addition, updating table_ also has
// to hold the mutex, to avoid the cache being in inconsistent state.
mutable port::Mutex mutex_;
// The circular list of cache handles. Initially the list is empty. Once a
// handle is needed by insertion, and no more handles are available in
// recycle bin, one more handle is appended to the end.
//
// We use std::deque for the circular list because we want to make sure
// pointers to handles are valid through out the life-cycle of the cache
// (in contrast to std::vector), and be able to grow the list (in contrast
// to statically allocated arrays).
std::deque<CacheHandle> list_;
// Pointer to the next handle in the circular list to be examine for
// eviction.
size_t head_;
// Recycle bin of cache handles.
autovector<CacheHandle*> recycle_;
// Maximum cache size.
std::atomic<size_t> capacity_;
// Current total size of the cache.
std::atomic<size_t> usage_;
// Total un-released cache size.
std::atomic<size_t> pinned_usage_;
// Whether allow insert into cache if cache is full.
std::atomic<bool> strict_capacity_limit_;
// Hash table (tbb::concurrent_hash_map) for lookup.
HashTable table_;
};
ClockCacheShard::ClockCacheShard()
: head_(0), usage_(0), pinned_usage_(0), strict_capacity_limit_(false) {}
ClockCacheShard::~ClockCacheShard() {
for (auto& handle : list_) {
uint32_t flags = handle.flags.load(std::memory_order_relaxed);
if (InCache(flags) || CountRefs(flags) > 0) {
if (handle.deleter != nullptr) {
(*handle.deleter)(handle.key, handle.value);
}
delete[] handle.key.data();
}
}
}
size_t ClockCacheShard::GetUsage() const {
return usage_.load(std::memory_order_relaxed);
}
size_t ClockCacheShard::GetPinnedUsage() const {
return pinned_usage_.load(std::memory_order_relaxed);
}
void ClockCacheShard::ApplyToAllCacheEntries(void (*callback)(void*, size_t),
bool thread_safe) {
if (thread_safe) {
mutex_.Lock();
}
for (auto& handle : list_) {
// Use relaxed semantics instead of acquire semantics since we are either
// holding mutex, or don't have thread safe requirement.
uint32_t flags = handle.flags.load(std::memory_order_relaxed);
if (InCache(flags)) {
callback(handle.value, handle.charge);
}
}
if (thread_safe) {
mutex_.Unlock();
}
}
void ClockCacheShard::RecycleHandle(CacheHandle* handle,
CleanupContext* context) {
mutex_.AssertHeld();
assert(!InCache(handle->flags) && CountRefs(handle->flags) == 0);
context->to_delete_key.push_back(handle->key.data());
context->to_delete_value.emplace_back(*handle);
handle->key.clear();
handle->value = nullptr;
handle->deleter = nullptr;
recycle_.push_back(handle);
usage_.fetch_sub(handle->charge, std::memory_order_relaxed);
}
void ClockCacheShard::Cleanup(const CleanupContext& context) {
for (const CacheHandle& handle : context.to_delete_value) {
if (handle.deleter) {
(*handle.deleter)(handle.key, handle.value);
}
}
for (const char* key : context.to_delete_key) {
delete[] key;
}
}
bool ClockCacheShard::Ref(Cache::Handle* h) {
auto handle = reinterpret_cast<CacheHandle*>(h);
// CAS loop to increase reference count.
uint32_t flags = handle->flags.load(std::memory_order_relaxed);
while (InCache(flags)) {
// Use acquire semantics on success, as further operations on the cache
// entry has to be order after reference count is increased.
if (handle->flags.compare_exchange_weak(flags, flags + kOneRef,
std::memory_order_acquire,
std::memory_order_relaxed)) {
if (CountRefs(flags) == 0) {
// No reference count before the operation.
pinned_usage_.fetch_add(handle->charge, std::memory_order_relaxed);
}
return true;
}
}
return false;
}
bool ClockCacheShard::Unref(CacheHandle* handle, bool set_usage,
CleanupContext* context) {
if (set_usage) {
handle->flags.fetch_or(kUsageBit, std::memory_order_relaxed);
}
// Use acquire-release semantics as previous operations on the cache entry
// has to be order before reference count is decreased, and potential cleanup
// of the entry has to be order after.
uint32_t flags = handle->flags.fetch_sub(kOneRef, std::memory_order_acq_rel);
assert(CountRefs(flags) > 0);
if (CountRefs(flags) == 1) {
// this is the last reference.
pinned_usage_.fetch_sub(handle->charge, std::memory_order_relaxed);
// Cleanup if it is the last reference.
if (!InCache(flags)) {
MutexLock l(&mutex_);
RecycleHandle(handle, context);
}
}
return context->to_delete_value.size();
}
bool ClockCacheShard::UnsetInCache(CacheHandle* handle,
CleanupContext* context) {
mutex_.AssertHeld();
// Use acquire-release semantics as previous operations on the cache entry
// has to be order before reference count is decreased, and potential cleanup
// of the entry has to be order after.
uint32_t flags =
handle->flags.fetch_and(~kInCacheBit, std::memory_order_acq_rel);
// Cleanup if it is the last reference.
if (InCache(flags) && CountRefs(flags) == 0) {
RecycleHandle(handle, context);
}
return context->to_delete_value.size();
}
bool ClockCacheShard::TryEvict(CacheHandle* handle, CleanupContext* context) {
mutex_.AssertHeld();
uint32_t flags = kInCacheBit;
if (handle->flags.compare_exchange_strong(flags, 0, std::memory_order_acquire,
std::memory_order_relaxed)) {
bool erased __attribute__((__unused__)) =
table_.erase(CacheKey(handle->key, handle->hash));
assert(erased);
RecycleHandle(handle, context);
return true;
}
handle->flags.fetch_and(~kUsageBit, std::memory_order_relaxed);
return false;
}
bool ClockCacheShard::EvictFromCache(size_t charge, CleanupContext* context) {
size_t usage = usage_.load(std::memory_order_relaxed);
size_t capacity = capacity_.load(std::memory_order_relaxed);
if (usage == 0) {
return charge <= capacity;
}
size_t new_head = head_;
bool second_iteration = false;
while (usage + charge > capacity) {
assert(new_head < list_.size());
if (TryEvict(&list_[new_head], context)) {
usage = usage_.load(std::memory_order_relaxed);
}
new_head = (new_head + 1 >= list_.size()) ? 0 : new_head + 1;
if (new_head == head_) {
if (second_iteration) {
return false;
} else {
second_iteration = true;
}
}
}
head_ = new_head;
return true;
}
void ClockCacheShard::SetCapacity(size_t capacity) {
CleanupContext context;
{
MutexLock l(&mutex_);
capacity_.store(capacity, std::memory_order_relaxed);
EvictFromCache(0, &context);
}
Cleanup(context);
}
void ClockCacheShard::SetStrictCapacityLimit(bool strict_capacity_limit) {
strict_capacity_limit_.store(strict_capacity_limit,
std::memory_order_relaxed);
}
CacheHandle* ClockCacheShard::Insert(
const Slice& key, uint32_t hash, void* value, size_t charge,
void (*deleter)(const Slice& key, void* value), bool hold_reference,
CleanupContext* context) {
MutexLock l(&mutex_);
bool success = EvictFromCache(charge, context);
bool strict = strict_capacity_limit_.load(std::memory_order_relaxed);
if (!success && (strict || !hold_reference)) {
context->to_delete_key.push_back(key.data());
if (!hold_reference) {
context->to_delete_value.emplace_back(key, value, deleter);
}
return nullptr;
}
// Grab available handle from recycle bin. If recycle bin is empty, create
// and append new handle to end of circular list.
CacheHandle* handle = nullptr;
if (!recycle_.empty()) {
handle = recycle_.back();
recycle_.pop_back();
} else {
list_.emplace_back();
handle = &list_.back();
}
// Fill handle.
handle->key = key;
handle->hash = hash;
handle->value = value;
handle->charge = charge;
handle->deleter = deleter;
uint32_t flags = hold_reference ? kInCacheBit + kOneRef : kInCacheBit;
handle->flags.store(flags, std::memory_order_relaxed);
HashTable::accessor accessor;
if (table_.find(accessor, CacheKey(key, hash))) {
CacheHandle* existing_handle = accessor->second;
table_.erase(accessor);
UnsetInCache(existing_handle, context);
}
table_.insert(HashTable::value_type(CacheKey(key, hash), handle));
if (hold_reference) {
pinned_usage_.fetch_add(charge, std::memory_order_relaxed);
}
usage_.fetch_add(charge, std::memory_order_relaxed);
return handle;
}
Status ClockCacheShard::Insert(const Slice& key, uint32_t hash, void* value,
size_t charge,
void (*deleter)(const Slice& key, void* value),
Cache::Handle** out_handle,
Cache::Priority /*priority*/) {
CleanupContext context;
HashTable::accessor accessor;
char* key_data = new char[key.size()];
memcpy(key_data, key.data(), key.size());
Slice key_copy(key_data, key.size());
CacheHandle* handle = Insert(key_copy, hash, value, charge, deleter,
out_handle != nullptr, &context);
Status s;
if (out_handle != nullptr) {
if (handle == nullptr) {
s = Status::Incomplete("Insert failed due to LRU cache being full.");
} else {
*out_handle = reinterpret_cast<Cache::Handle*>(handle);
}
}
Cleanup(context);
return s;
}
Cache::Handle* ClockCacheShard::Lookup(const Slice& key, uint32_t hash) {
HashTable::const_accessor accessor;
if (!table_.find(accessor, CacheKey(key, hash))) {
return nullptr;
}
CacheHandle* handle = accessor->second;
accessor.release();
// Ref() could fail if another thread sneak in and evict/erase the cache
// entry before we are able to hold reference.
if (!Ref(reinterpret_cast<Cache::Handle*>(handle))) {
return nullptr;
}
// Double check the key since the handle may now representing another key
// if other threads sneak in, evict/erase the entry and re-used the handle
// for another cache entry.
if (hash != handle->hash || key != handle->key) {
CleanupContext context;
Unref(handle, false, &context);
// It is possible Unref() delete the entry, so we need to cleanup.
Cleanup(context);
return nullptr;
}
return reinterpret_cast<Cache::Handle*>(handle);
}
bool ClockCacheShard::Release(Cache::Handle* h, bool force_erase) {
CleanupContext context;
CacheHandle* handle = reinterpret_cast<CacheHandle*>(h);
bool erased = Unref(handle, true, &context);
if (force_erase && !erased) {
erased = EraseAndConfirm(handle->key, handle->hash, &context);
}
Cleanup(context);
return erased;
}
void ClockCacheShard::Erase(const Slice& key, uint32_t hash) {
CleanupContext context;
EraseAndConfirm(key, hash, &context);
Cleanup(context);
}
bool ClockCacheShard::EraseAndConfirm(const Slice& key, uint32_t hash,
CleanupContext* context) {
MutexLock l(&mutex_);
HashTable::accessor accessor;
bool erased = false;
if (table_.find(accessor, CacheKey(key, hash))) {
CacheHandle* handle = accessor->second;
table_.erase(accessor);
erased = UnsetInCache(handle, context);
}
return erased;
}
void ClockCacheShard::EraseUnRefEntries() {
CleanupContext context;
{
MutexLock l(&mutex_);
table_.clear();
for (auto& handle : list_) {
UnsetInCache(&handle, &context);
}
}
Cleanup(context);
}
class ClockCache final : public ShardedCache {
public:
ClockCache(size_t capacity, int num_shard_bits, bool strict_capacity_limit)
: ShardedCache(capacity, num_shard_bits, strict_capacity_limit) {
int num_shards = 1 << num_shard_bits;
shards_ = new ClockCacheShard[num_shards];
SetCapacity(capacity);
SetStrictCapacityLimit(strict_capacity_limit);
}
~ClockCache() override { delete[] shards_; }
const char* Name() const override { return "ClockCache"; }
CacheShard* GetShard(int shard) override {
return reinterpret_cast<CacheShard*>(&shards_[shard]);
}
const CacheShard* GetShard(int shard) const override {
return reinterpret_cast<CacheShard*>(&shards_[shard]);
}
void* Value(Handle* handle) override {
return reinterpret_cast<const CacheHandle*>(handle)->value;
}
size_t GetCharge(Handle* handle) const override {
return reinterpret_cast<const CacheHandle*>(handle)->charge;
}
uint32_t GetHash(Handle* handle) const override {
return reinterpret_cast<const CacheHandle*>(handle)->hash;
}
void DisownData() override { shards_ = nullptr; }
private:
ClockCacheShard* shards_;
};
} // end anonymous namespace
std::shared_ptr<Cache> NewClockCache(size_t capacity, int num_shard_bits,
bool strict_capacity_limit) {
if (num_shard_bits < 0) {
num_shard_bits = GetDefaultCacheShardBits(capacity);
}
return std::make_shared<ClockCache>(capacity, num_shard_bits,
strict_capacity_limit);
}
} // namespace rocksdb
#endif // SUPPORT_CLOCK_CACHE
-16
View File
@@ -1,16 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#include "rocksdb/cache.h"
#if defined(TBB) && !defined(ROCKSDB_LITE)
#define SUPPORT_CLOCK_CACHE
#endif
-554
View File
@@ -1,554 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#include "cache/lru_cache.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include "util/mutexlock.h"
namespace rocksdb {
LRUHandleTable::LRUHandleTable() : list_(nullptr), length_(0), elems_(0) {
Resize();
}
LRUHandleTable::~LRUHandleTable() {
ApplyToAllCacheEntries([](LRUHandle* h) {
if (!h->HasRefs()) {
h->Free();
}
});
delete[] list_;
}
LRUHandle* LRUHandleTable::Lookup(const Slice& key, uint32_t hash) {
return *FindPointer(key, hash);
}
LRUHandle* LRUHandleTable::Insert(LRUHandle* h) {
LRUHandle** ptr = FindPointer(h->key(), h->hash);
LRUHandle* old = *ptr;
h->next_hash = (old == nullptr ? nullptr : old->next_hash);
*ptr = h;
if (old == nullptr) {
++elems_;
if (elems_ > length_) {
// Since each cache entry is fairly large, we aim for a small
// average linked list length (<= 1).
Resize();
}
}
return old;
}
LRUHandle* LRUHandleTable::Remove(const Slice& key, uint32_t hash) {
LRUHandle** ptr = FindPointer(key, hash);
LRUHandle* result = *ptr;
if (result != nullptr) {
*ptr = result->next_hash;
--elems_;
}
return result;
}
LRUHandle** LRUHandleTable::FindPointer(const Slice& key, uint32_t hash) {
LRUHandle** ptr = &list_[hash & (length_ - 1)];
while (*ptr != nullptr && ((*ptr)->hash != hash || key != (*ptr)->key())) {
ptr = &(*ptr)->next_hash;
}
return ptr;
}
void LRUHandleTable::Resize() {
uint32_t new_length = 16;
while (new_length < elems_ * 1.5) {
new_length *= 2;
}
LRUHandle** new_list = new LRUHandle*[new_length];
memset(new_list, 0, sizeof(new_list[0]) * new_length);
uint32_t count = 0;
for (uint32_t i = 0; i < length_; i++) {
LRUHandle* h = list_[i];
while (h != nullptr) {
LRUHandle* next = h->next_hash;
uint32_t hash = h->hash;
LRUHandle** ptr = &new_list[hash & (new_length - 1)];
h->next_hash = *ptr;
*ptr = h;
h = next;
count++;
}
}
assert(elems_ == count);
delete[] list_;
list_ = new_list;
length_ = new_length;
}
LRUCacheShard::LRUCacheShard(size_t capacity, bool strict_capacity_limit,
double high_pri_pool_ratio,
bool use_adaptive_mutex)
: capacity_(0),
high_pri_pool_usage_(0),
strict_capacity_limit_(strict_capacity_limit),
high_pri_pool_ratio_(high_pri_pool_ratio),
high_pri_pool_capacity_(0),
usage_(0),
lru_usage_(0),
mutex_(use_adaptive_mutex) {
// Make empty circular linked list
lru_.next = &lru_;
lru_.prev = &lru_;
lru_low_pri_ = &lru_;
SetCapacity(capacity);
}
void LRUCacheShard::EraseUnRefEntries() {
autovector<LRUHandle*> last_reference_list;
{
MutexLock l(&mutex_);
while (lru_.next != &lru_) {
LRUHandle* old = lru_.next;
// LRU list contains only elements which can be evicted
assert(old->InCache() && !old->HasRefs());
LRU_Remove(old);
table_.Remove(old->key(), old->hash);
old->SetInCache(false);
usage_ -= old->charge;
last_reference_list.push_back(old);
}
}
for (auto entry : last_reference_list) {
entry->Free();
}
}
void LRUCacheShard::ApplyToAllCacheEntries(void (*callback)(void*, size_t),
bool thread_safe) {
const auto applyCallback = [&]() {
table_.ApplyToAllCacheEntries(
[callback](LRUHandle* h) { callback(h->value, h->charge); });
};
if (thread_safe) {
MutexLock l(&mutex_);
applyCallback();
} else {
applyCallback();
}
}
void LRUCacheShard::TEST_GetLRUList(LRUHandle** lru, LRUHandle** lru_low_pri) {
MutexLock l(&mutex_);
*lru = &lru_;
*lru_low_pri = lru_low_pri_;
}
size_t LRUCacheShard::TEST_GetLRUSize() {
MutexLock l(&mutex_);
LRUHandle* lru_handle = lru_.next;
size_t lru_size = 0;
while (lru_handle != &lru_) {
lru_size++;
lru_handle = lru_handle->next;
}
return lru_size;
}
double LRUCacheShard::GetHighPriPoolRatio() {
MutexLock l(&mutex_);
return high_pri_pool_ratio_;
}
void LRUCacheShard::LRU_Remove(LRUHandle* e) {
assert(e->next != nullptr);
assert(e->prev != nullptr);
if (lru_low_pri_ == e) {
lru_low_pri_ = e->prev;
}
e->next->prev = e->prev;
e->prev->next = e->next;
e->prev = e->next = nullptr;
lru_usage_ -= e->charge;
if (e->InHighPriPool()) {
assert(high_pri_pool_usage_ >= e->charge);
high_pri_pool_usage_ -= e->charge;
}
}
void LRUCacheShard::LRU_Insert(LRUHandle* e) {
assert(e->next == nullptr);
assert(e->prev == nullptr);
if (high_pri_pool_ratio_ > 0 && (e->IsHighPri() || e->HasHit())) {
// Inset "e" to head of LRU list.
e->next = &lru_;
e->prev = lru_.prev;
e->prev->next = e;
e->next->prev = e;
e->SetInHighPriPool(true);
high_pri_pool_usage_ += e->charge;
MaintainPoolSize();
} else {
// Insert "e" to the head of low-pri pool. Note that when
// high_pri_pool_ratio is 0, head of low-pri pool is also head of LRU list.
e->next = lru_low_pri_->next;
e->prev = lru_low_pri_;
e->prev->next = e;
e->next->prev = e;
e->SetInHighPriPool(false);
lru_low_pri_ = e;
}
lru_usage_ += e->charge;
}
void LRUCacheShard::MaintainPoolSize() {
while (high_pri_pool_usage_ > high_pri_pool_capacity_) {
// Overflow last entry in high-pri pool to low-pri pool.
lru_low_pri_ = lru_low_pri_->next;
assert(lru_low_pri_ != &lru_);
lru_low_pri_->SetInHighPriPool(false);
high_pri_pool_usage_ -= lru_low_pri_->charge;
}
}
void LRUCacheShard::EvictFromLRU(size_t charge,
autovector<LRUHandle*>* deleted) {
while ((usage_ + charge) > capacity_ && lru_.next != &lru_) {
LRUHandle* old = lru_.next;
// LRU list contains only elements which can be evicted
assert(old->InCache() && !old->HasRefs());
LRU_Remove(old);
table_.Remove(old->key(), old->hash);
old->SetInCache(false);
usage_ -= old->charge;
deleted->push_back(old);
}
}
void LRUCacheShard::SetCapacity(size_t capacity) {
autovector<LRUHandle*> last_reference_list;
{
MutexLock l(&mutex_);
capacity_ = capacity;
high_pri_pool_capacity_ = capacity_ * high_pri_pool_ratio_;
EvictFromLRU(0, &last_reference_list);
}
// Free the entries outside of mutex for performance reasons
for (auto entry : last_reference_list) {
entry->Free();
}
}
void LRUCacheShard::SetStrictCapacityLimit(bool strict_capacity_limit) {
MutexLock l(&mutex_);
strict_capacity_limit_ = strict_capacity_limit;
}
Cache::Handle* LRUCacheShard::Lookup(const Slice& key, uint32_t hash) {
MutexLock l(&mutex_);
LRUHandle* e = table_.Lookup(key, hash);
if (e != nullptr) {
assert(e->InCache());
if (!e->HasRefs()) {
// The entry is in LRU since it's in hash and has no external references
LRU_Remove(e);
}
e->Ref();
e->SetHit();
}
return reinterpret_cast<Cache::Handle*>(e);
}
bool LRUCacheShard::Ref(Cache::Handle* h) {
LRUHandle* e = reinterpret_cast<LRUHandle*>(h);
MutexLock l(&mutex_);
// To create another reference - entry must be already externally referenced
assert(e->HasRefs());
e->Ref();
return true;
}
void LRUCacheShard::SetHighPriorityPoolRatio(double high_pri_pool_ratio) {
MutexLock l(&mutex_);
high_pri_pool_ratio_ = high_pri_pool_ratio;
high_pri_pool_capacity_ = capacity_ * high_pri_pool_ratio_;
MaintainPoolSize();
}
bool LRUCacheShard::Release(Cache::Handle* handle, bool force_erase) {
if (handle == nullptr) {
return false;
}
LRUHandle* e = reinterpret_cast<LRUHandle*>(handle);
bool last_reference = false;
{
MutexLock l(&mutex_);
last_reference = e->Unref();
if (last_reference && e->InCache()) {
// The item is still in cache, and nobody else holds a reference to it
if (usage_ > capacity_ || force_erase) {
// The LRU list must be empty since the cache is full
assert(lru_.next == &lru_ || force_erase);
// Take this opportunity and remove the item
table_.Remove(e->key(), e->hash);
e->SetInCache(false);
} else {
// Put the item back on the LRU list, and don't free it
LRU_Insert(e);
last_reference = false;
}
}
if (last_reference) {
usage_ -= e->charge;
}
}
// Free the entry here outside of mutex for performance reasons
if (last_reference) {
e->Free();
}
return last_reference;
}
Status LRUCacheShard::Insert(const Slice& key, uint32_t hash, void* value,
size_t charge,
void (*deleter)(const Slice& key, void* value),
Cache::Handle** handle, Cache::Priority priority) {
// Allocate the memory here outside of the mutex
// If the cache is full, we'll have to release it
// It shouldn't happen very often though.
LRUHandle* e = reinterpret_cast<LRUHandle*>(
new char[sizeof(LRUHandle) - 1 + key.size()]);
Status s = Status::OK();
autovector<LRUHandle*> last_reference_list;
e->value = value;
e->deleter = deleter;
e->charge = charge;
e->key_length = key.size();
e->flags = 0;
e->hash = hash;
e->refs = 0;
e->next = e->prev = nullptr;
e->SetInCache(true);
e->SetPriority(priority);
memcpy(e->key_data, key.data(), key.size());
{
MutexLock l(&mutex_);
// Free the space following strict LRU policy until enough space
// is freed or the lru list is empty
EvictFromLRU(charge, &last_reference_list);
if ((usage_ + charge) > capacity_ &&
(strict_capacity_limit_ || handle == nullptr)) {
if (handle == nullptr) {
// Don't insert the entry but still return ok, as if the entry inserted
// into cache and get evicted immediately.
e->SetInCache(false);
last_reference_list.push_back(e);
} else {
delete[] reinterpret_cast<char*>(e);
*handle = nullptr;
s = Status::Incomplete("Insert failed due to LRU cache being full.");
}
} else {
// Insert into the cache. Note that the cache might get larger than its
// capacity if not enough space was freed up.
LRUHandle* old = table_.Insert(e);
usage_ += e->charge;
if (old != nullptr) {
assert(old->InCache());
old->SetInCache(false);
if (!old->HasRefs()) {
// old is on LRU because it's in cache and its reference count is 0
LRU_Remove(old);
usage_ -= old->charge;
last_reference_list.push_back(old);
}
}
if (handle == nullptr) {
LRU_Insert(e);
} else {
e->Ref();
*handle = reinterpret_cast<Cache::Handle*>(e);
}
}
}
// Free the entries here outside of mutex for performance reasons
for (auto entry : last_reference_list) {
entry->Free();
}
return s;
}
void LRUCacheShard::Erase(const Slice& key, uint32_t hash) {
LRUHandle* e;
bool last_reference = false;
{
MutexLock l(&mutex_);
e = table_.Remove(key, hash);
if (e != nullptr) {
assert(e->InCache());
e->SetInCache(false);
if (!e->HasRefs()) {
// The entry is in LRU since it's in hash and has no external references
LRU_Remove(e);
usage_ -= e->charge;
last_reference = true;
}
}
}
// Free the entry here outside of mutex for performance reasons
// last_reference will only be true if e != nullptr
if (last_reference) {
e->Free();
}
}
size_t LRUCacheShard::GetUsage() const {
MutexLock l(&mutex_);
return usage_;
}
size_t LRUCacheShard::GetPinnedUsage() const {
MutexLock l(&mutex_);
assert(usage_ >= lru_usage_);
return usage_ - lru_usage_;
}
std::string LRUCacheShard::GetPrintableOptions() const {
const int kBufferSize = 200;
char buffer[kBufferSize];
{
MutexLock l(&mutex_);
snprintf(buffer, kBufferSize, " high_pri_pool_ratio: %.3lf\n",
high_pri_pool_ratio_);
}
return std::string(buffer);
}
LRUCache::LRUCache(size_t capacity, int num_shard_bits,
bool strict_capacity_limit, double high_pri_pool_ratio,
std::shared_ptr<MemoryAllocator> allocator,
bool use_adaptive_mutex)
: ShardedCache(capacity, num_shard_bits, strict_capacity_limit,
std::move(allocator)) {
num_shards_ = 1 << num_shard_bits;
shards_ = reinterpret_cast<LRUCacheShard*>(
port::cacheline_aligned_alloc(sizeof(LRUCacheShard) * num_shards_));
size_t per_shard = (capacity + (num_shards_ - 1)) / num_shards_;
for (int i = 0; i < num_shards_; i++) {
new (&shards_[i])
LRUCacheShard(per_shard, strict_capacity_limit, high_pri_pool_ratio,
use_adaptive_mutex);
}
}
LRUCache::~LRUCache() {
if (shards_ != nullptr) {
assert(num_shards_ > 0);
for (int i = 0; i < num_shards_; i++) {
shards_[i].~LRUCacheShard();
}
port::cacheline_aligned_free(shards_);
}
}
CacheShard* LRUCache::GetShard(int shard) {
return reinterpret_cast<CacheShard*>(&shards_[shard]);
}
const CacheShard* LRUCache::GetShard(int shard) const {
return reinterpret_cast<CacheShard*>(&shards_[shard]);
}
void* LRUCache::Value(Handle* handle) {
return reinterpret_cast<const LRUHandle*>(handle)->value;
}
size_t LRUCache::GetCharge(Handle* handle) const {
return reinterpret_cast<const LRUHandle*>(handle)->charge;
}
uint32_t LRUCache::GetHash(Handle* handle) const {
return reinterpret_cast<const LRUHandle*>(handle)->hash;
}
void LRUCache::DisownData() {
// Do not drop data if compile with ASAN to suppress leak warning.
#if defined(__clang__)
#if !defined(__has_feature) || !__has_feature(address_sanitizer)
shards_ = nullptr;
num_shards_ = 0;
#endif
#else // __clang__
#ifndef __SANITIZE_ADDRESS__
shards_ = nullptr;
num_shards_ = 0;
#endif // !__SANITIZE_ADDRESS__
#endif // __clang__
}
size_t LRUCache::TEST_GetLRUSize() {
size_t lru_size_of_all_shards = 0;
for (int i = 0; i < num_shards_; i++) {
lru_size_of_all_shards += shards_[i].TEST_GetLRUSize();
}
return lru_size_of_all_shards;
}
double LRUCache::GetHighPriPoolRatio() {
double result = 0.0;
if (num_shards_ > 0) {
result = shards_[0].GetHighPriPoolRatio();
}
return result;
}
std::shared_ptr<Cache> NewLRUCache(const LRUCacheOptions& cache_opts) {
return NewLRUCache(cache_opts.capacity, cache_opts.num_shard_bits,
cache_opts.strict_capacity_limit,
cache_opts.high_pri_pool_ratio,
cache_opts.memory_allocator,
cache_opts.use_adaptive_mutex);
}
std::shared_ptr<Cache> NewLRUCache(
size_t capacity, int num_shard_bits, bool strict_capacity_limit,
double high_pri_pool_ratio,
std::shared_ptr<MemoryAllocator> memory_allocator,
bool use_adaptive_mutex) {
if (num_shard_bits >= 20) {
return nullptr; // the cache cannot be sharded into too many fine pieces
}
if (high_pri_pool_ratio < 0.0 || high_pri_pool_ratio > 1.0) {
// invalid high_pri_pool_ratio
return nullptr;
}
if (num_shard_bits < 0) {
num_shard_bits = GetDefaultCacheShardBits(capacity);
}
return std::make_shared<LRUCache>(capacity, num_shard_bits,
strict_capacity_limit, high_pri_pool_ratio,
std::move(memory_allocator),
use_adaptive_mutex);
}
} // namespace rocksdb
-320
View File
@@ -1,320 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#include <string>
#include "cache/sharded_cache.h"
#include "port/port.h"
#include "util/autovector.h"
namespace rocksdb {
// LRU cache implementation. This class is not thread-safe.
// An entry is a variable length heap-allocated structure.
// Entries are referenced by cache and/or by any external entity.
// The cache keeps all its entries in a hash table. Some elements
// are also stored on LRU list.
//
// LRUHandle can be in these states:
// 1. Referenced externally AND in hash table.
// In that case the entry is *not* in the LRU list
// (refs >= 1 && in_cache == true)
// 2. Not referenced externally AND in hash table.
// In that case the entry is in the LRU list and can be freed.
// (refs == 0 && in_cache == true)
// 3. Referenced externally AND not in hash table.
// In that case the entry is not in the LRU list and not in hash table.
// The entry can be freed when refs becomes 0.
// (refs >= 1 && in_cache == false)
//
// All newly created LRUHandles are in state 1. If you call
// LRUCacheShard::Release on entry in state 1, it will go into state 2.
// To move from state 1 to state 3, either call LRUCacheShard::Erase or
// LRUCacheShard::Insert with the same key (but possibly different value).
// To move from state 2 to state 1, use LRUCacheShard::Lookup.
// Before destruction, make sure that no handles are in state 1. This means
// that any successful LRUCacheShard::Lookup/LRUCacheShard::Insert have a
// matching LRUCache::Release (to move into state 2) or LRUCacheShard::Erase
// (to move into state 3).
struct LRUHandle {
void* value;
void (*deleter)(const Slice&, void* value);
LRUHandle* next_hash;
LRUHandle* next;
LRUHandle* prev;
size_t charge; // TODO(opt): Only allow uint32_t?
size_t key_length;
// The hash of key(). Used for fast sharding and comparisons.
uint32_t hash;
// The number of external refs to this entry. The cache itself is not counted.
uint32_t refs;
enum Flags : uint8_t {
// Whether this entry is referenced by the hash table.
IN_CACHE = (1 << 0),
// Whether this entry is high priority entry.
IS_HIGH_PRI = (1 << 1),
// Whether this entry is in high-pri pool.
IN_HIGH_PRI_POOL = (1 << 2),
// Wwhether this entry has had any lookups (hits).
HAS_HIT = (1 << 3),
};
uint8_t flags;
// Beginning of the key (MUST BE THE LAST FIELD IN THIS STRUCT!)
char key_data[1];
Slice key() const { return Slice(key_data, key_length); }
// Increase the reference count by 1.
void Ref() { refs++; }
// Just reduce the reference count by 1. Return true if it was last reference.
bool Unref() {
assert(refs > 0);
refs--;
return refs == 0;
}
// Return true if there are external refs, false otherwise.
bool HasRefs() const { return refs > 0; }
bool InCache() const { return flags & IN_CACHE; }
bool IsHighPri() const { return flags & IS_HIGH_PRI; }
bool InHighPriPool() const { return flags & IN_HIGH_PRI_POOL; }
bool HasHit() const { return flags & HAS_HIT; }
void SetInCache(bool in_cache) {
if (in_cache) {
flags |= IN_CACHE;
} else {
flags &= ~IN_CACHE;
}
}
void SetPriority(Cache::Priority priority) {
if (priority == Cache::Priority::HIGH) {
flags |= IS_HIGH_PRI;
} else {
flags &= ~IS_HIGH_PRI;
}
}
void SetInHighPriPool(bool in_high_pri_pool) {
if (in_high_pri_pool) {
flags |= IN_HIGH_PRI_POOL;
} else {
flags &= ~IN_HIGH_PRI_POOL;
}
}
void SetHit() { flags |= HAS_HIT; }
void Free() {
assert(refs == 0);
if (deleter) {
(*deleter)(key(), value);
}
delete[] reinterpret_cast<char*>(this);
}
};
// We provide our own simple hash table since it removes a whole bunch
// of porting hacks and is also faster than some of the built-in hash
// table implementations in some of the compiler/runtime combinations
// we have tested. E.g., readrandom speeds up by ~5% over the g++
// 4.4.3's builtin hashtable.
class LRUHandleTable {
public:
LRUHandleTable();
~LRUHandleTable();
LRUHandle* Lookup(const Slice& key, uint32_t hash);
LRUHandle* Insert(LRUHandle* h);
LRUHandle* Remove(const Slice& key, uint32_t hash);
template <typename T>
void ApplyToAllCacheEntries(T func) {
for (uint32_t i = 0; i < length_; i++) {
LRUHandle* h = list_[i];
while (h != nullptr) {
auto n = h->next_hash;
assert(h->InCache());
func(h);
h = n;
}
}
}
private:
// Return a pointer to slot that points to a cache entry that
// matches key/hash. If there is no such cache entry, return a
// pointer to the trailing slot in the corresponding linked list.
LRUHandle** FindPointer(const Slice& key, uint32_t hash);
void Resize();
// The table consists of an array of buckets where each bucket is
// a linked list of cache entries that hash into the bucket.
LRUHandle** list_;
uint32_t length_;
uint32_t elems_;
};
// A single shard of sharded cache.
class ALIGN_AS(CACHE_LINE_SIZE) LRUCacheShard final : public CacheShard {
public:
LRUCacheShard(size_t capacity, bool strict_capacity_limit,
double high_pri_pool_ratio, bool use_adaptive_mutex);
virtual ~LRUCacheShard() override = default;
// Separate from constructor so caller can easily make an array of LRUCache
// if current usage is more than new capacity, the function will attempt to
// free the needed space
virtual void SetCapacity(size_t capacity) override;
// Set the flag to reject insertion if cache if full.
virtual void SetStrictCapacityLimit(bool strict_capacity_limit) override;
// Set percentage of capacity reserved for high-pri cache entries.
void SetHighPriorityPoolRatio(double high_pri_pool_ratio);
// Like Cache methods, but with an extra "hash" parameter.
virtual Status Insert(const Slice& key, uint32_t hash, void* value,
size_t charge,
void (*deleter)(const Slice& key, void* value),
Cache::Handle** handle,
Cache::Priority priority) override;
virtual Cache::Handle* Lookup(const Slice& key, uint32_t hash) override;
virtual bool Ref(Cache::Handle* handle) override;
virtual bool Release(Cache::Handle* handle,
bool force_erase = false) override;
virtual void Erase(const Slice& key, uint32_t hash) override;
// Although in some platforms the update of size_t is atomic, to make sure
// GetUsage() and GetPinnedUsage() work correctly under any platform, we'll
// protect them with mutex_.
virtual size_t GetUsage() const override;
virtual size_t GetPinnedUsage() const override;
virtual void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
bool thread_safe) override;
virtual void EraseUnRefEntries() override;
virtual std::string GetPrintableOptions() const override;
void TEST_GetLRUList(LRUHandle** lru, LRUHandle** lru_low_pri);
// Retrieves number of elements in LRU, for unit test purpose only
// not threadsafe
size_t TEST_GetLRUSize();
// Retrives high pri pool ratio
double GetHighPriPoolRatio();
private:
void LRU_Remove(LRUHandle* e);
void LRU_Insert(LRUHandle* e);
// Overflow the last entry in high-pri pool to low-pri pool until size of
// high-pri pool is no larger than the size specify by high_pri_pool_pct.
void MaintainPoolSize();
// Free some space following strict LRU policy until enough space
// to hold (usage_ + charge) is freed or the lru list is empty
// This function is not thread safe - it needs to be executed while
// holding the mutex_
void EvictFromLRU(size_t charge, autovector<LRUHandle*>* deleted);
// Initialized before use.
size_t capacity_;
// Memory size for entries in high-pri pool.
size_t high_pri_pool_usage_;
// Whether to reject insertion if cache reaches its full capacity.
bool strict_capacity_limit_;
// Ratio of capacity reserved for high priority cache entries.
double high_pri_pool_ratio_;
// High-pri pool size, equals to capacity * high_pri_pool_ratio.
// Remember the value to avoid recomputing each time.
double high_pri_pool_capacity_;
// Dummy head of LRU list.
// lru.prev is newest entry, lru.next is oldest entry.
// LRU contains items which can be evicted, ie reference only by cache
LRUHandle lru_;
// Pointer to head of low-pri pool in LRU list.
LRUHandle* lru_low_pri_;
// ------------^^^^^^^^^^^^^-----------
// Not frequently modified data members
// ------------------------------------
//
// We separate data members that are updated frequently from the ones that
// are not frequently updated so that they don't share the same cache line
// which will lead into false cache sharing
//
// ------------------------------------
// Frequently modified data members
// ------------vvvvvvvvvvvvv-----------
LRUHandleTable table_;
// Memory size for entries residing in the cache
size_t usage_;
// Memory size for entries residing only in the LRU list
size_t lru_usage_;
// mutex_ protects the following state.
// We don't count mutex_ as the cache's internal state so semantically we
// don't mind mutex_ invoking the non-const actions.
mutable port::Mutex mutex_;
};
class LRUCache
#ifdef NDEBUG
final
#endif
: public ShardedCache {
public:
LRUCache(size_t capacity, int num_shard_bits, bool strict_capacity_limit,
double high_pri_pool_ratio,
std::shared_ptr<MemoryAllocator> memory_allocator = nullptr,
bool use_adaptive_mutex = kDefaultToAdaptiveMutex);
virtual ~LRUCache();
virtual const char* Name() const override { return "LRUCache"; }
virtual CacheShard* GetShard(int shard) override;
virtual const CacheShard* GetShard(int shard) const override;
virtual void* Value(Handle* handle) override;
virtual size_t GetCharge(Handle* handle) const override;
virtual uint32_t GetHash(Handle* handle) const override;
virtual void DisownData() override;
// Retrieves number of elements in LRU, for unit test purpose only
size_t TEST_GetLRUSize();
// Retrives high pri pool ratio
double GetHighPriPoolRatio();
private:
LRUCacheShard* shards_ = nullptr;
int num_shards_ = 0;
};
} // namespace rocksdb
-197
View File
@@ -1,197 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
#include "cache/lru_cache.h"
#include <string>
#include <vector>
#include "port/port.h"
#include "test_util/testharness.h"
namespace rocksdb {
class LRUCacheTest : public testing::Test {
public:
LRUCacheTest() {}
~LRUCacheTest() override { DeleteCache(); }
void DeleteCache() {
if (cache_ != nullptr) {
cache_->~LRUCacheShard();
port::cacheline_aligned_free(cache_);
cache_ = nullptr;
}
}
void NewCache(size_t capacity, double high_pri_pool_ratio = 0.0,
bool use_adaptive_mutex = kDefaultToAdaptiveMutex) {
DeleteCache();
cache_ = reinterpret_cast<LRUCacheShard*>(
port::cacheline_aligned_alloc(sizeof(LRUCacheShard)));
new (cache_) LRUCacheShard(capacity, false /*strict_capcity_limit*/,
high_pri_pool_ratio, use_adaptive_mutex);
}
void Insert(const std::string& key,
Cache::Priority priority = Cache::Priority::LOW) {
cache_->Insert(key, 0 /*hash*/, nullptr /*value*/, 1 /*charge*/,
nullptr /*deleter*/, nullptr /*handle*/, priority);
}
void Insert(char key, Cache::Priority priority = Cache::Priority::LOW) {
Insert(std::string(1, key), priority);
}
bool Lookup(const std::string& key) {
auto handle = cache_->Lookup(key, 0 /*hash*/);
if (handle) {
cache_->Release(handle);
return true;
}
return false;
}
bool Lookup(char key) { return Lookup(std::string(1, key)); }
void Erase(const std::string& key) { cache_->Erase(key, 0 /*hash*/); }
void ValidateLRUList(std::vector<std::string> keys,
size_t num_high_pri_pool_keys = 0) {
LRUHandle* lru;
LRUHandle* lru_low_pri;
cache_->TEST_GetLRUList(&lru, &lru_low_pri);
LRUHandle* iter = lru;
bool in_high_pri_pool = false;
size_t high_pri_pool_keys = 0;
if (iter == lru_low_pri) {
in_high_pri_pool = true;
}
for (const auto& key : keys) {
iter = iter->next;
ASSERT_NE(lru, iter);
ASSERT_EQ(key, iter->key().ToString());
ASSERT_EQ(in_high_pri_pool, iter->InHighPriPool());
if (in_high_pri_pool) {
high_pri_pool_keys++;
}
if (iter == lru_low_pri) {
ASSERT_FALSE(in_high_pri_pool);
in_high_pri_pool = true;
}
}
ASSERT_EQ(lru, iter->next);
ASSERT_TRUE(in_high_pri_pool);
ASSERT_EQ(num_high_pri_pool_keys, high_pri_pool_keys);
}
private:
LRUCacheShard* cache_ = nullptr;
};
TEST_F(LRUCacheTest, BasicLRU) {
NewCache(5);
for (char ch = 'a'; ch <= 'e'; ch++) {
Insert(ch);
}
ValidateLRUList({"a", "b", "c", "d", "e"});
for (char ch = 'x'; ch <= 'z'; ch++) {
Insert(ch);
}
ValidateLRUList({"d", "e", "x", "y", "z"});
ASSERT_FALSE(Lookup("b"));
ValidateLRUList({"d", "e", "x", "y", "z"});
ASSERT_TRUE(Lookup("e"));
ValidateLRUList({"d", "x", "y", "z", "e"});
ASSERT_TRUE(Lookup("z"));
ValidateLRUList({"d", "x", "y", "e", "z"});
Erase("x");
ValidateLRUList({"d", "y", "e", "z"});
ASSERT_TRUE(Lookup("d"));
ValidateLRUList({"y", "e", "z", "d"});
Insert("u");
ValidateLRUList({"y", "e", "z", "d", "u"});
Insert("v");
ValidateLRUList({"e", "z", "d", "u", "v"});
}
TEST_F(LRUCacheTest, MidpointInsertion) {
// Allocate 2 cache entries to high-pri pool.
NewCache(5, 0.45);
Insert("a", Cache::Priority::LOW);
Insert("b", Cache::Priority::LOW);
Insert("c", Cache::Priority::LOW);
Insert("x", Cache::Priority::HIGH);
Insert("y", Cache::Priority::HIGH);
ValidateLRUList({"a", "b", "c", "x", "y"}, 2);
// Low-pri entries inserted to the tail of low-pri list (the midpoint).
// After lookup, it will move to the tail of the full list.
Insert("d", Cache::Priority::LOW);
ValidateLRUList({"b", "c", "d", "x", "y"}, 2);
ASSERT_TRUE(Lookup("d"));
ValidateLRUList({"b", "c", "x", "y", "d"}, 2);
// High-pri entries will be inserted to the tail of full list.
Insert("z", Cache::Priority::HIGH);
ValidateLRUList({"c", "x", "y", "d", "z"}, 2);
}
TEST_F(LRUCacheTest, EntriesWithPriority) {
// Allocate 2 cache entries to high-pri pool.
NewCache(5, 0.45);
Insert("a", Cache::Priority::LOW);
Insert("b", Cache::Priority::LOW);
Insert("c", Cache::Priority::LOW);
ValidateLRUList({"a", "b", "c"}, 0);
// Low-pri entries can take high-pri pool capacity if available
Insert("u", Cache::Priority::LOW);
Insert("v", Cache::Priority::LOW);
ValidateLRUList({"a", "b", "c", "u", "v"}, 0);
Insert("X", Cache::Priority::HIGH);
Insert("Y", Cache::Priority::HIGH);
ValidateLRUList({"c", "u", "v", "X", "Y"}, 2);
// High-pri entries can overflow to low-pri pool.
Insert("Z", Cache::Priority::HIGH);
ValidateLRUList({"u", "v", "X", "Y", "Z"}, 2);
// Low-pri entries will be inserted to head of low-pri pool.
Insert("a", Cache::Priority::LOW);
ValidateLRUList({"v", "X", "a", "Y", "Z"}, 2);
// Low-pri entries will be inserted to head of high-pri pool after lookup.
ASSERT_TRUE(Lookup("v"));
ValidateLRUList({"X", "a", "Y", "Z", "v"}, 2);
// High-pri entries will be inserted to the head of the list after lookup.
ASSERT_TRUE(Lookup("X"));
ValidateLRUList({"a", "Y", "Z", "v", "X"}, 2);
ASSERT_TRUE(Lookup("Z"));
ValidateLRUList({"a", "Y", "v", "X", "Z"}, 2);
Erase("Y");
ValidateLRUList({"a", "v", "X", "Z"}, 2);
Erase("X");
ValidateLRUList({"a", "v", "Z"}, 1);
Insert("d", Cache::Priority::LOW);
Insert("e", Cache::Priority::LOW);
ValidateLRUList({"a", "v", "d", "e", "Z"}, 1);
Insert("f", Cache::Priority::LOW);
Insert("g", Cache::Priority::LOW);
ValidateLRUList({"d", "e", "f", "g", "Z"}, 1);
ASSERT_TRUE(Lookup("d"));
ValidateLRUList({"e", "f", "g", "Z", "d"}, 2);
}
} // namespace rocksdb
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
-162
View File
@@ -1,162 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#include "cache/sharded_cache.h"
#include <string>
#include "util/mutexlock.h"
namespace rocksdb {
ShardedCache::ShardedCache(size_t capacity, int num_shard_bits,
bool strict_capacity_limit,
std::shared_ptr<MemoryAllocator> allocator)
: Cache(std::move(allocator)),
num_shard_bits_(num_shard_bits),
capacity_(capacity),
strict_capacity_limit_(strict_capacity_limit),
last_id_(1) {}
void ShardedCache::SetCapacity(size_t capacity) {
int num_shards = 1 << num_shard_bits_;
const size_t per_shard = (capacity + (num_shards - 1)) / num_shards;
MutexLock l(&capacity_mutex_);
for (int s = 0; s < num_shards; s++) {
GetShard(s)->SetCapacity(per_shard);
}
capacity_ = capacity;
}
void ShardedCache::SetStrictCapacityLimit(bool strict_capacity_limit) {
int num_shards = 1 << num_shard_bits_;
MutexLock l(&capacity_mutex_);
for (int s = 0; s < num_shards; s++) {
GetShard(s)->SetStrictCapacityLimit(strict_capacity_limit);
}
strict_capacity_limit_ = strict_capacity_limit;
}
Status ShardedCache::Insert(const Slice& key, void* value, size_t charge,
void (*deleter)(const Slice& key, void* value),
Handle** handle, Priority priority) {
uint32_t hash = HashSlice(key);
return GetShard(Shard(hash))
->Insert(key, hash, value, charge, deleter, handle, priority);
}
Cache::Handle* ShardedCache::Lookup(const Slice& key, Statistics* /*stats*/) {
uint32_t hash = HashSlice(key);
return GetShard(Shard(hash))->Lookup(key, hash);
}
bool ShardedCache::Ref(Handle* handle) {
uint32_t hash = GetHash(handle);
return GetShard(Shard(hash))->Ref(handle);
}
bool ShardedCache::Release(Handle* handle, bool force_erase) {
uint32_t hash = GetHash(handle);
return GetShard(Shard(hash))->Release(handle, force_erase);
}
void ShardedCache::Erase(const Slice& key) {
uint32_t hash = HashSlice(key);
GetShard(Shard(hash))->Erase(key, hash);
}
uint64_t ShardedCache::NewId() {
return last_id_.fetch_add(1, std::memory_order_relaxed);
}
size_t ShardedCache::GetCapacity() const {
MutexLock l(&capacity_mutex_);
return capacity_;
}
bool ShardedCache::HasStrictCapacityLimit() const {
MutexLock l(&capacity_mutex_);
return strict_capacity_limit_;
}
size_t ShardedCache::GetUsage() const {
// We will not lock the cache when getting the usage from shards.
int num_shards = 1 << num_shard_bits_;
size_t usage = 0;
for (int s = 0; s < num_shards; s++) {
usage += GetShard(s)->GetUsage();
}
return usage;
}
size_t ShardedCache::GetUsage(Handle* handle) const {
return GetCharge(handle);
}
size_t ShardedCache::GetPinnedUsage() const {
// We will not lock the cache when getting the usage from shards.
int num_shards = 1 << num_shard_bits_;
size_t usage = 0;
for (int s = 0; s < num_shards; s++) {
usage += GetShard(s)->GetPinnedUsage();
}
return usage;
}
void ShardedCache::ApplyToAllCacheEntries(void (*callback)(void*, size_t),
bool thread_safe) {
int num_shards = 1 << num_shard_bits_;
for (int s = 0; s < num_shards; s++) {
GetShard(s)->ApplyToAllCacheEntries(callback, thread_safe);
}
}
void ShardedCache::EraseUnRefEntries() {
int num_shards = 1 << num_shard_bits_;
for (int s = 0; s < num_shards; s++) {
GetShard(s)->EraseUnRefEntries();
}
}
std::string ShardedCache::GetPrintableOptions() const {
std::string ret;
ret.reserve(20000);
const int kBufferSize = 200;
char buffer[kBufferSize];
{
MutexLock l(&capacity_mutex_);
snprintf(buffer, kBufferSize, " capacity : %" ROCKSDB_PRIszt "\n",
capacity_);
ret.append(buffer);
snprintf(buffer, kBufferSize, " num_shard_bits : %d\n", num_shard_bits_);
ret.append(buffer);
snprintf(buffer, kBufferSize, " strict_capacity_limit : %d\n",
strict_capacity_limit_);
ret.append(buffer);
}
snprintf(buffer, kBufferSize, " memory_allocator : %s\n",
memory_allocator() ? memory_allocator()->Name() : "None");
ret.append(buffer);
ret.append(GetShard(0)->GetPrintableOptions());
return ret;
}
int GetDefaultCacheShardBits(size_t capacity) {
int num_shard_bits = 0;
size_t min_shard_size = 512L * 1024L; // Every shard is at least 512KB.
size_t num_shards = capacity / min_shard_size;
while (num_shards >>= 1) {
if (++num_shard_bits >= 6) {
// No more than 6.
return num_shard_bits;
}
}
return num_shard_bits;
}
} // namespace rocksdb
-104
View File
@@ -1,104 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#include <atomic>
#include <string>
#include "port/port.h"
#include "rocksdb/cache.h"
#include "util/hash.h"
namespace rocksdb {
// Single cache shard interface.
class CacheShard {
public:
CacheShard() = default;
virtual ~CacheShard() = default;
virtual Status Insert(const Slice& key, uint32_t hash, void* value,
size_t charge,
void (*deleter)(const Slice& key, void* value),
Cache::Handle** handle, Cache::Priority priority) = 0;
virtual Cache::Handle* Lookup(const Slice& key, uint32_t hash) = 0;
virtual bool Ref(Cache::Handle* handle) = 0;
virtual bool Release(Cache::Handle* handle, bool force_erase = false) = 0;
virtual void Erase(const Slice& key, uint32_t hash) = 0;
virtual void SetCapacity(size_t capacity) = 0;
virtual void SetStrictCapacityLimit(bool strict_capacity_limit) = 0;
virtual size_t GetUsage() const = 0;
virtual size_t GetPinnedUsage() const = 0;
virtual void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
bool thread_safe) = 0;
virtual void EraseUnRefEntries() = 0;
virtual std::string GetPrintableOptions() const { return ""; }
};
// Generic cache interface which shards cache by hash of keys. 2^num_shard_bits
// shards will be created, with capacity split evenly to each of the shards.
// Keys are sharded by the highest num_shard_bits bits of hash value.
class ShardedCache : public Cache {
public:
ShardedCache(size_t capacity, int num_shard_bits, bool strict_capacity_limit,
std::shared_ptr<MemoryAllocator> memory_allocator = nullptr);
virtual ~ShardedCache() = default;
virtual const char* Name() const override = 0;
virtual CacheShard* GetShard(int shard) = 0;
virtual const CacheShard* GetShard(int shard) const = 0;
virtual void* Value(Handle* handle) override = 0;
virtual size_t GetCharge(Handle* handle) const override = 0;
virtual uint32_t GetHash(Handle* handle) const = 0;
virtual void DisownData() override = 0;
virtual void SetCapacity(size_t capacity) override;
virtual void SetStrictCapacityLimit(bool strict_capacity_limit) override;
virtual Status Insert(const Slice& key, void* value, size_t charge,
void (*deleter)(const Slice& key, void* value),
Handle** handle, Priority priority) override;
virtual Handle* Lookup(const Slice& key, Statistics* stats) override;
virtual bool Ref(Handle* handle) override;
virtual bool Release(Handle* handle, bool force_erase = false) override;
virtual void Erase(const Slice& key) override;
virtual uint64_t NewId() override;
virtual size_t GetCapacity() const override;
virtual bool HasStrictCapacityLimit() const override;
virtual size_t GetUsage() const override;
virtual size_t GetUsage(Handle* handle) const override;
virtual size_t GetPinnedUsage() const override;
virtual void ApplyToAllCacheEntries(void (*callback)(void*, size_t),
bool thread_safe) override;
virtual void EraseUnRefEntries() override;
virtual std::string GetPrintableOptions() const override;
int GetNumShardBits() const { return num_shard_bits_; }
private:
static inline uint32_t HashSlice(const Slice& s) {
return static_cast<uint32_t>(GetSliceNPHash64(s));
}
uint32_t Shard(uint32_t hash) {
// Note, hash >> 32 yields hash in gcc, not the zero we expect!
return (num_shard_bits_ > 0) ? (hash >> (32 - num_shard_bits_)) : 0;
}
int num_shard_bits_;
mutable port::Mutex capacity_mutex_;
size_t capacity_;
bool strict_capacity_limit_;
std::atomic<uint64_t> last_id_;
};
extern int GetDefaultCacheShardBits(size_t capacity);
} // namespace rocksdb
-3
View File
@@ -1,3 +0,0 @@
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/RocksDBTargets.cmake")
check_required_components(RocksDB)
-79
View File
@@ -1,79 +0,0 @@
#!/usr/bin/env bash
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
# Exit on error.
set -e
if [ -n "$USE_CLANG" ]; then
echo "Error: Coverage test is supported only for gcc."
exit 1
fi
ROOT=".."
# Fetch right version of gcov
if [ -d /mnt/gvfs/third-party -a -z "$CXX" ]; then
source $ROOT/build_tools/fbcode_config.sh
GCOV=$GCC_BASE/bin/gcov
else
GCOV=$(which gcov)
fi
COVERAGE_DIR="$PWD/COVERAGE_REPORT"
mkdir -p $COVERAGE_DIR
# Find all gcno files to generate the coverage report
GCNO_FILES=`find $ROOT -name "*.gcno"`
$GCOV --preserve-paths --relative-only --no-output $GCNO_FILES 2>/dev/null |
# Parse the raw gcov report to more human readable form.
python $ROOT/coverage/parse_gcov_output.py |
# Write the output to both stdout and report file.
tee $COVERAGE_DIR/coverage_report_all.txt &&
echo -e "Generated coverage report for all files: $COVERAGE_DIR/coverage_report_all.txt\n"
# TODO: we also need to get the files of the latest commits.
# Get the most recently committed files.
LATEST_FILES=`
git show --pretty="format:" --name-only HEAD |
grep -v "^$" |
paste -s -d,`
RECENT_REPORT=$COVERAGE_DIR/coverage_report_recent.txt
echo -e "Recently updated files: $LATEST_FILES\n" > $RECENT_REPORT
$GCOV --preserve-paths --relative-only --no-output $GCNO_FILES 2>/dev/null |
python $ROOT/coverage/parse_gcov_output.py -interested-files $LATEST_FILES |
tee -a $RECENT_REPORT &&
echo -e "Generated coverage report for recently updated files: $RECENT_REPORT\n"
# Unless otherwise specified, we'll not generate html report by default
if [ -z "$HTML" ]; then
exit 0
fi
# Generate the html report. If we cannot find lcov in this machine, we'll simply
# skip this step.
echo "Generating the html coverage report..."
LCOV=$(which lcov || true 2>/dev/null)
if [ -z $LCOV ]
then
echo "Skip: Cannot find lcov to generate the html report."
exit 0
fi
LCOV_VERSION=$(lcov -v | grep 1.1 || true)
if [ $LCOV_VERSION ]
then
echo "Not supported lcov version. Expect lcov 1.1."
exit 0
fi
(cd $ROOT; lcov --no-external \
--capture \
--directory $PWD \
--gcov-tool $GCOV \
--output-file $COVERAGE_DIR/coverage.info)
genhtml $COVERAGE_DIR/coverage.info -o $COVERAGE_DIR
echo "HTML Coverage report is generated in $COVERAGE_DIR"
-119
View File
@@ -1,119 +0,0 @@
#!/usr/bin/env python2
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
import re
import sys
from optparse import OptionParser
# the gcov report follows certain pattern. Each file will have two lines
# of report, from which we can extract the file name, total lines and coverage
# percentage.
def parse_gcov_report(gcov_input):
per_file_coverage = {}
total_coverage = None
for line in sys.stdin:
line = line.strip()
# --First line of the coverage report (with file name in it)?
match_obj = re.match("^File '(.*)'$", line)
if match_obj:
# fetch the file name from the first line of the report.
current_file = match_obj.group(1)
continue
# -- Second line of the file report (with coverage percentage)
match_obj = re.match("^Lines executed:(.*)% of (.*)", line)
if match_obj:
coverage = float(match_obj.group(1))
lines = int(match_obj.group(2))
if current_file is not None:
per_file_coverage[current_file] = (coverage, lines)
current_file = None
else:
# If current_file is not set, we reach the last line of report,
# which contains the summarized coverage percentage.
total_coverage = (coverage, lines)
continue
# If the line's pattern doesn't fall into the above categories. We
# can simply ignore them since they're either empty line or doesn't
# find executable lines of the given file.
current_file = None
return per_file_coverage, total_coverage
def get_option_parser():
usage = "Parse the gcov output and generate more human-readable code " +\
"coverage report."
parser = OptionParser(usage)
parser.add_option(
"--interested-files", "-i",
dest="filenames",
help="Comma separated files names. if specified, we will display " +
"the coverage report only for interested source files. " +
"Otherwise we will display the coverage report for all " +
"source files."
)
return parser
def display_file_coverage(per_file_coverage, total_coverage):
# To print out auto-adjustable column, we need to know the longest
# length of file names.
max_file_name_length = max(
len(fname) for fname in per_file_coverage.keys()
)
# -- Print header
# size of separator is determined by 3 column sizes:
# file name, coverage percentage and lines.
header_template = \
"%" + str(max_file_name_length) + "s\t%s\t%s"
separator = "-" * (max_file_name_length + 10 + 20)
print header_template % ("Filename", "Coverage", "Lines") # noqa: E999 T25377293 Grandfathered in
print separator
# -- Print body
# template for printing coverage report for each file.
record_template = "%" + str(max_file_name_length) + "s\t%5.2f%%\t%10d"
for fname, coverage_info in per_file_coverage.items():
coverage, lines = coverage_info
print record_template % (fname, coverage, lines)
# -- Print footer
if total_coverage:
print separator
print record_template % ("Total", total_coverage[0], total_coverage[1])
def report_coverage():
parser = get_option_parser()
(options, args) = parser.parse_args()
interested_files = set()
if options.filenames is not None:
interested_files = set(f.strip() for f in options.filenames.split(','))
# To make things simple, right now we only read gcov report from the input
per_file_coverage, total_coverage = parse_gcov_report(sys.stdin)
# Check if we need to display coverage info for interested files.
if len(interested_files):
per_file_coverage = dict(
(fname, per_file_coverage[fname]) for fname in interested_files
if fname in per_file_coverage
)
# If we only interested in several files, it makes no sense to report
# the total_coverage
total_coverage = None
if not len(per_file_coverage):
print >> sys.stderr, "Cannot find coverage info for the given files."
return
display_file_coverage(per_file_coverage, total_coverage)
if __name__ == "__main__":
report_coverage()
-253
View File
@@ -1,253 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#include "db/builder.h"
#include <algorithm>
#include <deque>
#include <vector>
#include "db/compaction/compaction_iterator.h"
#include "db/dbformat.h"
#include "db/event_helpers.h"
#include "db/internal_stats.h"
#include "db/merge_helper.h"
#include "db/range_del_aggregator.h"
#include "db/table_cache.h"
#include "db/version_edit.h"
#include "file/filename.h"
#include "monitoring/iostats_context_imp.h"
#include "monitoring/thread_status_util.h"
#include "rocksdb/db.h"
#include "rocksdb/env.h"
#include "rocksdb/iterator.h"
#include "rocksdb/options.h"
#include "rocksdb/table.h"
#include "table/block_based/block_based_table_builder.h"
#include "table/format.h"
#include "table/internal_iterator.h"
#include "test_util/sync_point.h"
#include "util/file_reader_writer.h"
#include "util/stop_watch.h"
namespace rocksdb {
class TableFactory;
TableBuilder* NewTableBuilder(
const ImmutableCFOptions& ioptions, const MutableCFOptions& moptions,
const InternalKeyComparator& internal_comparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories,
uint32_t column_family_id, const std::string& column_family_name,
WritableFileWriter* file, const CompressionType compression_type,
uint64_t sample_for_compression, const CompressionOptions& compression_opts,
int level, const bool skip_filters, const uint64_t creation_time,
const uint64_t oldest_key_time, const uint64_t target_file_size,
const uint64_t file_creation_time) {
assert((column_family_id ==
TablePropertiesCollectorFactory::Context::kUnknownColumnFamily) ==
column_family_name.empty());
return ioptions.table_factory->NewTableBuilder(
TableBuilderOptions(ioptions, moptions, internal_comparator,
int_tbl_prop_collector_factories, compression_type,
sample_for_compression, compression_opts,
skip_filters, column_family_name, level,
creation_time, oldest_key_time, target_file_size,
file_creation_time),
column_family_id, file);
}
Status BuildTable(
const std::string& dbname, Env* env, const ImmutableCFOptions& ioptions,
const MutableCFOptions& mutable_cf_options, const EnvOptions& env_options,
TableCache* table_cache, InternalIterator* iter,
std::vector<std::unique_ptr<FragmentedRangeTombstoneIterator>>
range_del_iters,
FileMetaData* meta, const InternalKeyComparator& internal_comparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories,
uint32_t column_family_id, const std::string& column_family_name,
std::vector<SequenceNumber> snapshots,
SequenceNumber earliest_write_conflict_snapshot,
SnapshotChecker* snapshot_checker, const CompressionType compression,
uint64_t sample_for_compression, const CompressionOptions& compression_opts,
bool paranoid_file_checks, InternalStats* internal_stats,
TableFileCreationReason reason, EventLogger* event_logger, int job_id,
const Env::IOPriority io_priority, TableProperties* table_properties,
int level, const uint64_t creation_time, const uint64_t oldest_key_time,
Env::WriteLifeTimeHint write_hint, const uint64_t file_creation_time) {
assert((column_family_id ==
TablePropertiesCollectorFactory::Context::kUnknownColumnFamily) ==
column_family_name.empty());
// Reports the IOStats for flush for every following bytes.
const size_t kReportFlushIOStatsEvery = 1048576;
Status s;
meta->fd.file_size = 0;
iter->SeekToFirst();
std::unique_ptr<CompactionRangeDelAggregator> range_del_agg(
new CompactionRangeDelAggregator(&internal_comparator, snapshots));
for (auto& range_del_iter : range_del_iters) {
range_del_agg->AddTombstones(std::move(range_del_iter));
}
std::string fname = TableFileName(ioptions.cf_paths, meta->fd.GetNumber(),
meta->fd.GetPathId());
#ifndef ROCKSDB_LITE
EventHelpers::NotifyTableFileCreationStarted(
ioptions.listeners, dbname, column_family_name, fname, job_id, reason);
#endif // !ROCKSDB_LITE
TableProperties tp;
if (iter->Valid() || !range_del_agg->IsEmpty()) {
TableBuilder* builder;
std::unique_ptr<WritableFileWriter> file_writer;
// Currently we only enable dictionary compression during compaction to the
// bottommost level.
CompressionOptions compression_opts_for_flush(compression_opts);
compression_opts_for_flush.max_dict_bytes = 0;
compression_opts_for_flush.zstd_max_train_bytes = 0;
{
std::unique_ptr<WritableFile> file;
#ifndef NDEBUG
bool use_direct_writes = env_options.use_direct_writes;
TEST_SYNC_POINT_CALLBACK("BuildTable:create_file", &use_direct_writes);
#endif // !NDEBUG
s = NewWritableFile(env, fname, &file, env_options);
if (!s.ok()) {
EventHelpers::LogAndNotifyTableFileCreationFinished(
event_logger, ioptions.listeners, dbname, column_family_name, fname,
job_id, meta->fd, tp, reason, s);
return s;
}
file->SetIOPriority(io_priority);
file->SetWriteLifeTimeHint(write_hint);
file_writer.reset(
new WritableFileWriter(std::move(file), fname, env_options, env,
ioptions.statistics, ioptions.listeners));
builder = NewTableBuilder(
ioptions, mutable_cf_options, internal_comparator,
int_tbl_prop_collector_factories, column_family_id,
column_family_name, file_writer.get(), compression,
sample_for_compression, compression_opts_for_flush, level,
false /* skip_filters */, creation_time, oldest_key_time,
0 /*target_file_size*/, file_creation_time);
}
MergeHelper merge(env, internal_comparator.user_comparator(),
ioptions.merge_operator, nullptr, ioptions.info_log,
true /* internal key corruption is not ok */,
snapshots.empty() ? 0 : snapshots.back(),
snapshot_checker);
CompactionIterator c_iter(
iter, internal_comparator.user_comparator(), &merge, kMaxSequenceNumber,
&snapshots, earliest_write_conflict_snapshot, snapshot_checker, env,
ShouldReportDetailedTime(env, ioptions.statistics),
true /* internal key corruption is not ok */, range_del_agg.get());
c_iter.SeekToFirst();
for (; c_iter.Valid(); c_iter.Next()) {
const Slice& key = c_iter.key();
const Slice& value = c_iter.value();
builder->Add(key, value);
meta->UpdateBoundaries(key, c_iter.ikey().sequence);
// TODO(noetzli): Update stats after flush, too.
if (io_priority == Env::IO_HIGH &&
IOSTATS(bytes_written) >= kReportFlushIOStatsEvery) {
ThreadStatusUtil::SetThreadOperationProperty(
ThreadStatus::FLUSH_BYTES_WRITTEN, IOSTATS(bytes_written));
}
}
auto range_del_it = range_del_agg->NewIterator();
for (range_del_it->SeekToFirst(); range_del_it->Valid();
range_del_it->Next()) {
auto tombstone = range_del_it->Tombstone();
auto kv = tombstone.Serialize();
builder->Add(kv.first.Encode(), kv.second);
meta->UpdateBoundariesForRange(kv.first, tombstone.SerializeEndKey(),
tombstone.seq_, internal_comparator);
}
// Finish and check for builder errors
tp = builder->GetTableProperties();
bool empty = builder->NumEntries() == 0 && tp.num_range_deletions == 0;
s = c_iter.status();
if (!s.ok() || empty) {
builder->Abandon();
} else {
s = builder->Finish();
}
if (s.ok() && !empty) {
uint64_t file_size = builder->FileSize();
meta->fd.file_size = file_size;
meta->marked_for_compaction = builder->NeedCompact();
assert(meta->fd.GetFileSize() > 0);
tp = builder->GetTableProperties(); // refresh now that builder is finished
if (table_properties) {
*table_properties = tp;
}
}
delete builder;
// Finish and check for file errors
if (s.ok() && !empty) {
StopWatch sw(env, ioptions.statistics, TABLE_SYNC_MICROS);
s = file_writer->Sync(ioptions.use_fsync);
}
if (s.ok() && !empty) {
s = file_writer->Close();
}
if (s.ok() && !empty) {
// Verify that the table is usable
// We set for_compaction to false and don't OptimizeForCompactionTableRead
// here because this is a special case after we finish the table building
// No matter whether use_direct_io_for_flush_and_compaction is true,
// we will regrad this verification as user reads since the goal is
// to cache it here for further user reads
std::unique_ptr<InternalIterator> it(table_cache->NewIterator(
ReadOptions(), env_options, internal_comparator, *meta,
nullptr /* range_del_agg */,
mutable_cf_options.prefix_extractor.get(), nullptr,
(internal_stats == nullptr) ? nullptr
: internal_stats->GetFileReadHist(0),
TableReaderCaller::kFlush, /*arena=*/nullptr,
/*skip_filter=*/false, level, /*smallest_compaction_key=*/nullptr,
/*largest_compaction_key*/ nullptr));
s = it->status();
if (s.ok() && paranoid_file_checks) {
for (it->SeekToFirst(); it->Valid(); it->Next()) {
}
s = it->status();
}
}
}
// Check for input iterator errors
if (!iter->status().ok()) {
s = iter->status();
}
if (!s.ok() || meta->fd.GetFileSize() == 0) {
env->DeleteFile(fname);
}
// Output to event logger and fire events.
EventHelpers::LogAndNotifyTableFileCreationFinished(
event_logger, ioptions.listeners, dbname, column_family_name, fname,
job_id, meta->fd, tp, reason, s);
return s;
}
} // namespace rocksdb
-87
View File
@@ -1,87 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#include <string>
#include <utility>
#include <vector>
#include "db/range_tombstone_fragmenter.h"
#include "db/table_properties_collector.h"
#include "logging/event_logger.h"
#include "options/cf_options.h"
#include "rocksdb/comparator.h"
#include "rocksdb/env.h"
#include "rocksdb/listener.h"
#include "rocksdb/options.h"
#include "rocksdb/status.h"
#include "rocksdb/table_properties.h"
#include "rocksdb/types.h"
#include "table/scoped_arena_iterator.h"
namespace rocksdb {
struct Options;
struct FileMetaData;
class Env;
struct EnvOptions;
class Iterator;
class SnapshotChecker;
class TableCache;
class VersionEdit;
class TableBuilder;
class WritableFileWriter;
class InternalStats;
// @param column_family_name Name of the column family that is also identified
// by column_family_id, or empty string if unknown. It must outlive the
// TableBuilder returned by this function.
TableBuilder* NewTableBuilder(
const ImmutableCFOptions& options, const MutableCFOptions& moptions,
const InternalKeyComparator& internal_comparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories,
uint32_t column_family_id, const std::string& column_family_name,
WritableFileWriter* file, const CompressionType compression_type,
const uint64_t sample_for_compression,
const CompressionOptions& compression_opts, int level,
const bool skip_filters = false, const uint64_t creation_time = 0,
const uint64_t oldest_key_time = 0, const uint64_t target_file_size = 0,
const uint64_t file_creation_time = 0);
// Build a Table file from the contents of *iter. The generated file
// will be named according to number specified in meta. On success, the rest of
// *meta will be filled with metadata about the generated table.
// If no data is present in *iter, meta->file_size will be set to
// zero, and no Table file will be produced.
//
// @param column_family_name Name of the column family that is also identified
// by column_family_id, or empty string if unknown.
extern Status BuildTable(
const std::string& dbname, Env* env, const ImmutableCFOptions& options,
const MutableCFOptions& mutable_cf_options, const EnvOptions& env_options,
TableCache* table_cache, InternalIterator* iter,
std::vector<std::unique_ptr<FragmentedRangeTombstoneIterator>>
range_del_iters,
FileMetaData* meta, const InternalKeyComparator& internal_comparator,
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories,
uint32_t column_family_id, const std::string& column_family_name,
std::vector<SequenceNumber> snapshots,
SequenceNumber earliest_write_conflict_snapshot,
SnapshotChecker* snapshot_checker, const CompressionType compression,
const uint64_t sample_for_compression,
const CompressionOptions& compression_opts, bool paranoid_file_checks,
InternalStats* internal_stats, TableFileCreationReason reason,
EventLogger* event_logger = nullptr, int job_id = 0,
const Env::IOPriority io_priority = Env::IO_HIGH,
TableProperties* table_properties = nullptr, int level = -1,
const uint64_t creation_time = 0, const uint64_t oldest_key_time = 0,
Env::WriteLifeTimeHint write_hint = Env::WLTH_NOT_SET,
const uint64_t file_creation_time = 0);
} // namespace rocksdb
-4392
View File
File diff suppressed because it is too large. Load diff
-1814
View File
File diff suppressed because it is too large. Load diff
-1422
View File
File diff suppressed because it is too large. Load diff
-748
View File
@@ -1,748 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#include <unordered_map>
#include <string>
#include <vector>
#include <atomic>
#include "db/memtable_list.h"
#include "db/table_cache.h"
#include "db/table_properties_collector.h"
#include "db/write_batch_internal.h"
#include "db/write_controller.h"
#include "options/cf_options.h"
#include "rocksdb/compaction_job_stats.h"
#include "rocksdb/db.h"
#include "rocksdb/env.h"
#include "rocksdb/options.h"
#include "trace_replay/block_cache_tracer.h"
#include "util/thread_local.h"
namespace rocksdb {
class Version;
class VersionSet;
class VersionStorageInfo;
class MemTable;
class MemTableListVersion;
class CompactionPicker;
class Compaction;
class InternalKey;
class InternalStats;
class ColumnFamilyData;
class DBImpl;
class LogBuffer;
class InstrumentedMutex;
class InstrumentedMutexLock;
struct SuperVersionContext;
extern const double kIncSlowdownRatio;
// This file contains a list of data structures for managing column family
// level metadata.
//
// The basic relationships among classes declared here are illustrated as
// following:
//
// +----------------------+ +----------------------+ +--------+
// +---+ ColumnFamilyHandle 1 | +--+ ColumnFamilyHandle 2 | | DBImpl |
// | +----------------------+ | +----------------------+ +----+---+
// | +--------------------------+ |
// | | +-----------------------------+
// | | |
// | | +-----------------------------v-------------------------------+
// | | | |
// | | | ColumnFamilySet |
// | | | |
// | | +-------------+--------------------------+----------------+---+
// | | | | |
// | +-------------------------------------+ | |
// | | | | v
// | +-------------v-------------+ +-----v----v---------+
// | | | | |
// | | ColumnFamilyData 1 | | ColumnFamilyData 2 | ......
// | | | | |
// +---> | | |
// | +---------+ | |
// | | MemTable| | |
// | | List | | |
// +--------+---+--+-+----+----+ +--------------------++
// | | | |
// | | | |
// | | | +-----------------------+
// | | +-----------+ |
// v +--------+ | |
// +--------+--------+ | | |
// | | | | +----------v----------+
// +---> |SuperVersion 1.a +-----------------> |
// | +------+ | | MemTableListVersion |
// +---+-------------+ | | | | |
// | | | | +----+------------+---+
// | current | | | | |
// | +-------------+ | |mem | |
// | | | | | |
// +-v---v-------+ +---v--v---+ +-----v----+ +----v-----+
// | | | | | | | |
// | Version 1.a | | memtable | | memtable | | memtable |
// | | | 1.a | | 1.b | | 1.c |
// +-------------+ | | | | | |
// +----------+ +----------+ +----------+
//
// DBImpl keeps a ColumnFamilySet, which references to all column families by
// pointing to respective ColumnFamilyData object of each column family.
// This is how DBImpl can list and operate on all the column families.
// ColumnFamilyHandle also points to ColumnFamilyData directly, so that
// when a user executes a query, it can directly find memtables and Version
// as well as SuperVersion to the column family, without going through
// ColumnFamilySet.
//
// ColumnFamilySet points to the latest view of the LSM-tree (list of memtables
// and SST files) indirectly, while ongoing operations may hold references
// to a current or an out-of-date SuperVersion, which in turn points to a
// point-in-time view of the LSM-tree. This guarantees the memtables and SST
// files being operated on will not go away, until the SuperVersion is
// unreferenced to 0 and destoryed.
//
// The following graph illustrates a possible referencing relationships:
//
// Column +--------------+ current +-----------+
// Family +---->+ +------------------->+ |
// Data | SuperVersion +----------+ | Version A |
// | 3 | imm | | |
// Iter2 +----->+ | +-------v------+ +-----------+
// +-----+--------+ | MemtableList +----------------> Empty
// | | Version r | +-----------+
// | +--------------+ | |
// +------------------+ current| Version B |
// +--------------+ | +----->+ |
// | | | | +-----+-----+
// Compaction +>+ SuperVersion +-------------+ ^
// Job | 2 +------+ | |current
// | +----+ | | mem | +------------+
// +--------------+ | | +---------------------> |
// | +------------------------> MemTable a |
// | mem | | |
// +--------------+ | | +------------+
// | +--------------------------+
// Iter1 +-----> SuperVersion | | +------------+
// | 1 +------------------------------>+ |
// | +-+ | mem | MemTable b |
// +--------------+ | | | |
// | | +--------------+ +-----^------+
// | |imm | MemtableList | |
// | +--->+ Version s +------------+
// | +--------------+
// | +--------------+
// | | MemtableList |
// +------>+ Version t +--------> Empty
// imm +--------------+
//
// In this example, even if the current LSM-tree consists of Version A and
// memtable a, which is also referenced by SuperVersion, two older SuperVersion
// SuperVersion2 and Superversion1 still exist, and are referenced by a
// compaction job and an old iterator Iter1, respectively. SuperVersion2
// contains Version B, memtable a and memtable b; SuperVersion1 contains
// Version B and memtable b (mutable). As a result, Version B and memtable b
// are prevented from being destroyed or deleted.
// ColumnFamilyHandleImpl is the class that clients use to access different
// column families. It has non-trivial destructor, which gets called when client
// is done using the column family
class ColumnFamilyHandleImpl : public ColumnFamilyHandle {
public:
// create while holding the mutex
ColumnFamilyHandleImpl(
ColumnFamilyData* cfd, DBImpl* db, InstrumentedMutex* mutex);
// destroy without mutex
virtual ~ColumnFamilyHandleImpl();
virtual ColumnFamilyData* cfd() const { return cfd_; }
virtual uint32_t GetID() const override;
virtual const std::string& GetName() const override;
virtual Status GetDescriptor(ColumnFamilyDescriptor* desc) override;
virtual const Comparator* GetComparator() const override;
private:
ColumnFamilyData* cfd_;
DBImpl* db_;
InstrumentedMutex* mutex_;
};
// Does not ref-count ColumnFamilyData
// We use this dummy ColumnFamilyHandleImpl because sometimes MemTableInserter
// calls DBImpl methods. When this happens, MemTableInserter need access to
// ColumnFamilyHandle (same as the client would need). In that case, we feed
// MemTableInserter dummy ColumnFamilyHandle and enable it to call DBImpl
// methods
class ColumnFamilyHandleInternal : public ColumnFamilyHandleImpl {
public:
ColumnFamilyHandleInternal()
: ColumnFamilyHandleImpl(nullptr, nullptr, nullptr), internal_cfd_(nullptr) {}
void SetCFD(ColumnFamilyData* _cfd) { internal_cfd_ = _cfd; }
virtual ColumnFamilyData* cfd() const override { return internal_cfd_; }
private:
ColumnFamilyData* internal_cfd_;
};
// holds references to memtable, all immutable memtables and version
struct SuperVersion {
// Accessing members of this class is not thread-safe and requires external
// synchronization (ie db mutex held or on write thread).
MemTable* mem;
MemTableListVersion* imm;
Version* current;
MutableCFOptions mutable_cf_options;
// Version number of the current SuperVersion
uint64_t version_number;
WriteStallCondition write_stall_condition;
InstrumentedMutex* db_mutex;
// should be called outside the mutex
SuperVersion() = default;
~SuperVersion();
SuperVersion* Ref();
// If Unref() returns true, Cleanup() should be called with mutex held
// before deleting this SuperVersion.
bool Unref();
// call these two methods with db mutex held
// Cleanup unrefs mem, imm and current. Also, it stores all memtables
// that needs to be deleted in to_delete vector. Unrefing those
// objects needs to be done in the mutex
void Cleanup();
void Init(MemTable* new_mem, MemTableListVersion* new_imm,
Version* new_current);
// The value of dummy is not actually used. kSVInUse takes its address as a
// mark in the thread local storage to indicate the SuperVersion is in use
// by thread. This way, the value of kSVInUse is guaranteed to have no
// conflict with SuperVersion object address and portable on different
// platform.
static int dummy;
static void* const kSVInUse;
static void* const kSVObsolete;
private:
std::atomic<uint32_t> refs;
// We need to_delete because during Cleanup(), imm->Unref() returns
// all memtables that we need to free through this vector. We then
// delete all those memtables outside of mutex, during destruction
autovector<MemTable*> to_delete;
};
extern Status CheckCompressionSupported(const ColumnFamilyOptions& cf_options);
extern Status CheckConcurrentWritesSupported(
const ColumnFamilyOptions& cf_options);
extern Status CheckCFPathsSupported(const DBOptions& db_options,
const ColumnFamilyOptions& cf_options);
extern ColumnFamilyOptions SanitizeOptions(const ImmutableDBOptions& db_options,
const ColumnFamilyOptions& src);
// Wrap user defined table proproties collector factories `from cf_options`
// into internal ones in int_tbl_prop_collector_factories. Add a system internal
// one too.
extern void GetIntTblPropCollectorFactory(
const ImmutableCFOptions& ioptions,
std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories);
class ColumnFamilySet;
// This class keeps all the data that a column family needs.
// Most methods require DB mutex held, unless otherwise noted
class ColumnFamilyData {
public:
~ColumnFamilyData();
// thread-safe
uint32_t GetID() const { return id_; }
// thread-safe
const std::string& GetName() const { return name_; }
// Ref() can only be called from a context where the caller can guarantee
// that ColumnFamilyData is alive (while holding a non-zero ref already,
// holding a DB mutex, or as the leader in a write batch group).
void Ref() { refs_.fetch_add(1, std::memory_order_relaxed); }
// Unref decreases the reference count, but does not handle deletion
// when the count goes to 0. If this method returns true then the
// caller should delete the instance immediately, or later, by calling
// FreeDeadColumnFamilies(). Unref() can only be called while holding
// a DB mutex, or during single-threaded recovery.
bool Unref() {
int old_refs = refs_.fetch_sub(1, std::memory_order_relaxed);
assert(old_refs > 0);
return old_refs == 1;
}
// SetDropped() can only be called under following conditions:
// 1) Holding a DB mutex,
// 2) from single-threaded write thread, AND
// 3) from single-threaded VersionSet::LogAndApply()
// After dropping column family no other operation on that column family
// will be executed. All the files and memory will be, however, kept around
// until client drops the column family handle. That way, client can still
// access data from dropped column family.
// Column family can be dropped and still alive. In that state:
// *) Compaction and flush is not executed on the dropped column family.
// *) Client can continue reading from column family. Writes will fail unless
// WriteOptions::ignore_missing_column_families is true
// When the dropped column family is unreferenced, then we:
// *) Remove column family from the linked list maintained by ColumnFamilySet
// *) delete all memory associated with that column family
// *) delete all the files associated with that column family
void SetDropped();
bool IsDropped() const { return dropped_.load(std::memory_order_relaxed); }
// thread-safe
int NumberLevels() const { return ioptions_.num_levels; }
void SetLogNumber(uint64_t log_number) { log_number_ = log_number; }
uint64_t GetLogNumber() const { return log_number_; }
void SetFlushReason(FlushReason flush_reason) {
flush_reason_ = flush_reason;
}
FlushReason GetFlushReason() const { return flush_reason_; }
// thread-safe
const EnvOptions* soptions() const;
const ImmutableCFOptions* ioptions() const { return &ioptions_; }
// REQUIRES: DB mutex held
// This returns the MutableCFOptions used by current SuperVersion
// You should use this API to reference MutableCFOptions most of the time.
const MutableCFOptions* GetCurrentMutableCFOptions() const {
return &(super_version_->mutable_cf_options);
}
// REQUIRES: DB mutex held
// This returns the latest MutableCFOptions, which may be not in effect yet.
const MutableCFOptions* GetLatestMutableCFOptions() const {
return &mutable_cf_options_;
}
// REQUIRES: DB mutex held
// Build ColumnFamiliesOptions with immutable options and latest mutable
// options.
ColumnFamilyOptions GetLatestCFOptions() const;
bool is_delete_range_supported() { return is_delete_range_supported_; }
// Validate CF options against DB options
static Status ValidateOptions(const DBOptions& db_options,
const ColumnFamilyOptions& cf_options);
#ifndef ROCKSDB_LITE
// REQUIRES: DB mutex held
Status SetOptions(
const DBOptions& db_options,
const std::unordered_map<std::string, std::string>& options_map);
#endif // ROCKSDB_LITE
InternalStats* internal_stats() { return internal_stats_.get(); }
MemTableList* imm() { return &imm_; }
MemTable* mem() { return mem_; }
Version* current() { return current_; }
Version* dummy_versions() { return dummy_versions_; }
void SetCurrent(Version* _current);
uint64_t GetNumLiveVersions() const; // REQUIRE: DB mutex held
uint64_t GetTotalSstFilesSize() const; // REQUIRE: DB mutex held
uint64_t GetLiveSstFilesSize() const; // REQUIRE: DB mutex held
void SetMemtable(MemTable* new_mem) {
uint64_t memtable_id = last_memtable_id_.fetch_add(1) + 1;
new_mem->SetID(memtable_id);
mem_ = new_mem;
}
// calculate the oldest log needed for the durability of this column family
uint64_t OldestLogToKeep();
// See Memtable constructor for explanation of earliest_seq param.
MemTable* ConstructNewMemtable(const MutableCFOptions& mutable_cf_options,
SequenceNumber earliest_seq);
void CreateNewMemtable(const MutableCFOptions& mutable_cf_options,
SequenceNumber earliest_seq);
TableCache* table_cache() const { return table_cache_.get(); }
// See documentation in compaction_picker.h
// REQUIRES: DB mutex held
bool NeedsCompaction() const;
// REQUIRES: DB mutex held
Compaction* PickCompaction(const MutableCFOptions& mutable_options,
LogBuffer* log_buffer);
// Check if the passed range overlap with any running compactions.
// REQUIRES: DB mutex held
bool RangeOverlapWithCompaction(const Slice& smallest_user_key,
const Slice& largest_user_key,
int level) const;
// Check if the passed ranges overlap with any unflushed memtables
// (immutable or mutable).
//
// @param super_version A referenced SuperVersion that will be held for the
// duration of this function.
//
// Thread-safe
Status RangesOverlapWithMemtables(const autovector<Range>& ranges,
SuperVersion* super_version, bool* overlap);
// A flag to tell a manual compaction is to compact all levels together
// instead of a specific level.
static const int kCompactAllLevels;
// A flag to tell a manual compaction's output is base level.
static const int kCompactToBaseLevel;
// REQUIRES: DB mutex held
Compaction* CompactRange(const MutableCFOptions& mutable_cf_options,
int input_level, int output_level,
const CompactRangeOptions& compact_range_options,
const InternalKey* begin, const InternalKey* end,
InternalKey** compaction_end, bool* manual_conflict,
uint64_t max_file_num_to_ignore);
CompactionPicker* compaction_picker() { return compaction_picker_.get(); }
// thread-safe
const Comparator* user_comparator() const {
return internal_comparator_.user_comparator();
}
// thread-safe
const InternalKeyComparator& internal_comparator() const {
return internal_comparator_;
}
const std::vector<std::unique_ptr<IntTblPropCollectorFactory>>*
int_tbl_prop_collector_factories() const {
return &int_tbl_prop_collector_factories_;
}
SuperVersion* GetSuperVersion() { return super_version_; }
// thread-safe
// Return a already referenced SuperVersion to be used safely.
SuperVersion* GetReferencedSuperVersion(InstrumentedMutex* db_mutex);
// thread-safe
// Get SuperVersion stored in thread local storage. If it does not exist,
// get a reference from a current SuperVersion.
SuperVersion* GetThreadLocalSuperVersion(InstrumentedMutex* db_mutex);
// Try to return SuperVersion back to thread local storage. Retrun true on
// success and false on failure. It fails when the thread local storage
// contains anything other than SuperVersion::kSVInUse flag.
bool ReturnThreadLocalSuperVersion(SuperVersion* sv);
// thread-safe
uint64_t GetSuperVersionNumber() const {
return super_version_number_.load();
}
// will return a pointer to SuperVersion* if previous SuperVersion
// if its reference count is zero and needs deletion or nullptr if not
// As argument takes a pointer to allocated SuperVersion to enable
// the clients to allocate SuperVersion outside of mutex.
// IMPORTANT: Only call this from DBImpl::InstallSuperVersion()
void InstallSuperVersion(SuperVersionContext* sv_context,
InstrumentedMutex* db_mutex,
const MutableCFOptions& mutable_cf_options);
void InstallSuperVersion(SuperVersionContext* sv_context,
InstrumentedMutex* db_mutex);
void ResetThreadLocalSuperVersions();
// Protected by DB mutex
void set_queued_for_flush(bool value) { queued_for_flush_ = value; }
void set_queued_for_compaction(bool value) { queued_for_compaction_ = value; }
bool queued_for_flush() { return queued_for_flush_; }
bool queued_for_compaction() { return queued_for_compaction_; }
enum class WriteStallCause {
kNone,
kMemtableLimit,
kL0FileCountLimit,
kPendingCompactionBytes,
};
static std::pair<WriteStallCondition, WriteStallCause>
GetWriteStallConditionAndCause(int num_unflushed_memtables, int num_l0_files,
uint64_t num_compaction_needed_bytes,
const MutableCFOptions& mutable_cf_options);
// Recalculate some small conditions, which are changed only during
// compaction, adding new memtable and/or
// recalculation of compaction score. These values are used in
// DBImpl::MakeRoomForWrite function to decide, if it need to make
// a write stall
WriteStallCondition RecalculateWriteStallConditions(
const MutableCFOptions& mutable_cf_options);
void set_initialized() { initialized_.store(true); }
bool initialized() const { return initialized_.load(); }
const ColumnFamilyOptions& initial_cf_options() {
return initial_cf_options_;
}
Env::WriteLifeTimeHint CalculateSSTWriteHint(int level);
Status AddDirectories();
Directory* GetDataDir(size_t path_id) const;
ThreadLocalPtr* TEST_GetLocalSV() { return local_sv_.get(); }
private:
friend class ColumnFamilySet;
ColumnFamilyData(uint32_t id, const std::string& name,
Version* dummy_versions, Cache* table_cache,
WriteBufferManager* write_buffer_manager,
const ColumnFamilyOptions& options,
const ImmutableDBOptions& db_options,
const EnvOptions& env_options,
ColumnFamilySet* column_family_set,
BlockCacheTracer* const block_cache_tracer);
uint32_t id_;
const std::string name_;
Version* dummy_versions_; // Head of circular doubly-linked list of versions.
Version* current_; // == dummy_versions->prev_
std::atomic<int> refs_; // outstanding references to ColumnFamilyData
std::atomic<bool> initialized_;
std::atomic<bool> dropped_; // true if client dropped it
const InternalKeyComparator internal_comparator_;
std::vector<std::unique_ptr<IntTblPropCollectorFactory>>
int_tbl_prop_collector_factories_;
const ColumnFamilyOptions initial_cf_options_;
const ImmutableCFOptions ioptions_;
MutableCFOptions mutable_cf_options_;
const bool is_delete_range_supported_;
std::unique_ptr<TableCache> table_cache_;
std::unique_ptr<InternalStats> internal_stats_;
WriteBufferManager* write_buffer_manager_;
MemTable* mem_;
MemTableList imm_;
SuperVersion* super_version_;
// An ordinal representing the current SuperVersion. Updated by
// InstallSuperVersion(), i.e. incremented every time super_version_
// changes.
std::atomic<uint64_t> super_version_number_;
// Thread's local copy of SuperVersion pointer
// This needs to be destructed before mutex_
std::unique_ptr<ThreadLocalPtr> local_sv_;
// pointers for a circular linked list. we use it to support iterations over
// all column families that are alive (note: dropped column families can also
// be alive as long as client holds a reference)
ColumnFamilyData* next_;
ColumnFamilyData* prev_;
// This is the earliest log file number that contains data from this
// Column Family. All earlier log files must be ignored and not
// recovered from
uint64_t log_number_;
std::atomic<FlushReason> flush_reason_;
// An object that keeps all the compaction stats
// and picks the next compaction
std::unique_ptr<CompactionPicker> compaction_picker_;
ColumnFamilySet* column_family_set_;
std::unique_ptr<WriteControllerToken> write_controller_token_;
// If true --> this ColumnFamily is currently present in DBImpl::flush_queue_
bool queued_for_flush_;
// If true --> this ColumnFamily is currently present in
// DBImpl::compaction_queue_
bool queued_for_compaction_;
uint64_t prev_compaction_needed_bytes_;
// if the database was opened with 2pc enabled
bool allow_2pc_;
// Memtable id to track flush.
std::atomic<uint64_t> last_memtable_id_;
// Directories corresponding to cf_paths.
std::vector<std::unique_ptr<Directory>> data_dirs_;
};
// ColumnFamilySet has interesting thread-safety requirements
// * CreateColumnFamily() or RemoveColumnFamily() -- need to be protected by DB
// mutex AND executed in the write thread.
// CreateColumnFamily() should ONLY be called from VersionSet::LogAndApply() AND
// single-threaded write thread. It is also called during Recovery and in
// DumpManifest().
// RemoveColumnFamily() is only called from SetDropped(). DB mutex needs to be
// held and it needs to be executed from the write thread. SetDropped() also
// guarantees that it will be called only from single-threaded LogAndApply(),
// but this condition is not that important.
// * Iteration -- hold DB mutex, but you can release it in the body of
// iteration. If you release DB mutex in body, reference the column
// family before the mutex and unreference after you unlock, since the column
// family might get dropped when the DB mutex is released
// * GetDefault() -- thread safe
// * GetColumnFamily() -- either inside of DB mutex or from a write thread
// * GetNextColumnFamilyID(), GetMaxColumnFamily(), UpdateMaxColumnFamily(),
// NumberOfColumnFamilies -- inside of DB mutex
class ColumnFamilySet {
public:
// ColumnFamilySet supports iteration
class iterator {
public:
explicit iterator(ColumnFamilyData* cfd)
: current_(cfd) {}
iterator& operator++() {
// dropped column families might still be included in this iteration
// (we're only removing them when client drops the last reference to the
// column family).
// dummy is never dead, so this will never be infinite
do {
current_ = current_->next_;
} while (current_->refs_.load(std::memory_order_relaxed) == 0);
return *this;
}
bool operator!=(const iterator& other) {
return this->current_ != other.current_;
}
ColumnFamilyData* operator*() { return current_; }
private:
ColumnFamilyData* current_;
};
ColumnFamilySet(const std::string& dbname,
const ImmutableDBOptions* db_options,
const EnvOptions& env_options, Cache* table_cache,
WriteBufferManager* write_buffer_manager,
WriteController* write_controller,
BlockCacheTracer* const block_cache_tracer);
~ColumnFamilySet();
ColumnFamilyData* GetDefault() const;
// GetColumnFamily() calls return nullptr if column family is not found
ColumnFamilyData* GetColumnFamily(uint32_t id) const;
ColumnFamilyData* GetColumnFamily(const std::string& name) const;
// this call will return the next available column family ID. it guarantees
// that there is no column family with id greater than or equal to the
// returned value in the current running instance or anytime in RocksDB
// instance history.
uint32_t GetNextColumnFamilyID();
uint32_t GetMaxColumnFamily();
void UpdateMaxColumnFamily(uint32_t new_max_column_family);
size_t NumberOfColumnFamilies() const;
ColumnFamilyData* CreateColumnFamily(const std::string& name, uint32_t id,
Version* dummy_version,
const ColumnFamilyOptions& options);
iterator begin() { return iterator(dummy_cfd_->next_); }
iterator end() { return iterator(dummy_cfd_); }
// REQUIRES: DB mutex held
// Don't call while iterating over ColumnFamilySet
void FreeDeadColumnFamilies();
Cache* get_table_cache() { return table_cache_; }
private:
friend class ColumnFamilyData;
// helper function that gets called from cfd destructor
// REQUIRES: DB mutex held
void RemoveColumnFamily(ColumnFamilyData* cfd);
// column_families_ and column_family_data_ need to be protected:
// * when mutating both conditions have to be satisfied:
// 1. DB mutex locked
// 2. thread currently in single-threaded write thread
// * when reading, at least one condition needs to be satisfied:
// 1. DB mutex locked
// 2. accessed from a single-threaded write thread
std::unordered_map<std::string, uint32_t> column_families_;
std::unordered_map<uint32_t, ColumnFamilyData*> column_family_data_;
uint32_t max_column_family_;
ColumnFamilyData* dummy_cfd_;
// We don't hold the refcount here, since default column family always exists
// We are also not responsible for cleaning up default_cfd_cache_. This is
// just a cache that makes common case (accessing default column family)
// faster
ColumnFamilyData* default_cfd_cache_;
const std::string db_name_;
const ImmutableDBOptions* const db_options_;
const EnvOptions env_options_;
Cache* table_cache_;
WriteBufferManager* write_buffer_manager_;
WriteController* write_controller_;
BlockCacheTracer* const block_cache_tracer_;
};
// We use ColumnFamilyMemTablesImpl to provide WriteBatch a way to access
// memtables of different column families (specified by ID in the write batch)
class ColumnFamilyMemTablesImpl : public ColumnFamilyMemTables {
public:
explicit ColumnFamilyMemTablesImpl(ColumnFamilySet* column_family_set)
: column_family_set_(column_family_set), current_(nullptr) {}
// Constructs a ColumnFamilyMemTablesImpl equivalent to one constructed
// with the arguments used to construct *orig.
explicit ColumnFamilyMemTablesImpl(ColumnFamilyMemTablesImpl* orig)
: column_family_set_(orig->column_family_set_), current_(nullptr) {}
// sets current_ to ColumnFamilyData with column_family_id
// returns false if column family doesn't exist
// REQUIRES: use this function of DBImpl::column_family_memtables_ should be
// under a DB mutex OR from a write thread
bool Seek(uint32_t column_family_id) override;
// Returns log number of the selected column family
// REQUIRES: under a DB mutex OR from a write thread
uint64_t GetLogNumber() const override;
// REQUIRES: Seek() called first
// REQUIRES: use this function of DBImpl::column_family_memtables_ should be
// under a DB mutex OR from a write thread
virtual MemTable* GetMemTable() const override;
// Returns column family handle for the selected column family
// REQUIRES: use this function of DBImpl::column_family_memtables_ should be
// under a DB mutex OR from a write thread
virtual ColumnFamilyHandle* GetColumnFamilyHandle() override;
// Cannot be called while another thread is calling Seek().
// REQUIRES: use this function of DBImpl::column_family_memtables_ should be
// under a DB mutex OR from a write thread
virtual ColumnFamilyData* current() override { return current_; }
private:
ColumnFamilySet* column_family_set_;
ColumnFamilyData* current_;
ColumnFamilyHandleInternal handle_;
};
extern uint32_t GetColumnFamilyID(ColumnFamilyHandle* column_family);
extern const Comparator* GetColumnFamilyUserComparator(
ColumnFamilyHandle* column_family);
} // namespace rocksdb
File diff suppressed because it is too large. Load diff
-421
View File
@@ -1,421 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
#ifndef ROCKSDB_LITE
#include <mutex>
#include <string>
#include <thread>
#include <vector>
#include "db/db_impl/db_impl.h"
#include "port/port.h"
#include "rocksdb/db.h"
#include "rocksdb/env.h"
#include "test_util/sync_point.h"
#include "test_util/testharness.h"
#include "util/string_util.h"
namespace rocksdb {
class CompactFilesTest : public testing::Test {
public:
CompactFilesTest() {
env_ = Env::Default();
db_name_ = test::PerThreadDBPath("compact_files_test");
}
std::string db_name_;
Env* env_;
};
// A class which remembers the name of each flushed file.
class FlushedFileCollector : public EventListener {
public:
FlushedFileCollector() {}
~FlushedFileCollector() override {}
void OnFlushCompleted(DB* /*db*/, const FlushJobInfo& info) override {
std::lock_guard<std::mutex> lock(mutex_);
flushed_files_.push_back(info.file_path);
}
std::vector<std::string> GetFlushedFiles() {
std::lock_guard<std::mutex> lock(mutex_);
std::vector<std::string> result;
for (auto fname : flushed_files_) {
result.push_back(fname);
}
return result;
}
void ClearFlushedFiles() {
std::lock_guard<std::mutex> lock(mutex_);
flushed_files_.clear();
}
private:
std::vector<std::string> flushed_files_;
std::mutex mutex_;
};
TEST_F(CompactFilesTest, L0ConflictsFiles) {
Options options;
// to trigger compaction more easily
const int kWriteBufferSize = 10000;
const int kLevel0Trigger = 2;
options.create_if_missing = true;
options.compaction_style = kCompactionStyleLevel;
// Small slowdown and stop trigger for experimental purpose.
options.level0_slowdown_writes_trigger = 20;
options.level0_stop_writes_trigger = 20;
options.level0_stop_writes_trigger = 20;
options.write_buffer_size = kWriteBufferSize;
options.level0_file_num_compaction_trigger = kLevel0Trigger;
options.compression = kNoCompression;
DB* db = nullptr;
DestroyDB(db_name_, options);
Status s = DB::Open(options, db_name_, &db);
assert(s.ok());
assert(db);
rocksdb::SyncPoint::GetInstance()->LoadDependency({
{"CompactFilesImpl:0", "BackgroundCallCompaction:0"},
{"BackgroundCallCompaction:1", "CompactFilesImpl:1"},
});
rocksdb::SyncPoint::GetInstance()->EnableProcessing();
// create couple files
// Background compaction starts and waits in BackgroundCallCompaction:0
for (int i = 0; i < kLevel0Trigger * 4; ++i) {
db->Put(WriteOptions(), ToString(i), "");
db->Put(WriteOptions(), ToString(100 - i), "");
db->Flush(FlushOptions());
}
rocksdb::ColumnFamilyMetaData meta;
db->GetColumnFamilyMetaData(&meta);
std::string file1;
for (auto& file : meta.levels[0].files) {
ASSERT_EQ(0, meta.levels[0].level);
if (file1 == "") {
file1 = file.db_path + "/" + file.name;
} else {
std::string file2 = file.db_path + "/" + file.name;
// Another thread starts a compact files and creates an L0 compaction
// The background compaction then notices that there is an L0 compaction
// already in progress and doesn't do an L0 compaction
// Once the background compaction finishes, the compact files finishes
ASSERT_OK(
db->CompactFiles(rocksdb::CompactionOptions(), {file1, file2}, 0));
break;
}
}
rocksdb::SyncPoint::GetInstance()->DisableProcessing();
delete db;
}
TEST_F(CompactFilesTest, ObsoleteFiles) {
Options options;
// to trigger compaction more easily
const int kWriteBufferSize = 65536;
options.create_if_missing = true;
// Disable RocksDB background compaction.
options.compaction_style = kCompactionStyleNone;
options.level0_slowdown_writes_trigger = (1 << 30);
options.level0_stop_writes_trigger = (1 << 30);
options.write_buffer_size = kWriteBufferSize;
options.max_write_buffer_number = 2;
options.compression = kNoCompression;
// Add listener
FlushedFileCollector* collector = new FlushedFileCollector();
options.listeners.emplace_back(collector);
DB* db = nullptr;
DestroyDB(db_name_, options);
Status s = DB::Open(options, db_name_, &db);
assert(s.ok());
assert(db);
// create couple files
for (int i = 1000; i < 2000; ++i) {
db->Put(WriteOptions(), ToString(i),
std::string(kWriteBufferSize / 10, 'a' + (i % 26)));
}
auto l0_files = collector->GetFlushedFiles();
ASSERT_OK(db->CompactFiles(CompactionOptions(), l0_files, 1));
reinterpret_cast<DBImpl*>(db)->TEST_WaitForCompact();
// verify all compaction input files are deleted
for (auto fname : l0_files) {
ASSERT_EQ(Status::NotFound(), env_->FileExists(fname));
}
delete db;
}
TEST_F(CompactFilesTest, NotCutOutputOnLevel0) {
Options options;
options.create_if_missing = true;
// Disable RocksDB background compaction.
options.compaction_style = kCompactionStyleNone;
options.level0_slowdown_writes_trigger = 1000;
options.level0_stop_writes_trigger = 1000;
options.write_buffer_size = 65536;
options.max_write_buffer_number = 2;
options.compression = kNoCompression;
options.max_compaction_bytes = 5000;
// Add listener
FlushedFileCollector* collector = new FlushedFileCollector();
options.listeners.emplace_back(collector);
DB* db = nullptr;
DestroyDB(db_name_, options);
Status s = DB::Open(options, db_name_, &db);
assert(s.ok());
assert(db);
// create couple files
for (int i = 0; i < 500; ++i) {
db->Put(WriteOptions(), ToString(i), std::string(1000, 'a' + (i % 26)));
}
reinterpret_cast<DBImpl*>(db)->TEST_WaitForFlushMemTable();
auto l0_files_1 = collector->GetFlushedFiles();
collector->ClearFlushedFiles();
for (int i = 0; i < 500; ++i) {
db->Put(WriteOptions(), ToString(i), std::string(1000, 'a' + (i % 26)));
}
reinterpret_cast<DBImpl*>(db)->TEST_WaitForFlushMemTable();
auto l0_files_2 = collector->GetFlushedFiles();
ASSERT_OK(db->CompactFiles(CompactionOptions(), l0_files_1, 0));
ASSERT_OK(db->CompactFiles(CompactionOptions(), l0_files_2, 0));
// no assertion failure
delete db;
}
TEST_F(CompactFilesTest, CapturingPendingFiles) {
Options options;
options.create_if_missing = true;
// Disable RocksDB background compaction.
options.compaction_style = kCompactionStyleNone;
// Always do full scans for obsolete files (needed to reproduce the issue).
options.delete_obsolete_files_period_micros = 0;
// Add listener.
FlushedFileCollector* collector = new FlushedFileCollector();
options.listeners.emplace_back(collector);
DB* db = nullptr;
DestroyDB(db_name_, options);
Status s = DB::Open(options, db_name_, &db);
assert(s.ok());
assert(db);
// Create 5 files.
for (int i = 0; i < 5; ++i) {
db->Put(WriteOptions(), "key" + ToString(i), "value");
db->Flush(FlushOptions());
}
auto l0_files = collector->GetFlushedFiles();
EXPECT_EQ(5, l0_files.size());
rocksdb::SyncPoint::GetInstance()->LoadDependency({
{"CompactFilesImpl:2", "CompactFilesTest.CapturingPendingFiles:0"},
{"CompactFilesTest.CapturingPendingFiles:1", "CompactFilesImpl:3"},
});
rocksdb::SyncPoint::GetInstance()->EnableProcessing();
// Start compacting files.
rocksdb::port::Thread compaction_thread(
[&] { EXPECT_OK(db->CompactFiles(CompactionOptions(), l0_files, 1)); });
// In the meantime flush another file.
TEST_SYNC_POINT("CompactFilesTest.CapturingPendingFiles:0");
db->Put(WriteOptions(), "key5", "value");
db->Flush(FlushOptions());
TEST_SYNC_POINT("CompactFilesTest.CapturingPendingFiles:1");
compaction_thread.join();
rocksdb::SyncPoint::GetInstance()->DisableProcessing();
delete db;
// Make sure we can reopen the DB.
s = DB::Open(options, db_name_, &db);
ASSERT_TRUE(s.ok());
assert(db);
delete db;
}
TEST_F(CompactFilesTest, CompactionFilterWithGetSv) {
class FilterWithGet : public CompactionFilter {
public:
bool Filter(int /*level*/, const Slice& /*key*/, const Slice& /*value*/,
std::string* /*new_value*/,
bool* /*value_changed*/) const override {
if (db_ == nullptr) {
return true;
}
std::string res;
db_->Get(ReadOptions(), "", &res);
return true;
}
void SetDB(DB* db) {
db_ = db;
}
const char* Name() const override { return "FilterWithGet"; }
private:
DB* db_;
};
std::shared_ptr<FilterWithGet> cf(new FilterWithGet());
Options options;
options.create_if_missing = true;
options.compaction_filter = cf.get();
DB* db = nullptr;
DestroyDB(db_name_, options);
Status s = DB::Open(options, db_name_, &db);
ASSERT_OK(s);
cf->SetDB(db);
// Write one L0 file
db->Put(WriteOptions(), "K1", "V1");
db->Flush(FlushOptions());
// Compact all L0 files using CompactFiles
rocksdb::ColumnFamilyMetaData meta;
db->GetColumnFamilyMetaData(&meta);
for (auto& file : meta.levels[0].files) {
std::string fname = file.db_path + "/" + file.name;
ASSERT_OK(
db->CompactFiles(rocksdb::CompactionOptions(), {fname}, 0));
}
delete db;
}
TEST_F(CompactFilesTest, SentinelCompressionType) {
if (!Zlib_Supported()) {
fprintf(stderr, "zlib compression not supported, skip this test\n");
return;
}
if (!Snappy_Supported()) {
fprintf(stderr, "snappy compression not supported, skip this test\n");
return;
}
// Check that passing `CompressionType::kDisableCompressionOption` to
// `CompactFiles` causes it to use the column family compression options.
for (auto compaction_style :
{CompactionStyle::kCompactionStyleLevel,
CompactionStyle::kCompactionStyleUniversal,
CompactionStyle::kCompactionStyleNone}) {
DestroyDB(db_name_, Options());
Options options;
options.compaction_style = compaction_style;
// L0: Snappy, L1: ZSTD, L2: Snappy
options.compression_per_level = {CompressionType::kSnappyCompression,
CompressionType::kZlibCompression,
CompressionType::kSnappyCompression};
options.create_if_missing = true;
FlushedFileCollector* collector = new FlushedFileCollector();
options.listeners.emplace_back(collector);
DB* db = nullptr;
ASSERT_OK(DB::Open(options, db_name_, &db));
db->Put(WriteOptions(), "key", "val");
db->Flush(FlushOptions());
auto l0_files = collector->GetFlushedFiles();
ASSERT_EQ(1, l0_files.size());
// L0->L1 compaction, so output should be ZSTD-compressed
CompactionOptions compaction_opts;
compaction_opts.compression = CompressionType::kDisableCompressionOption;
ASSERT_OK(db->CompactFiles(compaction_opts, l0_files, 1));
rocksdb::TablePropertiesCollection all_tables_props;
ASSERT_OK(db->GetPropertiesOfAllTables(&all_tables_props));
for (const auto& name_and_table_props : all_tables_props) {
ASSERT_EQ(CompressionTypeToString(CompressionType::kZlibCompression),
name_and_table_props.second->compression_name);
}
delete db;
}
}
TEST_F(CompactFilesTest, GetCompactionJobInfo) {
Options options;
options.create_if_missing = true;
// Disable RocksDB background compaction.
options.compaction_style = kCompactionStyleNone;
options.level0_slowdown_writes_trigger = 1000;
options.level0_stop_writes_trigger = 1000;
options.write_buffer_size = 65536;
options.max_write_buffer_number = 2;
options.compression = kNoCompression;
options.max_compaction_bytes = 5000;
// Add listener
FlushedFileCollector* collector = new FlushedFileCollector();
options.listeners.emplace_back(collector);
DB* db = nullptr;
DestroyDB(db_name_, options);
Status s = DB::Open(options, db_name_, &db);
assert(s.ok());
assert(db);
// create couple files
for (int i = 0; i < 500; ++i) {
db->Put(WriteOptions(), ToString(i), std::string(1000, 'a' + (i % 26)));
}
reinterpret_cast<DBImpl*>(db)->TEST_WaitForFlushMemTable();
auto l0_files_1 = collector->GetFlushedFiles();
CompactionOptions co;
co.compression = CompressionType::kLZ4Compression;
CompactionJobInfo compaction_job_info;
ASSERT_OK(
db->CompactFiles(co, l0_files_1, 0, -1, nullptr, &compaction_job_info));
ASSERT_EQ(compaction_job_info.base_input_level, 0);
ASSERT_EQ(compaction_job_info.cf_id, db->DefaultColumnFamily()->GetID());
ASSERT_EQ(compaction_job_info.cf_name, db->DefaultColumnFamily()->GetName());
ASSERT_EQ(compaction_job_info.compaction_reason,
CompactionReason::kManualCompaction);
ASSERT_EQ(compaction_job_info.compression, CompressionType::kLZ4Compression);
ASSERT_EQ(compaction_job_info.output_level, 0);
ASSERT_OK(compaction_job_info.status);
// no assertion failure
delete db;
}
} // namespace rocksdb
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
#else
#include <stdio.h>
int main(int /*argc*/, char** /*argv*/) {
fprintf(stderr,
"SKIPPED as DBImpl::CompactFiles is not supported in ROCKSDB_LITE\n");
return 0;
}
#endif // !ROCKSDB_LITE
-160
View File
@@ -1,160 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
#ifndef ROCKSDB_LITE
#include "db/compacted_db_impl.h"
#include "db/db_impl/db_impl.h"
#include "db/version_set.h"
#include "table/get_context.h"
namespace rocksdb {
extern void MarkKeyMayExist(void* arg);
extern bool SaveValue(void* arg, const ParsedInternalKey& parsed_key,
const Slice& v, bool hit_and_return);
CompactedDBImpl::CompactedDBImpl(
const DBOptions& options, const std::string& dbname)
: DBImpl(options, dbname), cfd_(nullptr), version_(nullptr),
user_comparator_(nullptr) {
}
CompactedDBImpl::~CompactedDBImpl() {
}
size_t CompactedDBImpl::FindFile(const Slice& key) {
size_t right = files_.num_files - 1;
auto cmp = [&](const FdWithKeyRange& f, const Slice& k) -> bool {
return user_comparator_->Compare(ExtractUserKey(f.largest_key), k) < 0;
};
return static_cast<size_t>(std::lower_bound(files_.files,
files_.files + right, key, cmp) - files_.files);
}
Status CompactedDBImpl::Get(const ReadOptions& options, ColumnFamilyHandle*,
const Slice& key, PinnableSlice* value) {
GetContext get_context(user_comparator_, nullptr, nullptr, nullptr,
GetContext::kNotFound, key, value, nullptr, nullptr,
nullptr, nullptr);
LookupKey lkey(key, kMaxSequenceNumber);
files_.files[FindFile(key)].fd.table_reader->Get(options, lkey.internal_key(),
&get_context, nullptr);
if (get_context.State() == GetContext::kFound) {
return Status::OK();
}
return Status::NotFound();
}
std::vector<Status> CompactedDBImpl::MultiGet(const ReadOptions& options,
const std::vector<ColumnFamilyHandle*>&,
const std::vector<Slice>& keys, std::vector<std::string>* values) {
autovector<TableReader*, 16> reader_list;
for (const auto& key : keys) {
const FdWithKeyRange& f = files_.files[FindFile(key)];
if (user_comparator_->Compare(key, ExtractUserKey(f.smallest_key)) < 0) {
reader_list.push_back(nullptr);
} else {
LookupKey lkey(key, kMaxSequenceNumber);
f.fd.table_reader->Prepare(lkey.internal_key());
reader_list.push_back(f.fd.table_reader);
}
}
std::vector<Status> statuses(keys.size(), Status::NotFound());
values->resize(keys.size());
int idx = 0;
for (auto* r : reader_list) {
if (r != nullptr) {
PinnableSlice pinnable_val;
std::string& value = (*values)[idx];
GetContext get_context(user_comparator_, nullptr, nullptr, nullptr,
GetContext::kNotFound, keys[idx], &pinnable_val,
nullptr, nullptr, nullptr, nullptr);
LookupKey lkey(keys[idx], kMaxSequenceNumber);
r->Get(options, lkey.internal_key(), &get_context, nullptr);
value.assign(pinnable_val.data(), pinnable_val.size());
if (get_context.State() == GetContext::kFound) {
statuses[idx] = Status::OK();
}
}
++idx;
}
return statuses;
}
Status CompactedDBImpl::Init(const Options& options) {
SuperVersionContext sv_context(/* create_superversion */ true);
mutex_.Lock();
ColumnFamilyDescriptor cf(kDefaultColumnFamilyName,
ColumnFamilyOptions(options));
Status s = Recover({cf}, true /* read only */, false, true);
if (s.ok()) {
cfd_ = reinterpret_cast<ColumnFamilyHandleImpl*>(
DefaultColumnFamily())->cfd();
cfd_->InstallSuperVersion(&sv_context, &mutex_);
}
mutex_.Unlock();
sv_context.Clean();
if (!s.ok()) {
return s;
}
NewThreadStatusCfInfo(cfd_);
version_ = cfd_->GetSuperVersion()->current;
user_comparator_ = cfd_->user_comparator();
auto* vstorage = version_->storage_info();
if (vstorage->num_non_empty_levels() == 0) {
return Status::NotSupported("no file exists");
}
const LevelFilesBrief& l0 = vstorage->LevelFilesBrief(0);
// L0 should not have files
if (l0.num_files > 1) {
return Status::NotSupported("L0 contain more than 1 file");
}
if (l0.num_files == 1) {
if (vstorage->num_non_empty_levels() > 1) {
return Status::NotSupported("Both L0 and other level contain files");
}
files_ = l0;
return Status::OK();
}
for (int i = 1; i < vstorage->num_non_empty_levels() - 1; ++i) {
if (vstorage->LevelFilesBrief(i).num_files > 0) {
return Status::NotSupported("Other levels also contain files");
}
}
int level = vstorage->num_non_empty_levels() - 1;
if (vstorage->LevelFilesBrief(level).num_files > 0) {
files_ = vstorage->LevelFilesBrief(level);
return Status::OK();
}
return Status::NotSupported("no file exists");
}
Status CompactedDBImpl::Open(const Options& options,
const std::string& dbname, DB** dbptr) {
*dbptr = nullptr;
if (options.max_open_files != -1) {
return Status::InvalidArgument("require max_open_files = -1");
}
if (options.merge_operator.get() != nullptr) {
return Status::InvalidArgument("merge operator is not supported");
}
DBOptions db_options(options);
std::unique_ptr<CompactedDBImpl> db(new CompactedDBImpl(db_options, dbname));
Status s = db->Init(options);
if (s.ok()) {
db->StartTimedTasks();
ROCKS_LOG_INFO(db->immutable_db_options_.info_log,
"Opened the db as fully compacted mode");
LogFlush(db->immutable_db_options_.info_log);
*dbptr = db.release();
}
return s;
}
} // namespace rocksdb
#endif // ROCKSDB_LITE
-113
View File
@@ -1,113 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
#pragma once
#ifndef ROCKSDB_LITE
#include <string>
#include <vector>
#include "db/db_impl/db_impl.h"
namespace rocksdb {
class CompactedDBImpl : public DBImpl {
public:
CompactedDBImpl(const DBOptions& options, const std::string& dbname);
virtual ~CompactedDBImpl();
static Status Open(const Options& options, const std::string& dbname,
DB** dbptr);
// Implementations of the DB interface
using DB::Get;
virtual Status Get(const ReadOptions& options,
ColumnFamilyHandle* column_family, const Slice& key,
PinnableSlice* value) override;
using DB::MultiGet;
virtual std::vector<Status> MultiGet(
const ReadOptions& options,
const std::vector<ColumnFamilyHandle*>&,
const std::vector<Slice>& keys, std::vector<std::string>* values)
override;
using DBImpl::Put;
virtual Status Put(const WriteOptions& /*options*/,
ColumnFamilyHandle* /*column_family*/,
const Slice& /*key*/, const Slice& /*value*/) override {
return Status::NotSupported("Not supported in compacted db mode.");
}
using DBImpl::Merge;
virtual Status Merge(const WriteOptions& /*options*/,
ColumnFamilyHandle* /*column_family*/,
const Slice& /*key*/, const Slice& /*value*/) override {
return Status::NotSupported("Not supported in compacted db mode.");
}
using DBImpl::Delete;
virtual Status Delete(const WriteOptions& /*options*/,
ColumnFamilyHandle* /*column_family*/,
const Slice& /*key*/) override {
return Status::NotSupported("Not supported in compacted db mode.");
}
virtual Status Write(const WriteOptions& /*options*/,
WriteBatch* /*updates*/) override {
return Status::NotSupported("Not supported in compacted db mode.");
}
using DBImpl::CompactRange;
virtual Status CompactRange(const CompactRangeOptions& /*options*/,
ColumnFamilyHandle* /*column_family*/,
const Slice* /*begin*/,
const Slice* /*end*/) override {
return Status::NotSupported("Not supported in compacted db mode.");
}
virtual Status DisableFileDeletions() override {
return Status::NotSupported("Not supported in compacted db mode.");
}
virtual Status EnableFileDeletions(bool /*force*/) override {
return Status::NotSupported("Not supported in compacted db mode.");
}
virtual Status GetLiveFiles(std::vector<std::string>& ret,
uint64_t* manifest_file_size,
bool /*flush_memtable*/) override {
return DBImpl::GetLiveFiles(ret, manifest_file_size,
false /* flush_memtable */);
}
using DBImpl::Flush;
virtual Status Flush(const FlushOptions& /*options*/,
ColumnFamilyHandle* /*column_family*/) override {
return Status::NotSupported("Not supported in compacted db mode.");
}
using DB::IngestExternalFile;
virtual Status IngestExternalFile(
ColumnFamilyHandle* /*column_family*/,
const std::vector<std::string>& /*external_files*/,
const IngestExternalFileOptions& /*ingestion_options*/) override {
return Status::NotSupported("Not supported in compacted db mode.");
}
using DB::CreateColumnFamilyWithImport;
virtual Status CreateColumnFamilyWithImport(
const ColumnFamilyOptions& /*options*/,
const std::string& /*column_family_name*/,
const ImportColumnFamilyOptions& /*import_options*/,
const ExportImportFilesMetaData& /*metadata*/,
ColumnFamilyHandle** /*handle*/) override {
return Status::NotSupported("Not supported in compacted db mode.");
}
private:
friend class DB;
inline size_t FindFile(const Slice& key);
Status Init(const Options& options);
ColumnFamilyData* cfd_;
Version* version_;
const Comparator* user_comparator_;
LevelFilesBrief files_;
// No copying allowed
CompactedDBImpl(const CompactedDBImpl&);
void operator=(const CompactedDBImpl&);
};
}
#endif // ROCKSDB_LITE
-565
View File
@@ -1,565 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#include <cinttypes>
#include <vector>
#include "db/column_family.h"
#include "db/compaction/compaction.h"
#include "rocksdb/compaction_filter.h"
#include "test_util/sync_point.h"
#include "util/string_util.h"
namespace rocksdb {
const uint64_t kRangeTombstoneSentinel =
PackSequenceAndType(kMaxSequenceNumber, kTypeRangeDeletion);
int sstableKeyCompare(const Comparator* user_cmp, const InternalKey& a,
const InternalKey& b) {
auto c = user_cmp->Compare(a.user_key(), b.user_key());
if (c != 0) {
return c;
}
auto a_footer = ExtractInternalKeyFooter(a.Encode());
auto b_footer = ExtractInternalKeyFooter(b.Encode());
if (a_footer == kRangeTombstoneSentinel) {
if (b_footer != kRangeTombstoneSentinel) {
return -1;
}
} else if (b_footer == kRangeTombstoneSentinel) {
return 1;
}
return 0;
}
int sstableKeyCompare(const Comparator* user_cmp, const InternalKey* a,
const InternalKey& b) {
if (a == nullptr) {
return -1;
}
return sstableKeyCompare(user_cmp, *a, b);
}
int sstableKeyCompare(const Comparator* user_cmp, const InternalKey& a,
const InternalKey* b) {
if (b == nullptr) {
return -1;
}
return sstableKeyCompare(user_cmp, a, *b);
}
uint64_t TotalFileSize(const std::vector<FileMetaData*>& files) {
uint64_t sum = 0;
for (size_t i = 0; i < files.size() && files[i]; i++) {
sum += files[i]->fd.GetFileSize();
}
return sum;
}
void Compaction::SetInputVersion(Version* _input_version) {
input_version_ = _input_version;
cfd_ = input_version_->cfd();
cfd_->Ref();
input_version_->Ref();
edit_.SetColumnFamily(cfd_->GetID());
}
void Compaction::GetBoundaryKeys(
VersionStorageInfo* vstorage,
const std::vector<CompactionInputFiles>& inputs, Slice* smallest_user_key,
Slice* largest_user_key) {
bool initialized = false;
const Comparator* ucmp = vstorage->InternalComparator()->user_comparator();
for (size_t i = 0; i < inputs.size(); ++i) {
if (inputs[i].files.empty()) {
continue;
}
if (inputs[i].level == 0) {
// we need to consider all files on level 0
for (const auto* f : inputs[i].files) {
const Slice& start_user_key = f->smallest.user_key();
if (!initialized ||
ucmp->Compare(start_user_key, *smallest_user_key) < 0) {
*smallest_user_key = start_user_key;
}
const Slice& end_user_key = f->largest.user_key();
if (!initialized ||
ucmp->Compare(end_user_key, *largest_user_key) > 0) {
*largest_user_key = end_user_key;
}
initialized = true;
}
} else {
// we only need to consider the first and last file
const Slice& start_user_key = inputs[i].files[0]->smallest.user_key();
if (!initialized ||
ucmp->Compare(start_user_key, *smallest_user_key) < 0) {
*smallest_user_key = start_user_key;
}
const Slice& end_user_key = inputs[i].files.back()->largest.user_key();
if (!initialized || ucmp->Compare(end_user_key, *largest_user_key) > 0) {
*largest_user_key = end_user_key;
}
initialized = true;
}
}
}
std::vector<CompactionInputFiles> Compaction::PopulateWithAtomicBoundaries(
VersionStorageInfo* vstorage, std::vector<CompactionInputFiles> inputs) {
const Comparator* ucmp = vstorage->InternalComparator()->user_comparator();
for (size_t i = 0; i < inputs.size(); i++) {
if (inputs[i].level == 0 || inputs[i].files.empty()) {
continue;
}
inputs[i].atomic_compaction_unit_boundaries.reserve(inputs[i].files.size());
AtomicCompactionUnitBoundary cur_boundary;
size_t first_atomic_idx = 0;
auto add_unit_boundary = [&](size_t to) {
if (first_atomic_idx == to) return;
for (size_t k = first_atomic_idx; k < to; k++) {
inputs[i].atomic_compaction_unit_boundaries.push_back(cur_boundary);
}
first_atomic_idx = to;
};
for (size_t j = 0; j < inputs[i].files.size(); j++) {
const auto* f = inputs[i].files[j];
if (j == 0) {
// First file in a level.
cur_boundary.smallest = &f->smallest;
cur_boundary.largest = &f->largest;
} else if (sstableKeyCompare(ucmp, *cur_boundary.largest, f->smallest) ==
0) {
// SSTs overlap but the end key of the previous file was not
// artificially extended by a range tombstone. Extend the current
// boundary.
cur_boundary.largest = &f->largest;
} else {
// Atomic compaction unit has ended.
add_unit_boundary(j);
cur_boundary.smallest = &f->smallest;
cur_boundary.largest = &f->largest;
}
}
add_unit_boundary(inputs[i].files.size());
assert(inputs[i].files.size() ==
inputs[i].atomic_compaction_unit_boundaries.size());
}
return inputs;
}
// helper function to determine if compaction is creating files at the
// bottommost level
bool Compaction::IsBottommostLevel(
int output_level, VersionStorageInfo* vstorage,
const std::vector<CompactionInputFiles>& inputs) {
int output_l0_idx;
if (output_level == 0) {
output_l0_idx = 0;
for (const auto* file : vstorage->LevelFiles(0)) {
if (inputs[0].files.back() == file) {
break;
}
++output_l0_idx;
}
assert(static_cast<size_t>(output_l0_idx) < vstorage->LevelFiles(0).size());
} else {
output_l0_idx = -1;
}
Slice smallest_key, largest_key;
GetBoundaryKeys(vstorage, inputs, &smallest_key, &largest_key);
return !vstorage->RangeMightExistAfterSortedRun(smallest_key, largest_key,
output_level, output_l0_idx);
}
// test function to validate the functionality of IsBottommostLevel()
// function -- determines if compaction with inputs and storage is bottommost
bool Compaction::TEST_IsBottommostLevel(
int output_level, VersionStorageInfo* vstorage,
const std::vector<CompactionInputFiles>& inputs) {
return IsBottommostLevel(output_level, vstorage, inputs);
}
bool Compaction::IsFullCompaction(
VersionStorageInfo* vstorage,
const std::vector<CompactionInputFiles>& inputs) {
size_t num_files_in_compaction = 0;
size_t total_num_files = 0;
for (int l = 0; l < vstorage->num_levels(); l++) {
total_num_files += vstorage->NumLevelFiles(l);
}
for (size_t i = 0; i < inputs.size(); i++) {
num_files_in_compaction += inputs[i].size();
}
return num_files_in_compaction == total_num_files;
}
Compaction::Compaction(VersionStorageInfo* vstorage,
const ImmutableCFOptions& _immutable_cf_options,
const MutableCFOptions& _mutable_cf_options,
std::vector<CompactionInputFiles> _inputs,
int _output_level, uint64_t _target_file_size,
uint64_t _max_compaction_bytes, uint32_t _output_path_id,
CompressionType _compression,
CompressionOptions _compression_opts,
uint32_t _max_subcompactions,
std::vector<FileMetaData*> _grandparents,
bool _manual_compaction, double _score,
bool _deletion_compaction,
CompactionReason _compaction_reason)
: input_vstorage_(vstorage),
start_level_(_inputs[0].level),
output_level_(_output_level),
max_output_file_size_(_target_file_size),
max_compaction_bytes_(_max_compaction_bytes),
max_subcompactions_(_max_subcompactions),
immutable_cf_options_(_immutable_cf_options),
mutable_cf_options_(_mutable_cf_options),
input_version_(nullptr),
number_levels_(vstorage->num_levels()),
cfd_(nullptr),
output_path_id_(_output_path_id),
output_compression_(_compression),
output_compression_opts_(_compression_opts),
deletion_compaction_(_deletion_compaction),
inputs_(PopulateWithAtomicBoundaries(vstorage, std::move(_inputs))),
grandparents_(std::move(_grandparents)),
score_(_score),
bottommost_level_(IsBottommostLevel(output_level_, vstorage, inputs_)),
is_full_compaction_(IsFullCompaction(vstorage, inputs_)),
is_manual_compaction_(_manual_compaction),
is_trivial_move_(false),
compaction_reason_(_compaction_reason) {
MarkFilesBeingCompacted(true);
if (is_manual_compaction_) {
compaction_reason_ = CompactionReason::kManualCompaction;
}
if (max_subcompactions_ == 0) {
max_subcompactions_ = immutable_cf_options_.max_subcompactions;
}
if (!bottommost_level_) {
// Currently we only enable dictionary compression during compaction to the
// bottommost level.
output_compression_opts_.max_dict_bytes = 0;
output_compression_opts_.zstd_max_train_bytes = 0;
}
#ifndef NDEBUG
for (size_t i = 1; i < inputs_.size(); ++i) {
assert(inputs_[i].level > inputs_[i - 1].level);
}
#endif
// setup input_levels_
{
input_levels_.resize(num_input_levels());
for (size_t which = 0; which < num_input_levels(); which++) {
DoGenerateLevelFilesBrief(&input_levels_[which], inputs_[which].files,
&arena_);
}
}
GetBoundaryKeys(vstorage, inputs_, &smallest_user_key_, &largest_user_key_);
}
Compaction::~Compaction() {
if (input_version_ != nullptr) {
input_version_->Unref();
}
if (cfd_ != nullptr) {
if (cfd_->Unref()) {
delete cfd_;
}
}
}
bool Compaction::InputCompressionMatchesOutput() const {
int base_level = input_vstorage_->base_level();
bool matches = (GetCompressionType(immutable_cf_options_, input_vstorage_,
mutable_cf_options_, start_level_,
base_level) == output_compression_);
if (matches) {
TEST_SYNC_POINT("Compaction::InputCompressionMatchesOutput:Matches");
return true;
}
TEST_SYNC_POINT("Compaction::InputCompressionMatchesOutput:DidntMatch");
return matches;
}
bool Compaction::IsTrivialMove() const {
// Avoid a move if there is lots of overlapping grandparent data.
// Otherwise, the move could create a parent file that will require
// a very expensive merge later on.
// If start_level_== output_level_, the purpose is to force compaction
// filter to be applied to that level, and thus cannot be a trivial move.
// Check if start level have files with overlapping ranges
if (start_level_ == 0 && input_vstorage_->level0_non_overlapping() == false) {
// We cannot move files from L0 to L1 if the files are overlapping
return false;
}
if (is_manual_compaction_ &&
(immutable_cf_options_.compaction_filter != nullptr ||
immutable_cf_options_.compaction_filter_factory != nullptr)) {
// This is a manual compaction and we have a compaction filter that should
// be executed, we cannot do a trivial move
return false;
}
// Used in universal compaction, where trivial move can be done if the
// input files are non overlapping
if ((mutable_cf_options_.compaction_options_universal.allow_trivial_move) &&
(output_level_ != 0)) {
return is_trivial_move_;
}
if (!(start_level_ != output_level_ && num_input_levels() == 1 &&
input(0, 0)->fd.GetPathId() == output_path_id() &&
InputCompressionMatchesOutput())) {
return false;
}
// assert inputs_.size() == 1
for (const auto& file : inputs_.front().files) {
std::vector<FileMetaData*> file_grand_parents;
if (output_level_ + 1 >= number_levels_) {
continue;
}
input_vstorage_->GetOverlappingInputs(output_level_ + 1, &file->smallest,
&file->largest, &file_grand_parents);
const auto compaction_size =
file->fd.GetFileSize() + TotalFileSize(file_grand_parents);
if (compaction_size > max_compaction_bytes_) {
return false;
}
}
return true;
}
void Compaction::AddInputDeletions(VersionEdit* out_edit) {
for (size_t which = 0; which < num_input_levels(); which++) {
for (size_t i = 0; i < inputs_[which].size(); i++) {
out_edit->DeleteFile(level(which), inputs_[which][i]->fd.GetNumber());
}
}
}
bool Compaction::KeyNotExistsBeyondOutputLevel(
const Slice& user_key, std::vector<size_t>* level_ptrs) const {
assert(input_version_ != nullptr);
assert(level_ptrs != nullptr);
assert(level_ptrs->size() == static_cast<size_t>(number_levels_));
if (bottommost_level_) {
return true;
} else if (output_level_ != 0 &&
cfd_->ioptions()->compaction_style == kCompactionStyleLevel) {
// Maybe use binary search to find right entry instead of linear search?
const Comparator* user_cmp = cfd_->user_comparator();
for (int lvl = output_level_ + 1; lvl < number_levels_; lvl++) {
const std::vector<FileMetaData*>& files =
input_vstorage_->LevelFiles(lvl);
for (; level_ptrs->at(lvl) < files.size(); level_ptrs->at(lvl)++) {
auto* f = files[level_ptrs->at(lvl)];
if (user_cmp->Compare(user_key, f->largest.user_key()) <= 0) {
// We've advanced far enough
if (user_cmp->Compare(user_key, f->smallest.user_key()) >= 0) {
// Key falls in this file's range, so it may
// exist beyond output level
return false;
}
break;
}
}
}
return true;
}
return false;
}
// Mark (or clear) each file that is being compacted
void Compaction::MarkFilesBeingCompacted(bool mark_as_compacted) {
for (size_t i = 0; i < num_input_levels(); i++) {
for (size_t j = 0; j < inputs_[i].size(); j++) {
assert(mark_as_compacted ? !inputs_[i][j]->being_compacted
: inputs_[i][j]->being_compacted);
inputs_[i][j]->being_compacted = mark_as_compacted;
}
}
}
// Sample output:
// If compacting 3 L0 files, 2 L3 files and 1 L4 file, and outputting to L5,
// print: "3@0 + 2@3 + 1@4 files to L5"
const char* Compaction::InputLevelSummary(
InputLevelSummaryBuffer* scratch) const {
int len = 0;
bool is_first = true;
for (auto& input_level : inputs_) {
if (input_level.empty()) {
continue;
}
if (!is_first) {
len +=
snprintf(scratch->buffer + len, sizeof(scratch->buffer) - len, " + ");
len = std::min(len, static_cast<int>(sizeof(scratch->buffer)));
} else {
is_first = false;
}
len += snprintf(scratch->buffer + len, sizeof(scratch->buffer) - len,
"%" ROCKSDB_PRIszt "@%d", input_level.size(),
input_level.level);
len = std::min(len, static_cast<int>(sizeof(scratch->buffer)));
}
snprintf(scratch->buffer + len, sizeof(scratch->buffer) - len,
" files to L%d", output_level());
return scratch->buffer;
}
uint64_t Compaction::CalculateTotalInputSize() const {
uint64_t size = 0;
for (auto& input_level : inputs_) {
for (auto f : input_level.files) {
size += f->fd.GetFileSize();
}
}
return size;
}
void Compaction::ReleaseCompactionFiles(Status status) {
MarkFilesBeingCompacted(false);
cfd_->compaction_picker()->ReleaseCompactionFiles(this, status);
}
void Compaction::ResetNextCompactionIndex() {
assert(input_version_ != nullptr);
input_vstorage_->ResetNextCompactionIndex(start_level_);
}
namespace {
int InputSummary(const std::vector<FileMetaData*>& files, char* output,
int len) {
*output = '\0';
int write = 0;
for (size_t i = 0; i < files.size(); i++) {
int sz = len - write;
int ret;
char sztxt[16];
AppendHumanBytes(files.at(i)->fd.GetFileSize(), sztxt, 16);
ret = snprintf(output + write, sz, "%" PRIu64 "(%s) ",
files.at(i)->fd.GetNumber(), sztxt);
if (ret < 0 || ret >= sz) break;
write += ret;
}
// if files.size() is non-zero, overwrite the last space
return write - !!files.size();
}
} // namespace
void Compaction::Summary(char* output, int len) {
int write =
snprintf(output, len, "Base version %" PRIu64 " Base level %d, inputs: [",
input_version_->GetVersionNumber(), start_level_);
if (write < 0 || write >= len) {
return;
}
for (size_t level_iter = 0; level_iter < num_input_levels(); ++level_iter) {
if (level_iter > 0) {
write += snprintf(output + write, len - write, "], [");
if (write < 0 || write >= len) {
return;
}
}
write +=
InputSummary(inputs_[level_iter].files, output + write, len - write);
if (write < 0 || write >= len) {
return;
}
}
snprintf(output + write, len - write, "]");
}
uint64_t Compaction::OutputFilePreallocationSize() const {
uint64_t preallocation_size = 0;
for (const auto& level_files : inputs_) {
for (const auto& file : level_files.files) {
preallocation_size += file->fd.GetFileSize();
}
}
if (max_output_file_size_ != port::kMaxUint64 &&
(immutable_cf_options_.compaction_style == kCompactionStyleLevel ||
output_level() > 0)) {
preallocation_size = std::min(max_output_file_size_, preallocation_size);
}
// Over-estimate slightly so we don't end up just barely crossing
// the threshold
// No point to prellocate more than 1GB.
return std::min(uint64_t{1073741824},
preallocation_size + (preallocation_size / 10));
}
std::unique_ptr<CompactionFilter> Compaction::CreateCompactionFilter() const {
if (!cfd_->ioptions()->compaction_filter_factory) {
return nullptr;
}
CompactionFilter::Context context;
context.is_full_compaction = is_full_compaction_;
context.is_manual_compaction = is_manual_compaction_;
context.column_family_id = cfd_->GetID();
return cfd_->ioptions()->compaction_filter_factory->CreateCompactionFilter(
context);
}
bool Compaction::IsOutputLevelEmpty() const {
return inputs_.back().level != output_level_ || inputs_.back().empty();
}
bool Compaction::ShouldFormSubcompactions() const {
if (max_subcompactions_ <= 1 || cfd_ == nullptr) {
return false;
}
if (cfd_->ioptions()->compaction_style == kCompactionStyleLevel) {
return (start_level_ == 0 || is_manual_compaction_) && output_level_ > 0 &&
!IsOutputLevelEmpty();
} else if (cfd_->ioptions()->compaction_style == kCompactionStyleUniversal) {
return number_levels_ > 1 && output_level_ > 0;
} else {
return false;
}
}
uint64_t Compaction::MaxInputFileCreationTime() const {
uint64_t max_creation_time = 0;
for (const auto& file : inputs_[0].files) {
if (file->fd.table_reader != nullptr &&
file->fd.table_reader->GetTableProperties() != nullptr) {
uint64_t creation_time =
file->fd.table_reader->GetTableProperties()->creation_time;
max_creation_time = std::max(max_creation_time, creation_time);
}
}
return max_creation_time;
}
int Compaction::GetInputBaseLevel() const {
return input_vstorage_->base_level();
}
} // namespace rocksdb
-384
View File
@@ -1,384 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#include "db/version_set.h"
#include "memory/arena.h"
#include "options/cf_options.h"
#include "util/autovector.h"
namespace rocksdb {
// The file contains class Compaction, as well as some helper functions
// and data structures used by the class.
// Utility for comparing sstable boundary keys. Returns -1 if either a or b is
// null which provides the property that a==null indicates a key that is less
// than any key and b==null indicates a key that is greater than any key. Note
// that the comparison is performed primarily on the user-key portion of the
// key. If the user-keys compare equal, an additional test is made to sort
// range tombstone sentinel keys before other keys with the same user-key. The
// result is that 2 user-keys will compare equal if they differ purely on
// their sequence number and value, but the range tombstone sentinel for that
// user-key will compare not equal. This is necessary because the range
// tombstone sentinel key is set as the largest key for an sstable even though
// that key never appears in the database. We don't want adjacent sstables to
// be considered overlapping if they are separated by the range tombstone
// sentinel.
int sstableKeyCompare(const Comparator* user_cmp, const InternalKey& a,
const InternalKey& b);
int sstableKeyCompare(const Comparator* user_cmp, const InternalKey* a,
const InternalKey& b);
int sstableKeyCompare(const Comparator* user_cmp, const InternalKey& a,
const InternalKey* b);
// An AtomicCompactionUnitBoundary represents a range of keys [smallest,
// largest] that exactly spans one ore more neighbouring SSTs on the same
// level. Every pair of SSTs in this range "overlap" (i.e., the largest
// user key of one file is the smallest user key of the next file). These
// boundaries are propagated down to RangeDelAggregator during compaction
// to provide safe truncation boundaries for range tombstones.
struct AtomicCompactionUnitBoundary {
const InternalKey* smallest = nullptr;
const InternalKey* largest = nullptr;
};
// The structure that manages compaction input files associated
// with the same physical level.
struct CompactionInputFiles {
int level;
std::vector<FileMetaData*> files;
std::vector<AtomicCompactionUnitBoundary> atomic_compaction_unit_boundaries;
inline bool empty() const { return files.empty(); }
inline size_t size() const { return files.size(); }
inline void clear() { files.clear(); }
inline FileMetaData* operator[](size_t i) const { return files[i]; }
};
class Version;
class ColumnFamilyData;
class VersionStorageInfo;
class CompactionFilter;
// A Compaction encapsulates metadata about a compaction.
class Compaction {
public:
Compaction(VersionStorageInfo* input_version,
const ImmutableCFOptions& immutable_cf_options,
const MutableCFOptions& mutable_cf_options,
std::vector<CompactionInputFiles> inputs, int output_level,
uint64_t target_file_size, uint64_t max_compaction_bytes,
uint32_t output_path_id, CompressionType compression,
CompressionOptions compression_opts, uint32_t max_subcompactions,
std::vector<FileMetaData*> grandparents,
bool manual_compaction = false, double score = -1,
bool deletion_compaction = false,
CompactionReason compaction_reason = CompactionReason::kUnknown);
// No copying allowed
Compaction(const Compaction&) = delete;
void operator=(const Compaction&) = delete;
~Compaction();
// Returns the level associated to the specified compaction input level.
// If compaction_input_level is not specified, then input_level is set to 0.
int level(size_t compaction_input_level = 0) const {
return inputs_[compaction_input_level].level;
}
int start_level() const { return start_level_; }
// Outputs will go to this level
int output_level() const { return output_level_; }
// Returns the number of input levels in this compaction.
size_t num_input_levels() const { return inputs_.size(); }
// Return the object that holds the edits to the descriptor done
// by this compaction.
VersionEdit* edit() { return &edit_; }
// Returns the number of input files associated to the specified
// compaction input level.
// The function will return 0 if when "compaction_input_level" < 0
// or "compaction_input_level" >= "num_input_levels()".
size_t num_input_files(size_t compaction_input_level) const {
if (compaction_input_level < inputs_.size()) {
return inputs_[compaction_input_level].size();
}
return 0;
}
// Returns input version of the compaction
Version* input_version() const { return input_version_; }
// Returns the ColumnFamilyData associated with the compaction.
ColumnFamilyData* column_family_data() const { return cfd_; }
// Returns the file meta data of the 'i'th input file at the
// specified compaction input level.
// REQUIREMENT: "compaction_input_level" must be >= 0 and
// < "input_levels()"
FileMetaData* input(size_t compaction_input_level, size_t i) const {
assert(compaction_input_level < inputs_.size());
return inputs_[compaction_input_level][i];
}
const std::vector<AtomicCompactionUnitBoundary>* boundaries(
size_t compaction_input_level) const {
assert(compaction_input_level < inputs_.size());
return &inputs_[compaction_input_level].atomic_compaction_unit_boundaries;
}
// Returns the list of file meta data of the specified compaction
// input level.
// REQUIREMENT: "compaction_input_level" must be >= 0 and
// < "input_levels()"
const std::vector<FileMetaData*>* inputs(
size_t compaction_input_level) const {
assert(compaction_input_level < inputs_.size());
return &inputs_[compaction_input_level].files;
}
const std::vector<CompactionInputFiles>* inputs() { return &inputs_; }
// Returns the LevelFilesBrief of the specified compaction input level.
const LevelFilesBrief* input_levels(size_t compaction_input_level) const {
return &input_levels_[compaction_input_level];
}
// Maximum size of files to build during this compaction.
uint64_t max_output_file_size() const { return max_output_file_size_; }
// What compression for output
CompressionType output_compression() const { return output_compression_; }
// What compression options for output
CompressionOptions output_compression_opts() const {
return output_compression_opts_;
}
// Whether need to write output file to second DB path.
uint32_t output_path_id() const { return output_path_id_; }
// Is this a trivial compaction that can be implemented by just
// moving a single input file to the next level (no merging or splitting)
bool IsTrivialMove() const;
// If true, then the compaction can be done by simply deleting input files.
bool deletion_compaction() const { return deletion_compaction_; }
// Add all inputs to this compaction as delete operations to *edit.
void AddInputDeletions(VersionEdit* edit);
// Returns true if the available information we have guarantees that
// the input "user_key" does not exist in any level beyond "output_level()".
bool KeyNotExistsBeyondOutputLevel(const Slice& user_key,
std::vector<size_t>* level_ptrs) const;
// Clear all files to indicate that they are not being compacted
// Delete this compaction from the list of running compactions.
//
// Requirement: DB mutex held
void ReleaseCompactionFiles(Status status);
// Returns the summary of the compaction in "output" with maximum "len"
// in bytes. The caller is responsible for the memory management of
// "output".
void Summary(char* output, int len);
// Return the score that was used to pick this compaction run.
double score() const { return score_; }
// Is this compaction creating a file in the bottom most level?
bool bottommost_level() const { return bottommost_level_; }
// Does this compaction include all sst files?
bool is_full_compaction() const { return is_full_compaction_; }
// Was this compaction triggered manually by the client?
bool is_manual_compaction() const { return is_manual_compaction_; }
// Used when allow_trivial_move option is set in
// Universal compaction. If all the input files are
// non overlapping, then is_trivial_move_ variable
// will be set true, else false
void set_is_trivial_move(bool trivial_move) {
is_trivial_move_ = trivial_move;
}
// Used when allow_trivial_move option is set in
// Universal compaction. Returns true, if the input files
// are non-overlapping and can be trivially moved.
bool is_trivial_move() const { return is_trivial_move_; }
// How many total levels are there?
int number_levels() const { return number_levels_; }
// Return the ImmutableCFOptions that should be used throughout the compaction
// procedure
const ImmutableCFOptions* immutable_cf_options() const {
return &immutable_cf_options_;
}
// Return the MutableCFOptions that should be used throughout the compaction
// procedure
const MutableCFOptions* mutable_cf_options() const {
return &mutable_cf_options_;
}
// Returns the size in bytes that the output file should be preallocated to.
// In level compaction, that is max_file_size_. In universal compaction, that
// is the sum of all input file sizes.
uint64_t OutputFilePreallocationSize() const;
void SetInputVersion(Version* input_version);
struct InputLevelSummaryBuffer {
char buffer[128];
};
const char* InputLevelSummary(InputLevelSummaryBuffer* scratch) const;
uint64_t CalculateTotalInputSize() const;
// In case of compaction error, reset the nextIndex that is used
// to pick up the next file to be compacted from files_by_size_
void ResetNextCompactionIndex();
// Create a CompactionFilter from compaction_filter_factory
std::unique_ptr<CompactionFilter> CreateCompactionFilter() const;
// Is the input level corresponding to output_level_ empty?
bool IsOutputLevelEmpty() const;
// Should this compaction be broken up into smaller ones run in parallel?
bool ShouldFormSubcompactions() const;
// test function to validate the functionality of IsBottommostLevel()
// function -- determines if compaction with inputs and storage is bottommost
static bool TEST_IsBottommostLevel(
int output_level, VersionStorageInfo* vstorage,
const std::vector<CompactionInputFiles>& inputs);
TablePropertiesCollection GetOutputTableProperties() const {
return output_table_properties_;
}
void SetOutputTableProperties(TablePropertiesCollection tp) {
output_table_properties_ = std::move(tp);
}
Slice GetSmallestUserKey() const { return smallest_user_key_; }
Slice GetLargestUserKey() const { return largest_user_key_; }
int GetInputBaseLevel() const;
CompactionReason compaction_reason() { return compaction_reason_; }
const std::vector<FileMetaData*>& grandparents() const {
return grandparents_;
}
uint64_t max_compaction_bytes() const { return max_compaction_bytes_; }
uint32_t max_subcompactions() const { return max_subcompactions_; }
uint64_t MaxInputFileCreationTime() const;
private:
// mark (or clear) all files that are being compacted
void MarkFilesBeingCompacted(bool mark_as_compacted);
// get the smallest and largest key present in files to be compacted
static void GetBoundaryKeys(VersionStorageInfo* vstorage,
const std::vector<CompactionInputFiles>& inputs,
Slice* smallest_key, Slice* largest_key);
// Get the atomic file boundaries for all files in the compaction. Necessary
// in order to avoid the scenario described in
// https://github.com/facebook/rocksdb/pull/4432#discussion_r221072219 and plumb
// down appropriate key boundaries to RangeDelAggregator during compaction.
static std::vector<CompactionInputFiles> PopulateWithAtomicBoundaries(
VersionStorageInfo* vstorage, std::vector<CompactionInputFiles> inputs);
// helper function to determine if compaction with inputs and storage is
// bottommost
static bool IsBottommostLevel(
int output_level, VersionStorageInfo* vstorage,
const std::vector<CompactionInputFiles>& inputs);
static bool IsFullCompaction(VersionStorageInfo* vstorage,
const std::vector<CompactionInputFiles>& inputs);
VersionStorageInfo* input_vstorage_;
const int start_level_; // the lowest level to be compacted
const int output_level_; // levels to which output files are stored
uint64_t max_output_file_size_;
uint64_t max_compaction_bytes_;
uint32_t max_subcompactions_;
const ImmutableCFOptions immutable_cf_options_;
const MutableCFOptions mutable_cf_options_;
Version* input_version_;
VersionEdit edit_;
const int number_levels_;
ColumnFamilyData* cfd_;
Arena arena_; // Arena used to allocate space for file_levels_
const uint32_t output_path_id_;
CompressionType output_compression_;
CompressionOptions output_compression_opts_;
// If true, then the comaction can be done by simply deleting input files.
const bool deletion_compaction_;
// Compaction input files organized by level. Constant after construction
const std::vector<CompactionInputFiles> inputs_;
// A copy of inputs_, organized more closely in memory
autovector<LevelFilesBrief, 2> input_levels_;
// State used to check for number of overlapping grandparent files
// (grandparent == "output_level_ + 1")
std::vector<FileMetaData*> grandparents_;
const double score_; // score that was used to pick this compaction.
// Is this compaction creating a file in the bottom most level?
const bool bottommost_level_;
// Does this compaction include all sst files?
const bool is_full_compaction_;
// Is this compaction requested by the client?
const bool is_manual_compaction_;
// True if we can do trivial move in Universal multi level
// compaction
bool is_trivial_move_;
// Does input compression match the output compression?
bool InputCompressionMatchesOutput() const;
// table properties of output files
TablePropertiesCollection output_table_properties_;
// smallest user keys in compaction
Slice smallest_user_key_;
// largest user keys in compaction
Slice largest_user_key_;
// Reason for compaction
CompactionReason compaction_reason_;
};
// Return sum of sizes of all files in `files`.
extern uint64_t TotalFileSize(const std::vector<FileMetaData*>& files);
} // namespace rocksdb
-35
View File
@@ -1,35 +0,0 @@
// Copyright (c) 2016-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
#pragma once
struct CompactionIterationStats {
// Compaction statistics
// Doesn't include records skipped because of
// CompactionFilter::Decision::kRemoveAndSkipUntil.
int64_t num_record_drop_user = 0;
int64_t num_record_drop_hidden = 0;
int64_t num_record_drop_obsolete = 0;
int64_t num_record_drop_range_del = 0;
int64_t num_range_del_drop_obsolete = 0;
// Deletions obsoleted before bottom level due to file gap optimization.
int64_t num_optimized_del_drop_obsolete = 0;
uint64_t total_filter_time = 0;
// Input statistics
// TODO(noetzli): The stats are incomplete. They are lacking everything
// consumed by MergeHelper.
uint64_t num_input_records = 0;
uint64_t num_input_deletion_records = 0;
uint64_t num_input_corrupt_records = 0;
uint64_t total_input_raw_key_bytes = 0;
uint64_t total_input_raw_value_bytes = 0;
// Single-Delete diagnostics for exceptional situations
uint64_t num_single_del_fallthru = 0;
uint64_t num_single_del_mismatch = 0;
};
-705
View File
@@ -1,705 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
#include "db/compaction/compaction_iterator.h"
#include "db/snapshot_checker.h"
#include "port/likely.h"
#include "rocksdb/listener.h"
#include "table/internal_iterator.h"
#include "test_util/sync_point.h"
#define DEFINITELY_IN_SNAPSHOT(seq, snapshot) \
((seq) <= (snapshot) && \
(snapshot_checker_ == nullptr || \
LIKELY(snapshot_checker_->CheckInSnapshot((seq), (snapshot)) == \
SnapshotCheckerResult::kInSnapshot)))
#define DEFINITELY_NOT_IN_SNAPSHOT(seq, snapshot) \
((seq) > (snapshot) || \
(snapshot_checker_ != nullptr && \
UNLIKELY(snapshot_checker_->CheckInSnapshot((seq), (snapshot)) == \
SnapshotCheckerResult::kNotInSnapshot)))
#define IN_EARLIEST_SNAPSHOT(seq) \
((seq) <= earliest_snapshot_ && \
(snapshot_checker_ == nullptr || LIKELY(IsInEarliestSnapshot(seq))))
namespace rocksdb {
CompactionIterator::CompactionIterator(
InternalIterator* input, const Comparator* cmp, MergeHelper* merge_helper,
SequenceNumber last_sequence, std::vector<SequenceNumber>* snapshots,
SequenceNumber earliest_write_conflict_snapshot,
const SnapshotChecker* snapshot_checker, Env* env,
bool report_detailed_time, bool expect_valid_internal_key,
CompactionRangeDelAggregator* range_del_agg, const Compaction* compaction,
const CompactionFilter* compaction_filter,
const std::atomic<bool>* shutting_down,
const SequenceNumber preserve_deletes_seqnum,
SnapshotListFetchCallback* snap_list_callback)
: CompactionIterator(
input, cmp, merge_helper, last_sequence, snapshots,
earliest_write_conflict_snapshot, snapshot_checker, env,
report_detailed_time, expect_valid_internal_key, range_del_agg,
std::unique_ptr<CompactionProxy>(
compaction ? new CompactionProxy(compaction) : nullptr),
compaction_filter, shutting_down, preserve_deletes_seqnum,
snap_list_callback) {}
CompactionIterator::CompactionIterator(
InternalIterator* input, const Comparator* cmp, MergeHelper* merge_helper,
SequenceNumber /*last_sequence*/, std::vector<SequenceNumber>* snapshots,
SequenceNumber earliest_write_conflict_snapshot,
const SnapshotChecker* snapshot_checker, Env* env,
bool report_detailed_time, bool expect_valid_internal_key,
CompactionRangeDelAggregator* range_del_agg,
std::unique_ptr<CompactionProxy> compaction,
const CompactionFilter* compaction_filter,
const std::atomic<bool>* shutting_down,
const SequenceNumber preserve_deletes_seqnum,
SnapshotListFetchCallback* snap_list_callback)
: input_(input),
cmp_(cmp),
merge_helper_(merge_helper),
snapshots_(snapshots),
earliest_write_conflict_snapshot_(earliest_write_conflict_snapshot),
snapshot_checker_(snapshot_checker),
env_(env),
report_detailed_time_(report_detailed_time),
expect_valid_internal_key_(expect_valid_internal_key),
range_del_agg_(range_del_agg),
compaction_(std::move(compaction)),
compaction_filter_(compaction_filter),
shutting_down_(shutting_down),
preserve_deletes_seqnum_(preserve_deletes_seqnum),
current_user_key_sequence_(0),
current_user_key_snapshot_(0),
merge_out_iter_(merge_helper_),
current_key_committed_(false),
snap_list_callback_(snap_list_callback) {
assert(compaction_filter_ == nullptr || compaction_ != nullptr);
assert(snapshots_ != nullptr);
bottommost_level_ =
compaction_ == nullptr ? false : compaction_->bottommost_level();
if (compaction_ != nullptr) {
level_ptrs_ = std::vector<size_t>(compaction_->number_levels(), 0);
}
ProcessSnapshotList();
input_->SetPinnedItersMgr(&pinned_iters_mgr_);
TEST_SYNC_POINT_CALLBACK("CompactionIterator:AfterInit", compaction_.get());
}
CompactionIterator::~CompactionIterator() {
// input_ Iteartor lifetime is longer than pinned_iters_mgr_ lifetime
input_->SetPinnedItersMgr(nullptr);
}
void CompactionIterator::ResetRecordCounts() {
iter_stats_.num_record_drop_user = 0;
iter_stats_.num_record_drop_hidden = 0;
iter_stats_.num_record_drop_obsolete = 0;
iter_stats_.num_record_drop_range_del = 0;
iter_stats_.num_range_del_drop_obsolete = 0;
iter_stats_.num_optimized_del_drop_obsolete = 0;
}
void CompactionIterator::SeekToFirst() {
NextFromInput();
PrepareOutput();
}
void CompactionIterator::Next() {
// If there is a merge output, return it before continuing to process the
// input.
if (merge_out_iter_.Valid()) {
merge_out_iter_.Next();
// Check if we returned all records of the merge output.
if (merge_out_iter_.Valid()) {
key_ = merge_out_iter_.key();
value_ = merge_out_iter_.value();
bool valid_key __attribute__((__unused__));
valid_key = ParseInternalKey(key_, &ikey_);
// MergeUntil stops when it encounters a corrupt key and does not
// include them in the result, so we expect the keys here to be valid.
assert(valid_key);
// Keep current_key_ in sync.
current_key_.UpdateInternalKey(ikey_.sequence, ikey_.type);
key_ = current_key_.GetInternalKey();
ikey_.user_key = current_key_.GetUserKey();
valid_ = true;
} else {
// We consumed all pinned merge operands, release pinned iterators
pinned_iters_mgr_.ReleasePinnedData();
// MergeHelper moves the iterator to the first record after the merged
// records, so even though we reached the end of the merge output, we do
// not want to advance the iterator.
NextFromInput();
}
} else {
// Only advance the input iterator if there is no merge output and the
// iterator is not already at the next record.
if (!at_next_) {
input_->Next();
}
NextFromInput();
}
if (valid_) {
// Record that we've outputted a record for the current key.
has_outputted_key_ = true;
}
PrepareOutput();
}
void CompactionIterator::InvokeFilterIfNeeded(bool* need_skip,
Slice* skip_until) {
if (compaction_filter_ != nullptr &&
(ikey_.type == kTypeValue || ikey_.type == kTypeBlobIndex)) {
// If the user has specified a compaction filter and the sequence
// number is greater than any external snapshot, then invoke the
// filter. If the return value of the compaction filter is true,
// replace the entry with a deletion marker.
CompactionFilter::Decision filter;
compaction_filter_value_.clear();
compaction_filter_skip_until_.Clear();
CompactionFilter::ValueType value_type =
ikey_.type == kTypeValue ? CompactionFilter::ValueType::kValue
: CompactionFilter::ValueType::kBlobIndex;
// Hack: pass internal key to BlobIndexCompactionFilter since it needs
// to get sequence number.
Slice& filter_key = ikey_.type == kTypeValue ? ikey_.user_key : key_;
{
StopWatchNano timer(env_, report_detailed_time_);
filter = compaction_filter_->FilterV2(
compaction_->level(), filter_key, value_type, value_,
&compaction_filter_value_, compaction_filter_skip_until_.rep());
iter_stats_.total_filter_time +=
env_ != nullptr && report_detailed_time_ ? timer.ElapsedNanos() : 0;
}
if (filter == CompactionFilter::Decision::kRemoveAndSkipUntil &&
cmp_->Compare(*compaction_filter_skip_until_.rep(), ikey_.user_key) <=
0) {
// Can't skip to a key smaller than the current one.
// Keep the key as per FilterV2 documentation.
filter = CompactionFilter::Decision::kKeep;
}
if (filter == CompactionFilter::Decision::kRemove) {
// convert the current key to a delete; key_ is pointing into
// current_key_ at this point, so updating current_key_ updates key()
ikey_.type = kTypeDeletion;
current_key_.UpdateInternalKey(ikey_.sequence, kTypeDeletion);
// no value associated with delete
value_.clear();
iter_stats_.num_record_drop_user++;
} else if (filter == CompactionFilter::Decision::kChangeValue) {
value_ = compaction_filter_value_;
} else if (filter == CompactionFilter::Decision::kRemoveAndSkipUntil) {
*need_skip = true;
compaction_filter_skip_until_.ConvertFromUserKey(kMaxSequenceNumber,
kValueTypeForSeek);
*skip_until = compaction_filter_skip_until_.Encode();
}
}
}
void CompactionIterator::ProcessSnapshotList() {
#ifndef NDEBUG
// findEarliestVisibleSnapshot assumes this ordering.
for (size_t i = 1; i < snapshots_->size(); ++i) {
assert(snapshots_->at(i - 1) < snapshots_->at(i));
}
#endif
if (snapshots_->size() == 0) {
// optimize for fast path if there are no snapshots
visible_at_tip_ = true;
earliest_snapshot_iter_ = snapshots_->end();
earliest_snapshot_ = kMaxSequenceNumber;
latest_snapshot_ = 0;
} else {
visible_at_tip_ = false;
earliest_snapshot_iter_ = snapshots_->begin();
earliest_snapshot_ = snapshots_->at(0);
latest_snapshot_ = snapshots_->back();
}
released_snapshots_.clear();
}
void CompactionIterator::NextFromInput() {
at_next_ = false;
valid_ = false;
while (!valid_ && input_->Valid() && !IsShuttingDown()) {
key_ = input_->key();
value_ = input_->value();
iter_stats_.num_input_records++;
if (!ParseInternalKey(key_, &ikey_)) {
// If `expect_valid_internal_key_` is false, return the corrupted key
// and let the caller decide what to do with it.
// TODO(noetzli): We should have a more elegant solution for this.
if (expect_valid_internal_key_) {
assert(!"Corrupted internal key not expected.");
status_ = Status::Corruption("Corrupted internal key not expected.");
break;
}
key_ = current_key_.SetInternalKey(key_);
has_current_user_key_ = false;
current_user_key_sequence_ = kMaxSequenceNumber;
current_user_key_snapshot_ = 0;
iter_stats_.num_input_corrupt_records++;
valid_ = true;
break;
}
TEST_SYNC_POINT_CALLBACK("CompactionIterator:ProcessKV", &ikey_);
// Update input statistics
if (ikey_.type == kTypeDeletion || ikey_.type == kTypeSingleDeletion) {
iter_stats_.num_input_deletion_records++;
}
iter_stats_.total_input_raw_key_bytes += key_.size();
iter_stats_.total_input_raw_value_bytes += value_.size();
// If need_skip is true, we should seek the input iterator
// to internal key skip_until and continue from there.
bool need_skip = false;
// Points either into compaction_filter_skip_until_ or into
// merge_helper_->compaction_filter_skip_until_.
Slice skip_until;
// Check whether the user key changed. After this if statement current_key_
// is a copy of the current input key (maybe converted to a delete by the
// compaction filter). ikey_.user_key is pointing to the copy.
if (!has_current_user_key_ ||
!cmp_->Equal(ikey_.user_key, current_user_key_)) {
num_keys_++;
// Use num_keys_ to reduce the overhead of reading current time
if (snap_list_callback_ && snapshots_->size() &&
snap_list_callback_->TimeToRefresh(num_keys_)) {
snap_list_callback_->Refresh(snapshots_, latest_snapshot_);
ProcessSnapshotList();
}
// First occurrence of this user key
// Copy key for output
key_ = current_key_.SetInternalKey(key_, &ikey_);
current_user_key_ = ikey_.user_key;
has_current_user_key_ = true;
has_outputted_key_ = false;
current_user_key_sequence_ = kMaxSequenceNumber;
current_user_key_snapshot_ = 0;
current_key_committed_ = KeyCommitted(ikey_.sequence);
// Apply the compaction filter to the first committed version of the user
// key.
if (current_key_committed_) {
InvokeFilterIfNeeded(&need_skip, &skip_until);
}
} else {
// Update the current key to reflect the new sequence number/type without
// copying the user key.
// TODO(rven): Compaction filter does not process keys in this path
// Need to have the compaction filter process multiple versions
// if we have versions on both sides of a snapshot
current_key_.UpdateInternalKey(ikey_.sequence, ikey_.type);
key_ = current_key_.GetInternalKey();
ikey_.user_key = current_key_.GetUserKey();
// Note that newer version of a key is ordered before older versions. If a
// newer version of a key is committed, so as the older version. No need
// to query snapshot_checker_ in that case.
if (UNLIKELY(!current_key_committed_)) {
assert(snapshot_checker_ != nullptr);
current_key_committed_ = KeyCommitted(ikey_.sequence);
// Apply the compaction filter to the first committed version of the
// user key.
if (current_key_committed_) {
InvokeFilterIfNeeded(&need_skip, &skip_until);
}
}
}
if (UNLIKELY(!current_key_committed_)) {
assert(snapshot_checker_ != nullptr);
valid_ = true;
break;
}
// If there are no snapshots, then this kv affect visibility at tip.
// Otherwise, search though all existing snapshots to find the earliest
// snapshot that is affected by this kv.
SequenceNumber last_sequence __attribute__((__unused__));
last_sequence = current_user_key_sequence_;
current_user_key_sequence_ = ikey_.sequence;
SequenceNumber last_snapshot = current_user_key_snapshot_;
SequenceNumber prev_snapshot = 0; // 0 means no previous snapshot
current_user_key_snapshot_ =
visible_at_tip_
? earliest_snapshot_
: findEarliestVisibleSnapshot(ikey_.sequence, &prev_snapshot);
if (need_skip) {
// This case is handled below.
} else if (clear_and_output_next_key_) {
// In the previous iteration we encountered a single delete that we could
// not compact out. We will keep this Put, but can drop it's data.
// (See Optimization 3, below.)
assert(ikey_.type == kTypeValue);
assert(current_user_key_snapshot_ == last_snapshot);
value_.clear();
valid_ = true;
clear_and_output_next_key_ = false;
} else if (ikey_.type == kTypeSingleDeletion) {
// We can compact out a SingleDelete if:
// 1) We encounter the corresponding PUT -OR- we know that this key
// doesn't appear past this output level
// =AND=
// 2) We've already returned a record in this snapshot -OR-
// there are no earlier earliest_write_conflict_snapshot.
//
// Rule 1 is needed for SingleDelete correctness. Rule 2 is needed to
// allow Transactions to do write-conflict checking (if we compacted away
// all keys, then we wouldn't know that a write happened in this
// snapshot). If there is no earlier snapshot, then we know that there
// are no active transactions that need to know about any writes.
//
// Optimization 3:
// If we encounter a SingleDelete followed by a PUT and Rule 2 is NOT
// true, then we must output a SingleDelete. In this case, we will decide
// to also output the PUT. While we are compacting less by outputting the
// PUT now, hopefully this will lead to better compaction in the future
// when Rule 2 is later true (Ie, We are hoping we can later compact out
// both the SingleDelete and the Put, while we couldn't if we only
// outputted the SingleDelete now).
// In this case, we can save space by removing the PUT's value as it will
// never be read.
//
// Deletes and Merges are not supported on the same key that has a
// SingleDelete as it is not possible to correctly do any partial
// compaction of such a combination of operations. The result of mixing
// those operations for a given key is documented as being undefined. So
// we can choose how to handle such a combinations of operations. We will
// try to compact out as much as we can in these cases.
// We will report counts on these anomalous cases.
// The easiest way to process a SingleDelete during iteration is to peek
// ahead at the next key.
ParsedInternalKey next_ikey;
input_->Next();
// Check whether the next key exists, is not corrupt, and is the same key
// as the single delete.
if (input_->Valid() && ParseInternalKey(input_->key(), &next_ikey) &&
cmp_->Equal(ikey_.user_key, next_ikey.user_key)) {
// Check whether the next key belongs to the same snapshot as the
// SingleDelete.
if (prev_snapshot == 0 ||
DEFINITELY_NOT_IN_SNAPSHOT(next_ikey.sequence, prev_snapshot)) {
if (next_ikey.type == kTypeSingleDeletion) {
// We encountered two SingleDeletes in a row. This could be due to
// unexpected user input.
// Skip the first SingleDelete and let the next iteration decide how
// to handle the second SingleDelete
// First SingleDelete has been skipped since we already called
// input_->Next().
++iter_stats_.num_record_drop_obsolete;
++iter_stats_.num_single_del_mismatch;
} else if (has_outputted_key_ ||
DEFINITELY_IN_SNAPSHOT(
ikey_.sequence, earliest_write_conflict_snapshot_)) {
// Found a matching value, we can drop the single delete and the
// value. It is safe to drop both records since we've already
// outputted a key in this snapshot, or there is no earlier
// snapshot (Rule 2 above).
// Note: it doesn't matter whether the second key is a Put or if it
// is an unexpected Merge or Delete. We will compact it out
// either way. We will maintain counts of how many mismatches
// happened
if (next_ikey.type != kTypeValue &&
next_ikey.type != kTypeBlobIndex) {
++iter_stats_.num_single_del_mismatch;
}
++iter_stats_.num_record_drop_hidden;
++iter_stats_.num_record_drop_obsolete;
// Already called input_->Next() once. Call it a second time to
// skip past the second key.
input_->Next();
} else {
// Found a matching value, but we cannot drop both keys since
// there is an earlier snapshot and we need to leave behind a record
// to know that a write happened in this snapshot (Rule 2 above).
// Clear the value and output the SingleDelete. (The value will be
// outputted on the next iteration.)
// Setting valid_ to true will output the current SingleDelete
valid_ = true;
// Set up the Put to be outputted in the next iteration.
// (Optimization 3).
clear_and_output_next_key_ = true;
}
} else {
// We hit the next snapshot without hitting a put, so the iterator
// returns the single delete.
valid_ = true;
}
} else {
// We are at the end of the input, could not parse the next key, or hit
// a different key. The iterator returns the single delete if the key
// possibly exists beyond the current output level. We set
// has_current_user_key to false so that if the iterator is at the next
// key, we do not compare it again against the previous key at the next
// iteration. If the next key is corrupt, we return before the
// comparison, so the value of has_current_user_key does not matter.
has_current_user_key_ = false;
if (compaction_ != nullptr && IN_EARLIEST_SNAPSHOT(ikey_.sequence) &&
compaction_->KeyNotExistsBeyondOutputLevel(ikey_.user_key,
&level_ptrs_)) {
// Key doesn't exist outside of this range.
// Can compact out this SingleDelete.
++iter_stats_.num_record_drop_obsolete;
++iter_stats_.num_single_del_fallthru;
if (!bottommost_level_) {
++iter_stats_.num_optimized_del_drop_obsolete;
}
} else {
// Output SingleDelete
valid_ = true;
}
}
if (valid_) {
at_next_ = true;
}
} else if (last_snapshot == current_user_key_snapshot_ ||
(last_snapshot > 0 &&
last_snapshot < current_user_key_snapshot_)) {
// If the earliest snapshot is which this key is visible in
// is the same as the visibility of a previous instance of the
// same key, then this kv is not visible in any snapshot.
// Hidden by an newer entry for same user key
//
// Note: Dropping this key will not affect TransactionDB write-conflict
// checking since there has already been a record returned for this key
// in this snapshot.
assert(last_sequence >= current_user_key_sequence_);
++iter_stats_.num_record_drop_hidden; // (A)
input_->Next();
} else if (compaction_ != nullptr && ikey_.type == kTypeDeletion &&
IN_EARLIEST_SNAPSHOT(ikey_.sequence) &&
ikeyNotNeededForIncrementalSnapshot() &&
compaction_->KeyNotExistsBeyondOutputLevel(ikey_.user_key,
&level_ptrs_)) {
// TODO(noetzli): This is the only place where we use compaction_
// (besides the constructor). We should probably get rid of this
// dependency and find a way to do similar filtering during flushes.
//
// For this user key:
// (1) there is no data in higher levels
// (2) data in lower levels will have larger sequence numbers
// (3) data in layers that are being compacted here and have
// smaller sequence numbers will be dropped in the next
// few iterations of this loop (by rule (A) above).
// Therefore this deletion marker is obsolete and can be dropped.
//
// Note: Dropping this Delete will not affect TransactionDB
// write-conflict checking since it is earlier than any snapshot.
//
// It seems that we can also drop deletion later than earliest snapshot
// given that:
// (1) The deletion is earlier than earliest_write_conflict_snapshot, and
// (2) No value exist earlier than the deletion.
++iter_stats_.num_record_drop_obsolete;
if (!bottommost_level_) {
++iter_stats_.num_optimized_del_drop_obsolete;
}
input_->Next();
} else if ((ikey_.type == kTypeDeletion) && bottommost_level_ &&
ikeyNotNeededForIncrementalSnapshot()) {
// Handle the case where we have a delete key at the bottom most level
// We can skip outputting the key iff there are no subsequent puts for this
// key
ParsedInternalKey next_ikey;
input_->Next();
// Skip over all versions of this key that happen to occur in the same snapshot
// range as the delete
while (input_->Valid() && ParseInternalKey(input_->key(), &next_ikey) &&
cmp_->Equal(ikey_.user_key, next_ikey.user_key) &&
(prev_snapshot == 0 ||
DEFINITELY_NOT_IN_SNAPSHOT(next_ikey.sequence, prev_snapshot))) {
input_->Next();
}
// If you find you still need to output a row with this key, we need to output the
// delete too
if (input_->Valid() && ParseInternalKey(input_->key(), &next_ikey) &&
cmp_->Equal(ikey_.user_key, next_ikey.user_key)) {
valid_ = true;
at_next_ = true;
}
} else if (ikey_.type == kTypeMerge) {
if (!merge_helper_->HasOperator()) {
status_ = Status::InvalidArgument(
"merge_operator is not properly initialized.");
return;
}
pinned_iters_mgr_.StartPinning();
// We know the merge type entry is not hidden, otherwise we would
// have hit (A)
// We encapsulate the merge related state machine in a different
// object to minimize change to the existing flow.
Status s = merge_helper_->MergeUntil(input_, range_del_agg_,
prev_snapshot, bottommost_level_);
merge_out_iter_.SeekToFirst();
if (!s.ok() && !s.IsMergeInProgress()) {
status_ = s;
return;
} else if (merge_out_iter_.Valid()) {
// NOTE: key, value, and ikey_ refer to old entries.
// These will be correctly set below.
key_ = merge_out_iter_.key();
value_ = merge_out_iter_.value();
bool valid_key __attribute__((__unused__));
valid_key = ParseInternalKey(key_, &ikey_);
// MergeUntil stops when it encounters a corrupt key and does not
// include them in the result, so we expect the keys here to valid.
assert(valid_key);
// Keep current_key_ in sync.
current_key_.UpdateInternalKey(ikey_.sequence, ikey_.type);
key_ = current_key_.GetInternalKey();
ikey_.user_key = current_key_.GetUserKey();
valid_ = true;
} else {
// all merge operands were filtered out. reset the user key, since the
// batch consumed by the merge operator should not shadow any keys
// coming after the merges
has_current_user_key_ = false;
pinned_iters_mgr_.ReleasePinnedData();
if (merge_helper_->FilteredUntil(&skip_until)) {
need_skip = true;
}
}
} else {
// 1. new user key -OR-
// 2. different snapshot stripe
bool should_delete = range_del_agg_->ShouldDelete(
key_, RangeDelPositioningMode::kForwardTraversal);
if (should_delete) {
++iter_stats_.num_record_drop_hidden;
++iter_stats_.num_record_drop_range_del;
input_->Next();
} else {
valid_ = true;
}
}
if (need_skip) {
input_->Seek(skip_until);
}
}
if (!valid_ && IsShuttingDown()) {
status_ = Status::ShutdownInProgress();
}
}
void CompactionIterator::PrepareOutput() {
// Zeroing out the sequence number leads to better compression.
// If this is the bottommost level (no files in lower levels)
// and the earliest snapshot is larger than this seqno
// and the userkey differs from the last userkey in compaction
// then we can squash the seqno to zero.
//
// This is safe for TransactionDB write-conflict checking since transactions
// only care about sequence number larger than any active snapshots.
//
// Can we do the same for levels above bottom level as long as
// KeyNotExistsBeyondOutputLevel() return true?
if ((compaction_ != nullptr && !compaction_->allow_ingest_behind()) &&
ikeyNotNeededForIncrementalSnapshot() && bottommost_level_ && valid_ &&
IN_EARLIEST_SNAPSHOT(ikey_.sequence) && ikey_.type != kTypeMerge) {
assert(ikey_.type != kTypeDeletion && ikey_.type != kTypeSingleDeletion);
ikey_.sequence = 0;
current_key_.UpdateInternalKey(0, ikey_.type);
}
}
inline SequenceNumber CompactionIterator::findEarliestVisibleSnapshot(
SequenceNumber in, SequenceNumber* prev_snapshot) {
assert(snapshots_->size());
auto snapshots_iter = std::lower_bound(
snapshots_->begin(), snapshots_->end(), in);
if (snapshots_iter == snapshots_->begin()) {
*prev_snapshot = 0;
} else {
*prev_snapshot = *std::prev(snapshots_iter);
assert(*prev_snapshot < in);
}
if (snapshot_checker_ == nullptr) {
return snapshots_iter != snapshots_->end()
? *snapshots_iter : kMaxSequenceNumber;
}
bool has_released_snapshot = !released_snapshots_.empty();
for (; snapshots_iter != snapshots_->end(); ++snapshots_iter) {
auto cur = *snapshots_iter;
assert(in <= cur);
// Skip if cur is in released_snapshots.
if (has_released_snapshot && released_snapshots_.count(cur) > 0) {
continue;
}
auto res = snapshot_checker_->CheckInSnapshot(in, cur);
if (res == SnapshotCheckerResult::kInSnapshot) {
return cur;
} else if (res == SnapshotCheckerResult::kSnapshotReleased) {
released_snapshots_.insert(cur);
}
*prev_snapshot = cur;
}
return kMaxSequenceNumber;
}
// used in 2 places - prevents deletion markers to be dropped if they may be
// needed and disables seqnum zero-out in PrepareOutput for recent keys.
inline bool CompactionIterator::ikeyNotNeededForIncrementalSnapshot() {
return (!compaction_->preserve_deletes()) ||
(ikey_.sequence < preserve_deletes_seqnum_);
}
bool CompactionIterator::IsInEarliestSnapshot(SequenceNumber sequence) {
assert(snapshot_checker_ != nullptr);
assert(earliest_snapshot_ == kMaxSequenceNumber ||
(earliest_snapshot_iter_ != snapshots_->end() &&
*earliest_snapshot_iter_ == earliest_snapshot_));
auto in_snapshot =
snapshot_checker_->CheckInSnapshot(sequence, earliest_snapshot_);
while (UNLIKELY(in_snapshot == SnapshotCheckerResult::kSnapshotReleased)) {
// Avoid the the current earliest_snapshot_ being return as
// earliest visible snapshot for the next value. So if a value's sequence
// is zero-ed out by PrepareOutput(), the next value will be compact out.
released_snapshots_.insert(earliest_snapshot_);
earliest_snapshot_iter_++;
if (earliest_snapshot_iter_ == snapshots_->end()) {
earliest_snapshot_ = kMaxSequenceNumber;
} else {
earliest_snapshot_ = *earliest_snapshot_iter_;
}
in_snapshot =
snapshot_checker_->CheckInSnapshot(sequence, earliest_snapshot_);
}
assert(in_snapshot != SnapshotCheckerResult::kSnapshotReleased);
return in_snapshot == SnapshotCheckerResult::kInSnapshot;
}
} // namespace rocksdb
-283
View File
@@ -1,283 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
#pragma once
#include <algorithm>
#include <deque>
#include <string>
#include <unordered_set>
#include <vector>
#include "db/compaction/compaction.h"
#include "db/compaction/compaction_iteration_stats.h"
#include "db/merge_helper.h"
#include "db/pinned_iterators_manager.h"
#include "db/range_del_aggregator.h"
#include "db/snapshot_checker.h"
#include "options/cf_options.h"
#include "rocksdb/compaction_filter.h"
namespace rocksdb {
// This callback can be used to refresh the snapshot list from the db. It
// includes logics to exponentially decrease the refresh rate to limit the
// overhead of refresh.
class SnapshotListFetchCallback {
public:
SnapshotListFetchCallback(Env* env, uint64_t snap_refresh_nanos,
size_t every_nth_key = 1024)
: timer_(env, /*auto restart*/ true),
snap_refresh_nanos_(snap_refresh_nanos),
every_nth_key_minus_one_(every_nth_key - 1) {
assert(every_nth_key > 0);
assert((ceil(log2(every_nth_key)) == floor(log2(every_nth_key))));
}
// Refresh the snapshot list. snapshots will bre replacted with the new list.
// max is the upper bound. Note: this function will acquire the db_mutex_.
virtual void Refresh(std::vector<SequenceNumber>* snapshots,
SequenceNumber max) = 0;
inline bool TimeToRefresh(const size_t key_index) {
assert(snap_refresh_nanos_ != 0);
// skip the key if key_index % every_nth_key (which is of power 2) is not 0.
if ((key_index & every_nth_key_minus_one_) != 0) {
return false;
}
const uint64_t elapsed = timer_.ElapsedNanos();
auto ret = elapsed > snap_refresh_nanos_;
// pre-compute the next time threshold
if (ret) {
// inc next refresh period exponentially (by x4)
auto next_refresh_threshold = snap_refresh_nanos_ << 2;
// make sure the shift has not overflown the highest 1 bit
snap_refresh_nanos_ =
std::max(snap_refresh_nanos_, next_refresh_threshold);
}
return ret;
}
static constexpr SnapshotListFetchCallback* kDisabled = nullptr;
virtual ~SnapshotListFetchCallback() {}
private:
// Time since the callback was created
StopWatchNano timer_;
// The delay before calling ::Refresh. To be increased exponentially.
uint64_t snap_refresh_nanos_;
// Skip evey nth key. Number n if of power 2. The math will require n-1.
const uint64_t every_nth_key_minus_one_;
};
class CompactionIterator {
public:
// A wrapper around Compaction. Has a much smaller interface, only what
// CompactionIterator uses. Tests can override it.
class CompactionProxy {
public:
explicit CompactionProxy(const Compaction* compaction)
: compaction_(compaction) {}
virtual ~CompactionProxy() = default;
virtual int level(size_t /*compaction_input_level*/ = 0) const {
return compaction_->level();
}
virtual bool KeyNotExistsBeyondOutputLevel(
const Slice& user_key, std::vector<size_t>* level_ptrs) const {
return compaction_->KeyNotExistsBeyondOutputLevel(user_key, level_ptrs);
}
virtual bool bottommost_level() const {
return compaction_->bottommost_level();
}
virtual int number_levels() const { return compaction_->number_levels(); }
virtual Slice GetLargestUserKey() const {
return compaction_->GetLargestUserKey();
}
virtual bool allow_ingest_behind() const {
return compaction_->immutable_cf_options()->allow_ingest_behind;
}
virtual bool preserve_deletes() const {
return compaction_->immutable_cf_options()->preserve_deletes;
}
protected:
CompactionProxy() = default;
private:
const Compaction* compaction_;
};
CompactionIterator(InternalIterator* input, const Comparator* cmp,
MergeHelper* merge_helper, SequenceNumber last_sequence,
std::vector<SequenceNumber>* snapshots,
SequenceNumber earliest_write_conflict_snapshot,
const SnapshotChecker* snapshot_checker, Env* env,
bool report_detailed_time, bool expect_valid_internal_key,
CompactionRangeDelAggregator* range_del_agg,
const Compaction* compaction = nullptr,
const CompactionFilter* compaction_filter = nullptr,
const std::atomic<bool>* shutting_down = nullptr,
const SequenceNumber preserve_deletes_seqnum = 0,
SnapshotListFetchCallback* snap_list_callback = nullptr);
// Constructor with custom CompactionProxy, used for tests.
CompactionIterator(InternalIterator* input, const Comparator* cmp,
MergeHelper* merge_helper, SequenceNumber last_sequence,
std::vector<SequenceNumber>* snapshots,
SequenceNumber earliest_write_conflict_snapshot,
const SnapshotChecker* snapshot_checker, Env* env,
bool report_detailed_time, bool expect_valid_internal_key,
CompactionRangeDelAggregator* range_del_agg,
std::unique_ptr<CompactionProxy> compaction,
const CompactionFilter* compaction_filter = nullptr,
const std::atomic<bool>* shutting_down = nullptr,
const SequenceNumber preserve_deletes_seqnum = 0,
SnapshotListFetchCallback* snap_list_callback = nullptr);
~CompactionIterator();
void ResetRecordCounts();
// Seek to the beginning of the compaction iterator output.
//
// REQUIRED: Call only once.
void SeekToFirst();
// Produces the next record in the compaction.
//
// REQUIRED: SeekToFirst() has been called.
void Next();
// Getters
const Slice& key() const { return key_; }
const Slice& value() const { return value_; }
const Status& status() const { return status_; }
const ParsedInternalKey& ikey() const { return ikey_; }
bool Valid() const { return valid_; }
const Slice& user_key() const { return current_user_key_; }
const CompactionIterationStats& iter_stats() const { return iter_stats_; }
private:
// Processes the input stream to find the next output
void NextFromInput();
// Process snapshots_ and assign related variables
void ProcessSnapshotList();
// Do last preparations before presenting the output to the callee. At this
// point this only zeroes out the sequence number if possible for better
// compression.
void PrepareOutput();
// Invoke compaction filter if needed.
void InvokeFilterIfNeeded(bool* need_skip, Slice* skip_until);
// Given a sequence number, return the sequence number of the
// earliest snapshot that this sequence number is visible in.
// The snapshots themselves are arranged in ascending order of
// sequence numbers.
// Employ a sequential search because the total number of
// snapshots are typically small.
inline SequenceNumber findEarliestVisibleSnapshot(
SequenceNumber in, SequenceNumber* prev_snapshot);
// Checks whether the currently seen ikey_ is needed for
// incremental (differential) snapshot and hence can't be dropped
// or seqnum be zero-ed out even if all other conditions for it are met.
inline bool ikeyNotNeededForIncrementalSnapshot();
inline bool KeyCommitted(SequenceNumber sequence) {
return snapshot_checker_ == nullptr ||
snapshot_checker_->CheckInSnapshot(sequence, kMaxSequenceNumber) ==
SnapshotCheckerResult::kInSnapshot;
}
bool IsInEarliestSnapshot(SequenceNumber sequence);
InternalIterator* input_;
const Comparator* cmp_;
MergeHelper* merge_helper_;
std::vector<SequenceNumber>* snapshots_;
// List of snapshots released during compaction.
// findEarliestVisibleSnapshot() find them out from return of
// snapshot_checker, and make sure they will not be returned as
// earliest visible snapshot of an older value.
// See WritePreparedTransactionTest::ReleaseSnapshotDuringCompaction3.
std::unordered_set<SequenceNumber> released_snapshots_;
std::vector<SequenceNumber>::const_iterator earliest_snapshot_iter_;
const SequenceNumber earliest_write_conflict_snapshot_;
const SnapshotChecker* const snapshot_checker_;
Env* env_;
bool report_detailed_time_;
bool expect_valid_internal_key_;
CompactionRangeDelAggregator* range_del_agg_;
std::unique_ptr<CompactionProxy> compaction_;
const CompactionFilter* compaction_filter_;
const std::atomic<bool>* shutting_down_;
const SequenceNumber preserve_deletes_seqnum_;
bool bottommost_level_;
bool valid_ = false;
bool visible_at_tip_;
SequenceNumber earliest_snapshot_;
SequenceNumber latest_snapshot_;
// State
//
// Points to a copy of the current compaction iterator output (current_key_)
// if valid_.
Slice key_;
// Points to the value in the underlying iterator that corresponds to the
// current output.
Slice value_;
// The status is OK unless compaction iterator encounters a merge operand
// while not having a merge operator defined.
Status status_;
// Stores the user key, sequence number and type of the current compaction
// iterator output (or current key in the underlying iterator during
// NextFromInput()).
ParsedInternalKey ikey_;
// Stores whether ikey_.user_key is valid. If set to false, the user key is
// not compared against the current key in the underlying iterator.
bool has_current_user_key_ = false;
bool at_next_ = false; // If false, the iterator
// Holds a copy of the current compaction iterator output (or current key in
// the underlying iterator during NextFromInput()).
IterKey current_key_;
Slice current_user_key_;
SequenceNumber current_user_key_sequence_;
SequenceNumber current_user_key_snapshot_;
// True if the iterator has already returned a record for the current key.
bool has_outputted_key_ = false;
// truncated the value of the next key and output it without applying any
// compaction rules. This is used for outputting a put after a single delete.
bool clear_and_output_next_key_ = false;
MergeOutputIterator merge_out_iter_;
// PinnedIteratorsManager used to pin input_ Iterator blocks while reading
// merge operands and then releasing them after consuming them.
PinnedIteratorsManager pinned_iters_mgr_;
std::string compaction_filter_value_;
InternalKey compaction_filter_skip_until_;
// "level_ptrs" holds indices that remember which file of an associated
// level we were last checking during the last call to compaction->
// KeyNotExistsBeyondOutputLevel(). This allows future calls to the function
// to pick off where it left off since each subcompaction's key range is
// increasing so a later call to the function must be looking for a key that
// is in or beyond the last file checked during the previous call
std::vector<size_t> level_ptrs_;
CompactionIterationStats iter_stats_;
// Used to avoid purging uncommitted values. The application can specify
// uncommitted values by providing a SnapshotChecker object.
bool current_key_committed_;
SnapshotListFetchCallback* snap_list_callback_;
// number of distinct keys processed
size_t num_keys_ = 0;
bool IsShuttingDown() {
// This is a best-effort facility, so memory_order_relaxed is sufficient.
return shutting_down_ && shutting_down_->load(std::memory_order_relaxed);
}
};
} // namespace rocksdb
-976
View File
@@ -1,976 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
#include <string>
#include <vector>
#include "db/compaction/compaction_iterator.h"
#include "port/port.h"
#include "test_util/testharness.h"
#include "test_util/testutil.h"
#include "util/string_util.h"
#include "utilities/merge_operators.h"
namespace rocksdb {
// Expects no merging attempts.
class NoMergingMergeOp : public MergeOperator {
public:
bool FullMergeV2(const MergeOperationInput& /*merge_in*/,
MergeOperationOutput* /*merge_out*/) const override {
ADD_FAILURE();
return false;
}
bool PartialMergeMulti(const Slice& /*key*/,
const std::deque<Slice>& /*operand_list*/,
std::string* /*new_value*/,
Logger* /*logger*/) const override {
ADD_FAILURE();
return false;
}
const char* Name() const override {
return "CompactionIteratorTest NoMergingMergeOp";
}
};
// Compaction filter that gets stuck when it sees a particular key,
// then gets unstuck when told to.
// Always returns Decition::kRemove.
class StallingFilter : public CompactionFilter {
public:
Decision FilterV2(int /*level*/, const Slice& key, ValueType /*type*/,
const Slice& /*existing_value*/, std::string* /*new_value*/,
std::string* /*skip_until*/) const override {
int k = std::atoi(key.ToString().c_str());
last_seen.store(k);
while (k >= stall_at.load()) {
std::this_thread::yield();
}
return Decision::kRemove;
}
const char* Name() const override {
return "CompactionIteratorTest StallingFilter";
}
// Wait until the filter sees a key >= k and stalls at that key.
// If `exact`, asserts that the seen key is equal to k.
void WaitForStall(int k, bool exact = true) {
stall_at.store(k);
while (last_seen.load() < k) {
std::this_thread::yield();
}
if (exact) {
EXPECT_EQ(k, last_seen.load());
}
}
// Filter will stall on key >= stall_at. Advance stall_at to unstall.
mutable std::atomic<int> stall_at{0};
// Last key the filter was called with.
mutable std::atomic<int> last_seen{0};
};
// Compaction filter that filter out all keys.
class FilterAllKeysCompactionFilter : public CompactionFilter {
public:
Decision FilterV2(int /*level*/, const Slice& /*key*/, ValueType /*type*/,
const Slice& /*existing_value*/, std::string* /*new_value*/,
std::string* /*skip_until*/) const override {
return Decision::kRemove;
}
const char* Name() const override { return "AllKeysCompactionFilter"; }
};
class LoggingForwardVectorIterator : public InternalIterator {
public:
struct Action {
enum class Type {
SEEK_TO_FIRST,
SEEK,
NEXT,
};
Type type;
std::string arg;
explicit Action(Type _type, std::string _arg = "")
: type(_type), arg(_arg) {}
bool operator==(const Action& rhs) const {
return std::tie(type, arg) == std::tie(rhs.type, rhs.arg);
}
};
LoggingForwardVectorIterator(const std::vector<std::string>& keys,
const std::vector<std::string>& values)
: keys_(keys), values_(values), current_(keys.size()) {
assert(keys_.size() == values_.size());
}
bool Valid() const override { return current_ < keys_.size(); }
void SeekToFirst() override {
log.emplace_back(Action::Type::SEEK_TO_FIRST);
current_ = 0;
}
void SeekToLast() override { assert(false); }
void Seek(const Slice& target) override {
log.emplace_back(Action::Type::SEEK, target.ToString());
current_ = std::lower_bound(keys_.begin(), keys_.end(), target.ToString()) -
keys_.begin();
}
void SeekForPrev(const Slice& /*target*/) override { assert(false); }
void Next() override {
assert(Valid());
log.emplace_back(Action::Type::NEXT);
current_++;
}
void Prev() override { assert(false); }
Slice key() const override {
assert(Valid());
return Slice(keys_[current_]);
}
Slice value() const override {
assert(Valid());
return Slice(values_[current_]);
}
Status status() const override { return Status::OK(); }
std::vector<Action> log;
private:
std::vector<std::string> keys_;
std::vector<std::string> values_;
size_t current_;
};
class FakeCompaction : public CompactionIterator::CompactionProxy {
public:
FakeCompaction() = default;
int level(size_t /*compaction_input_level*/) const override { return 0; }
bool KeyNotExistsBeyondOutputLevel(
const Slice& /*user_key*/,
std::vector<size_t>* /*level_ptrs*/) const override {
return is_bottommost_level || key_not_exists_beyond_output_level;
}
bool bottommost_level() const override { return is_bottommost_level; }
int number_levels() const override { return 1; }
Slice GetLargestUserKey() const override {
return "\xff\xff\xff\xff\xff\xff\xff\xff\xff";
}
bool allow_ingest_behind() const override { return false; }
bool preserve_deletes() const override { return false; }
bool key_not_exists_beyond_output_level = false;
bool is_bottommost_level = false;
};
// A simplifed snapshot checker which assumes each snapshot has a global
// last visible sequence.
class TestSnapshotChecker : public SnapshotChecker {
public:
explicit TestSnapshotChecker(
SequenceNumber last_committed_sequence,
const std::unordered_map<SequenceNumber, SequenceNumber>& snapshots = {})
: last_committed_sequence_(last_committed_sequence),
snapshots_(snapshots) {}
SnapshotCheckerResult CheckInSnapshot(
SequenceNumber seq, SequenceNumber snapshot_seq) const override {
if (snapshot_seq == kMaxSequenceNumber) {
return seq <= last_committed_sequence_
? SnapshotCheckerResult::kInSnapshot
: SnapshotCheckerResult::kNotInSnapshot;
}
assert(snapshots_.count(snapshot_seq) > 0);
return seq <= snapshots_.at(snapshot_seq)
? SnapshotCheckerResult::kInSnapshot
: SnapshotCheckerResult::kNotInSnapshot;
}
private:
SequenceNumber last_committed_sequence_;
// A map of valid snapshot to last visible sequence to the snapshot.
std::unordered_map<SequenceNumber, SequenceNumber> snapshots_;
};
// Test param:
// bool: whether to pass snapshot_checker to compaction iterator.
class CompactionIteratorTest : public testing::TestWithParam<bool> {
public:
CompactionIteratorTest()
: cmp_(BytewiseComparator()), icmp_(cmp_), snapshots_({}) {}
void InitIterators(
const std::vector<std::string>& ks, const std::vector<std::string>& vs,
const std::vector<std::string>& range_del_ks,
const std::vector<std::string>& range_del_vs,
SequenceNumber last_sequence,
SequenceNumber last_committed_sequence = kMaxSequenceNumber,
MergeOperator* merge_op = nullptr, CompactionFilter* filter = nullptr,
bool bottommost_level = false,
SequenceNumber earliest_write_conflict_snapshot = kMaxSequenceNumber) {
std::unique_ptr<InternalIterator> unfragmented_range_del_iter(
new test::VectorIterator(range_del_ks, range_del_vs));
auto tombstone_list = std::make_shared<FragmentedRangeTombstoneList>(
std::move(unfragmented_range_del_iter), icmp_);
std::unique_ptr<FragmentedRangeTombstoneIterator> range_del_iter(
new FragmentedRangeTombstoneIterator(tombstone_list, icmp_,
kMaxSequenceNumber));
range_del_agg_.reset(new CompactionRangeDelAggregator(&icmp_, snapshots_));
range_del_agg_->AddTombstones(std::move(range_del_iter));
std::unique_ptr<CompactionIterator::CompactionProxy> compaction;
if (filter || bottommost_level) {
compaction_proxy_ = new FakeCompaction();
compaction_proxy_->is_bottommost_level = bottommost_level;
compaction.reset(compaction_proxy_);
}
bool use_snapshot_checker = UseSnapshotChecker() || GetParam();
if (use_snapshot_checker || last_committed_sequence < kMaxSequenceNumber) {
snapshot_checker_.reset(
new TestSnapshotChecker(last_committed_sequence, snapshot_map_));
}
merge_helper_.reset(
new MergeHelper(Env::Default(), cmp_, merge_op, filter, nullptr, false,
0 /*latest_snapshot*/, snapshot_checker_.get(),
0 /*level*/, nullptr /*statistics*/, &shutting_down_));
iter_.reset(new LoggingForwardVectorIterator(ks, vs));
iter_->SeekToFirst();
c_iter_.reset(new CompactionIterator(
iter_.get(), cmp_, merge_helper_.get(), last_sequence, &snapshots_,
earliest_write_conflict_snapshot, snapshot_checker_.get(),
Env::Default(), false /* report_detailed_time */, false,
range_del_agg_.get(), std::move(compaction), filter, &shutting_down_));
}
void AddSnapshot(SequenceNumber snapshot,
SequenceNumber last_visible_seq = kMaxSequenceNumber) {
snapshots_.push_back(snapshot);
snapshot_map_[snapshot] = last_visible_seq;
}
virtual bool UseSnapshotChecker() const { return false; }
void RunTest(
const std::vector<std::string>& input_keys,
const std::vector<std::string>& input_values,
const std::vector<std::string>& expected_keys,
const std::vector<std::string>& expected_values,
SequenceNumber last_committed_seq = kMaxSequenceNumber,
MergeOperator* merge_operator = nullptr,
CompactionFilter* compaction_filter = nullptr,
bool bottommost_level = false,
SequenceNumber earliest_write_conflict_snapshot = kMaxSequenceNumber) {
InitIterators(input_keys, input_values, {}, {}, kMaxSequenceNumber,
last_committed_seq, merge_operator, compaction_filter,
bottommost_level, earliest_write_conflict_snapshot);
c_iter_->SeekToFirst();
for (size_t i = 0; i < expected_keys.size(); i++) {
std::string info = "i = " + ToString(i);
ASSERT_TRUE(c_iter_->Valid()) << info;
ASSERT_OK(c_iter_->status()) << info;
ASSERT_EQ(expected_keys[i], c_iter_->key().ToString()) << info;
ASSERT_EQ(expected_values[i], c_iter_->value().ToString()) << info;
c_iter_->Next();
}
ASSERT_FALSE(c_iter_->Valid());
}
const Comparator* cmp_;
const InternalKeyComparator icmp_;
std::vector<SequenceNumber> snapshots_;
// A map of valid snapshot to last visible sequence to the snapshot.
std::unordered_map<SequenceNumber, SequenceNumber> snapshot_map_;
std::unique_ptr<MergeHelper> merge_helper_;
std::unique_ptr<LoggingForwardVectorIterator> iter_;
std::unique_ptr<CompactionIterator> c_iter_;
std::unique_ptr<CompactionRangeDelAggregator> range_del_agg_;
std::unique_ptr<SnapshotChecker> snapshot_checker_;
std::atomic<bool> shutting_down_{false};
FakeCompaction* compaction_proxy_;
};
// It is possible that the output of the compaction iterator is empty even if
// the input is not.
TEST_P(CompactionIteratorTest, EmptyResult) {
InitIterators({test::KeyStr("a", 5, kTypeSingleDeletion),
test::KeyStr("a", 3, kTypeValue)},
{"", "val"}, {}, {}, 5);
c_iter_->SeekToFirst();
ASSERT_FALSE(c_iter_->Valid());
}
// If there is a corruption after a single deletion, the corrupted key should
// be preserved.
TEST_P(CompactionIteratorTest, CorruptionAfterSingleDeletion) {
InitIterators({test::KeyStr("a", 5, kTypeSingleDeletion),
test::KeyStr("a", 3, kTypeValue, true),
test::KeyStr("b", 10, kTypeValue)},
{"", "val", "val2"}, {}, {}, 10);
c_iter_->SeekToFirst();
ASSERT_TRUE(c_iter_->Valid());
ASSERT_EQ(test::KeyStr("a", 5, kTypeSingleDeletion),
c_iter_->key().ToString());
c_iter_->Next();
ASSERT_TRUE(c_iter_->Valid());
ASSERT_EQ(test::KeyStr("a", 3, kTypeValue, true), c_iter_->key().ToString());
c_iter_->Next();
ASSERT_TRUE(c_iter_->Valid());
ASSERT_EQ(test::KeyStr("b", 10, kTypeValue), c_iter_->key().ToString());
c_iter_->Next();
ASSERT_FALSE(c_iter_->Valid());
}
TEST_P(CompactionIteratorTest, SimpleRangeDeletion) {
InitIterators({test::KeyStr("morning", 5, kTypeValue),
test::KeyStr("morning", 2, kTypeValue),
test::KeyStr("night", 3, kTypeValue)},
{"zao", "zao", "wan"},
{test::KeyStr("ma", 4, kTypeRangeDeletion)}, {"mz"}, 5);
c_iter_->SeekToFirst();
ASSERT_TRUE(c_iter_->Valid());
ASSERT_EQ(test::KeyStr("morning", 5, kTypeValue), c_iter_->key().ToString());
c_iter_->Next();
ASSERT_TRUE(c_iter_->Valid());
ASSERT_EQ(test::KeyStr("night", 3, kTypeValue), c_iter_->key().ToString());
c_iter_->Next();
ASSERT_FALSE(c_iter_->Valid());
}
TEST_P(CompactionIteratorTest, RangeDeletionWithSnapshots) {
AddSnapshot(10);
std::vector<std::string> ks1;
ks1.push_back(test::KeyStr("ma", 28, kTypeRangeDeletion));
std::vector<std::string> vs1{"mz"};
std::vector<std::string> ks2{test::KeyStr("morning", 15, kTypeValue),
test::KeyStr("morning", 5, kTypeValue),
test::KeyStr("night", 40, kTypeValue),
test::KeyStr("night", 20, kTypeValue)};
std::vector<std::string> vs2{"zao 15", "zao 5", "wan 40", "wan 20"};
InitIterators(ks2, vs2, ks1, vs1, 40);
c_iter_->SeekToFirst();
ASSERT_TRUE(c_iter_->Valid());
ASSERT_EQ(test::KeyStr("morning", 5, kTypeValue), c_iter_->key().ToString());
c_iter_->Next();
ASSERT_TRUE(c_iter_->Valid());
ASSERT_EQ(test::KeyStr("night", 40, kTypeValue), c_iter_->key().ToString());
c_iter_->Next();
ASSERT_FALSE(c_iter_->Valid());
}
TEST_P(CompactionIteratorTest, CompactionFilterSkipUntil) {
class Filter : public CompactionFilter {
Decision FilterV2(int /*level*/, const Slice& key, ValueType t,
const Slice& existing_value, std::string* /*new_value*/,
std::string* skip_until) const override {
std::string k = key.ToString();
std::string v = existing_value.ToString();
// See InitIterators() call below for the sequence of keys and their
// filtering decisions. Here we closely assert that compaction filter is
// called with the expected keys and only them, and with the right values.
if (k == "a") {
EXPECT_EQ(ValueType::kValue, t);
EXPECT_EQ("av50", v);
return Decision::kKeep;
}
if (k == "b") {
EXPECT_EQ(ValueType::kValue, t);
EXPECT_EQ("bv60", v);
*skip_until = "d+";
return Decision::kRemoveAndSkipUntil;
}
if (k == "e") {
EXPECT_EQ(ValueType::kMergeOperand, t);
EXPECT_EQ("em71", v);
return Decision::kKeep;
}
if (k == "f") {
if (v == "fm65") {
EXPECT_EQ(ValueType::kMergeOperand, t);
*skip_until = "f";
} else {
EXPECT_EQ("fm30", v);
EXPECT_EQ(ValueType::kMergeOperand, t);
*skip_until = "g+";
}
return Decision::kRemoveAndSkipUntil;
}
if (k == "h") {
EXPECT_EQ(ValueType::kValue, t);
EXPECT_EQ("hv91", v);
return Decision::kKeep;
}
if (k == "i") {
EXPECT_EQ(ValueType::kMergeOperand, t);
EXPECT_EQ("im95", v);
*skip_until = "z";
return Decision::kRemoveAndSkipUntil;
}
ADD_FAILURE();
return Decision::kKeep;
}
const char* Name() const override {
return "CompactionIteratorTest.CompactionFilterSkipUntil::Filter";
}
};
NoMergingMergeOp merge_op;
Filter filter;
InitIterators(
{test::KeyStr("a", 50, kTypeValue), // keep
test::KeyStr("a", 45, kTypeMerge),
test::KeyStr("b", 60, kTypeValue), // skip to "d+"
test::KeyStr("b", 40, kTypeValue), test::KeyStr("c", 35, kTypeValue),
test::KeyStr("d", 70, kTypeMerge),
test::KeyStr("e", 71, kTypeMerge), // keep
test::KeyStr("f", 65, kTypeMerge), // skip to "f", aka keep
test::KeyStr("f", 30, kTypeMerge), // skip to "g+"
test::KeyStr("f", 25, kTypeValue), test::KeyStr("g", 90, kTypeValue),
test::KeyStr("h", 91, kTypeValue), // keep
test::KeyStr("i", 95, kTypeMerge), // skip to "z"
test::KeyStr("j", 99, kTypeValue)},
{"av50", "am45", "bv60", "bv40", "cv35", "dm70", "em71", "fm65", "fm30",
"fv25", "gv90", "hv91", "im95", "jv99"},
{}, {}, kMaxSequenceNumber, kMaxSequenceNumber, &merge_op, &filter);
// Compaction should output just "a", "e" and "h" keys.
c_iter_->SeekToFirst();
ASSERT_TRUE(c_iter_->Valid());
ASSERT_EQ(test::KeyStr("a", 50, kTypeValue), c_iter_->key().ToString());
ASSERT_EQ("av50", c_iter_->value().ToString());
c_iter_->Next();
ASSERT_TRUE(c_iter_->Valid());
ASSERT_EQ(test::KeyStr("e", 71, kTypeMerge), c_iter_->key().ToString());
ASSERT_EQ("em71", c_iter_->value().ToString());
c_iter_->Next();
ASSERT_TRUE(c_iter_->Valid());
ASSERT_EQ(test::KeyStr("h", 91, kTypeValue), c_iter_->key().ToString());
ASSERT_EQ("hv91", c_iter_->value().ToString());
c_iter_->Next();
ASSERT_FALSE(c_iter_->Valid());
// Check that the compaction iterator did the correct sequence of calls on
// the underlying iterator.
using A = LoggingForwardVectorIterator::Action;
using T = A::Type;
std::vector<A> expected_actions = {
A(T::SEEK_TO_FIRST),
A(T::NEXT),
A(T::NEXT),
A(T::SEEK, test::KeyStr("d+", kMaxSequenceNumber, kValueTypeForSeek)),
A(T::NEXT),
A(T::NEXT),
A(T::SEEK, test::KeyStr("g+", kMaxSequenceNumber, kValueTypeForSeek)),
A(T::NEXT),
A(T::SEEK, test::KeyStr("z", kMaxSequenceNumber, kValueTypeForSeek))};
ASSERT_EQ(expected_actions, iter_->log);
}
TEST_P(CompactionIteratorTest, ShuttingDownInFilter) {
NoMergingMergeOp merge_op;
StallingFilter filter;
InitIterators(
{test::KeyStr("1", 1, kTypeValue), test::KeyStr("2", 2, kTypeValue),
test::KeyStr("3", 3, kTypeValue), test::KeyStr("4", 4, kTypeValue)},
{"v1", "v2", "v3", "v4"}, {}, {}, kMaxSequenceNumber, kMaxSequenceNumber,
&merge_op, &filter);
// Don't leave tombstones (kTypeDeletion) for filtered keys.
compaction_proxy_->key_not_exists_beyond_output_level = true;
std::atomic<bool> seek_done{false};
rocksdb::port::Thread compaction_thread([&] {
c_iter_->SeekToFirst();
EXPECT_FALSE(c_iter_->Valid());
EXPECT_TRUE(c_iter_->status().IsShutdownInProgress());
seek_done.store(true);
});
// Let key 1 through.
filter.WaitForStall(1);
// Shutdown during compaction filter call for key 2.
filter.WaitForStall(2);
shutting_down_.store(true);
EXPECT_FALSE(seek_done.load());
// Unstall filter and wait for SeekToFirst() to return.
filter.stall_at.store(3);
compaction_thread.join();
assert(seek_done.load());
// Check that filter was never called again.
EXPECT_EQ(2, filter.last_seen.load());
}
// Same as ShuttingDownInFilter, but shutdown happens during filter call for
// a merge operand, not for a value.
TEST_P(CompactionIteratorTest, ShuttingDownInMerge) {
NoMergingMergeOp merge_op;
StallingFilter filter;
InitIterators(
{test::KeyStr("1", 1, kTypeValue), test::KeyStr("2", 2, kTypeMerge),
test::KeyStr("3", 3, kTypeMerge), test::KeyStr("4", 4, kTypeValue)},
{"v1", "v2", "v3", "v4"}, {}, {}, kMaxSequenceNumber, kMaxSequenceNumber,
&merge_op, &filter);
compaction_proxy_->key_not_exists_beyond_output_level = true;
std::atomic<bool> seek_done{false};
rocksdb::port::Thread compaction_thread([&] {
c_iter_->SeekToFirst();
ASSERT_FALSE(c_iter_->Valid());
ASSERT_TRUE(c_iter_->status().IsShutdownInProgress());
seek_done.store(true);
});
// Let key 1 through.
filter.WaitForStall(1);
// Shutdown during compaction filter call for key 2.
filter.WaitForStall(2);
shutting_down_.store(true);
EXPECT_FALSE(seek_done.load());
// Unstall filter and wait for SeekToFirst() to return.
filter.stall_at.store(3);
compaction_thread.join();
assert(seek_done.load());
// Check that filter was never called again.
EXPECT_EQ(2, filter.last_seen.load());
}
TEST_P(CompactionIteratorTest, SingleMergeOperand) {
class Filter : public CompactionFilter {
Decision FilterV2(int /*level*/, const Slice& key, ValueType t,
const Slice& existing_value, std::string* /*new_value*/,
std::string* /*skip_until*/) const override {
std::string k = key.ToString();
std::string v = existing_value.ToString();
// See InitIterators() call below for the sequence of keys and their
// filtering decisions. Here we closely assert that compaction filter is
// called with the expected keys and only them, and with the right values.
if (k == "a") {
EXPECT_EQ(ValueType::kMergeOperand, t);
EXPECT_EQ("av1", v);
return Decision::kKeep;
} else if (k == "b") {
EXPECT_EQ(ValueType::kMergeOperand, t);
return Decision::kKeep;
} else if (k == "c") {
return Decision::kKeep;
}
ADD_FAILURE();
return Decision::kKeep;
}
const char* Name() const override {
return "CompactionIteratorTest.SingleMergeOperand::Filter";
}
};
class SingleMergeOp : public MergeOperator {
public:
bool FullMergeV2(const MergeOperationInput& merge_in,
MergeOperationOutput* merge_out) const override {
// See InitIterators() call below for why "c" is the only key for which
// FullMergeV2 should be called.
EXPECT_EQ("c", merge_in.key.ToString());
std::string temp_value;
if (merge_in.existing_value != nullptr) {
temp_value = merge_in.existing_value->ToString();
}
for (auto& operand : merge_in.operand_list) {
temp_value.append(operand.ToString());
}
merge_out->new_value = temp_value;
return true;
}
bool PartialMergeMulti(const Slice& key,
const std::deque<Slice>& operand_list,
std::string* new_value,
Logger* /*logger*/) const override {
std::string string_key = key.ToString();
EXPECT_TRUE(string_key == "a" || string_key == "b");
if (string_key == "a") {
EXPECT_EQ(1, operand_list.size());
} else if (string_key == "b") {
EXPECT_EQ(2, operand_list.size());
}
std::string temp_value;
for (auto& operand : operand_list) {
temp_value.append(operand.ToString());
}
swap(temp_value, *new_value);
return true;
}
const char* Name() const override {
return "CompactionIteratorTest SingleMergeOp";
}
bool AllowSingleOperand() const override { return true; }
};
SingleMergeOp merge_op;
Filter filter;
InitIterators(
// a should invoke PartialMergeMulti with a single merge operand.
{test::KeyStr("a", 50, kTypeMerge),
// b should invoke PartialMergeMulti with two operands.
test::KeyStr("b", 70, kTypeMerge), test::KeyStr("b", 60, kTypeMerge),
// c should invoke FullMerge due to kTypeValue at the beginning.
test::KeyStr("c", 90, kTypeMerge), test::KeyStr("c", 80, kTypeValue)},
{"av1", "bv2", "bv1", "cv2", "cv1"}, {}, {}, kMaxSequenceNumber,
kMaxSequenceNumber, &merge_op, &filter);
c_iter_->SeekToFirst();
ASSERT_TRUE(c_iter_->Valid());
ASSERT_EQ(test::KeyStr("a", 50, kTypeMerge), c_iter_->key().ToString());
ASSERT_EQ("av1", c_iter_->value().ToString());
c_iter_->Next();
ASSERT_TRUE(c_iter_->Valid());
ASSERT_EQ("bv1bv2", c_iter_->value().ToString());
c_iter_->Next();
ASSERT_EQ("cv1cv2", c_iter_->value().ToString());
}
// In bottommost level, values earlier than earliest snapshot can be output
// with sequence = 0.
TEST_P(CompactionIteratorTest, ZeroOutSequenceAtBottomLevel) {
AddSnapshot(1);
RunTest({test::KeyStr("a", 1, kTypeValue), test::KeyStr("b", 2, kTypeValue)},
{"v1", "v2"},
{test::KeyStr("a", 0, kTypeValue), test::KeyStr("b", 2, kTypeValue)},
{"v1", "v2"}, kMaxSequenceNumber /*last_commited_seq*/,
nullptr /*merge_operator*/, nullptr /*compaction_filter*/,
true /*bottommost_level*/);
}
// In bottommost level, deletions earlier than earliest snapshot can be removed
// permanently.
TEST_P(CompactionIteratorTest, RemoveDeletionAtBottomLevel) {
AddSnapshot(1);
RunTest({test::KeyStr("a", 1, kTypeDeletion),
test::KeyStr("b", 3, kTypeDeletion),
test::KeyStr("b", 1, kTypeValue)},
{"", "", ""},
{test::KeyStr("b", 3, kTypeDeletion),
test::KeyStr("b", 0, kTypeValue)},
{"", ""},
kMaxSequenceNumber /*last_commited_seq*/, nullptr /*merge_operator*/,
nullptr /*compaction_filter*/, true /*bottommost_level*/);
}
// In bottommost level, single deletions earlier than earliest snapshot can be
// removed permanently.
TEST_P(CompactionIteratorTest, RemoveSingleDeletionAtBottomLevel) {
AddSnapshot(1);
RunTest({test::KeyStr("a", 1, kTypeSingleDeletion),
test::KeyStr("b", 2, kTypeSingleDeletion)},
{"", ""}, {test::KeyStr("b", 2, kTypeSingleDeletion)}, {""},
kMaxSequenceNumber /*last_commited_seq*/, nullptr /*merge_operator*/,
nullptr /*compaction_filter*/, true /*bottommost_level*/);
}
INSTANTIATE_TEST_CASE_P(CompactionIteratorTestInstance, CompactionIteratorTest,
testing::Values(true, false));
// Tests how CompactionIterator work together with SnapshotChecker.
class CompactionIteratorWithSnapshotCheckerTest
: public CompactionIteratorTest {
public:
bool UseSnapshotChecker() const override { return true; }
};
// Uncommitted keys (keys with seq > last_committed_seq) should be output as-is
// while committed version of these keys should get compacted as usual.
TEST_F(CompactionIteratorWithSnapshotCheckerTest,
PreserveUncommittedKeys_Value) {
RunTest(
{test::KeyStr("foo", 3, kTypeValue), test::KeyStr("foo", 2, kTypeValue),
test::KeyStr("foo", 1, kTypeValue)},
{"v3", "v2", "v1"},
{test::KeyStr("foo", 3, kTypeValue), test::KeyStr("foo", 2, kTypeValue)},
{"v3", "v2"}, 2 /*last_committed_seq*/);
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest,
PreserveUncommittedKeys_Deletion) {
RunTest({test::KeyStr("foo", 2, kTypeDeletion),
test::KeyStr("foo", 1, kTypeValue)},
{"", "v1"},
{test::KeyStr("foo", 2, kTypeDeletion),
test::KeyStr("foo", 1, kTypeValue)},
{"", "v1"}, 1 /*last_committed_seq*/);
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest,
PreserveUncommittedKeys_Merge) {
auto merge_op = MergeOperators::CreateStringAppendOperator();
RunTest(
{test::KeyStr("foo", 3, kTypeMerge), test::KeyStr("foo", 2, kTypeMerge),
test::KeyStr("foo", 1, kTypeValue)},
{"v3", "v2", "v1"},
{test::KeyStr("foo", 3, kTypeMerge), test::KeyStr("foo", 2, kTypeValue)},
{"v3", "v1,v2"}, 2 /*last_committed_seq*/, merge_op.get());
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest,
PreserveUncommittedKeys_SingleDelete) {
RunTest({test::KeyStr("foo", 2, kTypeSingleDeletion),
test::KeyStr("foo", 1, kTypeValue)},
{"", "v1"},
{test::KeyStr("foo", 2, kTypeSingleDeletion),
test::KeyStr("foo", 1, kTypeValue)},
{"", "v1"}, 1 /*last_committed_seq*/);
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest,
PreserveUncommittedKeys_BlobIndex) {
RunTest({test::KeyStr("foo", 3, kTypeBlobIndex),
test::KeyStr("foo", 2, kTypeBlobIndex),
test::KeyStr("foo", 1, kTypeBlobIndex)},
{"v3", "v2", "v1"},
{test::KeyStr("foo", 3, kTypeBlobIndex),
test::KeyStr("foo", 2, kTypeBlobIndex)},
{"v3", "v2"}, 2 /*last_committed_seq*/);
}
// Test compaction iterator dedup keys visible to the same snapshot.
TEST_F(CompactionIteratorWithSnapshotCheckerTest, DedupSameSnapshot_Value) {
AddSnapshot(2, 1);
RunTest(
{test::KeyStr("foo", 4, kTypeValue), test::KeyStr("foo", 3, kTypeValue),
test::KeyStr("foo", 2, kTypeValue), test::KeyStr("foo", 1, kTypeValue)},
{"v4", "v3", "v2", "v1"},
{test::KeyStr("foo", 4, kTypeValue), test::KeyStr("foo", 3, kTypeValue),
test::KeyStr("foo", 1, kTypeValue)},
{"v4", "v3", "v1"}, 3 /*last_committed_seq*/);
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest, DedupSameSnapshot_Deletion) {
AddSnapshot(2, 1);
RunTest(
{test::KeyStr("foo", 4, kTypeValue),
test::KeyStr("foo", 3, kTypeDeletion),
test::KeyStr("foo", 2, kTypeValue), test::KeyStr("foo", 1, kTypeValue)},
{"v4", "", "v2", "v1"},
{test::KeyStr("foo", 4, kTypeValue),
test::KeyStr("foo", 3, kTypeDeletion),
test::KeyStr("foo", 1, kTypeValue)},
{"v4", "", "v1"}, 3 /*last_committed_seq*/);
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest, DedupSameSnapshot_Merge) {
AddSnapshot(2, 1);
AddSnapshot(4, 3);
auto merge_op = MergeOperators::CreateStringAppendOperator();
RunTest(
{test::KeyStr("foo", 5, kTypeMerge), test::KeyStr("foo", 4, kTypeMerge),
test::KeyStr("foo", 3, kTypeMerge), test::KeyStr("foo", 2, kTypeMerge),
test::KeyStr("foo", 1, kTypeValue)},
{"v5", "v4", "v3", "v2", "v1"},
{test::KeyStr("foo", 5, kTypeMerge), test::KeyStr("foo", 4, kTypeMerge),
test::KeyStr("foo", 3, kTypeMerge), test::KeyStr("foo", 1, kTypeValue)},
{"v5", "v4", "v2,v3", "v1"}, 4 /*last_committed_seq*/, merge_op.get());
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest,
DedupSameSnapshot_SingleDeletion) {
AddSnapshot(2, 1);
RunTest(
{test::KeyStr("foo", 4, kTypeValue),
test::KeyStr("foo", 3, kTypeSingleDeletion),
test::KeyStr("foo", 2, kTypeValue), test::KeyStr("foo", 1, kTypeValue)},
{"v4", "", "v2", "v1"},
{test::KeyStr("foo", 4, kTypeValue), test::KeyStr("foo", 1, kTypeValue)},
{"v4", "v1"}, 3 /*last_committed_seq*/);
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest, DedupSameSnapshot_BlobIndex) {
AddSnapshot(2, 1);
RunTest({test::KeyStr("foo", 4, kTypeBlobIndex),
test::KeyStr("foo", 3, kTypeBlobIndex),
test::KeyStr("foo", 2, kTypeBlobIndex),
test::KeyStr("foo", 1, kTypeBlobIndex)},
{"v4", "v3", "v2", "v1"},
{test::KeyStr("foo", 4, kTypeBlobIndex),
test::KeyStr("foo", 3, kTypeBlobIndex),
test::KeyStr("foo", 1, kTypeBlobIndex)},
{"v4", "v3", "v1"}, 3 /*last_committed_seq*/);
}
// At bottom level, sequence numbers can be zero out, and deletions can be
// removed, but only when they are visible to earliest snapshot.
TEST_F(CompactionIteratorWithSnapshotCheckerTest,
NotZeroOutSequenceIfNotVisibleToEarliestSnapshot) {
AddSnapshot(2, 1);
RunTest({test::KeyStr("a", 1, kTypeValue), test::KeyStr("b", 2, kTypeValue),
test::KeyStr("c", 3, kTypeValue)},
{"v1", "v2", "v3"},
{test::KeyStr("a", 0, kTypeValue), test::KeyStr("b", 2, kTypeValue),
test::KeyStr("c", 3, kTypeValue)},
{"v1", "v2", "v3"}, kMaxSequenceNumber /*last_commited_seq*/,
nullptr /*merge_operator*/, nullptr /*compaction_filter*/,
true /*bottommost_level*/);
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest,
NotRemoveDeletionIfNotVisibleToEarliestSnapshot) {
AddSnapshot(2, 1);
RunTest(
{test::KeyStr("a", 1, kTypeDeletion), test::KeyStr("b", 2, kTypeDeletion),
test::KeyStr("c", 3, kTypeDeletion)},
{"", "", ""},
{},
{"", ""}, kMaxSequenceNumber /*last_commited_seq*/,
nullptr /*merge_operator*/, nullptr /*compaction_filter*/,
true /*bottommost_level*/);
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest,
NotRemoveDeletionIfValuePresentToEarlierSnapshot) {
AddSnapshot(2,1);
RunTest(
{test::KeyStr("a", 4, kTypeDeletion), test::KeyStr("a", 1, kTypeValue),
test::KeyStr("b", 3, kTypeValue)},
{"", "", ""},
{test::KeyStr("a", 4, kTypeDeletion), test::KeyStr("a", 0, kTypeValue),
test::KeyStr("b", 3, kTypeValue)},
{"", "", ""}, kMaxSequenceNumber /*last_commited_seq*/,
nullptr /*merge_operator*/, nullptr /*compaction_filter*/,
true /*bottommost_level*/);
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest,
NotRemoveSingleDeletionIfNotVisibleToEarliestSnapshot) {
AddSnapshot(2, 1);
RunTest({test::KeyStr("a", 1, kTypeSingleDeletion),
test::KeyStr("b", 2, kTypeSingleDeletion),
test::KeyStr("c", 3, kTypeSingleDeletion)},
{"", "", ""},
{test::KeyStr("b", 2, kTypeSingleDeletion),
test::KeyStr("c", 3, kTypeSingleDeletion)},
{"", ""}, kMaxSequenceNumber /*last_commited_seq*/,
nullptr /*merge_operator*/, nullptr /*compaction_filter*/,
true /*bottommost_level*/);
}
// Single delete should not cancel out values that not visible to the
// same set of snapshots
TEST_F(CompactionIteratorWithSnapshotCheckerTest,
SingleDeleteAcrossSnapshotBoundary) {
AddSnapshot(2, 1);
RunTest({test::KeyStr("a", 2, kTypeSingleDeletion),
test::KeyStr("a", 1, kTypeValue)},
{"", "v1"},
{test::KeyStr("a", 2, kTypeSingleDeletion),
test::KeyStr("a", 1, kTypeValue)},
{"", "v1"}, 2 /*last_committed_seq*/);
}
// Single delete should be kept in case it is not visible to the
// earliest write conflict snapshot. If a single delete is kept for this reason,
// corresponding value can be trimmed to save space.
TEST_F(CompactionIteratorWithSnapshotCheckerTest,
KeepSingleDeletionForWriteConflictChecking) {
AddSnapshot(2, 0);
RunTest({test::KeyStr("a", 2, kTypeSingleDeletion),
test::KeyStr("a", 1, kTypeValue)},
{"", "v1"},
{test::KeyStr("a", 2, kTypeSingleDeletion),
test::KeyStr("a", 1, kTypeValue)},
{"", ""}, 2 /*last_committed_seq*/, nullptr /*merge_operator*/,
nullptr /*compaction_filter*/, false /*bottommost_level*/,
2 /*earliest_write_conflict_snapshot*/);
}
// Compaction filter should keep uncommitted key as-is, and
// * Convert the latest velue to deletion, and/or
// * if latest value is a merge, apply filter to all suequent merges.
TEST_F(CompactionIteratorWithSnapshotCheckerTest, CompactionFilter_Value) {
std::unique_ptr<CompactionFilter> compaction_filter(
new FilterAllKeysCompactionFilter());
RunTest(
{test::KeyStr("a", 2, kTypeValue), test::KeyStr("a", 1, kTypeValue),
test::KeyStr("b", 3, kTypeValue), test::KeyStr("c", 1, kTypeValue)},
{"v2", "v1", "v3", "v4"},
{test::KeyStr("a", 2, kTypeValue), test::KeyStr("a", 1, kTypeDeletion),
test::KeyStr("b", 3, kTypeValue), test::KeyStr("c", 1, kTypeDeletion)},
{"v2", "", "v3", ""}, 1 /*last_committed_seq*/,
nullptr /*merge_operator*/, compaction_filter.get());
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest, CompactionFilter_Deletion) {
std::unique_ptr<CompactionFilter> compaction_filter(
new FilterAllKeysCompactionFilter());
RunTest(
{test::KeyStr("a", 2, kTypeDeletion), test::KeyStr("a", 1, kTypeValue)},
{"", "v1"},
{test::KeyStr("a", 2, kTypeDeletion),
test::KeyStr("a", 1, kTypeDeletion)},
{"", ""}, 1 /*last_committed_seq*/, nullptr /*merge_operator*/,
compaction_filter.get());
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest,
CompactionFilter_PartialMerge) {
std::shared_ptr<MergeOperator> merge_op =
MergeOperators::CreateStringAppendOperator();
std::unique_ptr<CompactionFilter> compaction_filter(
new FilterAllKeysCompactionFilter());
RunTest({test::KeyStr("a", 3, kTypeMerge), test::KeyStr("a", 2, kTypeMerge),
test::KeyStr("a", 1, kTypeMerge)},
{"v3", "v2", "v1"}, {test::KeyStr("a", 3, kTypeMerge)}, {"v3"},
2 /*last_committed_seq*/, merge_op.get(), compaction_filter.get());
}
TEST_F(CompactionIteratorWithSnapshotCheckerTest, CompactionFilter_FullMerge) {
std::shared_ptr<MergeOperator> merge_op =
MergeOperators::CreateStringAppendOperator();
std::unique_ptr<CompactionFilter> compaction_filter(
new FilterAllKeysCompactionFilter());
RunTest(
{test::KeyStr("a", 3, kTypeMerge), test::KeyStr("a", 2, kTypeMerge),
test::KeyStr("a", 1, kTypeValue)},
{"v3", "v2", "v1"},
{test::KeyStr("a", 3, kTypeMerge), test::KeyStr("a", 1, kTypeDeletion)},
{"v3", ""}, 2 /*last_committed_seq*/, merge_op.get(),
compaction_filter.get());
}
} // namespace rocksdb
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
File diff suppressed because it is too large. Load diff
-194
View File
@@ -1,194 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#include <atomic>
#include <deque>
#include <functional>
#include <limits>
#include <set>
#include <string>
#include <utility>
#include <vector>
#include "db/column_family.h"
#include "db/compaction/compaction_iterator.h"
#include "db/dbformat.h"
#include "db/flush_scheduler.h"
#include "db/internal_stats.h"
#include "db/job_context.h"
#include "db/log_writer.h"
#include "db/memtable_list.h"
#include "db/range_del_aggregator.h"
#include "db/version_edit.h"
#include "db/write_controller.h"
#include "db/write_thread.h"
#include "logging/event_logger.h"
#include "options/cf_options.h"
#include "options/db_options.h"
#include "port/port.h"
#include "rocksdb/compaction_filter.h"
#include "rocksdb/compaction_job_stats.h"
#include "rocksdb/db.h"
#include "rocksdb/env.h"
#include "rocksdb/memtablerep.h"
#include "rocksdb/transaction_log.h"
#include "table/scoped_arena_iterator.h"
#include "util/autovector.h"
#include "util/stop_watch.h"
#include "util/thread_local.h"
namespace rocksdb {
class Arena;
class ErrorHandler;
class MemTable;
class SnapshotChecker;
class TableCache;
class Version;
class VersionEdit;
class VersionSet;
// CompactionJob is responsible for executing the compaction. Each (manual or
// automated) compaction corresponds to a CompactionJob object, and usually
// goes through the stages of `Prepare()`->`Run()`->`Install()`. CompactionJob
// will divide the compaction into subcompactions and execute them in parallel
// if needed.
class CompactionJob {
public:
CompactionJob(
int job_id, Compaction* compaction, const ImmutableDBOptions& db_options,
const EnvOptions env_options, VersionSet* versions,
const std::atomic<bool>* shutting_down,
const SequenceNumber preserve_deletes_seqnum, LogBuffer* log_buffer,
Directory* db_directory, Directory* output_directory, Statistics* stats,
InstrumentedMutex* db_mutex, ErrorHandler* db_error_handler,
std::vector<SequenceNumber> existing_snapshots,
SequenceNumber earliest_write_conflict_snapshot,
const SnapshotChecker* snapshot_checker,
std::shared_ptr<Cache> table_cache, EventLogger* event_logger,
bool paranoid_file_checks, bool measure_io_stats,
const std::string& dbname, CompactionJobStats* compaction_job_stats,
Env::Priority thread_pri, SnapshotListFetchCallback* snap_list_callback);
~CompactionJob();
// no copy/move
CompactionJob(CompactionJob&& job) = delete;
CompactionJob(const CompactionJob& job) = delete;
CompactionJob& operator=(const CompactionJob& job) = delete;
// REQUIRED: mutex held
// Prepare for the compaction by setting up boundaries for each subcompaction
void Prepare();
// REQUIRED mutex not held
// Launch threads for each subcompaction and wait for them to finish. After
// that, verify table is usable and finally do bookkeeping to unify
// subcompaction results
Status Run();
// REQUIRED: mutex held
// Add compaction input/output to the current version
Status Install(const MutableCFOptions& mutable_cf_options);
private:
struct SubcompactionState;
void AggregateStatistics();
// Generates a histogram representing potential divisions of key ranges from
// the input. It adds the starting and/or ending keys of certain input files
// to the working set and then finds the approximate size of data in between
// each consecutive pair of slices. Then it divides these ranges into
// consecutive groups such that each group has a similar size.
void GenSubcompactionBoundaries();
// update the thread status for starting a compaction.
void ReportStartedCompaction(Compaction* compaction);
void AllocateCompactionOutputFileNumbers();
// Call compaction filter. Then iterate through input and compact the
// kv-pairs
void ProcessKeyValueCompaction(SubcompactionState* sub_compact);
Status FinishCompactionOutputFile(
const Status& input_status, SubcompactionState* sub_compact,
CompactionRangeDelAggregator* range_del_agg,
CompactionIterationStats* range_del_out_stats,
const Slice* next_table_min_key = nullptr);
Status InstallCompactionResults(const MutableCFOptions& mutable_cf_options);
void RecordCompactionIOStats();
Status OpenCompactionOutputFile(SubcompactionState* sub_compact);
void CleanupCompaction();
void UpdateCompactionJobStats(
const InternalStats::CompactionStats& stats) const;
void RecordDroppedKeys(const CompactionIterationStats& c_iter_stats,
CompactionJobStats* compaction_job_stats = nullptr);
void UpdateCompactionStats();
void UpdateCompactionInputStatsHelper(
int* num_files, uint64_t* bytes_read, int input_level);
void LogCompaction();
int job_id_;
// CompactionJob state
struct CompactionState;
CompactionState* compact_;
CompactionJobStats* compaction_job_stats_;
InternalStats::CompactionStats compaction_stats_;
// DBImpl state
const std::string& dbname_;
const ImmutableDBOptions& db_options_;
const EnvOptions env_options_;
Env* env_;
// env_option optimized for compaction table reads
EnvOptions env_options_for_read_;
VersionSet* versions_;
const std::atomic<bool>* shutting_down_;
const SequenceNumber preserve_deletes_seqnum_;
LogBuffer* log_buffer_;
Directory* db_directory_;
Directory* output_directory_;
Statistics* stats_;
InstrumentedMutex* db_mutex_;
ErrorHandler* db_error_handler_;
// If there were two snapshots with seq numbers s1 and
// s2 and s1 < s2, and if we find two instances of a key k1 then lies
// entirely within s1 and s2, then the earlier version of k1 can be safely
// deleted because that version is not visible in any snapshot.
std::vector<SequenceNumber> existing_snapshots_;
SnapshotListFetchCallback* snap_list_callback_;
// This is the earliest snapshot that could be used for write-conflict
// checking by a transaction. For any user-key newer than this snapshot, we
// should make sure not to remove evidence that a write occurred.
SequenceNumber earliest_write_conflict_snapshot_;
const SnapshotChecker* const snapshot_checker_;
std::shared_ptr<Cache> table_cache_;
EventLogger* event_logger_;
// Is this compaction creating a file in the bottom most level?
bool bottommost_level_;
bool paranoid_file_checks_;
bool measure_io_stats_;
// Stores the Slices that designate the boundaries for each subcompaction
std::vector<Slice> boundaries_;
// Stores the approx size of keys covered in the range of each subcompaction
std::vector<uint64_t> sizes_;
Env::WriteLifeTimeHint write_hint_;
Env::Priority thread_pri_;
};
} // namespace rocksdb
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
-312
View File
@@ -1,312 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#include <memory>
#include <set>
#include <string>
#include <unordered_set>
#include <vector>
#include "db/compaction/compaction.h"
#include "db/version_set.h"
#include "options/cf_options.h"
#include "rocksdb/env.h"
#include "rocksdb/options.h"
#include "rocksdb/status.h"
namespace rocksdb {
// The file contains an abstract class CompactionPicker, and its two
// sub-classes LevelCompactionPicker and NullCompactionPicker, as
// well as some helper functions used by them.
class LogBuffer;
class Compaction;
class VersionStorageInfo;
struct CompactionInputFiles;
// An abstract class to pick compactions from an existing LSM-tree.
//
// Each compaction style inherits the class and implement the
// interface to form automatic compactions. If NeedCompaction() is true,
// then call PickCompaction() to find what files need to be compacted
// and where to put the output files.
//
// Non-virtual functions CompactRange() and CompactFiles() are used to
// pick files to compact based on users' DB::CompactRange() and
// DB::CompactFiles() requests, respectively. There is little
// compaction style specific logic for them.
class CompactionPicker {
public:
CompactionPicker(const ImmutableCFOptions& ioptions,
const InternalKeyComparator* icmp);
virtual ~CompactionPicker();
// Pick level and inputs for a new compaction.
// Returns nullptr if there is no compaction to be done.
// Otherwise returns a pointer to a heap-allocated object that
// describes the compaction. Caller should delete the result.
virtual Compaction* PickCompaction(const std::string& cf_name,
const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage,
LogBuffer* log_buffer) = 0;
// Return a compaction object for compacting the range [begin,end] in
// the specified level. Returns nullptr if there is nothing in that
// level that overlaps the specified range. Caller should delete
// the result.
//
// The returned Compaction might not include the whole requested range.
// In that case, compaction_end will be set to the next key that needs
// compacting. In case the compaction will compact the whole range,
// compaction_end will be set to nullptr.
// Client is responsible for compaction_end storage -- when called,
// *compaction_end should point to valid InternalKey!
virtual Compaction* CompactRange(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, int input_level, int output_level,
const CompactRangeOptions& compact_range_options,
const InternalKey* begin, const InternalKey* end,
InternalKey** compaction_end, bool* manual_conflict,
uint64_t max_file_num_to_ignore);
// The maximum allowed output level. Default value is NumberLevels() - 1.
virtual int MaxOutputLevel() const { return NumberLevels() - 1; }
virtual bool NeedsCompaction(const VersionStorageInfo* vstorage) const = 0;
// Sanitize the input set of compaction input files.
// When the input parameters do not describe a valid compaction, the
// function will try to fix the input_files by adding necessary
// files. If it's not possible to conver an invalid input_files
// into a valid one by adding more files, the function will return a
// non-ok status with specific reason.
#ifndef ROCKSDB_LITE
Status SanitizeCompactionInputFiles(std::unordered_set<uint64_t>* input_files,
const ColumnFamilyMetaData& cf_meta,
const int output_level) const;
#endif // ROCKSDB_LITE
// Free up the files that participated in a compaction
//
// Requirement: DB mutex held
void ReleaseCompactionFiles(Compaction* c, Status status);
// Returns true if any one of the specified files are being compacted
bool AreFilesInCompaction(const std::vector<FileMetaData*>& files);
// Takes a list of CompactionInputFiles and returns a (manual) Compaction
// object.
//
// Caller must provide a set of input files that has been passed through
// `SanitizeCompactionInputFiles` earlier. The lock should not be released
// between that call and this one.
Compaction* CompactFiles(const CompactionOptions& compact_options,
const std::vector<CompactionInputFiles>& input_files,
int output_level, VersionStorageInfo* vstorage,
const MutableCFOptions& mutable_cf_options,
uint32_t output_path_id);
// Converts a set of compaction input file numbers into
// a list of CompactionInputFiles.
Status GetCompactionInputsFromFileNumbers(
std::vector<CompactionInputFiles>* input_files,
std::unordered_set<uint64_t>* input_set,
const VersionStorageInfo* vstorage,
const CompactionOptions& compact_options) const;
// Is there currently a compaction involving level 0 taking place
bool IsLevel0CompactionInProgress() const {
return !level0_compactions_in_progress_.empty();
}
// Return true if the passed key range overlap with a compaction output
// that is currently running.
bool RangeOverlapWithCompaction(const Slice& smallest_user_key,
const Slice& largest_user_key,
int level) const;
// Stores the minimal range that covers all entries in inputs in
// *smallest, *largest.
// REQUIRES: inputs is not empty
void GetRange(const CompactionInputFiles& inputs, InternalKey* smallest,
InternalKey* largest) const;
// Stores the minimal range that covers all entries in inputs1 and inputs2
// in *smallest, *largest.
// REQUIRES: inputs is not empty
void GetRange(const CompactionInputFiles& inputs1,
const CompactionInputFiles& inputs2, InternalKey* smallest,
InternalKey* largest) const;
// Stores the minimal range that covers all entries in inputs
// in *smallest, *largest.
// REQUIRES: inputs is not empty (at least on entry have one file)
void GetRange(const std::vector<CompactionInputFiles>& inputs,
InternalKey* smallest, InternalKey* largest) const;
int NumberLevels() const { return ioptions_.num_levels; }
// Add more files to the inputs on "level" to make sure that
// no newer version of a key is compacted to "level+1" while leaving an older
// version in a "level". Otherwise, any Get() will search "level" first,
// and will likely return an old/stale value for the key, since it always
// searches in increasing order of level to find the value. This could
// also scramble the order of merge operands. This function should be
// called any time a new Compaction is created, and its inputs_[0] are
// populated.
//
// Will return false if it is impossible to apply this compaction.
bool ExpandInputsToCleanCut(const std::string& cf_name,
VersionStorageInfo* vstorage,
CompactionInputFiles* inputs,
InternalKey** next_smallest = nullptr);
// Returns true if any one of the parent files are being compacted
bool IsRangeInCompaction(VersionStorageInfo* vstorage,
const InternalKey* smallest,
const InternalKey* largest, int level, int* index);
// Returns true if the key range that `inputs` files cover overlap with the
// key range of a currently running compaction.
bool FilesRangeOverlapWithCompaction(
const std::vector<CompactionInputFiles>& inputs, int level) const;
bool SetupOtherInputs(const std::string& cf_name,
const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage,
CompactionInputFiles* inputs,
CompactionInputFiles* output_level_inputs,
int* parent_index, int base_index);
void GetGrandparents(VersionStorageInfo* vstorage,
const CompactionInputFiles& inputs,
const CompactionInputFiles& output_level_inputs,
std::vector<FileMetaData*>* grandparents);
void PickFilesMarkedForCompaction(const std::string& cf_name,
VersionStorageInfo* vstorage,
int* start_level, int* output_level,
CompactionInputFiles* start_level_inputs);
bool GetOverlappingL0Files(VersionStorageInfo* vstorage,
CompactionInputFiles* start_level_inputs,
int output_level, int* parent_index);
// Register this compaction in the set of running compactions
void RegisterCompaction(Compaction* c);
// Remove this compaction from the set of running compactions
void UnregisterCompaction(Compaction* c);
std::set<Compaction*>* level0_compactions_in_progress() {
return &level0_compactions_in_progress_;
}
std::unordered_set<Compaction*>* compactions_in_progress() {
return &compactions_in_progress_;
}
protected:
const ImmutableCFOptions& ioptions_;
// A helper function to SanitizeCompactionInputFiles() that
// sanitizes "input_files" by adding necessary files.
#ifndef ROCKSDB_LITE
virtual Status SanitizeCompactionInputFilesForAllLevels(
std::unordered_set<uint64_t>* input_files,
const ColumnFamilyMetaData& cf_meta, const int output_level) const;
#endif // ROCKSDB_LITE
// Keeps track of all compactions that are running on Level0.
// Protected by DB mutex
std::set<Compaction*> level0_compactions_in_progress_;
// Keeps track of all compactions that are running.
// Protected by DB mutex
std::unordered_set<Compaction*> compactions_in_progress_;
const InternalKeyComparator* const icmp_;
};
#ifndef ROCKSDB_LITE
// A dummy compaction that never triggers any automatic
// compaction.
class NullCompactionPicker : public CompactionPicker {
public:
NullCompactionPicker(const ImmutableCFOptions& ioptions,
const InternalKeyComparator* icmp)
: CompactionPicker(ioptions, icmp) {}
virtual ~NullCompactionPicker() {}
// Always return "nullptr"
Compaction* PickCompaction(const std::string& /*cf_name*/,
const MutableCFOptions& /*mutable_cf_options*/,
VersionStorageInfo* /*vstorage*/,
LogBuffer* /*log_buffer*/) override {
return nullptr;
}
// Always return "nullptr"
Compaction* CompactRange(const std::string& /*cf_name*/,
const MutableCFOptions& /*mutable_cf_options*/,
VersionStorageInfo* /*vstorage*/,
int /*input_level*/, int /*output_level*/,
const CompactRangeOptions& /*compact_range_options*/,
const InternalKey* /*begin*/,
const InternalKey* /*end*/,
InternalKey** /*compaction_end*/,
bool* /*manual_conflict*/,
uint64_t /*max_file_num_to_ignore*/) override {
return nullptr;
}
// Always returns false.
virtual bool NeedsCompaction(
const VersionStorageInfo* /*vstorage*/) const override {
return false;
}
};
#endif // !ROCKSDB_LITE
// Attempts to find an intra L0 compaction conforming to the given parameters.
//
// @param level_files Metadata for L0 files.
// @param min_files_to_compact Minimum number of files required to
// do the compaction.
// @param max_compact_bytes_per_del_file Maximum average size in bytes per
// file that is going to get deleted by
// the compaction.
// @param max_compaction_bytes Maximum total size in bytes (in terms
// of compensated file size) for files
// to be compacted.
// @param [out] comp_inputs If a compaction was found, will be
// initialized with corresponding input
// files. Cannot be nullptr.
//
// @return true iff compaction was found.
bool FindIntraL0Compaction(const std::vector<FileMetaData*>& level_files,
size_t min_files_to_compact,
uint64_t max_compact_bytes_per_del_file,
uint64_t max_compaction_bytes,
CompactionInputFiles* comp_inputs);
CompressionType GetCompressionType(const ImmutableCFOptions& ioptions,
const VersionStorageInfo* vstorage,
const MutableCFOptions& mutable_cf_options,
int level, int base_level,
const bool enable_compression = true);
CompressionOptions GetCompressionOptions(const ImmutableCFOptions& ioptions,
const VersionStorageInfo* vstorage,
int level,
const bool enable_compression = true);
} // namespace rocksdb
-232
View File
@@ -1,232 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#include "db/compaction/compaction_picker_fifo.h"
#ifndef ROCKSDB_LITE
#include <cinttypes>
#include <string>
#include <vector>
#include "db/column_family.h"
#include "logging/log_buffer.h"
#include "util/string_util.h"
namespace rocksdb {
namespace {
uint64_t GetTotalFilesSize(const std::vector<FileMetaData*>& files) {
uint64_t total_size = 0;
for (const auto& f : files) {
total_size += f->fd.file_size;
}
return total_size;
}
} // anonymous namespace
bool FIFOCompactionPicker::NeedsCompaction(
const VersionStorageInfo* vstorage) const {
const int kLevel0 = 0;
return vstorage->CompactionScore(kLevel0) >= 1;
}
Compaction* FIFOCompactionPicker::PickTTLCompaction(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, LogBuffer* log_buffer) {
assert(mutable_cf_options.ttl > 0);
const int kLevel0 = 0;
const std::vector<FileMetaData*>& level_files = vstorage->LevelFiles(kLevel0);
uint64_t total_size = GetTotalFilesSize(level_files);
int64_t _current_time;
auto status = ioptions_.env->GetCurrentTime(&_current_time);
if (!status.ok()) {
ROCKS_LOG_BUFFER(log_buffer,
"[%s] FIFO compaction: Couldn't get current time: %s. "
"Not doing compactions based on TTL. ",
cf_name.c_str(), status.ToString().c_str());
return nullptr;
}
const uint64_t current_time = static_cast<uint64_t>(_current_time);
std::vector<CompactionInputFiles> inputs;
inputs.emplace_back();
inputs[0].level = 0;
// avoid underflow
if (current_time > mutable_cf_options.ttl) {
for (auto ritr = level_files.rbegin(); ritr != level_files.rend(); ++ritr) {
auto f = *ritr;
if (f->fd.table_reader != nullptr &&
f->fd.table_reader->GetTableProperties() != nullptr) {
auto creation_time =
f->fd.table_reader->GetTableProperties()->creation_time;
if (creation_time == 0 ||
creation_time >= (current_time - mutable_cf_options.ttl)) {
break;
}
total_size -= f->compensated_file_size;
inputs[0].files.push_back(f);
}
}
}
// Return a nullptr and proceed to size-based FIFO compaction if:
// 1. there are no files older than ttl OR
// 2. there are a few files older than ttl, but deleting them will not bring
// the total size to be less than max_table_files_size threshold.
if (inputs[0].files.empty() ||
total_size >
mutable_cf_options.compaction_options_fifo.max_table_files_size) {
return nullptr;
}
for (const auto& f : inputs[0].files) {
ROCKS_LOG_BUFFER(log_buffer,
"[%s] FIFO compaction: picking file %" PRIu64
" with creation time %" PRIu64 " for deletion",
cf_name.c_str(), f->fd.GetNumber(),
f->fd.table_reader->GetTableProperties()->creation_time);
}
Compaction* c = new Compaction(
vstorage, ioptions_, mutable_cf_options, std::move(inputs), 0, 0, 0, 0,
kNoCompression, ioptions_.compression_opts, /* max_subcompactions */ 0,
{}, /* is manual */ false, vstorage->CompactionScore(0),
/* is deletion compaction */ true, CompactionReason::kFIFOTtl);
return c;
}
Compaction* FIFOCompactionPicker::PickSizeCompaction(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, LogBuffer* log_buffer) {
const int kLevel0 = 0;
const std::vector<FileMetaData*>& level_files = vstorage->LevelFiles(kLevel0);
uint64_t total_size = GetTotalFilesSize(level_files);
if (total_size <=
mutable_cf_options.compaction_options_fifo.max_table_files_size ||
level_files.size() == 0) {
// total size not exceeded
if (mutable_cf_options.compaction_options_fifo.allow_compaction &&
level_files.size() > 0) {
CompactionInputFiles comp_inputs;
// try to prevent same files from being compacted multiple times, which
// could produce large files that may never TTL-expire. Achieve this by
// disallowing compactions with files larger than memtable (inflate its
// size by 10% to account for uncompressed L0 files that may have size
// slightly greater than memtable size limit).
size_t max_compact_bytes_per_del_file =
static_cast<size_t>(MultiplyCheckOverflow(
static_cast<uint64_t>(mutable_cf_options.write_buffer_size),
1.1));
if (FindIntraL0Compaction(
level_files,
mutable_cf_options
.level0_file_num_compaction_trigger /* min_files_to_compact */
,
max_compact_bytes_per_del_file,
mutable_cf_options.max_compaction_bytes, &comp_inputs)) {
Compaction* c = new Compaction(
vstorage, ioptions_, mutable_cf_options, {comp_inputs}, 0,
16 * 1024 * 1024 /* output file size limit */,
0 /* max compaction bytes, not applicable */,
0 /* output path ID */, mutable_cf_options.compression,
ioptions_.compression_opts, 0 /* max_subcompactions */, {},
/* is manual */ false, vstorage->CompactionScore(0),
/* is deletion compaction */ false,
CompactionReason::kFIFOReduceNumFiles);
return c;
}
}
ROCKS_LOG_BUFFER(
log_buffer,
"[%s] FIFO compaction: nothing to do. Total size %" PRIu64
", max size %" PRIu64 "\n",
cf_name.c_str(), total_size,
mutable_cf_options.compaction_options_fifo.max_table_files_size);
return nullptr;
}
if (!level0_compactions_in_progress_.empty()) {
ROCKS_LOG_BUFFER(
log_buffer,
"[%s] FIFO compaction: Already executing compaction. No need "
"to run parallel compactions since compactions are very fast",
cf_name.c_str());
return nullptr;
}
std::vector<CompactionInputFiles> inputs;
inputs.emplace_back();
inputs[0].level = 0;
for (auto ritr = level_files.rbegin(); ritr != level_files.rend(); ++ritr) {
auto f = *ritr;
total_size -= f->compensated_file_size;
inputs[0].files.push_back(f);
char tmp_fsize[16];
AppendHumanBytes(f->fd.GetFileSize(), tmp_fsize, sizeof(tmp_fsize));
ROCKS_LOG_BUFFER(log_buffer,
"[%s] FIFO compaction: picking file %" PRIu64
" with size %s for deletion",
cf_name.c_str(), f->fd.GetNumber(), tmp_fsize);
if (total_size <=
mutable_cf_options.compaction_options_fifo.max_table_files_size) {
break;
}
}
Compaction* c = new Compaction(
vstorage, ioptions_, mutable_cf_options, std::move(inputs), 0, 0, 0, 0,
kNoCompression, ioptions_.compression_opts, /* max_subcompactions */ 0,
{}, /* is manual */ false, vstorage->CompactionScore(0),
/* is deletion compaction */ true, CompactionReason::kFIFOMaxSize);
return c;
}
Compaction* FIFOCompactionPicker::PickCompaction(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, LogBuffer* log_buffer) {
assert(vstorage->num_levels() == 1);
Compaction* c = nullptr;
if (mutable_cf_options.ttl > 0) {
c = PickTTLCompaction(cf_name, mutable_cf_options, vstorage, log_buffer);
}
if (c == nullptr) {
c = PickSizeCompaction(cf_name, mutable_cf_options, vstorage, log_buffer);
}
RegisterCompaction(c);
return c;
}
Compaction* FIFOCompactionPicker::CompactRange(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, int input_level, int output_level,
const CompactRangeOptions& /*compact_range_options*/,
const InternalKey* /*begin*/, const InternalKey* /*end*/,
InternalKey** compaction_end, bool* /*manual_conflict*/,
uint64_t /*max_file_num_to_ignore*/) {
#ifdef NDEBUG
(void)input_level;
(void)output_level;
#endif
assert(input_level == 0);
assert(output_level == 0);
*compaction_end = nullptr;
LogBuffer log_buffer(InfoLogLevel::INFO_LEVEL, ioptions_.info_log);
Compaction* c =
PickCompaction(cf_name, mutable_cf_options, vstorage, &log_buffer);
log_buffer.FlushBufferToLog();
return c;
}
} // namespace rocksdb
#endif // !ROCKSDB_LITE
-53
View File
@@ -1,53 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#ifndef ROCKSDB_LITE
#include "db/compaction/compaction_picker.h"
namespace rocksdb {
class FIFOCompactionPicker : public CompactionPicker {
public:
FIFOCompactionPicker(const ImmutableCFOptions& ioptions,
const InternalKeyComparator* icmp)
: CompactionPicker(ioptions, icmp) {}
virtual Compaction* PickCompaction(const std::string& cf_name,
const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* version,
LogBuffer* log_buffer) override;
virtual Compaction* CompactRange(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, int input_level, int output_level,
const CompactRangeOptions& compact_range_options,
const InternalKey* begin, const InternalKey* end,
InternalKey** compaction_end, bool* manual_conflict,
uint64_t max_file_num_to_ignore) override;
// The maximum allowed output level. Always returns 0.
virtual int MaxOutputLevel() const override { return 0; }
virtual bool NeedsCompaction(
const VersionStorageInfo* vstorage) const override;
private:
Compaction* PickTTLCompaction(const std::string& cf_name,
const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* version,
LogBuffer* log_buffer);
Compaction* PickSizeCompaction(const std::string& cf_name,
const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* version,
LogBuffer* log_buffer);
};
} // namespace rocksdb
#endif // !ROCKSDB_LITE
-553
View File
@@ -1,553 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#include <string>
#include <utility>
#include <vector>
#include "db/compaction/compaction_picker_level.h"
#include "logging/log_buffer.h"
#include "test_util/sync_point.h"
namespace rocksdb {
bool LevelCompactionPicker::NeedsCompaction(
const VersionStorageInfo* vstorage) const {
if (!vstorage->ExpiredTtlFiles().empty()) {
return true;
}
if (!vstorage->FilesMarkedForPeriodicCompaction().empty()) {
return true;
}
if (!vstorage->BottommostFilesMarkedForCompaction().empty()) {
return true;
}
if (!vstorage->FilesMarkedForCompaction().empty()) {
return true;
}
for (int i = 0; i <= vstorage->MaxInputLevel(); i++) {
if (vstorage->CompactionScore(i) >= 1) {
return true;
}
}
return false;
}
namespace {
// A class to build a leveled compaction step-by-step.
class LevelCompactionBuilder {
public:
LevelCompactionBuilder(const std::string& cf_name,
VersionStorageInfo* vstorage,
CompactionPicker* compaction_picker,
LogBuffer* log_buffer,
const MutableCFOptions& mutable_cf_options,
const ImmutableCFOptions& ioptions)
: cf_name_(cf_name),
vstorage_(vstorage),
compaction_picker_(compaction_picker),
log_buffer_(log_buffer),
mutable_cf_options_(mutable_cf_options),
ioptions_(ioptions) {}
// Pick and return a compaction.
Compaction* PickCompaction();
// Pick the initial files to compact to the next level. (or together
// in Intra-L0 compactions)
void SetupInitialFiles();
// If the initial files are from L0 level, pick other L0
// files if needed.
bool SetupOtherL0FilesIfNeeded();
// Based on initial files, setup other files need to be compacted
// in this compaction, accordingly.
bool SetupOtherInputsIfNeeded();
Compaction* GetCompaction();
// For the specfied level, pick a file that we want to compact.
// Returns false if there is no file to compact.
// If it returns true, inputs->files.size() will be exactly one.
// If level is 0 and there is already a compaction on that level, this
// function will return false.
bool PickFileToCompact();
// For L0->L0, picks the longest span of files that aren't currently
// undergoing compaction for which work-per-deleted-file decreases. The span
// always starts from the newest L0 file.
//
// Intra-L0 compaction is independent of all other files, so it can be
// performed even when L0->base_level compactions are blocked.
//
// Returns true if `inputs` is populated with a span of files to be compacted;
// otherwise, returns false.
bool PickIntraL0Compaction();
void PickExpiredTtlFiles();
void PickFilesMarkedForPeriodicCompaction();
const std::string& cf_name_;
VersionStorageInfo* vstorage_;
CompactionPicker* compaction_picker_;
LogBuffer* log_buffer_;
int start_level_ = -1;
int output_level_ = -1;
int parent_index_ = -1;
int base_index_ = -1;
double start_level_score_ = 0;
bool is_manual_ = false;
CompactionInputFiles start_level_inputs_;
std::vector<CompactionInputFiles> compaction_inputs_;
CompactionInputFiles output_level_inputs_;
std::vector<FileMetaData*> grandparents_;
CompactionReason compaction_reason_ = CompactionReason::kUnknown;
const MutableCFOptions& mutable_cf_options_;
const ImmutableCFOptions& ioptions_;
// Pick a path ID to place a newly generated file, with its level
static uint32_t GetPathId(const ImmutableCFOptions& ioptions,
const MutableCFOptions& mutable_cf_options,
int level);
static const int kMinFilesForIntraL0Compaction = 4;
};
void LevelCompactionBuilder::PickExpiredTtlFiles() {
if (vstorage_->ExpiredTtlFiles().empty()) {
return;
}
auto continuation = [&](std::pair<int, FileMetaData*> level_file) {
// If it's being compacted it has nothing to do here.
// If this assert() fails that means that some function marked some
// files as being_compacted, but didn't call ComputeCompactionScore()
assert(!level_file.second->being_compacted);
start_level_ = level_file.first;
output_level_ =
(start_level_ == 0) ? vstorage_->base_level() : start_level_ + 1;
if ((start_level_ == vstorage_->num_non_empty_levels() - 1) ||
(start_level_ == 0 &&
!compaction_picker_->level0_compactions_in_progress()->empty())) {
return false;
}
start_level_inputs_.files = {level_file.second};
start_level_inputs_.level = start_level_;
return compaction_picker_->ExpandInputsToCleanCut(cf_name_, vstorage_,
&start_level_inputs_);
};
for (auto& level_file : vstorage_->ExpiredTtlFiles()) {
if (continuation(level_file)) {
// found the compaction!
return;
}
}
start_level_inputs_.files.clear();
}
void LevelCompactionBuilder::PickFilesMarkedForPeriodicCompaction() {
if (vstorage_->FilesMarkedForPeriodicCompaction().empty()) {
return;
}
auto continuation = [&](std::pair<int, FileMetaData*> level_file) {
// If it's being compacted it has nothing to do here.
// If this assert() fails that means that some function marked some
// files as being_compacted, but didn't call ComputeCompactionScore()
assert(!level_file.second->being_compacted);
output_level_ = start_level_ = level_file.first;
if (start_level_ == 0 &&
!compaction_picker_->level0_compactions_in_progress()->empty()) {
return false;
}
start_level_inputs_.files = {level_file.second};
start_level_inputs_.level = start_level_;
return compaction_picker_->ExpandInputsToCleanCut(cf_name_, vstorage_,
&start_level_inputs_);
};
for (auto& level_file : vstorage_->FilesMarkedForPeriodicCompaction()) {
if (continuation(level_file)) {
// found the compaction!
return;
}
}
start_level_inputs_.files.clear();
}
void LevelCompactionBuilder::SetupInitialFiles() {
// Find the compactions by size on all levels.
bool skipped_l0_to_base = false;
for (int i = 0; i < compaction_picker_->NumberLevels() - 1; i++) {
start_level_score_ = vstorage_->CompactionScore(i);
start_level_ = vstorage_->CompactionScoreLevel(i);
assert(i == 0 || start_level_score_ <= vstorage_->CompactionScore(i - 1));
if (start_level_score_ >= 1) {
if (skipped_l0_to_base && start_level_ == vstorage_->base_level()) {
// If L0->base_level compaction is pending, don't schedule further
// compaction from base level. Otherwise L0->base_level compaction
// may starve.
continue;
}
output_level_ =
(start_level_ == 0) ? vstorage_->base_level() : start_level_ + 1;
if (PickFileToCompact()) {
// found the compaction!
if (start_level_ == 0) {
// L0 score = `num L0 files` / `level0_file_num_compaction_trigger`
compaction_reason_ = CompactionReason::kLevelL0FilesNum;
} else {
// L1+ score = `Level files size` / `MaxBytesForLevel`
compaction_reason_ = CompactionReason::kLevelMaxLevelSize;
}
break;
} else {
// didn't find the compaction, clear the inputs
start_level_inputs_.clear();
if (start_level_ == 0) {
skipped_l0_to_base = true;
// L0->base_level may be blocked due to ongoing L0->base_level
// compactions. It may also be blocked by an ongoing compaction from
// base_level downwards.
//
// In these cases, to reduce L0 file count and thus reduce likelihood
// of write stalls, we can attempt compacting a span of files within
// L0.
if (PickIntraL0Compaction()) {
output_level_ = 0;
compaction_reason_ = CompactionReason::kLevelL0FilesNum;
break;
}
}
}
}
}
// if we didn't find a compaction, check if there are any files marked for
// compaction
if (start_level_inputs_.empty()) {
parent_index_ = base_index_ = -1;
compaction_picker_->PickFilesMarkedForCompaction(
cf_name_, vstorage_, &start_level_, &output_level_,
&start_level_inputs_);
if (!start_level_inputs_.empty()) {
is_manual_ = true;
compaction_reason_ = CompactionReason::kFilesMarkedForCompaction;
return;
}
}
// Bottommost Files Compaction on deleting tombstones
if (start_level_inputs_.empty()) {
size_t i;
for (i = 0; i < vstorage_->BottommostFilesMarkedForCompaction().size();
++i) {
auto& level_and_file = vstorage_->BottommostFilesMarkedForCompaction()[i];
assert(!level_and_file.second->being_compacted);
start_level_inputs_.level = output_level_ = start_level_ =
level_and_file.first;
start_level_inputs_.files = {level_and_file.second};
if (compaction_picker_->ExpandInputsToCleanCut(cf_name_, vstorage_,
&start_level_inputs_)) {
break;
}
}
if (i == vstorage_->BottommostFilesMarkedForCompaction().size()) {
start_level_inputs_.clear();
} else {
assert(!start_level_inputs_.empty());
compaction_reason_ = CompactionReason::kBottommostFiles;
return;
}
}
// TTL Compaction
if (start_level_inputs_.empty()) {
PickExpiredTtlFiles();
if (!start_level_inputs_.empty()) {
compaction_reason_ = CompactionReason::kTtl;
return;
}
}
// Periodic Compaction
if (start_level_inputs_.empty()) {
PickFilesMarkedForPeriodicCompaction();
if (!start_level_inputs_.empty()) {
compaction_reason_ = CompactionReason::kPeriodicCompaction;
return;
}
}
}
bool LevelCompactionBuilder::SetupOtherL0FilesIfNeeded() {
if (start_level_ == 0 && output_level_ != 0) {
return compaction_picker_->GetOverlappingL0Files(
vstorage_, &start_level_inputs_, output_level_, &parent_index_);
}
return true;
}
bool LevelCompactionBuilder::SetupOtherInputsIfNeeded() {
// Setup input files from output level. For output to L0, we only compact
// spans of files that do not interact with any pending compactions, so don't
// need to consider other levels.
if (output_level_ != 0) {
output_level_inputs_.level = output_level_;
if (!compaction_picker_->SetupOtherInputs(
cf_name_, mutable_cf_options_, vstorage_, &start_level_inputs_,
&output_level_inputs_, &parent_index_, base_index_)) {
return false;
}
compaction_inputs_.push_back(start_level_inputs_);
if (!output_level_inputs_.empty()) {
compaction_inputs_.push_back(output_level_inputs_);
}
// In some edge cases we could pick a compaction that will be compacting
// a key range that overlap with another running compaction, and both
// of them have the same output level. This could happen if
// (1) we are running a non-exclusive manual compaction
// (2) AddFile ingest a new file into the LSM tree
// We need to disallow this from happening.
if (compaction_picker_->FilesRangeOverlapWithCompaction(compaction_inputs_,
output_level_)) {
// This compaction output could potentially conflict with the output
// of a currently running compaction, we cannot run it.
return false;
}
compaction_picker_->GetGrandparents(vstorage_, start_level_inputs_,
output_level_inputs_, &grandparents_);
} else {
compaction_inputs_.push_back(start_level_inputs_);
}
return true;
}
Compaction* LevelCompactionBuilder::PickCompaction() {
// Pick up the first file to start compaction. It may have been extended
// to a clean cut.
SetupInitialFiles();
if (start_level_inputs_.empty()) {
return nullptr;
}
assert(start_level_ >= 0 && output_level_ >= 0);
// If it is a L0 -> base level compaction, we need to set up other L0
// files if needed.
if (!SetupOtherL0FilesIfNeeded()) {
return nullptr;
}
// Pick files in the output level and expand more files in the start level
// if needed.
if (!SetupOtherInputsIfNeeded()) {
return nullptr;
}
// Form a compaction object containing the files we picked.
Compaction* c = GetCompaction();
TEST_SYNC_POINT_CALLBACK("LevelCompactionPicker::PickCompaction:Return", c);
return c;
}
Compaction* LevelCompactionBuilder::GetCompaction() {
auto c = new Compaction(
vstorage_, ioptions_, mutable_cf_options_, std::move(compaction_inputs_),
output_level_,
MaxFileSizeForLevel(mutable_cf_options_, output_level_,
ioptions_.compaction_style, vstorage_->base_level(),
ioptions_.level_compaction_dynamic_level_bytes),
mutable_cf_options_.max_compaction_bytes,
GetPathId(ioptions_, mutable_cf_options_, output_level_),
GetCompressionType(ioptions_, vstorage_, mutable_cf_options_,
output_level_, vstorage_->base_level()),
GetCompressionOptions(ioptions_, vstorage_, output_level_),
/* max_subcompactions */ 0, std::move(grandparents_), is_manual_,
start_level_score_, false /* deletion_compaction */, compaction_reason_);
// If it's level 0 compaction, make sure we don't execute any other level 0
// compactions in parallel
compaction_picker_->RegisterCompaction(c);
// Creating a compaction influences the compaction score because the score
// takes running compactions into account (by skipping files that are already
// being compacted). Since we just changed compaction score, we recalculate it
// here
vstorage_->ComputeCompactionScore(ioptions_, mutable_cf_options_);
return c;
}
/*
* Find the optimal path to place a file
* Given a level, finds the path where levels up to it will fit in levels
* up to and including this path
*/
uint32_t LevelCompactionBuilder::GetPathId(
const ImmutableCFOptions& ioptions,
const MutableCFOptions& mutable_cf_options, int level) {
uint32_t p = 0;
assert(!ioptions.cf_paths.empty());
// size remaining in the most recent path
uint64_t current_path_size = ioptions.cf_paths[0].target_size;
uint64_t level_size;
int cur_level = 0;
// max_bytes_for_level_base denotes L1 size.
// We estimate L0 size to be the same as L1.
level_size = mutable_cf_options.max_bytes_for_level_base;
// Last path is the fallback
while (p < ioptions.cf_paths.size() - 1) {
if (level_size <= current_path_size) {
if (cur_level == level) {
// Does desired level fit in this path?
return p;
} else {
current_path_size -= level_size;
if (cur_level > 0) {
if (ioptions.level_compaction_dynamic_level_bytes) {
// Currently, level_compaction_dynamic_level_bytes is ignored when
// multiple db paths are specified. https://github.com/facebook/
// rocksdb/blob/master/db/column_family.cc.
// Still, adding this check to avoid accidentally using
// max_bytes_for_level_multiplier_additional
level_size = static_cast<uint64_t>(
level_size * mutable_cf_options.max_bytes_for_level_multiplier);
} else {
level_size = static_cast<uint64_t>(
level_size * mutable_cf_options.max_bytes_for_level_multiplier *
mutable_cf_options.MaxBytesMultiplerAdditional(cur_level));
}
}
cur_level++;
continue;
}
}
p++;
current_path_size = ioptions.cf_paths[p].target_size;
}
return p;
}
bool LevelCompactionBuilder::PickFileToCompact() {
// level 0 files are overlapping. So we cannot pick more
// than one concurrent compactions at this level. This
// could be made better by looking at key-ranges that are
// being compacted at level 0.
if (start_level_ == 0 &&
!compaction_picker_->level0_compactions_in_progress()->empty()) {
TEST_SYNC_POINT("LevelCompactionPicker::PickCompactionBySize:0");
return false;
}
start_level_inputs_.clear();
assert(start_level_ >= 0);
// Pick the largest file in this level that is not already
// being compacted
const std::vector<int>& file_size =
vstorage_->FilesByCompactionPri(start_level_);
const std::vector<FileMetaData*>& level_files =
vstorage_->LevelFiles(start_level_);
unsigned int cmp_idx;
for (cmp_idx = vstorage_->NextCompactionIndex(start_level_);
cmp_idx < file_size.size(); cmp_idx++) {
int index = file_size[cmp_idx];
auto* f = level_files[index];
// do not pick a file to compact if it is being compacted
// from n-1 level.
if (f->being_compacted) {
continue;
}
start_level_inputs_.files.push_back(f);
start_level_inputs_.level = start_level_;
if (!compaction_picker_->ExpandInputsToCleanCut(cf_name_, vstorage_,
&start_level_inputs_) ||
compaction_picker_->FilesRangeOverlapWithCompaction(
{start_level_inputs_}, output_level_)) {
// A locked (pending compaction) input-level file was pulled in due to
// user-key overlap.
start_level_inputs_.clear();
continue;
}
// Now that input level is fully expanded, we check whether any output files
// are locked due to pending compaction.
//
// Note we rely on ExpandInputsToCleanCut() to tell us whether any output-
// level files are locked, not just the extra ones pulled in for user-key
// overlap.
InternalKey smallest, largest;
compaction_picker_->GetRange(start_level_inputs_, &smallest, &largest);
CompactionInputFiles output_level_inputs;
output_level_inputs.level = output_level_;
vstorage_->GetOverlappingInputs(output_level_, &smallest, &largest,
&output_level_inputs.files);
if (!output_level_inputs.empty() &&
!compaction_picker_->ExpandInputsToCleanCut(cf_name_, vstorage_,
&output_level_inputs)) {
start_level_inputs_.clear();
continue;
}
base_index_ = index;
break;
}
// store where to start the iteration in the next call to PickCompaction
vstorage_->SetNextCompactionIndex(start_level_, cmp_idx);
return start_level_inputs_.size() > 0;
}
bool LevelCompactionBuilder::PickIntraL0Compaction() {
start_level_inputs_.clear();
const std::vector<FileMetaData*>& level_files =
vstorage_->LevelFiles(0 /* level */);
if (level_files.size() <
static_cast<size_t>(
mutable_cf_options_.level0_file_num_compaction_trigger + 2) ||
level_files[0]->being_compacted) {
// If L0 isn't accumulating much files beyond the regular trigger, don't
// resort to L0->L0 compaction yet.
return false;
}
return FindIntraL0Compaction(
level_files, kMinFilesForIntraL0Compaction, port::kMaxUint64,
mutable_cf_options_.max_compaction_bytes, &start_level_inputs_);
}
} // namespace
Compaction* LevelCompactionPicker::PickCompaction(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, LogBuffer* log_buffer) {
LevelCompactionBuilder builder(cf_name, vstorage, this, log_buffer,
mutable_cf_options, ioptions_);
return builder.PickCompaction();
}
} // namespace rocksdb
-32
View File
@@ -1,32 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#include "db/compaction/compaction_picker.h"
namespace rocksdb {
// Picking compactions for leveled compaction. See wiki page
// https://github.com/facebook/rocksdb/wiki/Leveled-Compaction
// for description of Leveled compaction.
class LevelCompactionPicker : public CompactionPicker {
public:
LevelCompactionPicker(const ImmutableCFOptions& ioptions,
const InternalKeyComparator* icmp)
: CompactionPicker(ioptions, icmp) {}
virtual Compaction* PickCompaction(const std::string& cf_name,
const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage,
LogBuffer* log_buffer) override;
virtual bool NeedsCompaction(
const VersionStorageInfo* vstorage) const override;
};
} // namespace rocksdb
File diff suppressed because it is too large. Load diff
@@ -1,903 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#include "db/compaction/compaction_picker_universal.h"
#ifndef ROCKSDB_LITE
#include <cinttypes>
#include <limits>
#include <queue>
#include <string>
#include <utility>
#include "db/column_family.h"
#include "file/filename.h"
#include "logging/log_buffer.h"
#include "monitoring/statistics.h"
#include "test_util/sync_point.h"
#include "util/random.h"
#include "util/string_util.h"
namespace rocksdb {
namespace {
// Used in universal compaction when trivial move is enabled.
// This structure is used for the construction of min heap
// that contains the file meta data, the level of the file
// and the index of the file in that level
struct InputFileInfo {
InputFileInfo() : f(nullptr), level(0), index(0) {}
FileMetaData* f;
size_t level;
size_t index;
};
// Used in universal compaction when trivial move is enabled.
// This comparator is used for the construction of min heap
// based on the smallest key of the file.
struct SmallestKeyHeapComparator {
explicit SmallestKeyHeapComparator(const Comparator* ucmp) { ucmp_ = ucmp; }
bool operator()(InputFileInfo i1, InputFileInfo i2) const {
return (ucmp_->Compare(i1.f->smallest.user_key(),
i2.f->smallest.user_key()) > 0);
}
private:
const Comparator* ucmp_;
};
typedef std::priority_queue<InputFileInfo, std::vector<InputFileInfo>,
SmallestKeyHeapComparator>
SmallestKeyHeap;
// This function creates the heap that is used to find if the files are
// overlapping during universal compaction when the allow_trivial_move
// is set.
SmallestKeyHeap create_level_heap(Compaction* c, const Comparator* ucmp) {
SmallestKeyHeap smallest_key_priority_q =
SmallestKeyHeap(SmallestKeyHeapComparator(ucmp));
InputFileInfo input_file;
for (size_t l = 0; l < c->num_input_levels(); l++) {
if (c->num_input_files(l) != 0) {
if (l == 0 && c->start_level() == 0) {
for (size_t i = 0; i < c->num_input_files(0); i++) {
input_file.f = c->input(0, i);
input_file.level = 0;
input_file.index = i;
smallest_key_priority_q.push(std::move(input_file));
}
} else {
input_file.f = c->input(l, 0);
input_file.level = l;
input_file.index = 0;
smallest_key_priority_q.push(std::move(input_file));
}
}
}
return smallest_key_priority_q;
}
#ifndef NDEBUG
// smallest_seqno and largest_seqno are set iff. `files` is not empty.
void GetSmallestLargestSeqno(const std::vector<FileMetaData*>& files,
SequenceNumber* smallest_seqno,
SequenceNumber* largest_seqno) {
bool is_first = true;
for (FileMetaData* f : files) {
assert(f->fd.smallest_seqno <= f->fd.largest_seqno);
if (is_first) {
is_first = false;
*smallest_seqno = f->fd.smallest_seqno;
*largest_seqno = f->fd.largest_seqno;
} else {
if (f->fd.smallest_seqno < *smallest_seqno) {
*smallest_seqno = f->fd.smallest_seqno;
}
if (f->fd.largest_seqno > *largest_seqno) {
*largest_seqno = f->fd.largest_seqno;
}
}
}
}
#endif
} // namespace
// Algorithm that checks to see if there are any overlapping
// files in the input
bool UniversalCompactionPicker::IsInputFilesNonOverlapping(Compaction* c) {
auto comparator = icmp_->user_comparator();
int first_iter = 1;
InputFileInfo prev, curr, next;
SmallestKeyHeap smallest_key_priority_q =
create_level_heap(c, icmp_->user_comparator());
while (!smallest_key_priority_q.empty()) {
curr = smallest_key_priority_q.top();
smallest_key_priority_q.pop();
if (first_iter) {
prev = curr;
first_iter = 0;
} else {
if (comparator->Compare(prev.f->largest.user_key(),
curr.f->smallest.user_key()) >= 0) {
// found overlapping files, return false
return false;
}
assert(comparator->Compare(curr.f->largest.user_key(),
prev.f->largest.user_key()) > 0);
prev = curr;
}
next.f = nullptr;
if (curr.level != 0 && curr.index < c->num_input_files(curr.level) - 1) {
next.f = c->input(curr.level, curr.index + 1);
next.level = curr.level;
next.index = curr.index + 1;
}
if (next.f) {
smallest_key_priority_q.push(std::move(next));
}
}
return true;
}
bool UniversalCompactionPicker::NeedsCompaction(
const VersionStorageInfo* vstorage) const {
const int kLevel0 = 0;
if (vstorage->CompactionScore(kLevel0) >= 1) {
return true;
}
if (!vstorage->FilesMarkedForCompaction().empty()) {
return true;
}
return false;
}
void UniversalCompactionPicker::SortedRun::Dump(char* out_buf,
size_t out_buf_size,
bool print_path) const {
if (level == 0) {
assert(file != nullptr);
if (file->fd.GetPathId() == 0 || !print_path) {
snprintf(out_buf, out_buf_size, "file %" PRIu64, file->fd.GetNumber());
} else {
snprintf(out_buf, out_buf_size, "file %" PRIu64
"(path "
"%" PRIu32 ")",
file->fd.GetNumber(), file->fd.GetPathId());
}
} else {
snprintf(out_buf, out_buf_size, "level %d", level);
}
}
void UniversalCompactionPicker::SortedRun::DumpSizeInfo(
char* out_buf, size_t out_buf_size, size_t sorted_run_count) const {
if (level == 0) {
assert(file != nullptr);
snprintf(out_buf, out_buf_size,
"file %" PRIu64 "[%" ROCKSDB_PRIszt
"] "
"with size %" PRIu64 " (compensated size %" PRIu64 ")",
file->fd.GetNumber(), sorted_run_count, file->fd.GetFileSize(),
file->compensated_file_size);
} else {
snprintf(out_buf, out_buf_size,
"level %d[%" ROCKSDB_PRIszt
"] "
"with size %" PRIu64 " (compensated size %" PRIu64 ")",
level, sorted_run_count, size, compensated_file_size);
}
}
std::vector<UniversalCompactionPicker::SortedRun>
UniversalCompactionPicker::CalculateSortedRuns(
const VersionStorageInfo& vstorage, const ImmutableCFOptions& /*ioptions*/,
const MutableCFOptions& mutable_cf_options) {
std::vector<UniversalCompactionPicker::SortedRun> ret;
for (FileMetaData* f : vstorage.LevelFiles(0)) {
ret.emplace_back(0, f, f->fd.GetFileSize(), f->compensated_file_size,
f->being_compacted);
}
for (int level = 1; level < vstorage.num_levels(); level++) {
uint64_t total_compensated_size = 0U;
uint64_t total_size = 0U;
bool being_compacted = false;
bool is_first = true;
for (FileMetaData* f : vstorage.LevelFiles(level)) {
total_compensated_size += f->compensated_file_size;
total_size += f->fd.GetFileSize();
if (mutable_cf_options.compaction_options_universal.allow_trivial_move ==
true) {
if (f->being_compacted) {
being_compacted = f->being_compacted;
}
} else {
// Compaction always includes all files for a non-zero level, so for a
// non-zero level, all the files should share the same being_compacted
// value.
// This assumption is only valid when
// mutable_cf_options.compaction_options_universal.allow_trivial_move is
// false
assert(is_first || f->being_compacted == being_compacted);
}
if (is_first) {
being_compacted = f->being_compacted;
is_first = false;
}
}
if (total_compensated_size > 0) {
ret.emplace_back(level, nullptr, total_size, total_compensated_size,
being_compacted);
}
}
return ret;
}
// Universal style of compaction. Pick files that are contiguous in
// time-range to compact.
Compaction* UniversalCompactionPicker::PickCompaction(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, LogBuffer* log_buffer) {
const int kLevel0 = 0;
double score = vstorage->CompactionScore(kLevel0);
std::vector<SortedRun> sorted_runs =
CalculateSortedRuns(*vstorage, ioptions_, mutable_cf_options);
if (sorted_runs.size() == 0 ||
(vstorage->FilesMarkedForCompaction().empty() &&
sorted_runs.size() < (unsigned int)mutable_cf_options
.level0_file_num_compaction_trigger)) {
ROCKS_LOG_BUFFER(log_buffer, "[%s] Universal: nothing to do\n",
cf_name.c_str());
TEST_SYNC_POINT_CALLBACK("UniversalCompactionPicker::PickCompaction:Return",
nullptr);
return nullptr;
}
VersionStorageInfo::LevelSummaryStorage tmp;
ROCKS_LOG_BUFFER_MAX_SZ(
log_buffer, 3072,
"[%s] Universal: sorted runs files(%" ROCKSDB_PRIszt "): %s\n",
cf_name.c_str(), sorted_runs.size(), vstorage->LevelSummary(&tmp));
// Check for size amplification first.
Compaction* c = nullptr;
if (sorted_runs.size() >=
static_cast<size_t>(
mutable_cf_options.level0_file_num_compaction_trigger)) {
if ((c = PickCompactionToReduceSizeAmp(cf_name, mutable_cf_options,
vstorage, score, sorted_runs,
log_buffer)) != nullptr) {
ROCKS_LOG_BUFFER(log_buffer, "[%s] Universal: compacting for size amp\n",
cf_name.c_str());
} else {
// Size amplification is within limits. Try reducing read
// amplification while maintaining file size ratios.
unsigned int ratio =
mutable_cf_options.compaction_options_universal.size_ratio;
if ((c = PickCompactionToReduceSortedRuns(
cf_name, mutable_cf_options, vstorage, score, ratio, UINT_MAX,
sorted_runs, log_buffer)) != nullptr) {
ROCKS_LOG_BUFFER(log_buffer,
"[%s] Universal: compacting for size ratio\n",
cf_name.c_str());
} else {
// Size amplification and file size ratios are within configured limits.
// If max read amplification is exceeding configured limits, then force
// compaction without looking at filesize ratios and try to reduce
// the number of files to fewer than level0_file_num_compaction_trigger.
// This is guaranteed by NeedsCompaction()
assert(sorted_runs.size() >=
static_cast<size_t>(
mutable_cf_options.level0_file_num_compaction_trigger));
// Get the total number of sorted runs that are not being compacted
int num_sr_not_compacted = 0;
for (size_t i = 0; i < sorted_runs.size(); i++) {
if (sorted_runs[i].being_compacted == false) {
num_sr_not_compacted++;
}
}
// The number of sorted runs that are not being compacted is greater
// than the maximum allowed number of sorted runs
if (num_sr_not_compacted >
mutable_cf_options.level0_file_num_compaction_trigger) {
unsigned int num_files =
num_sr_not_compacted -
mutable_cf_options.level0_file_num_compaction_trigger + 1;
if ((c = PickCompactionToReduceSortedRuns(
cf_name, mutable_cf_options, vstorage, score, UINT_MAX,
num_files, sorted_runs, log_buffer)) != nullptr) {
ROCKS_LOG_BUFFER(log_buffer,
"[%s] Universal: compacting for file num -- %u\n",
cf_name.c_str(), num_files);
}
}
}
}
}
if (c == nullptr) {
if ((c = PickDeleteTriggeredCompaction(cf_name, mutable_cf_options,
vstorage, score, sorted_runs,
log_buffer)) != nullptr) {
ROCKS_LOG_BUFFER(log_buffer,
"[%s] Universal: delete triggered compaction\n",
cf_name.c_str());
}
}
if (c == nullptr) {
TEST_SYNC_POINT_CALLBACK("UniversalCompactionPicker::PickCompaction:Return",
nullptr);
return nullptr;
}
if (mutable_cf_options.compaction_options_universal.allow_trivial_move ==
true) {
c->set_is_trivial_move(IsInputFilesNonOverlapping(c));
}
// validate that all the chosen files of L0 are non overlapping in time
#ifndef NDEBUG
SequenceNumber prev_smallest_seqno = 0U;
bool is_first = true;
size_t level_index = 0U;
if (c->start_level() == 0) {
for (auto f : *c->inputs(0)) {
assert(f->fd.smallest_seqno <= f->fd.largest_seqno);
if (is_first) {
is_first = false;
}
prev_smallest_seqno = f->fd.smallest_seqno;
}
level_index = 1U;
}
for (; level_index < c->num_input_levels(); level_index++) {
if (c->num_input_files(level_index) != 0) {
SequenceNumber smallest_seqno = 0U;
SequenceNumber largest_seqno = 0U;
GetSmallestLargestSeqno(*(c->inputs(level_index)), &smallest_seqno,
&largest_seqno);
if (is_first) {
is_first = false;
} else if (prev_smallest_seqno > 0) {
// A level is considered as the bottommost level if there are
// no files in higher levels or if files in higher levels do
// not overlap with the files being compacted. Sequence numbers
// of files in bottommost level can be set to 0 to help
// compression. As a result, the following assert may not hold
// if the prev_smallest_seqno is 0.
assert(prev_smallest_seqno > largest_seqno);
}
prev_smallest_seqno = smallest_seqno;
}
}
#endif
// update statistics
RecordInHistogram(ioptions_.statistics, NUM_FILES_IN_SINGLE_COMPACTION,
c->inputs(0)->size());
RegisterCompaction(c);
vstorage->ComputeCompactionScore(ioptions_, mutable_cf_options);
TEST_SYNC_POINT_CALLBACK("UniversalCompactionPicker::PickCompaction:Return",
c);
return c;
}
uint32_t UniversalCompactionPicker::GetPathId(
const ImmutableCFOptions& ioptions,
const MutableCFOptions& mutable_cf_options, uint64_t file_size) {
// Two conditions need to be satisfied:
// (1) the target path needs to be able to hold the file's size
// (2) Total size left in this and previous paths need to be not
// smaller than expected future file size before this new file is
// compacted, which is estimated based on size_ratio.
// For example, if now we are compacting files of size (1, 1, 2, 4, 8),
// we will make sure the target file, probably with size of 16, will be
// placed in a path so that eventually when new files are generated and
// compacted to (1, 1, 2, 4, 8, 16), all those files can be stored in or
// before the path we chose.
//
// TODO(sdong): now the case of multiple column families is not
// considered in this algorithm. So the target size can be violated in
// that case. We need to improve it.
uint64_t accumulated_size = 0;
uint64_t future_size =
file_size *
(100 - mutable_cf_options.compaction_options_universal.size_ratio) / 100;
uint32_t p = 0;
assert(!ioptions.cf_paths.empty());
for (; p < ioptions.cf_paths.size() - 1; p++) {
uint64_t target_size = ioptions.cf_paths[p].target_size;
if (target_size > file_size &&
accumulated_size + (target_size - file_size) > future_size) {
return p;
}
accumulated_size += target_size;
}
return p;
}
//
// Consider compaction files based on their size differences with
// the next file in time order.
//
Compaction* UniversalCompactionPicker::PickCompactionToReduceSortedRuns(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, double score, unsigned int ratio,
unsigned int max_number_of_files_to_compact,
const std::vector<SortedRun>& sorted_runs, LogBuffer* log_buffer) {
unsigned int min_merge_width =
mutable_cf_options.compaction_options_universal.min_merge_width;
unsigned int max_merge_width =
mutable_cf_options.compaction_options_universal.max_merge_width;
const SortedRun* sr = nullptr;
bool done = false;
size_t start_index = 0;
unsigned int candidate_count = 0;
unsigned int max_files_to_compact =
std::min(max_merge_width, max_number_of_files_to_compact);
min_merge_width = std::max(min_merge_width, 2U);
// Caller checks the size before executing this function. This invariant is
// important because otherwise we may have a possible integer underflow when
// dealing with unsigned types.
assert(sorted_runs.size() > 0);
// Considers a candidate file only if it is smaller than the
// total size accumulated so far.
for (size_t loop = 0; loop < sorted_runs.size(); loop++) {
candidate_count = 0;
// Skip files that are already being compacted
for (sr = nullptr; loop < sorted_runs.size(); loop++) {
sr = &sorted_runs[loop];
if (!sr->being_compacted) {
candidate_count = 1;
break;
}
char file_num_buf[kFormatFileNumberBufSize];
sr->Dump(file_num_buf, sizeof(file_num_buf));
ROCKS_LOG_BUFFER(log_buffer,
"[%s] Universal: %s"
"[%d] being compacted, skipping",
cf_name.c_str(), file_num_buf, loop);
sr = nullptr;
}
// This file is not being compacted. Consider it as the
// first candidate to be compacted.
uint64_t candidate_size = sr != nullptr ? sr->compensated_file_size : 0;
if (sr != nullptr) {
char file_num_buf[kFormatFileNumberBufSize];
sr->Dump(file_num_buf, sizeof(file_num_buf), true);
ROCKS_LOG_BUFFER(log_buffer, "[%s] Universal: Possible candidate %s[%d].",
cf_name.c_str(), file_num_buf, loop);
}
// Check if the succeeding files need compaction.
for (size_t i = loop + 1;
candidate_count < max_files_to_compact && i < sorted_runs.size();
i++) {
const SortedRun* succeeding_sr = &sorted_runs[i];
if (succeeding_sr->being_compacted) {
break;
}
// Pick files if the total/last candidate file size (increased by the
// specified ratio) is still larger than the next candidate file.
// candidate_size is the total size of files picked so far with the
// default kCompactionStopStyleTotalSize; with
// kCompactionStopStyleSimilarSize, it's simply the size of the last
// picked file.
double sz = candidate_size * (100.0 + ratio) / 100.0;
if (sz < static_cast<double>(succeeding_sr->size)) {
break;
}
if (mutable_cf_options.compaction_options_universal.stop_style ==
kCompactionStopStyleSimilarSize) {
// Similar-size stopping rule: also check the last picked file isn't
// far larger than the next candidate file.
sz = (succeeding_sr->size * (100.0 + ratio)) / 100.0;
if (sz < static_cast<double>(candidate_size)) {
// If the small file we've encountered begins a run of similar-size
// files, we'll pick them up on a future iteration of the outer
// loop. If it's some lonely straggler, it'll eventually get picked
// by the last-resort read amp strategy which disregards size ratios.
break;
}
candidate_size = succeeding_sr->compensated_file_size;
} else { // default kCompactionStopStyleTotalSize
candidate_size += succeeding_sr->compensated_file_size;
}
candidate_count++;
}
// Found a series of consecutive files that need compaction.
if (candidate_count >= (unsigned int)min_merge_width) {
start_index = loop;
done = true;
break;
} else {
for (size_t i = loop;
i < loop + candidate_count && i < sorted_runs.size(); i++) {
const SortedRun* skipping_sr = &sorted_runs[i];
char file_num_buf[256];
skipping_sr->DumpSizeInfo(file_num_buf, sizeof(file_num_buf), loop);
ROCKS_LOG_BUFFER(log_buffer, "[%s] Universal: Skipping %s",
cf_name.c_str(), file_num_buf);
}
}
}
if (!done || candidate_count <= 1) {
return nullptr;
}
size_t first_index_after = start_index + candidate_count;
// Compression is enabled if files compacted earlier already reached
// size ratio of compression.
bool enable_compression = true;
int ratio_to_compress =
mutable_cf_options.compaction_options_universal.compression_size_percent;
if (ratio_to_compress >= 0) {
uint64_t total_size = 0;
for (auto& sorted_run : sorted_runs) {
total_size += sorted_run.compensated_file_size;
}
uint64_t older_file_size = 0;
for (size_t i = sorted_runs.size() - 1; i >= first_index_after; i--) {
older_file_size += sorted_runs[i].size;
if (older_file_size * 100L >= total_size * (long)ratio_to_compress) {
enable_compression = false;
break;
}
}
}
uint64_t estimated_total_size = 0;
for (unsigned int i = 0; i < first_index_after; i++) {
estimated_total_size += sorted_runs[i].size;
}
uint32_t path_id =
GetPathId(ioptions_, mutable_cf_options, estimated_total_size);
int start_level = sorted_runs[start_index].level;
int output_level;
if (first_index_after == sorted_runs.size()) {
output_level = vstorage->num_levels() - 1;
} else if (sorted_runs[first_index_after].level == 0) {
output_level = 0;
} else {
output_level = sorted_runs[first_index_after].level - 1;
}
// last level is reserved for the files ingested behind
if (ioptions_.allow_ingest_behind &&
(output_level == vstorage->num_levels() - 1)) {
assert(output_level > 1);
output_level--;
}
std::vector<CompactionInputFiles> inputs(vstorage->num_levels());
for (size_t i = 0; i < inputs.size(); ++i) {
inputs[i].level = start_level + static_cast<int>(i);
}
for (size_t i = start_index; i < first_index_after; i++) {
auto& picking_sr = sorted_runs[i];
if (picking_sr.level == 0) {
FileMetaData* picking_file = picking_sr.file;
inputs[0].files.push_back(picking_file);
} else {
auto& files = inputs[picking_sr.level - start_level].files;
for (auto* f : vstorage->LevelFiles(picking_sr.level)) {
files.push_back(f);
}
}
char file_num_buf[256];
picking_sr.DumpSizeInfo(file_num_buf, sizeof(file_num_buf), i);
ROCKS_LOG_BUFFER(log_buffer, "[%s] Universal: Picking %s", cf_name.c_str(),
file_num_buf);
}
CompactionReason compaction_reason;
if (max_number_of_files_to_compact == UINT_MAX) {
compaction_reason = CompactionReason::kUniversalSizeRatio;
} else {
compaction_reason = CompactionReason::kUniversalSortedRunNum;
}
return new Compaction(
vstorage, ioptions_, mutable_cf_options, std::move(inputs), output_level,
MaxFileSizeForLevel(mutable_cf_options, output_level,
kCompactionStyleUniversal),
LLONG_MAX, path_id,
GetCompressionType(ioptions_, vstorage, mutable_cf_options, start_level,
1, enable_compression),
GetCompressionOptions(ioptions_, vstorage, start_level,
enable_compression),
/* max_subcompactions */ 0, /* grandparents */ {}, /* is manual */ false,
score, false /* deletion_compaction */, compaction_reason);
}
// Look at overall size amplification. If size amplification
// exceeeds the configured value, then do a compaction
// of the candidate files all the way upto the earliest
// base file (overrides configured values of file-size ratios,
// min_merge_width and max_merge_width).
//
Compaction* UniversalCompactionPicker::PickCompactionToReduceSizeAmp(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, double score,
const std::vector<SortedRun>& sorted_runs, LogBuffer* log_buffer) {
// percentage flexibility while reducing size amplification
uint64_t ratio = mutable_cf_options.compaction_options_universal
.max_size_amplification_percent;
unsigned int candidate_count = 0;
uint64_t candidate_size = 0;
size_t start_index = 0;
const SortedRun* sr = nullptr;
if (sorted_runs.back().being_compacted) {
return nullptr;
}
// Skip files that are already being compacted
for (size_t loop = 0; loop < sorted_runs.size() - 1; loop++) {
sr = &sorted_runs[loop];
if (!sr->being_compacted) {
start_index = loop; // Consider this as the first candidate.
break;
}
char file_num_buf[kFormatFileNumberBufSize];
sr->Dump(file_num_buf, sizeof(file_num_buf), true);
ROCKS_LOG_BUFFER(log_buffer, "[%s] Universal: skipping %s[%d] compacted %s",
cf_name.c_str(), file_num_buf, loop,
" cannot be a candidate to reduce size amp.\n");
sr = nullptr;
}
if (sr == nullptr) {
return nullptr; // no candidate files
}
{
char file_num_buf[kFormatFileNumberBufSize];
sr->Dump(file_num_buf, sizeof(file_num_buf), true);
ROCKS_LOG_BUFFER(
log_buffer,
"[%s] Universal: First candidate %s[%" ROCKSDB_PRIszt "] %s",
cf_name.c_str(), file_num_buf, start_index, " to reduce size amp.\n");
}
// keep adding up all the remaining files
for (size_t loop = start_index; loop < sorted_runs.size() - 1; loop++) {
sr = &sorted_runs[loop];
if (sr->being_compacted) {
char file_num_buf[kFormatFileNumberBufSize];
sr->Dump(file_num_buf, sizeof(file_num_buf), true);
ROCKS_LOG_BUFFER(
log_buffer, "[%s] Universal: Possible candidate %s[%d] %s",
cf_name.c_str(), file_num_buf, start_index,
" is already being compacted. No size amp reduction possible.\n");
return nullptr;
}
candidate_size += sr->compensated_file_size;
candidate_count++;
}
if (candidate_count == 0) {
return nullptr;
}
// size of earliest file
uint64_t earliest_file_size = sorted_runs.back().size;
// size amplification = percentage of additional size
if (candidate_size * 100 < ratio * earliest_file_size) {
ROCKS_LOG_BUFFER(
log_buffer,
"[%s] Universal: size amp not needed. newer-files-total-size %" PRIu64
" earliest-file-size %" PRIu64,
cf_name.c_str(), candidate_size, earliest_file_size);
return nullptr;
} else {
ROCKS_LOG_BUFFER(
log_buffer,
"[%s] Universal: size amp needed. newer-files-total-size %" PRIu64
" earliest-file-size %" PRIu64,
cf_name.c_str(), candidate_size, earliest_file_size);
}
assert(start_index < sorted_runs.size() - 1);
// Estimate total file size
uint64_t estimated_total_size = 0;
for (size_t loop = start_index; loop < sorted_runs.size(); loop++) {
estimated_total_size += sorted_runs[loop].size;
}
uint32_t path_id =
GetPathId(ioptions_, mutable_cf_options, estimated_total_size);
int start_level = sorted_runs[start_index].level;
std::vector<CompactionInputFiles> inputs(vstorage->num_levels());
for (size_t i = 0; i < inputs.size(); ++i) {
inputs[i].level = start_level + static_cast<int>(i);
}
// We always compact all the files, so always compress.
for (size_t loop = start_index; loop < sorted_runs.size(); loop++) {
auto& picking_sr = sorted_runs[loop];
if (picking_sr.level == 0) {
FileMetaData* f = picking_sr.file;
inputs[0].files.push_back(f);
} else {
auto& files = inputs[picking_sr.level - start_level].files;
for (auto* f : vstorage->LevelFiles(picking_sr.level)) {
files.push_back(f);
}
}
char file_num_buf[256];
picking_sr.DumpSizeInfo(file_num_buf, sizeof(file_num_buf), loop);
ROCKS_LOG_BUFFER(log_buffer, "[%s] Universal: size amp picking %s",
cf_name.c_str(), file_num_buf);
}
// output files at the bottom most level, unless it's reserved
int output_level = vstorage->num_levels() - 1;
// last level is reserved for the files ingested behind
if (ioptions_.allow_ingest_behind) {
assert(output_level > 1);
output_level--;
}
return new Compaction(
vstorage, ioptions_, mutable_cf_options, std::move(inputs), output_level,
MaxFileSizeForLevel(mutable_cf_options, output_level,
kCompactionStyleUniversal),
/* max_grandparent_overlap_bytes */ LLONG_MAX, path_id,
GetCompressionType(ioptions_, vstorage, mutable_cf_options, output_level,
1),
GetCompressionOptions(ioptions_, vstorage, output_level),
/* max_subcompactions */ 0, /* grandparents */ {}, /* is manual */ false,
score, false /* deletion_compaction */,
CompactionReason::kUniversalSizeAmplification);
}
// Pick files marked for compaction. Typically, files are marked by
// CompactOnDeleteCollector due to the presence of tombstones.
Compaction* UniversalCompactionPicker::PickDeleteTriggeredCompaction(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, double score,
const std::vector<SortedRun>& /*sorted_runs*/, LogBuffer* /*log_buffer*/) {
CompactionInputFiles start_level_inputs;
int output_level;
std::vector<CompactionInputFiles> inputs;
if (vstorage->num_levels() == 1) {
// This is single level universal. Since we're basically trying to reclaim
// space by processing files marked for compaction due to high tombstone
// density, let's do the same thing as compaction to reduce size amp which
// has the same goals.
bool compact = false;
start_level_inputs.level = 0;
start_level_inputs.files.clear();
output_level = 0;
for (FileMetaData* f : vstorage->LevelFiles(0)) {
if (f->marked_for_compaction) {
compact = true;
}
if (compact) {
start_level_inputs.files.push_back(f);
}
}
if (start_level_inputs.size() <= 1) {
// If only the last file in L0 is marked for compaction, ignore it
return nullptr;
}
inputs.push_back(start_level_inputs);
} else {
int start_level;
// For multi-level universal, the strategy is to make this look more like
// leveled. We pick one of the files marked for compaction and compact with
// overlapping files in the adjacent level.
PickFilesMarkedForCompaction(cf_name, vstorage, &start_level, &output_level,
&start_level_inputs);
if (start_level_inputs.empty()) {
return nullptr;
}
// Pick the first non-empty level after the start_level
for (output_level = start_level + 1; output_level < vstorage->num_levels();
output_level++) {
if (vstorage->NumLevelFiles(output_level) != 0) {
break;
}
}
// If all higher levels are empty, pick the highest level as output level
if (output_level == vstorage->num_levels()) {
if (start_level == 0) {
output_level = vstorage->num_levels() - 1;
} else {
// If start level is non-zero and all higher levels are empty, this
// compaction will translate into a trivial move. Since the idea is
// to reclaim space and trivial move doesn't help with that, we
// skip compaction in this case and return nullptr
return nullptr;
}
}
if (ioptions_.allow_ingest_behind &&
output_level == vstorage->num_levels() - 1) {
assert(output_level > 1);
output_level--;
}
if (output_level != 0) {
if (start_level == 0) {
if (!GetOverlappingL0Files(vstorage, &start_level_inputs, output_level,
nullptr)) {
return nullptr;
}
}
CompactionInputFiles output_level_inputs;
int parent_index = -1;
output_level_inputs.level = output_level;
if (!SetupOtherInputs(cf_name, mutable_cf_options, vstorage,
&start_level_inputs, &output_level_inputs,
&parent_index, -1)) {
return nullptr;
}
inputs.push_back(start_level_inputs);
if (!output_level_inputs.empty()) {
inputs.push_back(output_level_inputs);
}
if (FilesRangeOverlapWithCompaction(inputs, output_level)) {
return nullptr;
}
} else {
inputs.push_back(start_level_inputs);
}
}
uint64_t estimated_total_size = 0;
// Use size of the output level as estimated file size
for (FileMetaData* f : vstorage->LevelFiles(output_level)) {
estimated_total_size += f->fd.GetFileSize();
}
uint32_t path_id =
GetPathId(ioptions_, mutable_cf_options, estimated_total_size);
return new Compaction(
vstorage, ioptions_, mutable_cf_options, std::move(inputs), output_level,
MaxFileSizeForLevel(mutable_cf_options, output_level,
kCompactionStyleUniversal),
/* max_grandparent_overlap_bytes */ LLONG_MAX, path_id,
GetCompressionType(ioptions_, vstorage, mutable_cf_options, output_level,
1),
GetCompressionOptions(ioptions_, vstorage, output_level),
/* max_subcompactions */ 0, /* grandparents */ {}, /* is manual */ true,
score, false /* deletion_compaction */,
CompactionReason::kFilesMarkedForCompaction);
}
} // namespace rocksdb
#endif // !ROCKSDB_LITE
@@ -1,98 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#ifndef ROCKSDB_LITE
#include "db/compaction/compaction_picker.h"
namespace rocksdb {
class UniversalCompactionPicker : public CompactionPicker {
public:
UniversalCompactionPicker(const ImmutableCFOptions& ioptions,
const InternalKeyComparator* icmp)
: CompactionPicker(ioptions, icmp) {}
virtual Compaction* PickCompaction(const std::string& cf_name,
const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage,
LogBuffer* log_buffer) override;
virtual int MaxOutputLevel() const override { return NumberLevels() - 1; }
virtual bool NeedsCompaction(
const VersionStorageInfo* vstorage) const override;
private:
struct SortedRun {
SortedRun(int _level, FileMetaData* _file, uint64_t _size,
uint64_t _compensated_file_size, bool _being_compacted)
: level(_level),
file(_file),
size(_size),
compensated_file_size(_compensated_file_size),
being_compacted(_being_compacted) {
assert(compensated_file_size > 0);
assert(level != 0 || file != nullptr);
}
void Dump(char* out_buf, size_t out_buf_size,
bool print_path = false) const;
// sorted_run_count is added into the string to print
void DumpSizeInfo(char* out_buf, size_t out_buf_size,
size_t sorted_run_count) const;
int level;
// `file` Will be null for level > 0. For level = 0, the sorted run is
// for this file.
FileMetaData* file;
// For level > 0, `size` and `compensated_file_size` are sum of sizes all
// files in the level. `being_compacted` should be the same for all files
// in a non-zero level. Use the value here.
uint64_t size;
uint64_t compensated_file_size;
bool being_compacted;
};
// Pick Universal compaction to limit read amplification
Compaction* PickCompactionToReduceSortedRuns(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, double score, unsigned int ratio,
unsigned int num_files, const std::vector<SortedRun>& sorted_runs,
LogBuffer* log_buffer);
// Pick Universal compaction to limit space amplification.
Compaction* PickCompactionToReduceSizeAmp(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, double score,
const std::vector<SortedRun>& sorted_runs, LogBuffer* log_buffer);
Compaction* PickDeleteTriggeredCompaction(
const std::string& cf_name, const MutableCFOptions& mutable_cf_options,
VersionStorageInfo* vstorage, double score,
const std::vector<SortedRun>& sorted_runs, LogBuffer* log_buffer);
// Used in universal compaction when the enabled_trivial_move
// option is set. Checks whether there are any overlapping files
// in the input. Returns true if the input files are non
// overlapping.
bool IsInputFilesNonOverlapping(Compaction* c);
static std::vector<SortedRun> CalculateSortedRuns(
const VersionStorageInfo& vstorage, const ImmutableCFOptions& ioptions,
const MutableCFOptions& mutable_cf_options);
// Pick a path ID to place a newly generated file, with its estimated file
// size.
static uint32_t GetPathId(const ImmutableCFOptions& ioptions,
const MutableCFOptions& mutable_cf_options,
uint64_t file_size);
};
} // namespace rocksdb
#endif // !ROCKSDB_LITE
-660
View File
@@ -1,660 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
#include <array>
#include <map>
#include <string>
#include "memtable/stl_wrappers.h"
#include "rocksdb/db.h"
#include "rocksdb/env.h"
#include "test_util/testharness.h"
#include "test_util/testutil.h"
#include "util/hash.h"
#include "util/kv_map.h"
#include "util/string_util.h"
#include "utilities/merge_operators.h"
using std::unique_ptr;
namespace rocksdb {
namespace {
static const Comparator* comparator;
class KVIter : public Iterator {
public:
explicit KVIter(const stl_wrappers::KVMap* map)
: map_(map), iter_(map_->end()) {}
bool Valid() const override { return iter_ != map_->end(); }
void SeekToFirst() override { iter_ = map_->begin(); }
void SeekToLast() override {
if (map_->empty()) {
iter_ = map_->end();
} else {
iter_ = map_->find(map_->rbegin()->first);
}
}
void Seek(const Slice& k) override {
iter_ = map_->lower_bound(k.ToString());
}
void SeekForPrev(const Slice& k) override {
iter_ = map_->upper_bound(k.ToString());
Prev();
}
void Next() override { ++iter_; }
void Prev() override {
if (iter_ == map_->begin()) {
iter_ = map_->end();
return;
}
--iter_;
}
Slice key() const override { return iter_->first; }
Slice value() const override { return iter_->second; }
Status status() const override { return Status::OK(); }
private:
const stl_wrappers::KVMap* const map_;
stl_wrappers::KVMap::const_iterator iter_;
};
void AssertItersEqual(Iterator* iter1, Iterator* iter2) {
ASSERT_EQ(iter1->Valid(), iter2->Valid());
if (iter1->Valid()) {
ASSERT_EQ(iter1->key().ToString(), iter2->key().ToString());
ASSERT_EQ(iter1->value().ToString(), iter2->value().ToString());
}
}
// Measuring operations on DB (expect to be empty).
// source_strings are candidate keys
void DoRandomIteraratorTest(DB* db, std::vector<std::string> source_strings,
Random* rnd, int num_writes, int num_iter_ops,
int num_trigger_flush) {
stl_wrappers::KVMap map((stl_wrappers::LessOfComparator(comparator)));
for (int i = 0; i < num_writes; i++) {
if (num_trigger_flush > 0 && i != 0 && i % num_trigger_flush == 0) {
db->Flush(FlushOptions());
}
int type = rnd->Uniform(2);
int index = rnd->Uniform(static_cast<int>(source_strings.size()));
auto& key = source_strings[index];
switch (type) {
case 0:
// put
map[key] = key;
ASSERT_OK(db->Put(WriteOptions(), key, key));
break;
case 1:
// delete
if (map.find(key) != map.end()) {
map.erase(key);
}
ASSERT_OK(db->Delete(WriteOptions(), key));
break;
default:
assert(false);
}
}
std::unique_ptr<Iterator> iter(db->NewIterator(ReadOptions()));
std::unique_ptr<Iterator> result_iter(new KVIter(&map));
bool is_valid = false;
for (int i = 0; i < num_iter_ops; i++) {
// Random walk and make sure iter and result_iter returns the
// same key and value
int type = rnd->Uniform(6);
ASSERT_OK(iter->status());
switch (type) {
case 0:
// Seek to First
iter->SeekToFirst();
result_iter->SeekToFirst();
break;
case 1:
// Seek to last
iter->SeekToLast();
result_iter->SeekToLast();
break;
case 2: {
// Seek to random key
auto key_idx = rnd->Uniform(static_cast<int>(source_strings.size()));
auto key = source_strings[key_idx];
iter->Seek(key);
result_iter->Seek(key);
break;
}
case 3:
// Next
if (is_valid) {
iter->Next();
result_iter->Next();
} else {
continue;
}
break;
case 4:
// Prev
if (is_valid) {
iter->Prev();
result_iter->Prev();
} else {
continue;
}
break;
default: {
assert(type == 5);
auto key_idx = rnd->Uniform(static_cast<int>(source_strings.size()));
auto key = source_strings[key_idx];
std::string result;
auto status = db->Get(ReadOptions(), key, &result);
if (map.find(key) == map.end()) {
ASSERT_TRUE(status.IsNotFound());
} else {
ASSERT_EQ(map[key], result);
}
break;
}
}
AssertItersEqual(iter.get(), result_iter.get());
is_valid = iter->Valid();
}
}
class DoubleComparator : public Comparator {
public:
DoubleComparator() {}
const char* Name() const override { return "DoubleComparator"; }
int Compare(const Slice& a, const Slice& b) const override {
#ifndef CYGWIN
double da = std::stod(a.ToString());
double db = std::stod(b.ToString());
#else
double da = std::strtod(a.ToString().c_str(), 0 /* endptr */);
double db = std::strtod(a.ToString().c_str(), 0 /* endptr */);
#endif
if (da == db) {
return a.compare(b);
} else if (da > db) {
return 1;
} else {
return -1;
}
}
void FindShortestSeparator(std::string* /*start*/,
const Slice& /*limit*/) const override {}
void FindShortSuccessor(std::string* /*key*/) const override {}
};
class HashComparator : public Comparator {
public:
HashComparator() {}
const char* Name() const override { return "HashComparator"; }
int Compare(const Slice& a, const Slice& b) const override {
uint32_t ha = Hash(a.data(), a.size(), 66);
uint32_t hb = Hash(b.data(), b.size(), 66);
if (ha == hb) {
return a.compare(b);
} else if (ha > hb) {
return 1;
} else {
return -1;
}
}
void FindShortestSeparator(std::string* /*start*/,
const Slice& /*limit*/) const override {}
void FindShortSuccessor(std::string* /*key*/) const override {}
};
class TwoStrComparator : public Comparator {
public:
TwoStrComparator() {}
const char* Name() const override { return "TwoStrComparator"; }
int Compare(const Slice& a, const Slice& b) const override {
assert(a.size() >= 2);
assert(b.size() >= 2);
size_t size_a1 = static_cast<size_t>(a[0]);
size_t size_b1 = static_cast<size_t>(b[0]);
size_t size_a2 = static_cast<size_t>(a[1]);
size_t size_b2 = static_cast<size_t>(b[1]);
assert(size_a1 + size_a2 + 2 == a.size());
assert(size_b1 + size_b2 + 2 == b.size());
Slice a1 = Slice(a.data() + 2, size_a1);
Slice b1 = Slice(b.data() + 2, size_b1);
Slice a2 = Slice(a.data() + 2 + size_a1, size_a2);
Slice b2 = Slice(b.data() + 2 + size_b1, size_b2);
if (a1 != b1) {
return a1.compare(b1);
}
return a2.compare(b2);
}
void FindShortestSeparator(std::string* /*start*/,
const Slice& /*limit*/) const override {}
void FindShortSuccessor(std::string* /*key*/) const override {}
};
} // namespace
class ComparatorDBTest
: public testing::Test,
virtual public ::testing::WithParamInterface<uint32_t> {
private:
std::string dbname_;
Env* env_;
DB* db_;
Options last_options_;
std::unique_ptr<const Comparator> comparator_guard;
public:
ComparatorDBTest() : env_(Env::Default()), db_(nullptr) {
comparator = BytewiseComparator();
dbname_ = test::PerThreadDBPath("comparator_db_test");
BlockBasedTableOptions toptions;
toptions.format_version = GetParam();
last_options_.table_factory.reset(
rocksdb::NewBlockBasedTableFactory(toptions));
EXPECT_OK(DestroyDB(dbname_, last_options_));
}
~ComparatorDBTest() override {
delete db_;
EXPECT_OK(DestroyDB(dbname_, last_options_));
comparator = BytewiseComparator();
}
DB* GetDB() { return db_; }
void SetOwnedComparator(const Comparator* cmp, bool owner = true) {
if (owner) {
comparator_guard.reset(cmp);
} else {
comparator_guard.reset();
}
comparator = cmp;
last_options_.comparator = cmp;
}
// Return the current option configuration.
Options* GetOptions() { return &last_options_; }
void DestroyAndReopen() {
// Destroy using last options
Destroy();
ASSERT_OK(TryReopen());
}
void Destroy() {
delete db_;
db_ = nullptr;
ASSERT_OK(DestroyDB(dbname_, last_options_));
}
Status TryReopen() {
delete db_;
db_ = nullptr;
last_options_.create_if_missing = true;
return DB::Open(last_options_, dbname_, &db_);
}
};
INSTANTIATE_TEST_CASE_P(FormatDef, ComparatorDBTest,
testing::Values(test::kDefaultFormatVersion));
INSTANTIATE_TEST_CASE_P(FormatLatest, ComparatorDBTest,
testing::Values(test::kLatestFormatVersion));
TEST_P(ComparatorDBTest, Bytewise) {
for (int rand_seed = 301; rand_seed < 306; rand_seed++) {
DestroyAndReopen();
Random rnd(rand_seed);
DoRandomIteraratorTest(GetDB(),
{"a", "b", "c", "d", "e", "f", "g", "h", "i"}, &rnd,
8, 100, 3);
}
}
TEST_P(ComparatorDBTest, SimpleSuffixReverseComparator) {
SetOwnedComparator(new test::SimpleSuffixReverseComparator());
for (int rnd_seed = 301; rnd_seed < 316; rnd_seed++) {
Options* opt = GetOptions();
opt->comparator = comparator;
DestroyAndReopen();
Random rnd(rnd_seed);
std::vector<std::string> source_strings;
std::vector<std::string> source_prefixes;
// Randomly generate 5 prefixes
for (int i = 0; i < 5; i++) {
source_prefixes.push_back(test::RandomHumanReadableString(&rnd, 8));
}
for (int j = 0; j < 20; j++) {
int prefix_index = rnd.Uniform(static_cast<int>(source_prefixes.size()));
std::string key = source_prefixes[prefix_index] +
test::RandomHumanReadableString(&rnd, rnd.Uniform(8));
source_strings.push_back(key);
}
DoRandomIteraratorTest(GetDB(), source_strings, &rnd, 30, 600, 66);
}
}
TEST_P(ComparatorDBTest, Uint64Comparator) {
SetOwnedComparator(test::Uint64Comparator(), false /* owner */);
for (int rnd_seed = 301; rnd_seed < 316; rnd_seed++) {
Options* opt = GetOptions();
opt->comparator = comparator;
DestroyAndReopen();
Random rnd(rnd_seed);
Random64 rnd64(rnd_seed);
std::vector<std::string> source_strings;
// Randomly generate source keys
for (int i = 0; i < 100; i++) {
uint64_t r = rnd64.Next();
std::string str;
str.resize(8);
memcpy(&str[0], static_cast<void*>(&r), 8);
source_strings.push_back(str);
}
DoRandomIteraratorTest(GetDB(), source_strings, &rnd, 200, 1000, 66);
}
}
TEST_P(ComparatorDBTest, DoubleComparator) {
SetOwnedComparator(new DoubleComparator());
for (int rnd_seed = 301; rnd_seed < 316; rnd_seed++) {
Options* opt = GetOptions();
opt->comparator = comparator;
DestroyAndReopen();
Random rnd(rnd_seed);
std::vector<std::string> source_strings;
// Randomly generate source keys
for (int i = 0; i < 100; i++) {
uint32_t r = rnd.Next();
uint32_t divide_order = rnd.Uniform(8);
double to_divide = 1.0;
for (uint32_t j = 0; j < divide_order; j++) {
to_divide *= 10.0;
}
source_strings.push_back(ToString(r / to_divide));
}
DoRandomIteraratorTest(GetDB(), source_strings, &rnd, 200, 1000, 66);
}
}
TEST_P(ComparatorDBTest, HashComparator) {
SetOwnedComparator(new HashComparator());
for (int rnd_seed = 301; rnd_seed < 316; rnd_seed++) {
Options* opt = GetOptions();
opt->comparator = comparator;
DestroyAndReopen();
Random rnd(rnd_seed);
std::vector<std::string> source_strings;
// Randomly generate source keys
for (int i = 0; i < 100; i++) {
source_strings.push_back(test::RandomKey(&rnd, 8));
}
DoRandomIteraratorTest(GetDB(), source_strings, &rnd, 200, 1000, 66);
}
}
TEST_P(ComparatorDBTest, TwoStrComparator) {
SetOwnedComparator(new TwoStrComparator());
for (int rnd_seed = 301; rnd_seed < 316; rnd_seed++) {
Options* opt = GetOptions();
opt->comparator = comparator;
DestroyAndReopen();
Random rnd(rnd_seed);
std::vector<std::string> source_strings;
// Randomly generate source keys
for (int i = 0; i < 100; i++) {
std::string str;
uint32_t size1 = rnd.Uniform(8);
uint32_t size2 = rnd.Uniform(8);
str.append(1, static_cast<char>(size1));
str.append(1, static_cast<char>(size2));
str.append(test::RandomKey(&rnd, size1));
str.append(test::RandomKey(&rnd, size2));
source_strings.push_back(str);
}
DoRandomIteraratorTest(GetDB(), source_strings, &rnd, 200, 1000, 66);
}
}
TEST_P(ComparatorDBTest, IsSameLengthImmediateSuccessor) {
{
// different length
Slice s("abcxy");
Slice t("abcxyz");
ASSERT_FALSE(BytewiseComparator()->IsSameLengthImmediateSuccessor(s, t));
}
{
Slice s("abcxyz");
Slice t("abcxy");
ASSERT_FALSE(BytewiseComparator()->IsSameLengthImmediateSuccessor(s, t));
}
{
// not last byte different
Slice s("abc1xyz");
Slice t("abc2xyz");
ASSERT_FALSE(BytewiseComparator()->IsSameLengthImmediateSuccessor(s, t));
}
{
// same string
Slice s("abcxyz");
Slice t("abcxyz");
ASSERT_FALSE(BytewiseComparator()->IsSameLengthImmediateSuccessor(s, t));
}
{
Slice s("abcxy");
Slice t("abcxz");
ASSERT_TRUE(BytewiseComparator()->IsSameLengthImmediateSuccessor(s, t));
}
{
Slice s("abcxz");
Slice t("abcxy");
ASSERT_FALSE(BytewiseComparator()->IsSameLengthImmediateSuccessor(s, t));
}
{
const char s_array[] = "\x50\x8a\xac";
const char t_array[] = "\x50\x8a\xad";
Slice s(s_array);
Slice t(t_array);
ASSERT_TRUE(BytewiseComparator()->IsSameLengthImmediateSuccessor(s, t));
}
{
const char s_array[] = "\x50\x8a\xff";
const char t_array[] = "\x50\x8b\x00";
Slice s(s_array, 3);
Slice t(t_array, 3);
ASSERT_TRUE(BytewiseComparator()->IsSameLengthImmediateSuccessor(s, t));
}
{
const char s_array[] = "\x50\x8a\xff\xff";
const char t_array[] = "\x50\x8b\x00\x00";
Slice s(s_array, 4);
Slice t(t_array, 4);
ASSERT_TRUE(BytewiseComparator()->IsSameLengthImmediateSuccessor(s, t));
}
{
const char s_array[] = "\x50\x8a\xff\xff";
const char t_array[] = "\x50\x8b\x00\x01";
Slice s(s_array, 4);
Slice t(t_array, 4);
ASSERT_FALSE(BytewiseComparator()->IsSameLengthImmediateSuccessor(s, t));
}
}
TEST_P(ComparatorDBTest, FindShortestSeparator) {
std::string s1 = "abc1xyz";
std::string s2 = "abc3xy";
BytewiseComparator()->FindShortestSeparator(&s1, s2);
ASSERT_EQ("abc2", s1);
s1 = "abc5xyztt";
ReverseBytewiseComparator()->FindShortestSeparator(&s1, s2);
ASSERT_EQ("abc5", s1);
s1 = "abc3";
s2 = "abc2xy";
ReverseBytewiseComparator()->FindShortestSeparator(&s1, s2);
ASSERT_EQ("abc3", s1);
s1 = "abc3xyz";
s2 = "abc2xy";
ReverseBytewiseComparator()->FindShortestSeparator(&s1, s2);
ASSERT_EQ("abc3", s1);
s1 = "abc3xyz";
s2 = "abc2";
ReverseBytewiseComparator()->FindShortestSeparator(&s1, s2);
ASSERT_EQ("abc3", s1);
std::string old_s1 = s1 = "abc2xy";
s2 = "abc2";
ReverseBytewiseComparator()->FindShortestSeparator(&s1, s2);
ASSERT_TRUE(old_s1 >= s1);
ASSERT_TRUE(s1 > s2);
}
TEST_P(ComparatorDBTest, SeparatorSuccessorRandomizeTest) {
// Char list for boundary cases.
std::array<unsigned char, 6> char_list{{0, 1, 2, 253, 254, 255}};
Random rnd(301);
for (int attempts = 0; attempts < 1000; attempts++) {
uint32_t size1 = rnd.Skewed(4);
uint32_t size2;
if (rnd.OneIn(2)) {
// size2 to be random size
size2 = rnd.Skewed(4);
} else {
// size1 is within [-2, +2] of size1
int diff = static_cast<int>(rnd.Uniform(5)) - 2;
int tmp_size2 = static_cast<int>(size1) + diff;
if (tmp_size2 < 0) {
tmp_size2 = 0;
}
size2 = static_cast<uint32_t>(tmp_size2);
}
std::string s1;
std::string s2;
for (uint32_t i = 0; i < size1; i++) {
if (rnd.OneIn(2)) {
// Use random byte
s1 += static_cast<char>(rnd.Uniform(256));
} else {
// Use one byte in char_list
char c = static_cast<char>(char_list[rnd.Uniform(sizeof(char_list))]);
s1 += c;
}
}
// First set s2 to be the same as s1, and then modify s2.
s2 = s1;
s2.resize(size2);
// We start from the back of the string
if (size2 > 0) {
uint32_t pos = size2 - 1;
do {
if (pos >= size1 || rnd.OneIn(4)) {
// For 1/4 chance, use random byte
s2[pos] = static_cast<char>(rnd.Uniform(256));
} else if (rnd.OneIn(4)) {
// In 1/4 chance, stop here.
break;
} else {
// Create a char within [-2, +2] of the matching char of s1.
int diff = static_cast<int>(rnd.Uniform(5)) - 2;
// char may be signed or unsigned based on platform.
int s1_char = static_cast<int>(static_cast<unsigned char>(s1[pos]));
int s2_char = s1_char + diff;
if (s2_char < 0) {
s2_char = 0;
}
if (s2_char > 255) {
s2_char = 255;
}
s2[pos] = static_cast<char>(s2_char);
}
} while (pos-- != 0);
}
// Test separators
for (int rev = 0; rev < 2; rev++) {
if (rev == 1) {
// switch s1 and s2
std::string t = s1;
s1 = s2;
s2 = t;
}
std::string separator = s1;
BytewiseComparator()->FindShortestSeparator(&separator, s2);
std::string rev_separator = s1;
ReverseBytewiseComparator()->FindShortestSeparator(&rev_separator, s2);
if (s1 == s2) {
ASSERT_EQ(s1, separator);
ASSERT_EQ(s2, rev_separator);
} else if (s1 < s2) {
ASSERT_TRUE(s1 <= separator);
ASSERT_TRUE(s2 > separator);
ASSERT_LE(separator.size(), std::max(s1.size(), s2.size()));
ASSERT_EQ(s1, rev_separator);
} else {
ASSERT_TRUE(s1 >= rev_separator);
ASSERT_TRUE(s2 < rev_separator);
ASSERT_LE(rev_separator.size(), std::max(s1.size(), s2.size()));
ASSERT_EQ(s1, separator);
}
}
// Test successors
std::string succ = s1;
BytewiseComparator()->FindShortSuccessor(&succ);
ASSERT_TRUE(succ >= s1);
succ = s1;
ReverseBytewiseComparator()->FindShortSuccessor(&succ);
ASSERT_TRUE(succ <= s1);
}
}
} // namespace rocksdb
int main(int argc, char** argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
-68
View File
@@ -1,68 +0,0 @@
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
#ifndef ROCKSDB_LITE
#include "rocksdb/convenience.h"
#include "db/db_impl/db_impl.h"
#include "util/cast_util.h"
namespace rocksdb {
void CancelAllBackgroundWork(DB* db, bool wait) {
(static_cast_with_check<DBImpl, DB>(db->GetRootDB()))
->CancelAllBackgroundWork(wait);
}
Status DeleteFilesInRange(DB* db, ColumnFamilyHandle* column_family,
const Slice* begin, const Slice* end,
bool include_end) {
RangePtr range(begin, end);
return DeleteFilesInRanges(db, column_family, &range, 1, include_end);
}
Status DeleteFilesInRanges(DB* db, ColumnFamilyHandle* column_family,
const RangePtr* ranges, size_t n,
bool include_end) {
return (static_cast_with_check<DBImpl, DB>(db->GetRootDB()))
->DeleteFilesInRanges(column_family, ranges, n, include_end);
}
Status VerifySstFileChecksum(const Options& options,
const EnvOptions& env_options,
const std::string& file_path) {
std::unique_ptr<RandomAccessFile> file;
uint64_t file_size;
InternalKeyComparator internal_comparator(options.comparator);
ImmutableCFOptions ioptions(options);
Status s = ioptions.env->NewRandomAccessFile(file_path, &file, env_options);
if (s.ok()) {
s = ioptions.env->GetFileSize(file_path, &file_size);
} else {
return s;
}
std::unique_ptr<TableReader> table_reader;
std::unique_ptr<RandomAccessFileReader> file_reader(
new RandomAccessFileReader(std::move(file), file_path));
const bool kImmortal = true;
s = ioptions.table_factory->NewTableReader(
TableReaderOptions(ioptions, options.prefix_extractor.get(), env_options,
internal_comparator, false /* skip_filters */,
!kImmortal, -1 /* level */),
std::move(file_reader), file_size, &table_reader,
false /* prefetch_index_and_filter_in_cache */);
if (!s.ok()) {
return s;
}
s = table_reader->VerifyChecksum(TableReaderCaller::kUserVerifyChecksum);
return s;
}
} // namespace rocksdb
#endif // ROCKSDB_LITE
Loaded 100 of 1522 files, more files were not shown because too many files have changed in this diff. Show more