{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":156018,"defaultBranch":"unstable","name":"redis","ownerLogin":"redis","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2009-03-21T22:32:25.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/1529926?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1717664835.0","currentOid":""},"activityList":{"items":[{"before":"884c3467978af29594798a0ad4aed38acb2b5670","after":"4606f91d5e31f69e8dadcf4125f386da6f942673","ref":"refs/heads/7.4","pushedAt":"2024-06-06T11:03:20.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"YaacovHazan","name":null,"path":"/YaacovHazan","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/31382944?s=80&v=4"},"commit":{"message":"Redis 7.4 RC1 (#13328)\n\nCo-authored-by: YaacovHazan ","shortMessageHtmlLink":"Redis 7.4 RC1 (#13328)"}},{"before":null,"after":"884c3467978af29594798a0ad4aed38acb2b5670","ref":"refs/heads/7.4","pushedAt":"2024-06-06T08:29:02.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"YaacovHazan","name":null,"path":"/YaacovHazan","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/31382944?s=80&v=4"},"commit":{"message":"Redis 7.4 RC1","shortMessageHtmlLink":"Redis 7.4 RC1"}},{"before":"9a2c6ba4e7be4121044a1ef048e953333535caf5","after":"690ef36330b192ed29d8c24d08a24d6d5cfd40a4","ref":"refs/heads/unstable","pushedAt":"2024-06-05T06:49:45.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Fix HFE notification test timing caused by field expiration in hexpire command (#13325)\n\nIn the old test, we give the `hexpire` a very short expire time, which\r\ncaused the filed to be deleted by the time `hpersist` command was\r\nexecuted. As a result, the `hpersist` command won't be able to give a\r\n`hpersist` notification, leading to test stuck.\r\n\r\nfail CI:\r\nhttps://github.com/redis/redis/actions/runs/9342175887/job/25709886471","shortMessageHtmlLink":"Fix HFE notification test timing caused by field expiration in hexpir…"}},{"before":"f36b5a85867eaf06a73c3432077f2a79a3875265","after":"9a2c6ba4e7be4121044a1ef048e953333535caf5","ref":"refs/heads/unstable","pushedAt":"2024-06-04T12:35:26.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Prevent negative expire parameter in HEXPIRE/HEXPIREAT/HPEXPIRE/HPEXPIREAT commands (#13310)\n\n1. Don't allow HEXPIRE/HEXPIREAT/HPEXPIRE/HPEXPIREAT command expire\r\nparameters is negative\r\n\r\n2. Remove a dead code reported from Coverity.\r\nwhen `unit` is not `UNIT_SECONDS`, the second `if (expire > (long long)\r\nEB_EXPIRE_TIME_MAX)` will be dead code.\r\n```c\r\n# t_hash.c\r\n2988 /* Check expire overflow */\r\n \tcond_at_most: Condition expire > 281474976710655LL, taking false branch. Now the value of expire is at most 281474976710655.\r\n2989 if (expire > (long long) EB_EXPIRE_TIME_MAX) {\r\n2990 addReplyErrorExpireTime(c);\r\n2991 return;\r\n2992 }\r\n\r\n2994 if (unit == UNIT_SECONDS) {\r\n2995 if (expire > (long long) EB_EXPIRE_TIME_MAX / 1000) {\r\n2996 addReplyErrorExpireTime(c);\r\n2997 return;\r\n2998 }\r\n2999 expire *= 1000;\r\n3000 } else {\r\n \tat_most: At condition expire > 281474976710655LL, the value of expire must be at most 281474976710655.\r\n \tdead_error_condition: The condition expire > 281474976710655LL cannot be true.\r\n3001 if (expire > (long long) EB_EXPIRE_TIME_MAX) {\r\n \t\r\nCID 494223: (#1 of 1): Logically dead code (DEADCODE)\r\ndead_error_begin: Execution cannot reach this statement: addReplyErrorExpireTime(c);.\r\n3002 addReplyErrorExpireTime(c);\r\n3003 return;\r\n3004 }\r\n3005 }\r\n```\r\n\r\n---------\r\n\r\nCo-authored-by: Ozan Tezcan ","shortMessageHtmlLink":"Prevent negative expire parameter in HEXPIRE/HEXPIREAT/HPEXPIRE/HPEXP…"}},{"before":"293a68afdf68789dc1f39f5eba0e4eaa628b950c","after":"f36b5a85867eaf06a73c3432077f2a79a3875265","ref":"refs/heads/unstable","pushedAt":"2024-06-04T12:16:36.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Fix crash due to unblock client during slot migration (#13311)\n\nIn #13224, we found a crash during cluster slot migration but don't know\r\nwhy. So i check all the return C_OK in processCommand to see if we are\r\nmissing some duration reset and see this.\r\n\r\nThis fix is like #12247, when we reject the command, we should reset the\r\nduration. I test it and verify it can fix #13224.\r\n\r\nSo the reason may because we are using stream block and then during the\r\nslot migration, it got a redirect and then crash the server.\r\n\r\n---------\r\n\r\nCo-authored-by: debing.sun ","shortMessageHtmlLink":"Fix crash due to unblock client during slot migration (#13311)"}},{"before":"44352beefa601212b9ed211c030b2f96079525af","after":"293a68afdf68789dc1f39f5eba0e4eaa628b950c","ref":"refs/heads/unstable","pushedAt":"2024-06-04T09:04:37.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Use lookupKeyWrite() for hpersist command (#13321)\n\nAs hpersist is a write command, we should use lookupKeyWrite() instead\r\nof lookupKeyRead() to fetch the key.","shortMessageHtmlLink":"Use lookupKeyWrite() for hpersist command (#13321)"}},{"before":"56169112e3b55e1776091964b4e510c0e1fe7110","after":"44352beefa601212b9ed211c030b2f96079525af","ref":"refs/heads/unstable","pushedAt":"2024-06-04T08:42:02.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Fix crash in RM_ScanKey() when used with hexpire (#13320)\n\nRM_ScanKey() was overlooked while introducing hash field expiration. \r\nAn assert is triggered when it is called on a hash key with\r\nOBJ_ENCODING_LISTPACK_EX encoding.\r\n\r\nI've changed to code to handle listpackex encoding properly.","shortMessageHtmlLink":"Fix crash in RM_ScanKey() when used with hexpire (#13320)"}},{"before":"50569a906c29ea4f2348f88888ff71bca4afb47b","after":"56169112e3b55e1776091964b4e510c0e1fe7110","ref":"refs/heads/unstable","pushedAt":"2024-06-03T10:54:44.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"moticless","name":"Moti Cohen","path":"/moticless","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/24944278?s=80&v=4"},"commit":{"message":"Fix returned value nextExpireTime by ebExpire() (#13313)\n\nAt `ebuckets` structure, On `ebExpire()`, if the callback indicated to update \r\nthe item expiration time and return it back to ebuckets (`ACT_UPDATE_EXP_ITEM`), \r\nthen returned value `nextExpireTime` should be updated, if needed. \r\nInvalid value of `nextExpireTime` was modified from 0 to `EB_EXPIRE_TIME_INVALID`.","shortMessageHtmlLink":"Fix returned value nextExpireTime by ebExpire() (#13313)"}},{"before":"5a3534f9b5f4e49c7e59f168250e78d0ea6abfa6","after":"50569a906c29ea4f2348f88888ff71bca4afb47b","ref":"refs/heads/unstable","pushedAt":"2024-05-30T14:09:30.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Free current client asynchronously after user permissions changes (#13274)\n\nThe crash happens when the user that triggers the permission changes\r\nshould be affected (and should be disconnected eventually).\r\n\r\nTo handle such a scenario, we should use the\r\n`CLIENT_CLOSE_AFTER_COMMAND` flag.\r\n\r\nThis commit encapsulates all the places that should be handled in the\r\nsame way in `deauthenticateAndCloseClient`\r\n\r\nAlso:\r\n* bugfix: during the ACL LOAD we ignore clients that are marked as\r\n`CLIENT MASTER`","shortMessageHtmlLink":"Free current client asynchronously after user permissions changes (#1…"}},{"before":"7b9e96069048dda85ee460fc084dbf6c4281bd53","after":"5a3534f9b5f4e49c7e59f168250e78d0ea6abfa6","ref":"refs/heads/unstable","pushedAt":"2024-05-30T11:09:26.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"dynamically list test files (#13220)\n\n**Related issue**\r\nhttps://github.com/redis/redis/issues/13219\r\n\r\n**Motivation**\r\nCurrently we have to manually update the all_tests variable when\r\nintroducing new test files.\r\n\r\n**Modification**\r\nI have modified it to list test files dynamically, but instead of\r\nmodifying it to add all test files, I have modified it to only add only\r\ntest files from the following 4 paths\r\n\r\n- unit\r\n- unit/type\r\n- unit/cluster\r\n- integration\r\n\r\nso that it doesn't deviate too much from what we already do\r\n\r\n**Result**\r\n- dynamically list test files to all_tests variable\r\n- close issue https://github.com/redis/redis/issues/13219\r\n\r\n**Additional information**\r\n- removed `list-common.tcl` file and added\r\n`generate_largevalue_test_array` proc in `util.tcl`. because\r\n`list-common.tcl` is not a test file\r\n- There is an order dependency. So I added a code to the \"Is a ziplist\r\nencoded Hash promoted on big payload?\" test that resets\r\nhash-max-listpack-value to the default (64).\r\n\r\n---------\r\n\r\nSigned-off-by: jonghoonpark \r\nCo-authored-by: debing.sun ","shortMessageHtmlLink":"dynamically list test files (#13220)"}},{"before":"2d1bb42cba2258e229235be00d382476e2ee6049","after":"7b9e96069048dda85ee460fc084dbf6c4281bd53","ref":"refs/heads/unstable","pushedAt":"2024-05-30T07:26:19.000Z","pushType":"pr_merge","commitsCount":22,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Hash Field Expiration (#13303)\n\n## Background\r\n\r\nThis PR introduces support for field-level expiration in Redis hashes. Previously, Redis supported expiration only at the key level, but this enhancement allows setting expiration times for individual fields within a hash.\r\n\r\n## New commands\r\n* HEXPIRE\r\n* HEXPIREAT\r\n* HEXPIRETIME\r\n* HPERSIST\r\n* HPEXPIRE\r\n* HPEXPIREAT\r\n* HPEXPIRETIME\r\n* HPTTL\r\n* HTTL\r\n\r\n## Short example\r\nfrom @moticless\r\n```sh\r\n127.0.0.1:6379> hset myhash f1 v1 f2 v2 f3 v3 \r\n(integer) 3\r\n127.0.0.1:6379> hpexpire myhash 10000 NX fields 2 f2 f3 \r\n1) (integer) 1\r\n2) (integer) 1\r\n127.0.0.1:6379> hpttl myhash fields 3 f1 f2 f3 \r\n1) (integer) -1\r\n2) (integer) 9997\r\n3) (integer) 9997\r\n127.0.0.1:6379> hgetall myhash \r\n1) \"f3\"\r\n2) \"v3\"\r\n3) \"f2\"\r\n4) \"v2\"\r\n5) \"f1\"\r\n6) \"v1\"\r\n\r\n... after 10 seconds ...\r\n\r\n127.0.0.1:6379> hgetall myhash \r\n1) \"f1\"\r\n2) \"v1\"\r\n127.0.0.1:6379>\r\n```\r\n\r\n## Expiration strategy\r\n1. Integrate active\r\n Redis periodically performs active expiration and deletion of hash keys that contain expired fields, with a maximum attempt limit.\r\n3. Lazy expiration\r\n When a client touches fields within a hash, Redis checks if the fields are expired. If a field is expired, it will be deleted. However, we do not delete expired fields during a traversal, we implicitly skip over them.\r\n\r\n## RDB changes\r\nAdd two new rdb type s`RDB_TYPE_HASH_METADATA` and `RDB_TYPE_HASH_LISTPACK_EX`.\r\n\r\n## Notification\r\n1. Add `hpersist` notification for `HPERSIST` command.\r\n5. Add `hexpire` notification for `HEXPIRE`, `HEXPIREAT`, `HPEXPIRE` and `HPEXPIREAT` commands.\r\n\r\n## Internal\r\n1. Add new data structure `ebuckets`, which is used to store TTL and keys, enabling quick retrieval of keys based on TTL.\r\n2. Add new data structure `mstr` like sds, which is used to store a string with TTL.\r\n\r\nThis work was done by @moticless, @tezc, @ronen-kalish, @sundb, I just release it.","shortMessageHtmlLink":"Hash Field Expiration (#13303)"}},{"before":"33fc0fbfae1c048b8b313baa13bdc78cbd2e763a","after":"f0389f282394cca3b646f7dc45043dac9ffe83f7","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-29T13:35:47.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Fix position of numfields in H(P)EXPIRE json files (#13301)\n\nFix position of numfields in H(P)EXPIRE json files","shortMessageHtmlLink":"Fix position of numfields in H(P)EXPIRE json files (#13301)"}},{"before":"6a11d458bee7ac611ce8acdd42259fccbff4c197","after":"33fc0fbfae1c048b8b313baa13bdc78cbd2e763a","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-29T11:47:48.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"HFE to support AOF and replicas (#13285)\n\n* For replica sake, rewrite commands `H*EXPIRE*` , `HSETF`, `HGETF` to\r\nhave absolute unix time in msec.\r\n* On active-expiration of field, propagate HDEL to replica\r\n(`propagateHashFieldDeletion()`)\r\n* On lazy-expiration, propagate HDEL to replica (`hashTypeGetValue()`\r\nnow calls `hashTypeDelete()`. It also takes care to call\r\n`propagateHashFieldDeletion()`).\r\n* Fix `H*EXPIRE*` command such that if it gets flag `LT` and it doesn’t\r\nhave any expiration on the field then it will considered as valid\r\ncondition.\r\n\r\nNote, replicas doesn’t make any active expiration, and should avoid lazy\r\nexpiration. On `hashTypeGetValue()` it doesn't check expiration (As long\r\nas the master didn’t request to delete the field, it is valid)\r\n\r\nTODO: \r\n* Attach `dbid` to HASH metadata. See\r\n[here](https://github.com/redis/redis/pull/13209#discussion_r1593385850)\r\n\r\n---------\r\n\r\nCo-authored-by: debing.sun ","shortMessageHtmlLink":"HFE to support AOF and replicas (#13285)"}},{"before":"e2918705c8ad9e7c7d60ff111ea1e93d79c5aa06","after":"6a11d458bee7ac611ce8acdd42259fccbff4c197","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-28T08:59:57.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Fix hscan return value (#13297)\n\nIn the last step of hscan, while replying to client, we assume all items\r\nin the result list are keys which are mstr instances. Though, there \r\nmight be values which are sds instances. \r\n\r\nAdded a check to avoid calling mstrlen() for value objects.\r\n\r\nTo reproduce:\r\n```\r\n127.0.0.1:6379> hset myhash1 a 11111111111111111111111111111111111111111111111111111111111111111\r\n(integer) 0\r\n127.0.0.1:6379> hscan myhash1 0\r\n1) \"0\"\r\n2) 1) \"a\"\r\n 2) \"11111111111111111111111111111111111111111111111111111111111111111\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\"\r\n```","shortMessageHtmlLink":"Fix hscan return value (#13297)"}},{"before":"2f34f6f0b98cc7de1a9b4fafe06e62703be5b0af","after":"e2918705c8ad9e7c7d60ff111ea1e93d79c5aa06","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-27T13:07:01.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Fix hfe reply schemas (#13295)\n\nIn https://github.com/redis/redis/pull/13291, we've changed that hfe\r\ncommands to return empty array if the key does not exist.\r\nForgot to update json schemas.","shortMessageHtmlLink":"Fix hfe reply schemas (#13295)"}},{"before":"6801a3cec882d45853dde84b92fd3aace7a9e9b7","after":"2d1bb42cba2258e229235be00d382476e2ee6049","ref":"refs/heads/unstable","pushedAt":"2024-05-27T08:47:24.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Update version references from 8.0 to 7.4 for upcoming release (#13294)","shortMessageHtmlLink":"Update version references from 8.0 to 7.4 for upcoming release (#13294)"}},{"before":"60e1582ddb4247195d2fbe1b52968e393103d865","after":"2f34f6f0b98cc7de1a9b4fafe06e62703be5b0af","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-26T10:30:45.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Delete hsetf and hgetf (#13291)\n\nChanges:\r\n- Delete hsetf and hgetf commands\r\n- Hfe commands will return empty array instead of nil.\r\n---------\r\n\r\nCo-authored-by: Moti Cohen ","shortMessageHtmlLink":"Delete hsetf and hgetf (#13291)"}},{"before":"f34f2ade85359770bb708ddc23503d95db93ccfc","after":"60e1582ddb4247195d2fbe1b52968e393103d865","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-26T00:34:15.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Fix statistics test (#13293)","shortMessageHtmlLink":"Fix statistics test (#13293)"}},{"before":"e92363e248019b8bf3fc7dd8ce84f648b6b13473","after":"6801a3cec882d45853dde84b92fd3aace7a9e9b7","ref":"refs/heads/unstable","pushedAt":"2024-05-25T07:59:27.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"redis-cli --keystats and --keystats-samples with --top and --cursor (#12826)\n\nAdded `--keystats` and `--keystats-samples ` commands.\r\n\r\nThe new commands combines memkeys and bigkeys with additional\r\ndistribution data.\r\nWe often run memkeys and bigkeys one after the other. It will be\r\nconvenient to just have one command.\r\nDistribution and top 10 key sizes are useful when we have multiple keys\r\ntaking a lot of memory.\r\n\r\nLike for memkeys and bigkeys, we can use `-i ` and Ctrl-C to\r\ninterrupt the scan loop. It will still show the statistics on the keys\r\nsampled so far.\r\nWe can use two new optional parameters:\r\n- `--cursor ` to continue from the last cursor after an interruption\r\nof the scan.\r\n- `--top ` to change the number of top key sizes (10 by default).\r\n\r\nImplemented a fix for the `--memkeys-samples 0` issue in order to use\r\n`--keystats-samples 0`.\r\n\r\nUsed hdr_histogram for the key size distribution.\r\n\r\nFor key length, hdr_histogram seemed overkill and preset ranges were\r\nused.\r\n\r\nThe memory used by keystats with hdr_histogram is around 7MB (compared\r\nto 3MB for memkeys or bigkeys).\r\n\r\nExecution time is somewhat equivalent to adding memkeys and bigkeys\r\ntime. Each scan loop is having more commands (key type, key size, key\r\nlength/cardinality).\r\n\r\nWe can redirect the output to a file. In that case, no color or text\r\nrefresh will happen.\r\n\r\nLimitation:\r\n- As the information printed during the loop is refreshed (moving cursor\r\nup), stderr and information not fitting in the terminal window (width or\r\nheight) might create some refresh issues.\r\n\r\nComments:\r\n- config.top_sizes_limit could be used globally like config.count, but\r\nit is passed as parameter to be consistent with config.memkeys_samples.\r\n- Not sure if we should move some utility functions to cli-common.c.\r\n\r\nGot some tips and help from @ofirluzon.\r\n\r\n---------\r\n\r\nCo-authored-by: Binbin \r\nCo-authored-by: Viktor Söderqvist \r\nCo-authored-by: debing.sun ","shortMessageHtmlLink":"redis-cli --keystats and --keystats-samples with --top and --cursor (#…"}},{"before":"ae6df30eb13bea2f15a5f39a78bf311c41d47322","after":"f34f2ade85359770bb708ddc23503d95db93ccfc","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-23T14:29:46.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"moticless","name":"Moti Cohen","path":"/moticless","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/24944278?s=80&v=4"},"commit":{"message":"Add Statistics hashes_with_expiry_fields to INFO (#13275)\n\nAdded hashes_with_expiry_fields.\r\nOptimially it would better to have statistic of that counts all fields\r\nwith expiry. But it requires careful logic and computation to follow and\r\ndeep dive listpacks and hashes. This statistics is trivial to achieve\r\nand reflected by global HFE DS that has builtin enumeration of all the\r\nhashes that are registered in it.","shortMessageHtmlLink":"Add Statistics hashes_with_expiry_fields to INFO (#13275)"}},{"before":"a25b15392c3f50909ab2dafbcbdb3794ada29620","after":"ae6df30eb13bea2f15a5f39a78bf311c41d47322","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-23T07:46:50.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"moticless","name":"Moti Cohen","path":"/moticless","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/24944278?s=80&v=4"},"commit":{"message":"Fix ebuckets stop indication during ebExpire() (#13287)\n\non active-expire of buckets, at function `ebExpire()` ->\r\n`ebSegExpire()`, if callback `onExpireItem()` indicated to stop, Yet\r\niterator (iter) was wrongly already got updated to point to next item.\r\nIn turn the segment will be updated without current item.","shortMessageHtmlLink":"Fix ebuckets stop indication during ebExpire() (#13287)"}},{"before":"95cbe879e54ab19d0120eac9fa10240759a129e1","after":"a25b15392c3f50909ab2dafbcbdb3794ada29620","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-22T20:05:32.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Improve performance of hfe listpack (#13279)\n\nThis PR contains a few optimizations for hfe listpack.\r\n- Hfe fields are ordered by TTL in the listpack. There are two cases\r\nthat we want to search listpack according to TTLs:\r\n- As part of active-expiry, we need to find the fields that are expired.\r\ne.g. find fields that have smaller TTLs than given timestamp.\r\n- When we want to add a new field, we need to find the correct position\r\nto maintain the order by TTL. e.g. find the field that has a higher TTL\r\nthan the one we want to insert.\r\n \r\nIterating with lpNext() to compare TTLs has a performance cost as\r\nlpNext() calls lpValidateIntegrity() for each entry. Instead, this PR\r\nadds `lpFindCb()` to the listpack which accepts a comparator callback.\r\nIt preserves same validation logic of lpFind() which is faster than\r\nsearch with lpNext().\r\n \r\n- We have field name, value, ttl for a single hfe field. Inserting these\r\nitems one by one to listpack is costly. Especially, as we place fields\r\naccording to TTL, most additions will end up in the middle of the\r\nlistpack. Each insert causes realloc + memmove. This PR introduces\r\n`lpBatchInsert()` to add multiple items in one go.\r\n\r\n- For hsetf, if we are going to update value and TTL at the same time,\r\ncurrently, we update the value first and later update the TTL (two\r\ndistinct listpack operation). This PR improves it by doing it with a\r\nsingle update operation.\r\n\r\n---------\r\n\r\nCo-authored-by: debing.sun ","shortMessageHtmlLink":"Improve performance of hfe listpack (#13279)"}},{"before":"36c3cec6d17222eadea5e07a982791a45e3d0ec4","after":"95cbe879e54ab19d0120eac9fa10240759a129e1","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-22T02:53:30.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"sanitize dump payload for HFE (#13278)\n\nAdd the following validations:\r\n1. Get TTL using the lpGetIntegerValue() method instead of lpGetValue(),\r\nRef https://github.com/redis/redis/pull/13209#discussion_r1602569422\r\n2. The TTL of listpackex is a number in the valid range\r\n(0~EB_EXPIRE_TIME_MAX) and ordered.\r\n3. The TTL fields of listpackex are ordered. \r\n4. The TTL of hashtable is within the valid range\r\n(0~EB_EXPIRE_TIME_MAX).\r\n\r\nOther:\r\nFix the missing of handling OBJ_ENCODING_LISTPACK_EX in\r\ndismissHashObject().\r\n\r\n---------\r\n\r\nCo-authored-by: Ozan Tezcan ","shortMessageHtmlLink":"sanitize dump payload for HFE (#13278)"}},{"before":"9ffc35c98e4629faa0faa4f17a9196da7b4ef9c7","after":"e92363e248019b8bf3fc7dd8ce84f648b6b13473","ref":"refs/heads/unstable","pushedAt":"2024-05-21T02:33:14.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Log the real reason for why posix_fadvise failed (#13246)\n\n`reclaimFilePageCache` did not set `errno` but `rdbSaveInternal` which\r\nis logging the error assumed it did. This makes sure `errno` is set.\r\n\r\nFixes #13245\r\n\r\nSigned-off-by: Ted Lyngmo ","shortMessageHtmlLink":"Log the real reason for why posix_fadvise failed (#13246)"}},{"before":"f1b02129173dd676feca0131dcde92d5b374dacf","after":"9ffc35c98e4629faa0faa4f17a9196da7b4ef9c7","ref":"refs/heads/unstable","pushedAt":"2024-05-21T01:25:14.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Have consistent behavior of SPUBLISH within multi/exec like regular command (#13276)\n\nThis PR is based on the commits from PR #12944.\r\n\r\nAllow SPUBLISH command within multi/exec on replica\r\n\r\nBehavior on unstable:\r\n\r\n```\r\n127.0.0.1:6380> CLUSTER NODES\r\n39ce8aa20f1f0d91f1a88d976ee1926dfefcdf1a 127.0.0.1:6380@16380 myself,slave 8b0feb120b68aac489d6a5af9c77dc40d71bc792 0 0 0 connected\r\n8b0feb120b68aac489d6a5af9c77dc40d71bc792 127.0.0.1:6379@16379 master - 0 1705091681202 0 connected 0-16383\r\n127.0.0.1:6380> SPUBLISH hello world\r\n(integer) 0\r\n127.0.0.1:6380> MULTI\r\nOK\r\n127.0.0.1:6380(TX)> SPUBLISH hello world\r\nQUEUED\r\n127.0.0.1:6380(TX)> EXEC\r\n(error) MOVED 866 127.0.0.1:6379\r\n```\r\n\r\nWith this change:\r\n\r\n```\r\n127.0.0.1:6380> SPUBLISH hello world\r\n(integer) 0\r\n127.0.0.1:6380> MULTI\r\nOK\r\n127.0.0.1:6380(TX)> SPUBLISH hello world\r\nQUEUED\r\n127.0.0.1:6380(TX)> EXEC\r\n1) (integer) 0\r\n```\r\n\r\n---------\r\n\r\nCo-authored-by: Harkrishn Patro \r\nCo-authored-by: oranagra ","shortMessageHtmlLink":"Have consistent behavior of SPUBLISH within multi/exec like regular c…"}},{"before":"d2c8a4b91e8c0e6aefd1f5bc0bf582cddbe046b7","after":"f60370ce28b946c1146dcea77c9c399d39601aaa","ref":"refs/heads/7.2","pushedAt":"2024-05-19T06:12:35.000Z","pushType":"pr_merge","commitsCount":14,"pusher":{"login":"YaacovHazan","name":null,"path":"/YaacovHazan","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/31382944?s=80&v=4"},"commit":{"message":"Redis 7.2.5","shortMessageHtmlLink":"Redis 7.2.5"}},{"before":"323be4d6993faf02bf89382f06f04f0d0f9a70c9","after":"36c3cec6d17222eadea5e07a982791a45e3d0ec4","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-18T08:34:13.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"tezc","name":"Ozan Tezcan","path":"/tezc","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/17865367?s=80&v=4"},"commit":{"message":"Fix hfe RDB tests by adding FIELDS keyword to hexpire commands (#13277)\n\nFIELDS keyword was added as part of\r\n[#13270](https://github.com/redis/redis/pull/13270). \r\n\r\nIt was missing in\r\n[#13243](https://github.com/redis/redis/pull/13243)","shortMessageHtmlLink":"Fix hfe RDB tests by adding FIELDS keyword to hexpire commands (#13277)"}},{"before":"71676513ddd125af03926b60748bf7eae5689f67","after":"323be4d6993faf02bf89382f06f04f0d0f9a70c9","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-17T10:27:02.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Hfe serialization listpack (#13243)\n\nAdd RDB de/serialization for HFE\r\n\r\nThis PR adds two new RDB types: `RDB_TYPE_HASH_METADATA` and\r\n`RDB_TYPE_HASH_LISTPACK_TTL` to save HFE data.\r\nWhen the hash RAM encoding is dict, it will be saved in the former, and\r\nwhen it is listpack it will be saved in the latter.\r\nBoth formats just add the TTL value for each field after the data that\r\nwas previously saved, i.e HASH_METADATA will save the number of entries\r\nand, for each entry, key, value and TTL, whereas listpack is saved as a\r\nblob.\r\nOn read, the usual dict <--> listpack conversion takes place if\r\nrequired.\r\nIn addition, when reading a hash that was saved as a dict fields are\r\nactively expired if expiry is due. Currently this slao holds for\r\nlistpack encoding, but it is supposed to be removed.\r\n\r\nTODO:\r\nRemove active expiry on load when loading from listpack format (unless\r\nwe'll decide to keep it)","shortMessageHtmlLink":"Hfe serialization listpack (#13243)"}},{"before":"80be2cc29111b31e316c47529b21c7a9efc61651","after":"71676513ddd125af03926b60748bf7eae5689f67","ref":"refs/heads/hash-field-expiry-integ","pushedAt":"2024-05-16T16:35:58.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"moticless","name":"Moti Cohen","path":"/moticless","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/24944278?s=80&v=4"},"commit":{"message":"Fix commands H*EXPIRE* and H*TTL to include `FIELDS` constant (#13270)\n\nThe same goes to: HPEXPIRE, HEXPIREAT, HPEXPIREAT, HEXPIRETIME,\r\nHPEXPIRETIME, HPTTL, HTTL, HPERSIST","shortMessageHtmlLink":"Fix commands H*EXPIRE* and H*TTL to include FIELDS constant (#13270)"}},{"before":"ffbdf2f6f37e2d5c0d1dcc6db16b63faacffd705","after":"f1b02129173dd676feca0131dcde92d5b374dacf","ref":"refs/heads/unstable","pushedAt":"2024-05-15T06:12:22.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sundb","name":"debing.sun","path":"/sundb","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/965798?s=80&v=4"},"commit":{"message":"Revert \"Change mmap rand bits as a temporary mitigation to resolve asan bug (#13150)\" (#13266)\n\nThe kernel config `vm.mmap_rnd_bits` had been revert in\r\nhttps://github.com/actions/runner-images/issues/9491, so we can revert\r\nthe changes from #13150.\r\n\r\nCI only with ASAN passed:\r\nhttps://github.com/sundb/redis/actions/runs/9058263634","shortMessageHtmlLink":"Revert \"Change mmap rand bits as a temporary mitigation to resolve as…"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEXhYCqAA","startCursor":null,"endCursor":null}},"title":"Activity · redis/redis"}