Skip to content

fix: cherry pick pika 355 to 40#3061

Closed
Mixficsol wants to merge 15 commits intoOpenAtomFoundation:unstablefrom
Mixficsol:355_to_40
Closed

fix: cherry pick pika 355 to 40#3061
Mixficsol wants to merge 15 commits intoOpenAtomFoundation:unstablefrom
Mixficsol:355_to_40

Conversation

@Mixficsol
Copy link
Copy Markdown
Collaborator

@Mixficsol Mixficsol commented Mar 25, 2025

Summary by CodeRabbit

  • New Features

    • Introduced new configuration options allowing users to customize cache item limits and key sizes.
    • Enhanced performance monitoring now provides detailed slow log breakdowns of command execution, offering better insights into processing times.
    • Improved cache operations that enforce key existence checks for more reliable data handling.
    • Added new methods for setting values in cache only if the specified key exists, enhancing data integrity.
    • Updated version information output for the Codis applications to include more detailed build information.
  • Chores

    • Updated the build process with automatic version generation and clearer version logging outputs.

Mixficsol and others added 10 commits March 25, 2025 17:35
…nAtomFoundation#3043)

* The number of element updates in RedisCache is configurable

Co-authored-by: wuxianrong <[email protected]>
…ds (OpenAtomFoundation#3049)

* Example Repair the subjective and objective offline logic of primary and secondary nodes

* fix comment

---------

Co-authored-by: wuxianrong <[email protected]>
…omFoundation#3054)

* Fixed version information for Pika, Pika_exporter, Codis

* Delete redundant logic

---------

Co-authored-by: wuxianrong <[email protected]>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 25, 2025

Walkthrough

This pull request introduces a series of modifications across the build, configuration, caching, and command processing components. The build system now removes persistent caching of the build date and adds a new version generation target. Replication and server state logic have been refined in topom and sentinel modules, and JSON unmarshalling has been corrected. New configuration parameters and getters/setters are added, and key existence checks are enforced in various cache operations. Additionally, command processing has been updated to include stage timers for performance metrics and improved key handling throughout.

Changes

File(s) Change Summary
CMakeLists.txt, codis/Makefile, tools/pika_exporter/Makefile, tools/pika_exporter/main.go Removed persistent caching of build date; added generate-version target; simplified version commit hash extraction; restructured exporter logging.
codis/pkg/topom/topom_group.go, codis/pkg/topom/topom_sentinel.go, codis/pkg/utils/redis/sentinel.go Adjusted replication update logic; refined offline state handling; corrected master host/port mapping.
conf/pika.conf, include/pika_conf.h, src/pika_conf.cc, src/pika_admin.cc Introduced new cache configuration parameters and methods for RocksDB and cache limits; enhanced configuration retrieval and setting commands.
include/pika_cache.h, src/cache/..., src/pika_cache.cc Added conditional cache methods (e.g., SetRangeIfKeyExist, HMSetIfKeyExist) to enforce key existence checks in cache operations.
include/pika_client_conn.h, include/pika_command.h, src/pika_client_conn.cc, src/pika_command.cc, src/pika_hash.cc, src/pika_kv.cc, src/pika_list.cc, src/pika_set.cc, src/pika_zset.cc Updated command interfaces for slow log processing; integrated stage timers; modified key type parameters and cache key prefixing; revised expiration and TTL handling.
src/pstd/include/stage_timer.h, src/storage/src/redis_strings.cc Introduced the StageTimer class for performance metric measurement; updated Redis string append behavior to correctly set the new value output.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant PikaCache
    participant RedisCache

    Client->>PikaCache: Call SetRangeIfKeyExist(key, start, value)
    PikaCache->>RedisCache: Check if key exists
    alt Key exists
        RedisCache->>RedisCache: Execute set-range operation
        RedisCache-->>PikaCache: Return OK status
    else Key does not exist
        RedisCache-->>PikaCache: Return NotFound error
    end
    PikaCache-->>Client: Return operation result
Loading
sequenceDiagram
    participant Client
    participant Conn as PikaClientConn
    participant Cmd as Command (with StageTimer)
    participant DB as RocksDB

    Client->>Conn: Send command request
    Conn->>Cmd: Execute command (with STAGE_TIMER_GUARD)
    Cmd->>DB: Process command and measure stages
    DB-->>Cmd: Return execution result
    Cmd-->>Conn: Return performance summary (StagesDurationSummary)
    Conn-->>Client: Return final command output with slow log info
Loading

Suggested labels

3.5.6, 4.0.2

Suggested reviewers

  • chejinge

Poem

Oh, what a day for code to hop,
My whiskers twitch with every swap.
Functions bloom like springtime flowers,
New checks and timers empower.
Through cache and config, we happily race—
A rabbit’s joy in swift code’s embrace!
🐇💻


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e23ec9d and 605e7a0.

📒 Files selected for processing (1)
  • src/storage/src/redis_strings.cc (1 hunks)
🧰 Additional context used
🧬 Code Definitions (1)
src/storage/src/redis_strings.cc (4)
src/storage/src/redis_streams.cc (1)
  • value (397-397)
src/storage/src/pika_stream_meta_value.h (8)
  • value (81-117)
  • value (81-81)
  • value (315-333)
  • value (315-315)
  • value (375-391)
  • value (375-375)
  • value (469-484)
  • value (469-469)
include/pika_command.h (8)
  • value (456-456)
  • value (456-456)
  • value (457-460)
  • value (457-457)
  • value (461-461)
  • value (461-461)
  • value (590-590)
  • db_ (563-563)
src/storage/src/redis.h (2)
  • db_ (42-42)
  • default_write_options_ (508-508)
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: build_on_centos
  • GitHub Check: build_on_ubuntu
  • GitHub Check: build_on_macos
  • GitHub Check: Analyze (go)
🔇 Additional comments (2)
src/storage/src/redis_strings.cc (2)

102-102: Added proper out_new_value initialization for non-existent keys.

This line ensures that when a key doesn't exist, the out_new_value parameter is consistently set to the string representation of the value being appended. Previously, the out_new_value parameter would have been uninitialized in this code path, while it's properly set in other paths (like line 93).


104-105: Key format in database Put operation is consistent.

The code is using base_key.Encode() consistently for both read (line 72) and write (line 104) operations, which is good for maintaining data integrity.

✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai plan to trigger planning for file edits and PR creation.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@github-actions github-actions Bot added the ☢️ Bug Something isn't working label Mar 25, 2025
@Mixficsol Mixficsol changed the title fix: cherry pika 355 to 40 fix: cherry pick pika 355 to 40 Mar 25, 2025
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

🧹 Nitpick comments (43)
src/cache/src/bit.cc (1)

33-35: Ensure consistent error message formatting

There's a typo in the error message "Free memory faild !". This same typo exists in the original SetBit method.

  if (C_OK != res) {
-    return Status::Corruption("[error] Free memory faild !");
+    return Status::Corruption("[error] Free memory failed!");
  }
src/cache/src/string.cc (1)

258-278: New method ensures key existence before operation

Adding SetRangeIfKeyExist provides a safer alternative to SetRange by first verifying the key exists before attempting to modify it. This prevents implicit key creation and gives better control over cache behavior.

There's a small typo in the error message:

- return Status::Corruption("[error] Free memory faild !");
+ return Status::Corruption("[error] Free memory failed!");
src/pika_set.cc (5)

167-168: SCardCmd::DoUpdateCache with async queue
Currently, only pushing the key for async load. If cardinality has changed, consider whether explicit updates might be needed to avoid short-term cache inaccuracies.


335-337: Remove set members from cache in SRemCmd::DoUpdateCache
Consider logging or handling potential errors if the underlying cache call fails for debugging or observability.


399-400: SUnionstoreCmd::DoUpdateCache variable naming
The vector named v is not descriptive. Consider a more explicit name like keys_to_delete to improve readability.

-    std::vector<std::string> v;
+    std::vector<std::string> keys_to_delete;

502-503: SInterstoreCmd::DoUpdateCache deletion
If db_->cache()->Del(v) fails internally, consider logging for troubleshooting.


659-663: Handle source and destination updates in SMoveCmd::DoUpdateCache
If the member no longer exists in the source set, ensure we still remove it from the cache to stay in sync.

src/pika_command.cc (1)

873-874: Capture acquire_lock_duration_ms
Dividing by 1000 is straightforward. Consider using duration_cast for clarity if feasible.

src/pika_admin.cc (1)

2904-2916: Consider simplifying validation logic

The validation for RocksDB performance settings follows identical patterns but with different limits. Consider refactoring this to reduce code duplication.

You could refactor the validation into a helper function:

-    bool success = g_pika_conf->UpdateRocksDBPerfLevel(int(ival));
-    LOG(INFO) << "update rocksdb-perf-level to " << ival
-              << (success ? " success" : " failed");
-    if (!success) {
-      res_.AppendStringRaw("-ERR Invalid argument \'" + value + "\' for CONFIG SET 'rocksdb-perf-level', should between 1 and 5\r\n");
-      return;
-    }
-    res_.AppendStringRaw("+OK\r\n");
+    if (!UpdateConfigWithRangeCheck(g_pika_conf->UpdateRocksDBPerfLevel(int(ival)), 
+                                   "rocksdb-perf-level", ival, value, 
+                                   "should between 1 and 5")) {
+      return;
+    }

With a helper function defined as:

bool UpdateConfigWithRangeCheck(bool success, const std::string& config_name, 
                                long int value, const std::string& original_value,
                                const std::string& range_description) {
  LOG(INFO) << "update " << config_name << " to " << value
            << (success ? " success" : " failed");
  if (!success) {
    res_.AppendStringRaw("-ERR Invalid argument \'" + original_value + 
                        "\' for CONFIG SET '" + config_name + "', " + 
                        range_description + "\r\n");
    return false;
  }
  res_.AppendStringRaw("+OK\r\n");
  return true;
}
include/pika_command.h (1)

618-623: Enhanced timing metrics with more granular measurements.

Replacing the previous single do_duration_ metric with multiple specialized timing metrics provides better insights into performance bottlenecks across different stages of command execution.

Consider adding brief documentation comments for each duration field to clarify what exact parts of the execution they measure.

src/pika_kv.cc (25)

68-68: Add explanatory comment on timer usage.
You introduced STAGE_TIMER_GUARD(storage_duration_ms, true); to measure storage performance. Consider adding a brief comment to clarify its purpose for maintainers.


114-114: Use prefixed variable consistently.
CachePrefixKeyK is declared, but subsequent lines still operate on key_ directly in some places. Ensure all relevant operations consistently use the prefixed variable for clarity in cache usage.


177-179: Apply consistent naming for cache prefix and add error handling.

  1. Using STAGE_TIMER_GUARD(cache_duration_ms, true); here helps measure cache read performance, which is good.
  2. The next lines use CachePrefixKeyK. Ensure uniform naming consistency across all cache operations.
  3. Consider handling exceptions or errors from db_->cache()->Get() more explicitly, e.g., logs or status checks, for better debugging.

344-344: Potential overflow risk.
Incrby uses signed integers. Verify the boundary conditions in by_ to avoid overflow in large increments, or consider 64-bit checks.


433-434: Use a single location for prefix building.
Repeatedly constructing CachePrefixKeyK in each command can introduce code duplication. Consider a helper function for clarity and maintainability.


535-536: Mirror the logic in DB storage.
Ensure db_->cache()->DecrByxx matches the exact arithmetic and error-checking logic used in storage()->Decrby to avoid inconsistencies.


607-608: Prevent duplication on repeated appends.
After appending in the DB, re-append in the cache. If partial failures or concurrency exist, consider verifying cached data is correct.


687-687: Add a comment for repeated pattern.
Similar to other STAGE_TIMER_GUARD usages—keep the code DRY by centralizing these entry calls or macros if possible.


719-719: Use or discard the timer result.
Storing the timer guard result or logging it might help. If not used, consider ensuring it doesn't cause overhead or confusion.


738-738: Confirm repeated caching logic.
Another repetitive use of STAGE_TIMER_GUARD. Potentially unify these calls to reduce code duplication.


812-812: Large scans can be time-consuming.
Enable a progressive or partial response if ScanCmd might operate on massive data sets to avoid blocking.


903-904: Ensure consistent TTL usage in cache.
Storing with Setxx plus TTL is correct, but confirm alignment with any potential adjustments in the DB layer (e.g., leftover TTL if partial updates failed).


947-947: Use consistent naming for microseconds vs. milliseconds
usec_ / 1000 can be confusing since usec_ suggests microseconds but the code uses it as milliseconds. Rename or add comments to clarify.


963-964: Same microseconds vs. milliseconds concern
Be consistent about what usec_ truly represents. Re-check potential truncation or overflow.


1052-1052: Verify variable usage
You introduced std::string CachePrefixKeyK; but it’s unused. Remove or implement it to avoid confusion.

-  std::string CachePrefixKeyK;

1316-1317: Check for combined data type errors
Eagerly building type_status for multiple data types is correct. Possibly log partial errors if one data type fails.


1380-1381: Map usage for data type expiration
Check the meaning of -1 or other negative results—consistent usage will avoid confusion in higher-level logic.


1419-1427: Cascade expire calls
Expiring all typed prefixes is correct. Ensure partial successes or errors are logged if any typed prefix fails.


1508-1509: Expireat time bounds
Casting time_stamp_ to int32_t might cause overflow if times exceed 2038 (32-bit). Evaluate using 64-bit.


1524-1535: Handle failures in the loop
If db_->cache()->Expireat(...) fails for some prefix, consider partial results logging or corrective measures.


1566-1576: Ensure consistent pexpireat
Same approach with pexpireat: partial success is possible. Consider logging any anomalies.


1614-1638: Read cache TTL approach
Similar logic to DB TTL. Make sure negative or special TTL values (-2, -1) are handled consistently with the DB.


1654-1698: PTTL behavior
The code multiplies or sets TTL in milliseconds. Check that the DB also uses the correct scale.


1701-1745: Cache read for Pttl
Same partial results approach. Good. Possibly unify this logic for maintainability.


1778-1787: Ensure all typed keys are persisted
For PersistCmd, each typed prefix is persisted. If any type fails, consider partial success logging.

include/pika_conf.h (6)

862-864: Sufficient range for perf level?
RocksDBPerfLevel returns an int from rocksdb_perf_level_. If the valid range is 0–5, add validation to prevent out-of-range usage.


866-868: Expose maximum size in doc
CacheValueItemMaxSize() is straightforward. A quick inline comment or docstring about typical usage would help future maintainers.


882-888: Check boundary logs
When UpdateMaxKeySizeInCache fails, consider logging the invalid size to help debugging.


898-900: Document perf percent usage
RocksDBPerfPercent() is clear, but how it impacts performance could be made more explicit with a short doc comment.


902-908: Soft vs hard limit
UpdateRocksDBPerfPercent uses a 0–100 range. Evaluate if you need a soft limit near 100 to prevent unexpected overhead.


1178-1192: Maintain or remove commented-out code
This block describes possible perf levels. If it’s purely documentation, keep it up-to-date or remove if obsolete to reduce confusion.

src/cache/include/cache.h (2)

116-117: Repositioning of SCard method.

The SCard method has been moved to follow SAddIfKeyExist, which disrupts the original method ordering. Consider maintaining a consistent method ordering pattern (alphabetical or by functionality) for better readability.


73-161: Consider adding documentation for the new methods.

All the newly added methods follow a clear naming pattern but lack documentation comments. Adding brief descriptions would help future maintainers understand the purpose and usage of these methods.

+  // Set a range of value in a string key if the key exists
   Status SetRangeIfKeyExist(std::string& key, int64_t start, std::string &value);

+  // Set a hash field value if the hash key exists
   Status HSetIfKeyExist(std::string& key, std::string &field, std::string &value);

   Status HSetnx(std::string& key, std::string &field, std::string &value);
+  // Set a hash field value if it doesn't exist and the hash key exists
   Status HSetnxIfKeyExist(std::string& key, std::string &field, std::string &value);

   Status HMSet(std::string& key, std::vector<storage::FieldValue> &fvs);
+  // Set multiple hash field values if the hash key exists
   Status HMSetIfKeyExist(std::string& key, std::vector<storage::FieldValue> &fvs);
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 590afe9 and e780a9f.

📒 Files selected for processing (35)
  • CMakeLists.txt (1 hunks)
  • codis/Makefile (2 hunks)
  • codis/pkg/topom/topom_group.go (1 hunks)
  • codis/pkg/topom/topom_sentinel.go (1 hunks)
  • codis/pkg/utils/redis/sentinel.go (1 hunks)
  • conf/pika.conf (1 hunks)
  • include/pika_cache.h (3 hunks)
  • include/pika_client_conn.h (1 hunks)
  • include/pika_command.h (4 hunks)
  • include/pika_conf.h (6 hunks)
  • include/pika_hash.h (1 hunks)
  • include/pika_kv.h (2 hunks)
  • src/cache/include/cache.h (4 hunks)
  • src/cache/include/config.h (2 hunks)
  • src/cache/src/bit.cc (1 hunks)
  • src/cache/src/hash.cc (4 hunks)
  • src/cache/src/list.cc (2 hunks)
  • src/cache/src/set.cc (2 hunks)
  • src/cache/src/string.cc (1 hunks)
  • src/cache/src/zset.cc (3 hunks)
  • src/pika_admin.cc (3 hunks)
  • src/pika_cache.cc (13 hunks)
  • src/pika_cache_load_thread.cc (7 hunks)
  • src/pika_client_conn.cc (4 hunks)
  • src/pika_command.cc (17 hunks)
  • src/pika_conf.cc (1 hunks)
  • src/pika_hash.cc (39 hunks)
  • src/pika_kv.cc (70 hunks)
  • src/pika_list.cc (32 hunks)
  • src/pika_set.cc (31 hunks)
  • src/pika_zset.cc (53 hunks)
  • src/pstd/include/stage_timer.h (1 hunks)
  • src/storage/src/redis_strings.cc (1 hunks)
  • tools/pika_exporter/Makefile (1 hunks)
  • tools/pika_exporter/main.go (1 hunks)
🧰 Additional context used
🧬 Code Definitions (10)
src/pika_cache_load_thread.cc (1)
include/pika_cache.h (16)
  • key (56-56)
  • key (64-64)
  • key (69-69)
  • key (70-70)
  • key (71-71)
  • key (72-72)
  • key (73-73)
  • key (74-74)
  • key (75-75)
  • key (78-78)
  • key (79-79)
  • key (80-80)
  • key (81-81)
  • key (82-82)
  • key (84-84)
  • key (86-86)
src/storage/src/redis_strings.cc (1)
src/storage/src/redis.h (2)
  • db_ (42-42)
  • default_write_options_ (508-508)
src/cache/src/list.cc (2)
src/pika_cache.cc (6)
  • LPushIfKeyExist (554-558)
  • LPushIfKeyExist (554-554)
  • Exists (99-103)
  • Exists (99-99)
  • RPushIfKeyExist (608-612)
  • RPushIfKeyExist (608-608)
src/cache/src/cache.cc (6)
  • Exists (85-93)
  • Exists (85-85)
  • FreeObjectList (238-243)
  • FreeObjectList (238-238)
  • DecrObjectsRefCount (225-229)
  • DecrObjectsRefCount (225-225)
src/cache/src/zset.cc (3)
src/pika_cache.cc (4)
  • ZAddIfKeyExist (756-850)
  • ZAddIfKeyExist (756-756)
  • Exists (99-103)
  • Exists (99-99)
src/storage/src/storage.cc (2)
  • Exists (1209-1222)
  • Exists (1209-1209)
src/cache/src/cache.cc (6)
  • Exists (85-93)
  • Exists (85-85)
  • FreeObjectList (238-243)
  • FreeObjectList (238-238)
  • DecrObjectsRefCount (225-229)
  • DecrObjectsRefCount (225-225)
src/pika_conf.cc (2)
src/pstd/src/base_conf.cc (4)
  • GetConfInt (98-109)
  • GetConfInt (98-98)
  • GetConfInt64 (155-166)
  • GetConfInt64 (155-155)
include/pika_conf.h (5)
  • cache_value_item_max_size_ (866-868)
  • cache_value_item_max_size_ (987-987)
  • max_key_size_in_cache_ (878-880)
  • max_key_size_in_cache_ (986-986)
  • cache_maxmemory_ (930-930)
src/cache/src/set.cc (5)
src/pika_cache.cc (6)
  • SAddIfKeyExist (652-656)
  • SAddIfKeyExist (652-652)
  • Exists (99-103)
  • Exists (99-99)
  • SCard (681-685)
  • SCard (681-681)
src/cache/include/cache.h (16)
  • key (45-45)
  • key (49-49)
  • key (50-50)
  • key (51-51)
  • key (52-52)
  • key (53-53)
  • key (54-54)
  • key (55-55)
  • key (58-58)
  • key (59-59)
  • key (60-60)
  • key (61-61)
  • key (62-62)
  • key (63-63)
  • key (64-64)
  • key (65-65)
src/storage/src/storage.cc (4)
  • Exists (1209-1222)
  • Exists (1209-1209)
  • SCard (493-496)
  • SCard (493-493)
src/cache/src/cache.cc (6)
  • Exists (85-93)
  • Exists (85-85)
  • FreeObjectList (238-243)
  • FreeObjectList (238-238)
  • DecrObjectsRefCount (225-229)
  • DecrObjectsRefCount (225-225)
src/storage/src/redis_sets.cc (2)
  • SCard (151-182)
  • SCard (151-151)
src/pika_command.cc (4)
src/pstd/src/env.cc (2)
  • NowMicros (220-223)
  • NowMicros (220-220)
src/pstd/include/stage_timer.h (1)
  • NowMicros (47-49)
src/pstd/include/env.h (1)
  • NowMicros (66-66)
include/pika_command.h (1)
  • exclude_zero_value (562-562)
src/cache/src/hash.cc (3)
src/pika_cache.cc (8)
  • HSetIfKeyExist (406-410)
  • HSetIfKeyExist (406-406)
  • Exists (99-103)
  • Exists (99-99)
  • HMSetIfKeyExist (424-428)
  • HMSetIfKeyExist (424-424)
  • HMSet (418-422)
  • HMSet (418-418)
src/storage/src/storage.cc (4)
  • Exists (1209-1222)
  • Exists (1209-1209)
  • HMSet (396-399)
  • HMSet (396-396)
src/cache/src/cache.cc (2)
  • Exists (85-93)
  • Exists (85-85)
src/pika_cache.cc (3)
src/cache/src/string.cc (2)
  • SetRangeIfKeyExist (258-278)
  • SetRangeIfKeyExist (258-258)
src/cache/src/hash.cc (4)
  • HSetIfKeyExist (34-55)
  • HSetIfKeyExist (34-34)
  • HMSetIfKeyExist (96-115)
  • HMSetIfKeyExist (96-96)
src/cache/src/list.cc (4)
  • LPushIfKeyExist (96-113)
  • LPushIfKeyExist (96-96)
  • RPushIfKeyExist (268-284)
  • RPushIfKeyExist (268-268)
src/pika_admin.cc (1)
src/pstd/include/pstd_string.h (4)
  • stringmatch (45-45)
  • string2int (48-48)
  • string2int (49-49)
  • string2int (50-50)
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: Analyze (go)
  • GitHub Check: build_on_macos
  • GitHub Check: build_on_centos
  • GitHub Check: build_on_ubuntu
🔇 Additional comments (217)
include/pika_client_conn.h (1)

133-133: Improved ProcessSlowlog signature for better command context

The method signature change from accepting a duration parameter to accepting a command pointer provides more context for slow log processing. This enhancement allows for more detailed slow log reporting by having access to the entire command object rather than just the execution duration.

tools/pika_exporter/Makefile (1)

7-7: Enhanced version tracking with full Git commit hash

Using the full Git commit hash instead of the shortened version provides more uniqueness and precision for version tracking. This is particularly useful in large projects with many commits where short hashes might potentially collide.

conf/pika.conf (1)

573-577: Added new cache configuration parameters

Two new cache configuration parameters have been added:

  1. cache-value-item-max-size: Limits collection data types (Set, List, Zset) to 1024 elements per cache entry
  2. max-key-size-in-cache: Sets a 1MB maximum size for keys in String data type cache entries

These additions provide better control over cache memory usage and prevent potential memory exhaustion when dealing with large collections or keys.

codis/Makefile (1)

5-5: The build-all target now includes the new generate-version target

The build-all target has been updated to include the generate-version target, which will ensure version information is generated during the build process.

CMakeLists.txt (1)

742-742: Removed caching of build date timestamp

The PIKA_BUILD_DATE variable is now set without caching, ensuring that each build gets a fresh timestamp instead of potentially reusing a cached value from a previous build.

This change ensures that the build date always reflects the current build time, which is more accurate than using a cached value. This is likely related to the new version generation system.

tools/pika_exporter/main.go (1)

58-61: Improved log message readability

The single log statement for version information has been split into multiple log statements, making each piece of information more visible in logs.

This change enhances log readability by separating the build information into distinct lines instead of concatenating everything in a single line.

src/cache/src/bit.cc (1)

31-51: Added new method to set bit only if key exists

The new SetBitIfKeyExist method checks for key existence before performing the bit operation, providing a safer alternative to SetBit when you don't want to create new keys.

This method enhances the API by adding a variant that only performs the operation if the key already exists in the cache. It follows the same pattern as the existing SetBit method but adds a key existence check and returns Status::NotFound if the key doesn't exist.

include/pika_hash.h (1)

57-57: Parameter type update improves type safety

Changing the parameter type from int to size_t for max_sz is appropriate since you're comparing against key_.size() which returns a size_t. This improves type safety by avoiding signed/unsigned comparison issues and makes the code more semantically correct since sizes cannot be negative.

codis/pkg/topom/topom_group.go (1)

384-389: Improved replication relationship management logic

The refactored code now only attempts to update the master when necessary (when addresses don't match), making the logic clearer and more efficient. The change also removes a potentially forceful update in favor of a standard update, which is generally safer.

include/pika_kv.h (2)

32-32: Parameter type update improves type safety

Changing the parameter type from int to size_t for max_sz is appropriate since you're comparing against key_.size() which returns a size_t. This improves type safety by avoiding signed/unsigned comparison issues and makes the code more semantically correct since sizes cannot be negative.


68-68: Parameter type update improves type safety

Similar to the previous change, updating the parameter type to size_t ensures proper type matching with key_.size() and prevents potential issues with signed/unsigned comparisons.

src/pika_zset.cc (54)

39-40: Performance instrumentation added for ZAddCmd::Do operation

The added timer will track the execution time of storage operations, which is valuable for performance analysis and monitoring.


57-59: Improved cache key handling with prefix in ZAddCmd::DoUpdateCache

The code now uses a standardized prefix for ZSet cache keys, ensuring consistent key patterns across the codebase. The timer will measure cache operation duration.


73-74: Performance instrumentation added for ZCardCmd::Do operation

Adding timer tracking for storage operations of ZCardCmd is consistent with the performance monitoring strategy applied across other commands.


138-139: Performance instrumentation added for ZScanCmd::Do operation

The timer will track storage operation duration, aligning with the performance monitoring pattern applied throughout the codebase.


177-178: Performance instrumentation added for ZIncrbyCmd::Do operation

This instrumentation addition is consistent with the performance monitoring strategy applied to other commands.


199-201: Improved cache key handling with prefix in ZIncrbyCmd::DoUpdateCache

Using a standardized prefix for ZSet cache keys ensures consistent key patterns across the codebase. The timer will measure cache operation performance.


233-234: Performance instrumentation added for ZRangeCmd::Do operation

The timer will measure storage operation duration for performance analysis, consistent with other commands.


263-264: Performance instrumentation added for ZRangeCmd::ReadCache operation

Adding timer tracking for cache read operations provides valuable performance metrics for cache access patterns.


299-301: Performance instrumentation for ZRangeCmd::DoUpdateCache with explanatory comment

The timer addition with documentation clearly indicates the intention to measure queue operation latency.


315-316: Performance instrumentation added for ZRevrangeCmd::Do operation

Consistent with the monitoring strategy applied to other commands.


345-346: Performance instrumentation added for ZRevrangeCmd::ReadCache operation

This timer addition allows tracking cache access performance metrics.


382-384: Performance instrumentation for ZRevrangeCmd::DoUpdateCache with explanatory comment

The timer and comment clearly document the intention to measure queue operation performance.


476-477: Performance instrumentation added for ZRangebyscoreCmd::Do operation

Consistent performance tracking addition for storage operations.


517-518: Performance instrumentation added for ZRangebyscoreCmd::ReadCache operation

The timer will track cache read operation performance.


553-555: Performance instrumentation for ZRangebyscoreCmd::DoUpdateCache with explanatory comment

The timer and comment clearly document performance tracking for queue operations.


582-583: Performance instrumentation added for ZRevrangebyscoreCmd::Do operation

The timer addition is consistent with other commands' instrumentation.


621-622: Performance instrumentation added for ZRevrangebyscoreCmd::ReadCache operation

Adding timer for cache read operations consistently improves performance monitoring capabilities.


657-659: Performance instrumentation for ZRevrangebyscoreCmd::DoUpdateCache with comment

The timer and comment provide clear documentation for performance monitoring.


685-686: Performance instrumentation added for ZCountCmd::Do operation

Consistent timer addition for storage operation monitoring.


702-703: Performance instrumentation added for ZCountCmd::ReadCache operation

The timer will measure cache read performance, consistent with other command implementations.


720-722: Performance instrumentation for ZCountCmd::DoUpdateCache with explanatory comment

The timer and comment clearly indicate performance tracking for queue operations.


737-738: Performance instrumentation added for ZRemCmd::Do operation

Consistent performance monitoring addition for storage operations.


754-756: Improved cache key handling with prefix in ZRemCmd::DoUpdateCache

The code now uses a standardized prefix for ZSet cache keys with proper performance timing.


828-829: Performance instrumentation added for ZUnionstoreCmd::Do operation

Consistent timer addition for storage operation monitoring.


847-849: Improved cache key handling with prefix in ZUnionstoreCmd::DoUpdateCache

The standardized prefix ensures consistent key naming with appropriate performance timing.


911-912: Performance instrumentation added for ZInterstoreCmd::Do operation

The timer will measure storage operation performance, consistent with other commands.


929-931: Improved cache key handling with prefix in ZInterstoreCmd::DoUpdateCache

Using the standardized prefix with performance timing is consistent with other cache operations.


996-997: Performance instrumentation added for ZRankCmd::Do operation

Consistent instrumentation for monitoring storage operations.


1011-1012: Performance instrumentation added for ZRankCmd::ReadCache operation

Adding timers for cache read operations improves performance monitoring.


1029-1031: Performance instrumentation for ZRankCmd::DoUpdateCache with explanatory comment

The timer and comment provide clear documentation for queue operation performance tracking.


1045-1046: Performance instrumentation added for ZRevrankCmd::Do operation

Consistent timer addition for storage operation monitoring.


1060-1061: Performance instrumentation added for ZRevrankCmd::ReadCache operation

The timer will consistently track cache read performance.


1078-1080: Performance instrumentation for ZRevrankCmd::DoUpdateCache with explanatory comment

The timer and comment clearly document performance tracking for queue operations.


1095-1096: Performance instrumentation added for ZScoreCmd::Do operation

Consistent timer addition for storage operation monitoring.


1113-1115: Improved cache key handling with prefix in ZScoreCmd::ReadCache

The standardized prefix with performance timing ensures consistent cache key handling.


1211-1212: Performance instrumentation added for ZRangebylexCmd::Do operation

Consistent instrumentation for monitoring storage operations.


1237-1238: Performance instrumentation added for ZRangebylexCmd::ReadCache operation

The timer addition improves performance monitoring for cache operations.


1263-1265: Performance instrumentation for ZRangebylexCmd::DoUpdateCache with explanatory comment

The timer and comment provide clear documentation for queue operation performance tracking.


1293-1294: Performance instrumentation added for ZRevrangebylexCmd::Do operation

Consistent timer addition for storage operation monitoring.


1320-1321: Performance instrumentation added for ZRevrangebylexCmd::ReadCache operation

The timer will track cache read performance consistently with other commands.


1342-1344: Performance instrumentation for ZRevrangebylexCmd::DoUpdateCache with explanatory comment

The timer and comment clearly document performance tracking for queue operations.


1369-1370: Performance instrumentation added for ZLexcountCmd::Do operation

Consistent timer addition for storage operation monitoring.


1387-1388: Performance instrumentation added for ZLexcountCmd::ReadCache operation

The timer will improve performance monitoring for cache operations.


1405-1407: Performance instrumentation for ZLexcountCmd::DoUpdateCache with explanatory comment

The timer and comment clearly document performance tracking for queue operations.


1431-1432: Performance instrumentation added for ZRemrangebyrankCmd::Do operation

Consistent timer addition for storage operation monitoring.


1448-1450: Improved cache key handling with prefix in ZRemrangebyrankCmd::DoUpdateCache

The standardized prefix with performance timing ensures consistent cache key handling.


1473-1474: Performance instrumentation added for ZRemrangebyscoreCmd::Do operation

Consistent timer addition for storage operation monitoring.


1491-1493: Improved cache key handling with prefix in ZRemrangebyscoreCmd::DoUpdateCache

The code now uses a standardized prefix for ZSet cache keys with proper performance timing.


1517-1518: Performance instrumentation added for ZRemrangebylexCmd::Do operation

Consistent timer addition for storage operation monitoring.


1535-1537: Improved cache key handling with prefix in ZRemrangebylexCmd::DoUpdateCache

The standardized prefix with performance timing ensures consistent cache key handling.


1558-1559: Performance instrumentation added for ZPopmaxCmd::Do operation

Consistent timer addition for storage operation monitoring.


1585-1586: Performance instrumentation added for ZPopmaxCmd::DoUpdateCache operation

The timer will measure cache update performance.


1613-1614: Performance instrumentation added for ZPopminCmd::DoUpdateCache operation

The timer will track cache update performance consistently.


1619-1620: Performance instrumentation added for ZPopminCmd::Do operation

Consistent timer addition for storage operation monitoring.

src/storage/src/redis_strings.cc (1)

102-103: Output value now properly set when key doesn't exist

The added line ensures that when a key is not found during append, the out_new_value parameter is set to the string representation of the value being appended. This improves the method's behavior by providing the expected output for non-existent keys.

src/pika_list.cc (6)

33-33: Performance monitoring added for storage operations.

Adding timing guards to track storage operation durations will help track performance metrics. This pattern is consistently applied throughout the file for all storage operations.


48-49: Cache key referencing improved with prefix.

Cache operations now use a prefixed key variable (CachePrefixKeyL) instead of directly using the key, which is a better approach for consistent cache key management.


66-68: Timer added for cache queue operations with helpful comment.

The timer guard addition along with the explanatory comment improves code readability and will help measure performance overhead of asynchronous cache operations.


111-114: Cache key construction standardized.

Using a consistent prefix format (PCacheKeyPrefixL + key_) for cache keys ensures proper namespacing and prevents key conflicts.


467-467: Cache operation uses consistent prefix variable.

The LPop cache operation now uses the standardized CachePrefixKeyL variable, which aligns with the prefix pattern established throughout the file.


893-896: Cache key handling improved for RPopLPushCmd.

The implementation now uses distinct prefixed keys for source and receiver operations, which prevents potential key clashes and improves code clarity.

src/cache/src/set.cc (2)

12-36: New conditional cache operation method added.

The SAddIfKeyExist method adds important key existence validation before performing the set add operation. This method follows the same pattern as the existing SAdd method but with additional safeguards.

This implementation:

  1. Checks for memory availability first
  2. Validates key existence before proceeding
  3. Properly allocates and cleans up Redis objects using DEFER
  4. Has appropriate error handling for different failure cases

61-61: Parameter type changed from const to mutable.

The SCard method signature was modified to accept a non-const reference, allowing the method to potentially modify the key string. This change is consistent with other methods in the class that might need to modify the key (e.g., to add prefixes).

src/pika_cache_load_thread.cc (7)

13-13: Configuration access added via global variable.

Added access to the global configuration which allows for dynamic configuration rather than hardcoded values. This improves flexibility and maintainability.


61-61: Key size validation now uses configuration value.

The key size validation now uses g_pika_conf->max_key_size_in_cache() instead of a hardcoded limit, which improves configurability.


72-74: Added helpful comments and configuration-based limits.

The comments clarify the caching policy, and the code now uses g_pika_conf->value_item_max_size_in_cache() for the member count limit instead of a hardcoded value, improving configurability.


92-94: Improved documentation and consistent configuration use.

Similar to the Hash implementation, the List loading code now has clear comments about member limits and uses configuration values consistently.


114-116: Documentation and configuration consistency maintained for Set type.

The pattern of clear comments and configuration-based limits is consistently applied across all data types.


138-138: ZSet implementation aligned with configuration-based approach.

The key size validation for ZSet operations now uses g_pika_conf->max_key_size_in_cache() consistently with other data types.


147-149: Added informative caching behavior documentation.

The comments clearly describe the ZSet caching behavior regarding the number of members cached and direction, which improves code maintainability.

src/pika_client_conn.cc (6)

23-26: Added RocksDB performance monitoring include files.

These includes are necessary for the performance monitoring functionality added later in the file.


211-217: Implemented dynamic RocksDB performance level monitoring.

This code sets RocksDB performance level based on configuration with a probabilistic approach. Using random sampling (via PercentTrue) allows for targeted performance monitoring without impacting all operations.


219-219: Reset performance context before command execution.

Properly resetting the performance context ensures accurate measurements for each command execution.


229-229: Updated slow log processing to use command pointer.

The method call now passes the command pointer to allow access to detailed performance metrics.


235-235: Improved slow log method signature.

The ProcessSlowlog method signature now accepts a command pointer parameter, allowing access to more detailed timing information.


260-261: Enhanced performance logging with detailed metrics.

The slow log output now includes command stage durations and RocksDB performance context, providing much more comprehensive performance data for troubleshooting.

src/cache/src/zset.cc (3)

11-38: Implementation of ZAddIfKeyExist follows good practices

The new method properly checks for key existence before attempting to add score-member pairs to a sorted set. I like that it follows the same pattern as other methods in the class, including proper memory management with DEFER and appropriate error handling.


66-66: Parameter type change for consistency

Changing the parameter type from const std::string& to std::string& makes this method consistent with other methods in the class that also use non-const references for key parameters.


105-107: Added key existence check for data integrity

This check prevents operating on non-existent keys, which improves data integrity. Good addition.

src/pika_conf.cc (3)

686-693: New cache value item max size configuration handled correctly

The implementation follows the established pattern for configuration parameters, including proper initialization, bounds checking, and error handling.


699-700: Added upper bound check for max key size

This validation prevents excessively large key sizes that could cause performance issues or excessive memory usage.


706-706: Improved fallback behavior for cache_maxmemory_

Changed to use PIKA_CACHE_SIZE_MIN instead of PIKA_CACHE_SIZE_DEFAULT when the provided value is too small, which is more logical than using the default value.

src/cache/src/list.cc (2)

96-120: Implementation of LPushIfKeyExist follows good practices

This new method correctly checks for key existence before attempting to push values to the left of a list. It follows the established pattern in the codebase, including proper memory management with DEFER and appropriate error handling.


268-291: Implementation of RPushIfKeyExist follows good practices

This new method correctly checks for key existence before attempting to push values to the right of a list. It follows the established pattern in the codebase, including proper memory management with DEFER and appropriate error handling.

src/cache/include/config.h (2)

41-42: Increased DEFAULT_CACHE_MAX_KEY_SIZE and added MAX_CACHE_MAX_KEY_SIZE

Increasing the default key size to 1MB provides more flexibility for users, while adding an upper limit of 2MB prevents excessive memory usage. Good balance.


44-48: Added constants for cache value item size

These constants define reasonable default and maximum sizes for cache value items, providing a good balance between flexibility and performance.

src/pika_set.cc (23)

26-26: Add timing instrumentation for SAddCmd::Do
Measuring storage duration with STAGE_TIMER_GUARD helps identify potential bottlenecks in the SAdd operation.


45-47: Validate cache prefix usage in SAddCmd::DoUpdateCache
Appending PCacheKeyPrefixS to derive CachePrefixKeyS is correct for namespace separation. Confirm that SAddIfKeyExist behaves as intended when the cache key is absent.


74-74: Add timing instrumentation for SPopCmd::Do
Consistent with other commands for measuring storage duration.


98-100: Remove members from cache in SPopCmd::DoUpdateCache
Confirm that concurrency and error handling in SRem is adequately covered. Potential cache inconsistencies may arise if multiple writers operate concurrently.


132-132: Add timing instrumentation for SCardCmd::Do
Storage duration measurement follows the same pattern, looks good.


148-150: Reading SCard from cache
Ensure the cached cardinality is accurate if the set is modified directly in storage without an immediate cache update.


183-183: Add timing instrumentation for SMembersCmd::Do
Implementation aligns well with the approach for measuring storage duration.


203-205: Reading SMembers from cache
If the set is large, confirm that caching it remains efficient and does not exceed memory constraints.


226-227: SMembersCmd::DoUpdateCache
Pushing the key to the async load queue is consistent for eventual cache syncing.


315-315: Add timing instrumentation for SRemCmd::Do
Similar logic as other commands. No issues found.


353-353: Add timing instrumentation for SUnionCmd::Do
Follows the shared pattern for measuring storage duration.


381-381: Add timing instrumentation for SUnionstoreCmd::Do
No concerns found.


456-456: Add timing instrumentation for SInterCmd::Do
Implementation appears correct.


484-484: Add timing instrumentation for SInterstoreCmd::Do
Consistent with the rest of the codebase.


519-519: Add timing instrumentation for SIsmemberCmd::Do
No issues identified.


534-536: Check cache consistency in SIsmemberCmd::ReadCache
If the member was removed from the DB but not from the cache, verify the eventual consistency approach.


571-571: Add timing instrumentation for SDiffCmd::Do
Implementation matches other commands.


599-599: Add timing instrumentation for SDiffstoreCmd::Do
No concerns found.


617-618: SDiffstoreCmd::DoUpdateCache concurrency
Check that deleting the cache key is safe under concurrent modifications.


635-635: Add timing instrumentation for SMoveCmd::Do
Implementation is consistent with other commands.


715-715: Add timing instrumentation for SRandmemberCmd::Do
Only measuring storage duration. Implementation looks consistent.


740-742: Read random members from cache in SRandmemberCmd::ReadCache
Approach is fine. It returns a subset of members if available in the cache.


768-769: Async load in SRandmemberCmd::DoUpdateCache
Implementation aligns with other commands pushing keys to the async queue.

codis/pkg/topom/topom_sentinel.go (3)

77-81: Clarify subjective vs. objective offline logic
The newly added comments explain that no action is taken in subjective offline, and repeated failures push the server into objective offline. This separation is clear and aligns with the failover approach.


82-86: Add server to offline lists
When entering objective offline, properly distinguishing masters and slaves with isGroupMaster ensures the correct offline group list is updated.


95-106: Recover group servers in subjective offline
The additional check for group.OutOfSync ensures that previously marked-out-of-sync slaves are resynced. This logic looks consistent with the rest of the replication recovery process.

src/pika_command.cc (24)

7-7: Include <sstream>
Adding <sstream> is appropriate for string stream usage in StagesDurationSummary.


156-156: Change ClearCacheCmd to kCmdFlagsAdmin | kCmdFlagsRead
While clearing the cache seems more like a write operation, treating it under “read” flags might be intentional if it’s a specialized admin command.


416-416: HKeysCmd updated flags
Including kCmdFlagsUpdateCache + kCmdFlagsReadCache allows a read-write cache pattern. Verify it won’t degrade performance for large hash keys.


420-420: HLenCmd cache flags
kCmdFlagsReadCache plus kCmdFlagsUpdateCache for counting hash fields can be beneficial, but monitor memory usage to ensure it’s manageable.


436-436: HStrlenCmd new cache flags
Reading and updating cache for string length calculation is consistent with the approach to keep hash structures in sync.


461-461: LIndexCmd with read cache
Ensure lists in the cache remain consistent under concurrent writes.


468-468: LLenCmd new flags
Marking LLenCmd as kCmdFlagsReadCache + kCmdFlagsUpdateCache seems useful to cache list lengths, but watch for overhead in large lists.


485-485: LRangeCmd read & update cache
Potentially retrieving large segments from the cache is helpful but could be memory-intensive. Monitor performance.


521-521: ZCardCmd with read cache
Cached cardinality for sorted sets can reduce DB calls. No immediate issues found.


533-533: ZRangeCmd read cache
Reusing cached sorted set ranges can improve performance, subject to memory constraints.


537-537: ZRevrangeCmd read cache
Similarly beneficial to ZRangeCmd, but confirm consistent updates to keep the cache accurate.


550-550: ZCountCmd new flags
Read and update cache for counting scores in a range. Could reduce DB hits if frequently called.


566-566: ZRankCmd cache usage
Storing or updating rank info in a cache can be complex. Check correctness for shifting ranks after inserts/deletes.


570-570: ZRevrankCmd cache inclusion
Same caution as ZRankCmd. Rankings may need careful invalidation or re-computation.


574-574: ZScoreCmd flagged with kCmdFlagsReadCache
No kCmdFlagsUpdateCache here, so ensure the cache strategy for single-member lookups remains consistent.


622-622: SCardCmd read+update cache
Aligns with the set logic changes in pika_set.cc.


626-626: SMembersCmd read+update cache
Fetching full membership can be heavy for large sets, but the cache might pay off for repetitive calls.


654-654: SIsmemberCmd read+update cache
Consistent with the set logic. Verify correctness under simultaneous writes.


670-670: SRandmemberCmd read+update cache
Random sampling from cached sets is fine but ensure large sets are handled efficiently.


683-683: BitCountCmd read+update cache
Bit operations can be large. Ensure caching doesn’t cause memory pressure for huge bitmaps.


864-864: Initialize start_us for command timing
Capturing microseconds for performance metrics is helpful.


877-878: Compute command_duration_ms
Storing the time spent in DoCommand. The approach is consistent with the rest.


888-889: Compute binlog_duration_ms
Tracks binlog writing time. This helps identify potential I/O bottlenecks.


979-990: Macros & StagesDurationSummary
The macro PIKA_STAGE_DURATION_OUTPUT and subsequent trimming of trailing commas is neat. This summary offers fine-grained performance insights.

include/pika_cache.h (3)

94-94: Consistent implementation of key existence checks

The new SetRangeIfKeyExist method enhances the API by adding a stricter version of SetRangexx that only modifies the string value if the key already exists, which helps prevent unintended key creation.


116-116: Logical addition to Hash operations

Adding HMSetIfKeyExist complements the existing HSetIfKeyExist method, providing a multi-field version for hash operations that respects key existence requirements.


131-131: Key existence checks added for list operations

The RPushIfKeyExist and LPushIfKeyExist methods provide consistent operations similar to other data types, ensuring list modification only occurs if the key exists.

This follows the pattern established for other data types and provides a more controlled way to handle list operations without accidentally creating new lists.

Also applies to: 135-135

src/pstd/include/stage_timer.h (6)

1-6: Licensing information properly included

The copyright and licensing information is clearly stated at the top of the file, which is good practice.


12-19: Well-designed timer implementation

The StageTimer class is well-structured with a clear constructor that initializes all necessary state variables. The use of a metric pointer allows for flexible accumulation of timing statistics.


20-26: Proper cleanup and control flow

The destructor automatically calls Stop() to ensure measurements are properly finalized, and the Start() method only captures time when performance counting is enabled.


28-34: Effective intermediate measurement capability

The Measure() method provides an efficient way to accumulate timing metrics at intermediate points without stopping the timer completely.


36-44: Robust stopping mechanism

The Stop() method properly handles cases where the timer might not have been started, and correctly converts microseconds to milliseconds when updating the metric.


47-54: Clean implementation with proper encapsulation

The private time_now() method abstracts the time retrieval mechanism, and the member variables are well-organized with clear purposes.

src/pika_admin.cc (3)

2135-2145: LGTM! Added new cache configuration parameters to ConfigGet

The implementation correctly adds support for retrieving "cache-value-item-max-size" and "max-key-size-in-cache" configuration values using the appropriate getter methods.


2213-2223: LGTM! Added RocksDB performance configuration parameters to ConfigGet

The implementation correctly adds support for retrieving "rocksdb-perf-level" and "rocksdb-perf-percent" values.


2891-2943:

Details

✅ Verification successful

Verify range validation in update methods

The implementation properly handles basic validation and error messaging for the new configuration parameters. Error messages clearly indicate valid ranges, but initial checks only validate against values <= 0. The full range validation appears to be handled by the respective update methods.


🏁 Script executed:

#!/bin/bash
# Verify if the update methods handle the upper bounds validation correctly
rg -A 5 "UpdateRocksDBPerfLevel|UpdateRocksDBPerfPercent|UpdateCacheValueItemMaxSize|UpdateMaxKeySizeInCache" --include="*.h" --include="*.cc"

Length of output: 586


Range Validation Verification – Manual Confirmation Needed

  • The code correctly checks that configuration values are greater than 0 before calling the respective update methods.
  • It appears that the detailed upper bound validations (e.g., ensuring “rocksdb-perf-level” is between 1 and 5, “rocksdb-perf-percent” between 0 and 100, “cache-value-item-max-size” between 1 and 2048, and “max-key-size-in-cache” between 1 and 2097152) are delegated to the update methods.
  • An automated search to verify the upper bound checks in these update methods was inconclusive due to issues with the original command flags.
  • Action Required: Please manually verify (or re-run the search using the script below) that the update methods indeed enforce these upper bounds correctly.

🏁 Script executed:

#!/bin/bash
# Re-run verification using find and xargs to search for update method definitions
find . -type f \( -name "*.cc" -o -name "*.h" \) -print0 | xargs -0 rg -A 10 "UpdateRocksDBPerfLevel|UpdateRocksDBPerfPercent|UpdateCacheValueItemMaxSize|UpdateMaxKeySizeInCache"

Length of output: 5764


Range Validation and Update Method Consistency Verified

  • The command handler performs a basic check (rejecting values ≤ 0) before forwarding the configuration change.
  • The update methods in pika_conf.h enforce stricter bounds:
    • UpdateRocksDBPerfLevel rejects values where perf_level >= 6 or perf_level < 0 (effectively allowing values 0–5, with the command handler excluding 0, so 1–5 are valid).
    • UpdateRocksDBPerfPercent rejects values if percent > 100 or percent < 0 (validating the intended range of 0–100).
    • UpdateCacheValueItemMaxSize and UpdateMaxKeySizeInCache similarly limit values to fall within their respective acceptable ranges.
  • The error messages clearly communicate these bounds, and the two-tier validation (basic in the command handler and full in the update methods) is intentional.

No further changes are required, though you might want to double-check that the exclusion of 0 in the command handler for “rocksdb-perf-percent” is deliberate.

include/pika_command.h (4)

20-20: Good addition of the stage_timer.h header.

Including this header supports the new timing functionality being implemented.


24-28: Well-designed macro for stage timing.

The STAGE_TIMER_GUARD macro provides a clean pattern for creating and starting timer instances, making it easy to instrument code sections for performance measurement.


542-542: Improved type safety by changing parameter type from int to size_t.

Changing IsTooLargeKey parameter type from int to size_t is more appropriate for size-related checks since:

  1. It's an unsigned type that prevents negative values
  2. It can handle larger sizes, avoiding potential overflow issues on 64-bit systems

562-562: Good addition of a summary method for timing information.

The StagesDurationSummary virtual method will enable commands to report detailed timing information, improving performance monitoring capabilities.

src/cache/src/hash.cc (5)

34-55: Improved consistency with function name that clearly indicates behavior.

Renaming HSet to HSetIfKeyExist with an existence check makes the function behavior explicit and consistent with other functions in the codebase.


57-76: Good addition of HSetnxIfKeyExist method.

This new method follows the pattern of checking for key existence before performing operations, ensuring consistent behavior across the cache layer.


96-121: Improved function naming for clarity and consistency.

Renaming HMSet to HMSetIfKeyExist with key existence verification follows the pattern established for other cache operations.


123-145: Good restoration of the original HMSet functionality.

Adding back the HMSet method that doesn't perform key existence checking preserves backward compatibility and provides both options for client code.


195-195: Fixed error handling to return NotFound status.

Changed from pushing a not-found status into a vector to returning a direct NotFound error, which is more consistent with error handling patterns throughout the codebase.

src/pika_cache.cc (12)

373-377: Good addition of SetRangeIfKeyExist method.

This new method follows the pattern of checking for key existence at the RedisCache layer, improving code organization.


382-382: Simplified SetRangexx implementation.

Modified to call SetRange directly rather than performing existence check at this layer, which reduces code duplication.


403-403: Simplified HSet implementation.

Now delegates to HSetIfKeyExist, relying on the underlying implementation to handle the existence check.


406-410: Refactored HSetIfKeyExist for consistency.

Simplified the implementation by directly calling the underlying RedisCache implementation rather than duplicating the key existence check.


412-416: Updated HSetIfKeyExistAndFieldNotExist to use specialized method.

Now calls HSetnxIfKeyExist, which handles both the key existence check and setting only if the field doesn't exist.


424-428: Good addition of HMSetIfKeyExist method.

This new method follows the established pattern for conditional cache operations, improving API consistency.


456-456: Simplified HMSetxx implementation.

Now calls HMSet directly, removing duplicate key existence checks from this layer.


554-558: Good addition of LPushIfKeyExist method.

This new method follows the pattern established for other data types, providing consistent API behavior across different structures.


608-612: Good addition of RPushIfKeyExist method.

This new method complements LPushIfKeyExist, ensuring symmetry in the list manipulation API.


652-656: Updated SAddIfKeyExist implementation.

Now calls the underlying RedisCache method directly, following the same pattern as other methods.


788-788: Updated ZAdd-related function calls for consistency.

Changed from ZAdd to ZAddIfKeyExist across multiple locations in the ZSet operations, maintaining consistent behavior.

Also applies to: 806-806, 817-817, 835-835


1519-1519: Updated SetBitIfKeyExist implementation.

Now calls the underlying RedisCache implementation directly, simplifying the code.

src/pika_kv.cc (19)

163-163: Validate returned TTL.
Retrieving TTL with GetWithTTL is logical. Ensure you handle negative or edge-case TTL values properly (e.g., expired or never expires) to avoid downstream confusion.


299-300: Check for successful prefix addition.
Prefixed key creation and immediate usage in Incrxx is correct, but ensure there's no empty prefix scenario that might lead to collisions.


364-365: Cache increment alignment.
Ensure the logic in db_->cache()->IncrByxx(...) matches the logic used at the storage layer for concurrency consistency, especially if partial failures can occur.


409-409: Validate floating-point conversion.
Incrbyfloat modifies a string to long double. Confirm the input parsing handles malformed floating-point strings to prevent silent errors.


474-474: Timer usage is consistent.
Another STAGE_TIMER_GUARD for storage operations. This is consistent with prior usage.


513-514: Confirm negative decrement handling.
When calling Decrby, ensure the code properly handles negative results and integer underflow.


551-551: Timer guard clarifies performance overhead.
Using STAGE_TIMER_GUARD for the GetsetCmd is a consistent pattern. Good for performance tracking.


590-590: Watch for new_value_ correctness.
The appended data ends up in new_value_; handle corner cases (e.g. empty string) or conflicting data types.


670-670: Time measurement for MGet
This aligns with performance tracing. Ensure large multi-key fetches also handle potential timeouts or partial results gracefully.


841-841: Timer consistency with Setnx
Same recommendation: the timer guard can help detect slow setnx ops. Looks good.


1003-1003: Add comment for Delvx usage.
Delvx is a specialized command (value matching). The timer guard is fine, but consider clarifying concurrency or atomic constraints.


1031-1032: Batch set operation performance
Successfully measuring MSet duration is helpful. Looks good.


1148-1148: Added 'auth' to admin commands
Be sure to verify no security holes arise from using 'auth' in the admin command set.


1326-1327: Confirm partial exist checks
Splitting keys for partial Exists is correct; ensure you handle mismatch lengths or partial success.


1342-1355: Caching multi-type existence
This block checks multiple prefix expansions for one key. Good approach. Just confirm that returning the first match is desired behavior.


1444-1445: Pexpire consistency
Translating ms to s at the storage layer can cause rounding. Confirm that’s acceptable.


1550-1551: Force 32-bit timestamp
Same concern as above—time after 2038 can overflow an int32_t, leading to incorrect results.


1799-1800: Different size for types
You allocate types(1), but the code might retrieve multiple types. Validate indexing usage.


1825-1846: Expanded type detection
This new PTypeCmd retrieves multiple types in one go. Check for empty or partially filled results if GetType does not return all 5.

include/pika_conf.h (5)

21-21: Add brief context for "cache/include/config.h"
If this is newly included for cache-specific config, ensure no conflicts with existing macros or definitions in the codebase.


870-876: Ensure MAX_CACHE_ITEMS_SIZE is defined
MAX_CACHE_ITEMS_SIZE must be valid. If it’s large, consider concurrency or memory overhead. Also handle boundary logs.


878-880: Use 64-bit for key size
MaxKeySizeInCache() returning size_t is good for large keys. Confirm no sign confusion or truncation in other code that calls it.


890-896: RocksDBPerfLevel validation range
We see you check perf_level >= 6 || perf_level < 0 to fail. Perfect boundary check for typical enumerations.


1152-1153: Type changes to atomic
Converting to std::atomic<int> and std::atomic_size_t> is good for concurrency. Just ensure all read/writes go through these properly.

src/pika_hash.cc (8)

29-29: Excellent addition of performance measurement!

Adding the STAGE_TIMER_GUARD helps measure the storage duration, which provides valuable performance insights.


47-49: Good enhancement for cache operations.

The changes properly implement performance timing and consistent cache key prefixing. Using CachePrefixKeyH ensures consistent handling of hash keys in the cache.


64-82: Improved command handling logic.

The code now properly differentiates between single field updates and multiple field updates, with consistent response formatting for each case.


90-97: Robust cache update implementation.

The implementation now checks for key existence before performing cache operations, which prevents unnecessary writes and improves efficiency.


110-141: Enhanced command flexibility.

The implementation now handles both single and multiple field retrievals with proper response formatting for each case.


145-177: Comprehensive cache reading implementation.

The code correctly implements cache reading with proper error handling for both single field and multiple field cases, while also measuring performance.


213-213: Consistent performance monitoring.

The timer guard for storage operations has been added consistently across all hash commands, which will provide valuable performance data.


247-249: Standardized cache key handling.

The code consistently uses prefixed keys for all cache operations, which improves maintainability and reduces the risk of cache key collisions.

src/cache/include/cache.h (5)

73-73: Good addition of conditional operation.

Adding SetRangeIfKeyExist follows a consistent pattern of checking key existence before performing operations, which improves cache reliability.


78-83: Well-designed hash operations with existence checks.

These new methods follow good practice by checking key existence before performing operations, which helps prevent unexpected behavior and improves cache consistency.


102-112: Enhanced list operations with existence checks.

The addition of LPushIfKeyExist and RPushIfKeyExist methods provides safer list operations that only modify existing keys, preventing unintended side effects.


125-126: Consistent pattern for zset operations.

Adding ZAddIfKeyExist and repositioning ZCard follows the same pattern as with other data types, ensuring a consistent interface across the cache implementation.


161-161: Completed implementation with bit operations.

The addition of SetBitIfKeyExist completes the pattern of adding existence checks across all data types, ensuring a comprehensive and consistent API.

Comment on lines +109 to +110
i.MasterPort = kvmap["master_port"]
i.MasterHost = kvmap["master_host"]
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fixed critical field assignment bug in UnmarshalJSON

This change corrects a critical bug where master host and port values were previously swapped during JSON unmarshalling. The fix ensures proper assignment of host and port values, preventing potential connection issues between master and slave servers.

Comment thread codis/Makefile Outdated
Comment on lines +35 to +37
generate-version:
$(info generate version)
@./version
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Added new target to generate version information

The new generate-version target executes a script located at ./version to generate version information for the build artifacts.


🏁 Script executed:

#!/bin/bash
# Check if the version script exists and is executable
if [ -f ./version ]; then
  echo "Version script exists"
  if [ -x ./version ]; then
    echo "Version script is executable"
  else
    echo "Version script is not executable"
  fi
else
  echo "Version script does not exist"
fi

Length of output: 91


Action Required: Missing 'version' Script File

The generate-version target in codis/Makefile (lines 35-37) calls ./version to generate version information. However, our verification script confirms that the ./version file does not exist in the repository. Please ensure that the missing script is added or update the Makefile target to reference the correct script.

Comment thread src/storage/src/redis_strings.cc Outdated
Comment on lines 104 to 105
return db_->Put(default_write_options_, key, strings_value.Encode());
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Changed key format used in database Put operation

The database Put operation now uses key directly instead of base_key.Encode(). This changes how the new value is stored in the database. Verify that this change is intentional and that all code paths that read this value are updated accordingly.


🏁 Script executed:

#!/bin/bash
# Look for other occurrences of base_key.Encode() to ensure consistency
rg -A 1 "base_key\.Encode\(\)" --type cpp src/storage

Length of output: 11073


Key format inconsistency in redis_strings Put operation

The recent change in src/storage/src/redis_strings.cc (lines 104-105) now uses key directly in the call to db_->Put instead of the previously used base_key.Encode(). However, our repository still shows many occurrences—both in read and write operations (e.g., in redis_strings.cc and redis_hyperloglog.cc)—that continue to use base_key.Encode(). Please verify that this divergence is intentional. If the new key format is desired, all code paths (including every read that uses the encoded key) should be updated to maintain consistency. Otherwise, consider reverting the changes in this instance.

  • Files to review:
    • src/storage/src/redis_strings.cc — check that read operations and other database interactions match the new key format.
    • src/storage/src/redis_hyperloglog.cc — note the continued usage of base_key.Encode() in write/read operations.

Comment on lines +57 to +58
int32_t cache_value_item_max_size;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Added cache_value_item_max_size but it's not initialized in the constructor

The new field is not initialized in the CacheConfig constructor which could lead to undefined behavior.

Apply this diff to initialize the field in the constructor:

  CacheConfig()
    : maxmemory(CACHE_DEFAULT_MAXMEMORY)
      , maxmemory_policy(CACHE_NO_EVICTION)
      , maxmemory_samples(CACHE_DEFAULT_MAXMEMORY_SAMPLES)
      , lfu_decay_time(CACHE_DEFAULT_LFU_DECAY_TIME)
      , zset_cache_start_direction(CACHE_START_FROM_BEGIN)
-     , zset_cache_field_num_per_key(DEFAULT_CACHE_ITEMS_PER_KEY){}
+     , zset_cache_field_num_per_key(DEFAULT_CACHE_ITEMS_PER_KEY)
+     , cache_value_item_max_size(DEFAULT_CACHE_ITEMS_SIZE){}

Also update the assignment operator to include the new field:

  CacheConfig& operator=(const CacheConfig& obj) {
    maxmemory = obj.maxmemory;
    maxmemory_policy = obj.maxmemory_policy;
    maxmemory_samples = obj.maxmemory_samples;
    lfu_decay_time = obj.lfu_decay_time;
    zset_cache_start_direction = obj.zset_cache_start_direction;
    zset_cache_field_num_per_key = obj.zset_cache_field_num_per_key;
+   cache_value_item_max_size = obj.cache_value_item_max_size;
    return *this;
  }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
int32_t cache_value_item_max_size;
CacheConfig()
: maxmemory(CACHE_DEFAULT_MAXMEMORY)
, maxmemory_policy(CACHE_NO_EVICTION)
, maxmemory_samples(CACHE_DEFAULT_MAXMEMORY_SAMPLES)
, lfu_decay_time(CACHE_DEFAULT_LFU_DECAY_TIME)
, zset_cache_start_direction(CACHE_START_FROM_BEGIN)
, zset_cache_field_num_per_key(DEFAULT_CACHE_ITEMS_PER_KEY)
, cache_value_item_max_size(DEFAULT_CACHE_ITEMS_SIZE)
{}
CacheConfig& operator=(const CacheConfig& obj) {
maxmemory = obj.maxmemory;
maxmemory_policy = obj.maxmemory_policy;
maxmemory_samples = obj.maxmemory_samples;
lfu_decay_time = obj.lfu_decay_time;
zset_cache_start_direction = obj.zset_cache_start_direction;
zset_cache_field_num_per_key = obj.zset_cache_field_num_per_key;
cache_value_item_max_size = obj.cache_value_item_max_size;
return *this;
}

Comment thread src/pika_kv.cc Outdated
Comment on lines +495 to +496
std::string CachePrefixKeyK = PCacheKeyPrefixK + key_;
db_->cache()->Decrxx(CachePrefixKeyK);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Ensure key is found in the cache.
Decrxx implies the key must be present and numerical. Add checks or error handling for missing or non-integer cache entries to avoid silent errors.

Comment thread src/pika_kv.cc Outdated
Comment on lines +574 to +575
std::string CachePrefixKeyK = PCacheKeyPrefixK + key_;
db_->cache()->SetxxWithoutTTL(CachePrefixKeyK, new_value_);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Refine set-after-get pattern.
When using GetSet, storing the new value in cache is correct, but consider checking the old value in the cache to maintain consistency if multi-threaded.

Comment thread src/pika_kv.cc Outdated

void SetexCmd::Do() {
s_ = db_->storage()->Setex(key_, value_, ttl_sec_ * 1000);
s_ = db_->storage()->Setex(key_, value_, static_cast<int32_t>(sec_));
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Check integer cast for large TTL
static_cast<int32_t>(sec_) might overflow if sec_ is extremely large. Consider a bounds check.

Comment thread src/pika_kv.cc Outdated
Comment on lines +1482 to +1491
if (s_.ok()) {
db_->cache()->Expire(key_, ttl_millsec);
std::vector<std::string> v;
v.emplace_back(PCacheKeyPrefixK + key_);
v.emplace_back(PCacheKeyPrefixL + key_);
v.emplace_back(PCacheKeyPrefixZ + key_);
v.emplace_back(PCacheKeyPrefixS + key_);
v.emplace_back(PCacheKeyPrefixH + key_);
for (auto key : v){
db_->cache()->Expire(key, msec_/1000);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Double-check partial expiration.
Expiring a key across multiple data types in the cache is consistent. Consider separate logs or metrics to detect partial stale data.

Comment thread src/pika_kv.cc Outdated
Comment on lines 1588 to 1611
std::map<storage::DataType, int64_t> type_timestamp;
std::map<storage::DataType, rocksdb::Status> type_status;
type_timestamp = db_->storage()->TTL(key_, &type_status);
for (const auto& item : type_timestamp) {
// mean operation exception errors happen in database
if (item.second == -3) {
res_.SetRes(CmdRes::kErrOther, "ttl internal error");
return;
}
}
if (type_timestamp[storage::kStrings] != -2) {
res_.AppendInteger(type_timestamp[storage::kStrings]);
} else if (type_timestamp[storage::kHashes] != -2) {
res_.AppendInteger(type_timestamp[storage::kHashes]);
} else if (type_timestamp[storage::kLists] != -2) {
res_.AppendInteger(type_timestamp[storage::kLists]);
} else if (type_timestamp[storage::kZSets] != -2) {
res_.AppendInteger(type_timestamp[storage::kZSets]);
} else if (type_timestamp[storage::kSets] != -2) {
res_.AppendInteger(type_timestamp[storage::kSets]);
} else {
res_.AppendInteger(ttl_sec_);
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Check negative TTL
This block merges DB TTL results. If type_timestamp[...] == -3, we bail out. Confirm no partial type results are missed.

Comment thread src/pika_kv.cc Outdated
Comment on lines +1811 to +1812
std::vector<std::string> types(1);
rocksdb::Status s = db_->storage()->GetType(key_, true, types);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Check array dimension
Same concern: std::vector<std::string> types(1) might be too small for multi-type retrieval.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (5)
tools/pika_exporter/Makefile (2)

6-7: Unified Version Information: Evaluate BRANCH and GITREV Extraction

The updated hunk now uses a single-line approach to extract the branch name and the full commit hash. For the branch extraction, although the current command

git branch | sed -n 's/* \(.*\)/\1/p'

works, you might consider using

git rev-parse --abbrev-ref HEAD

which is more concise and potentially more robust.
For GITREV, using the full commit hash (git rev-parse HEAD) is a solid improvement—just verify that any downstream tooling correctly handles the longer hash string.


11-13: Enhancement with New Version Variables

Introducing PIKA_EXPORTER_MAJOR, PIKA_EXPORTER_MINOR, and PIKA_EXPORTER_PATCH improves clarity and flexibility in version management. Consider updating the version generation logic (in the GENERATE_VERSION_CODE block) to incorporate these new variables if a more granular version string (e.g., combining major, minor, and patch) is desired.

codis/version (2)

7-7: Consider using consistent command substitution syntax.

The script uses both backticks (`) and $() for command substitution. The latter is more modern and recommended for better nesting capabilities and readability.

-gitsha=`git log --pretty=format:"%H" -1`
+gitsha=$(git log --pretty=format:"%H" -1)

-compile=`date +"%F %T %Z"`
+compile=$(date +"%F %T %Z")

Also applies to: 12-12, 17-17


3-5: Consider adding a comment explaining the version scheme.

Adding a comment about the versioning policy would help other developers understand the significance of these hardcoded values and when/how they should be updated.

+# Version numbers for Codis
+# Update these values according to semantic versioning guidelines
+# when making new releases: https://semver.org/
CODIS_MAJOR=3
CODIS_MINOR=5
CODIS_PATCH=4
src/pika_kv.cc (1)

1344-1344: Potential overflow for very large TTL values.

ttl_sec_ * 1000 can theoretically exceed the range of a 64-bit integer if ttl_sec_ is extremely large. Though unlikely in practice, consider adding a sanity check or capping.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e780a9f and 08f1a85.

📒 Files selected for processing (18)
  • CMakeLists.txt (1 hunks)
  • codis/Makefile (1 hunks)
  • codis/cmd/dashboard/main.go (1 hunks)
  • codis/cmd/fe/main.go (1 hunks)
  • codis/cmd/ha/main.go (1 hunks)
  • codis/cmd/proxy/main.go (1 hunks)
  • codis/version (1 hunks)
  • include/pika_cache.h (4 hunks)
  • src/cache/include/cache.h (5 hunks)
  • src/cache/src/set.cc (1 hunks)
  • src/cache/src/zset.cc (2 hunks)
  • src/pika_cache.cc (15 hunks)
  • src/pika_hash.cc (40 hunks)
  • src/pika_kv.cc (32 hunks)
  • src/pika_list.cc (32 hunks)
  • src/pika_set.cc (31 hunks)
  • src/pika_zset.cc (53 hunks)
  • tools/pika_exporter/Makefile (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
  • codis/Makefile
  • CMakeLists.txt
  • src/pika_set.cc
  • src/pika_hash.cc
🧰 Additional context used
🧬 Code Definitions (3)
src/cache/src/zset.cc (4)
src/pika_cache.cc (4)
  • ZAddIfKeyExist (756-850)
  • ZAddIfKeyExist (756-756)
  • Exists (99-103)
  • Exists (99-99)
include/pika_cache.h (1)
  • score_members (215-215)
src/storage/src/storage.cc (2)
  • Exists (1209-1222)
  • Exists (1209-1209)
src/cache/src/cache.cc (2)
  • Exists (85-93)
  • Exists (85-85)
src/cache/src/set.cc (3)
src/pika_cache.cc (4)
  • SAddIfKeyExist (652-656)
  • SAddIfKeyExist (652-652)
  • Exists (99-103)
  • Exists (99-99)
src/storage/src/storage.cc (2)
  • Exists (1209-1222)
  • Exists (1209-1209)
src/cache/src/cache.cc (6)
  • Exists (85-93)
  • Exists (85-85)
  • FreeObjectList (238-243)
  • FreeObjectList (238-238)
  • DecrObjectsRefCount (225-229)
  • DecrObjectsRefCount (225-225)
src/pika_cache.cc (3)
src/cache/src/string.cc (2)
  • SetRangeIfKeyExist (258-278)
  • SetRangeIfKeyExist (258-258)
src/cache/src/hash.cc (4)
  • HSetIfKeyExist (34-55)
  • HSetIfKeyExist (34-34)
  • HMSetIfKeyExist (96-115)
  • HMSetIfKeyExist (96-96)
src/cache/src/list.cc (4)
  • LPushIfKeyExist (96-113)
  • LPushIfKeyExist (96-96)
  • RPushIfKeyExist (268-284)
  • RPushIfKeyExist (268-268)
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: Analyze (go)
  • GitHub Check: build_on_macos
  • GitHub Check: build_on_ubuntu
  • GitHub Check: build_on_centos
🔇 Additional comments (140)
codis/cmd/dashboard/main.go (1)

51-55: Improved version display formatting and content.

The changes enhance the version output by adding a formatted header and including additional useful information such as Git SHA and Go version. This makes the version information more complete and consistent with other Codis components.

codis/cmd/fe/main.go (1)

75-79: Improved version display formatting and content.

The changes enhance the version output by adding a formatted header and including additional useful information such as Git SHA and Go version. This makes the version information more complete and consistent with other Codis components.

codis/cmd/proxy/main.go (1)

58-62: Improved version display formatting and content.

The changes enhance the version output by adding a formatted header and including additional useful information such as Git SHA and Go version. This makes the version information more complete and consistent with other Codis components.

codis/cmd/ha/main.go (1)

36-40: Improved version display formatting and content.

The changes enhance the version output by adding a formatted header and including additional useful information such as Git SHA and Go version. This makes the version information more complete and consistent with other Codis components.

codis/version (1)

26-30: LGTM! The version constants are properly structured.

The version information is now more structured with separate constants for Version, Gitsha, Compile, and GoVersion, which provides better clarity for users.

src/pika_zset.cc (54)

39-39: Performance monitoring added for storage operations.

The STAGE_TIMER_GUARD macro has been added to measure and record the duration of storage operations in the ZAddCmd::Do method. This allows for tracking performance metrics for database operations.


57-58: Performance monitoring added for cache operations.

The STAGE_TIMER_GUARD macro has been added to measure the duration of cache operations in the ZAddCmd::DoUpdateCache method. This is part of a systematic enhancement to track performance across different command execution stages.


72-73: Performance monitoring added for storage operations in ZCardCmd::Do.

The addition of the STAGE_TIMER_GUARD macro ensures consistent performance measurement for the storage operations in ZCardCmd::Do method, aligning with the pattern applied across other commands.


137-138: Performance monitoring added for storage operations in ZScanCmd::Do.

The STAGE_TIMER_GUARD macro has been added to track execution time of storage operations, providing valuable performance metrics.


176-177: Performance monitoring added for storage operations in ZIncrbyCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration in the ZIncrbyCmd::Do method, consistent with the pattern applied across other commands.


198-199: Performance monitoring added for cache operations in ZIncrbyCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro measures the duration of cache operations, ensuring consistent performance tracking across the command execution lifecycle.


231-232: Performance monitoring added for storage operations in ZRangeCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, providing valuable performance metrics.


261-262: Performance monitoring added for cache operations in ZRangeCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, enhancing performance tracking.


297-299: Performance monitoring with explanatory comment added for cache operations.

The STAGE_TIMER_GUARD macro has been added along with a comment explaining that it records time cost for pushing keys to the asynchronous load queue, improving code clarity and performance measurement.


313-314: Performance monitoring added for storage operations in ZRevrangeCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, consistent with the pattern applied across the codebase.


343-344: Performance monitoring added for cache operations in ZRevrangeCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, aligning with the performance tracking approach used throughout the codebase.


380-382: Performance monitoring with explanatory comment added for cache operations.

The STAGE_TIMER_GUARD macro has been added with a comment explaining its purpose of recording time cost for pushing keys to the queue, enhancing both performance tracking and code maintainability.


474-475: Performance monitoring added for storage operations in ZRangebyscoreCmd::Do.

The STAGE_TIMER_GUARD macro has been added to consistently measure storage operation duration, aligning with the pattern applied throughout the codebase.


515-516: Performance monitoring added for cache operations in ZRangebyscoreCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, providing consistent performance metrics.


551-553: Performance monitoring with explanatory comment added for cache operations.

The STAGE_TIMER_GUARD macro has been added with a comment clarifying that it records time cost for pushing keys to the queue, improving code clarity and performance measurement.


580-581: Performance monitoring added for storage operations in ZRevrangebyscoreCmd::Do.

The STAGE_TIMER_GUARD macro has been added to consistently measure storage operation duration across commands.


619-620: Performance monitoring added for cache operations in ZRevrangebyscoreCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, ensuring consistent performance metrics collection.


655-657: Performance monitoring with explanatory comment added for cache operations.

The STAGE_TIMER_GUARD macro has been added with a comment explaining its purpose of recording time cost for pushing keys to the queue, enhancing both performance tracking and code readability.


683-684: Performance monitoring added for storage operations in ZCountCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, consistent with the pattern applied throughout the codebase.


700-701: Performance monitoring added for cache operations in ZCountCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, providing valuable performance metrics.


718-720: Performance monitoring with explanatory comment added for cache operations.

The STAGE_TIMER_GUARD macro has been added with a comment explaining its purpose of recording time cost for pushing keys to the queue, improving both performance tracking and code maintainability.


735-736: Performance monitoring added for storage operations in ZRemCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, ensuring consistent performance metrics collection across commands.


752-753: Performance monitoring added for cache operations in ZRemCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure the duration of cache update operations, providing valuable performance metrics.


825-826: Performance monitoring added for storage operations in ZUnionstoreCmd::Do.

The STAGE_TIMER_GUARD macro has been added to consistently measure storage operation duration across commands.


845-846: Performance monitoring added for cache operations in ZUnionstoreCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure cache update operations, aligning with the performance tracking approach used throughout the codebase.


908-909: Performance monitoring added for storage operations in ZInterstoreCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, consistent with the pattern applied throughout the file.


927-928: Performance monitoring added for cache operations in ZInterstoreCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure cache update operations, providing consistent performance metrics.


993-994: Performance monitoring added for storage operations in ZRankCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, aligning with the pattern applied across other commands.


1008-1009: Performance monitoring added for cache operations in ZRankCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, enhancing performance tracking.


1026-1028: Performance monitoring with explanatory comment added for cache operations.

The STAGE_TIMER_GUARD macro has been added with a comment explaining that it records time cost for pushing keys to the queue, improving both performance tracking and code clarity.


1042-1043: Performance monitoring added for storage operations in ZRevrankCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, consistent with the approach used throughout the codebase.


1057-1058: Performance monitoring added for cache operations in ZRevrankCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, providing valuable performance metrics.


1075-1077: Performance monitoring with explanatory comment added for cache operations.

The STAGE_TIMER_GUARD macro has been added with a comment explaining its purpose of recording time cost for pushing keys to the queue, enhancing both performance tracking and code maintainability.


1092-1093: Performance monitoring added for storage operations in ZScoreCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, ensuring consistent performance metrics collection.


1110-1112: Performance monitoring added for cache operations in ZScoreCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, aligning with the performance tracking approach used throughout the codebase.


1208-1209: Performance monitoring added for storage operations in ZRangebylexCmd::Do.

The STAGE_TIMER_GUARD macro has been added to consistently measure storage operation duration across commands.


1234-1235: Performance monitoring added for cache operations in ZRangebylexCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, providing consistent performance metrics.


1260-1262: Performance monitoring with explanatory comment added for cache operations.

The STAGE_TIMER_GUARD macro has been added with a comment explaining its purpose of recording time cost for pushing keys to the queue, improving both performance tracking and code readability.


1290-1291: Performance monitoring added for storage operations in ZRevrangebylexCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, consistent with the pattern applied throughout the codebase.


1317-1318: Performance monitoring added for cache operations in ZRevrangebylexCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, enhancing performance tracking.


1339-1341: Performance monitoring with explanatory comment added for cache operations.

The STAGE_TIMER_GUARD macro has been added with a comment explaining that it records time cost for pushing keys to the queue, improving both performance tracking and code clarity.


1366-1367: Performance monitoring added for storage operations in ZLexcountCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, consistent with the approach used throughout the file.


1384-1385: Performance monitoring added for cache operations in ZLexcountCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, providing valuable performance metrics.


1402-1404: Performance monitoring with explanatory comment added for cache operations.

The STAGE_TIMER_GUARD macro has been added with a comment explaining its purpose of recording time cost for pushing keys to the queue, enhancing both performance tracking and code maintainability.


1428-1429: Performance monitoring added for storage operations in ZRemrangebyrankCmd::Do.

The STAGE_TIMER_GUARD macro has been added to consistently measure storage operation duration across commands.


1445-1447: Performance monitoring added for cache operations in ZRemrangebyrankCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure cache update operations, aligning with the performance tracking approach used throughout the codebase.


1470-1471: Performance monitoring added for storage operations in ZRemrangebyscoreCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, consistent with the pattern applied throughout the file.


1488-1489: Performance monitoring added for cache operations in ZRemrangebyscoreCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure cache update operations, providing consistent performance metrics.


1513-1514: Performance monitoring added for storage operations in ZRemrangebylexCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, ensuring consistent performance metrics collection.


1531-1532: Performance monitoring added for cache operations in ZRemrangebylexCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure cache update operations, aligning with the performance tracking approach used throughout the codebase.


1553-1554: Performance monitoring added for storage operations in ZPopmaxCmd::Do.

The STAGE_TIMER_GUARD macro has been added to consistently measure storage operation duration across commands.


1580-1581: Performance monitoring added for cache operations in ZPopmaxCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure cache update operations, providing valuable performance metrics.


1608-1609: Performance monitoring added for cache operations in ZPopminCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure cache update operations, consistent with the pattern applied throughout the codebase.


1614-1615: Performance monitoring added for storage operations in ZPopminCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, aligning with the performance tracking approach used throughout the file.

src/cache/src/zset.cc (2)

11-38: New method added to enforce key existence check for ZAdd operations.

A new ZAddIfKeyExist method has been implemented to check for key existence before performing the ZAdd operation. This enhances the cache integrity by preventing operations on non-existent keys and follows a consistent pattern with similar methods in other data structure handlers.

The implementation correctly:

  1. Verifies memory availability
  2. Checks for key existence
  3. Properly handles Redis object creation and cleanup
  4. Uses DEFER for resource management

105-107: Added key existence check in ZIncrby method.

The method now verifies that the key exists before proceeding with the increment operation. This prevents potential cache inconsistencies by ensuring operations only occur on existing keys.

src/pika_list.cc (33)

33-34: Performance monitoring added for storage operations in LIndexCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, enabling performance tracking.


48-49: Performance monitoring added for cache operations in LIndexCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, providing valuable performance metrics.


66-68: Performance monitoring with explanatory comment added for cache operations.

The STAGE_TIMER_GUARD macro has been added with a comment explaining its purpose of recording time cost for pushing keys to the queue, improving both performance tracking and code clarity.


93-94: Performance monitoring added for storage operations in LInsertCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, aligning with the pattern applied throughout the codebase.


111-112: Performance monitoring added for cache operations in LInsertCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure cache update operations, ensuring consistent performance metrics collection.


126-127: Performance monitoring added for storage operations in LLenCmd::Do.

The STAGE_TIMER_GUARD macro has been added to consistently measure storage operation duration across commands.


139-140: Performance monitoring added for cache operations in LLenCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, providing valuable performance metrics.


157-159: Performance monitoring with explanatory comment added for cache operations.

The STAGE_TIMER_GUARD macro has been added with a comment explaining its purpose of recording time cost for pushing keys to the queue, enhancing both performance tracking and code maintainability.


278-279: Performance monitoring added for storage operations in LPushCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, consistent with the pattern applied throughout the codebase.


302-303: Performance monitoring added and method changed to enforce key existence check.

The STAGE_TIMER_GUARD macro has been added to measure cache operations, and the method call has been changed from LPushx to LPushIfKeyExist to enforce key existence checks before performing operations.


371-372: Performance monitoring added for storage operations in BLPopCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, aligning with the performance tracking approach used throughout the file.


438-439: Performance monitoring added for storage operations in LPopCmd::Do.

The STAGE_TIMER_GUARD macro has been added to consistently measure storage operation duration across commands.


464-465: Performance monitoring added for cache operations in LPopCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure cache update operations, providing valuable performance metrics.


483-484: Performance monitoring added for storage operations in LPushxCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, consistent with the pattern applied throughout the file.


501-502: Performance monitoring added and method changed to enforce key existence check.

The STAGE_TIMER_GUARD macro has been added to measure cache operations, and the method call has been changed from LPushx to LPushIfKeyExist to ensure operations are only performed on existing keys.


525-526: Performance monitoring added for storage operations in LRangeCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, ensuring consistent performance metrics collection across commands.


543-544: Performance monitoring added for cache operations in LRangeCmd::ReadCache.

The STAGE_TIMER_GUARD macro has been added to measure cache read operations, aligning with the performance tracking approach used throughout the codebase.


564-566: Performance monitoring with explanatory comment added for cache operations.

The STAGE_TIMER_GUARD macro has been added with a comment explaining that it records time cost for pushing keys to the queue, improving both performance tracking and code clarity.


586-587: Performance monitoring added for storage operations in LRemCmd::Do.

The STAGE_TIMER_GUARD macro has been added to consistently measure storage operation duration across commands.


603-604: Performance monitoring added for cache operations in LRemCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure cache update operations, providing valuable performance metrics.


623-624: Performance monitoring added for storage operations in LSetCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, consistent with the pattern applied throughout the codebase.


646-647: Performance monitoring added for cache operations in LSetCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure cache update operations, aligning with the performance tracking approach used throughout the file.


669-670: Performance monitoring added for storage operations in LTrimCmd::Do.

The STAGE_TIMER_GUARD macro has been added to consistently measure storage operation duration across commands.


686-687: Performance monitoring added for cache operations in LTrimCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure cache update operations, providing valuable performance metrics.


692-693: Performance monitoring added for storage operations in BRPopCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, ensuring consistent performance metrics collection.


788-789: Performance monitoring added for storage operations in RPopCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, aligning with the performance tracking approach used throughout the codebase.


813-814: Performance monitoring added for cache operations in RPopCmd::DoUpdateCache.

The STAGE_TIMER_GUARD macro has been added to measure cache update operations, providing consistent performance metrics.


832-833: Performance monitoring added for storage operations in RPopLPushCmd::Do.

The STAGE_TIMER_GUARD macro has been added to consistently measure storage operation duration across commands.


883-889: Performance monitoring added and method changed to enforce key existence check.

The STAGE_TIMER_GUARD macro has been added to measure cache operations, and the method call has been changed to use LPushIfKeyExist to ensure operations are only performed on existing keys. This is part of a consistent pattern of key existence enforcement throughout the codebase.


909-910: Performance monitoring added for storage operations in RPushCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, consistent with the pattern applied throughout the file.


933-934: Performance monitoring added and method changed to enforce key existence check.

The STAGE_TIMER_GUARD macro has been added to measure cache operations, and the method call has been changed from RPushx to RPushIfKeyExist to ensure operations are only performed on existing keys.


952-953: Performance monitoring added for storage operations in RPushxCmd::Do.

The STAGE_TIMER_GUARD macro has been added to measure storage operation duration, aligning with the performance tracking approach used throughout the codebase.


970-971: Performance monitoring added and method changed to enforce key existence check.

The STAGE_TIMER_GUARD macro has been added to measure cache operations, and the method call has been changed from RPushx to RPushIfKeyExist to ensure operations are only performed on existing keys, improving cache integrity.

src/cache/src/set.cc (1)

12-36: New method added to enforce key existence check for SAdd operations.

The SAddIfKeyExist method has been implemented to check for key existence before performing set add operations. This follows the same pattern used in other data structures and enhances cache integrity by preventing operations on non-existent keys.

The implementation correctly:

  1. Frees memory if needed
  2. Verifies key existence
  3. Properly handles Redis object creation and cleanup using DEFER
  4. Returns appropriate status codes based on operation outcomes
include/pika_cache.h (6)

94-94: Well-structured addition of conditional key-based operation.

This new method appropriately adds the ability to set a range within a string only if the key already exists, consistent with other conditional operations in the codebase.


116-116: Good addition of hash multi-set conditional operation.

This method complements the existing HSetIfKeyExist method by providing a batch version for setting multiple field-value pairs only when the key exists.


131-131: Clean implementation of right-push conditional operation.

This method provides a way to append values to the end of a list only if the key exists, which is a useful addition to the API.


135-135: Consistent addition of left-push conditional operation.

Good parallel implementation to RPushIfKeyExist for pushing values to the beginning of a list, maintaining API symmetry.


142-142: Improved parameter type for read-only operation.

Changing the key parameter from std::string& to const std::string& is appropriate since the method doesn't modify the key. This improves const correctness.


153-153: Good const correctness improvement for ZCard.

Similar to the SCard change, using const std::string& for the key parameter is the correct approach for this read-only operation.

src/pika_cache.cc (13)

373-377: Clean implementation of SetRangeIfKeyExist method.

The implementation correctly:

  1. Calculates the cache index
  2. Acquires a lock to ensure thread safety
  3. Delegates to the underlying cache implementation

This matches the pattern used throughout the codebase.


382-382: Method simplified by using direct implementation.

The method has been modified to delegate directly to the underlying cache implementation rather than performing an explicit existence check first, which simplifies the code.


403-403: Improved implementation to use conditional key existence check.

This change delegates to the specialized HSetIfKeyExist method, creating more consistent behavior and centralizing the key existence check logic.


409-409: Consistent implementation for HSetIfKeyExist.

This change makes the method delegate to the corresponding specialized method in the underlying cache implementation, maintaining consistency.


415-415: Improved method implementation using specialized cache method.

Changed to use HSetnxIfKeyExist which properly handles both key existence and field non-existence checks in a single operation.


424-428: Well-implemented HMSetIfKeyExist method.

This implementation follows the established pattern for cache operations:

  1. Obtains the proper cache index
  2. Acquires a lock for thread safety
  3. Delegates to the appropriate method in the underlying cache

The implementation is clean and consistent with other similar methods.


456-456: Simplified HMSetxx implementation.

The method now delegates directly to HMSet in the underlying cache, simplifying the code by removing explicit existence checks.


554-558: Clean implementation of LPushIfKeyExist method.

Follows the established pattern for conditional cache operations with proper locking and delegation.


608-612: Well-implemented RPushIfKeyExist method.

The implementation is consistent with its counterpart LPushIfKeyExist and maintains the established pattern for cache operations.


655-655: Improved SAddIfKeyExist implementation.

Now delegates to the specialized method in the underlying cache, centralizing the key existence check logic.


681-681: Improved const correctness for SCard.

This change properly changes the key parameter to const std::string& since the method doesn't modify the key, improving const correctness.


788-788: Consistent use of ZAddIfKeyExist in ZSet operations.

These changes update the code to use the conditional ZAddIfKeyExist method which is more appropriate in these contexts than the unconditional ZAdd.

Also applies to: 806-806, 835-835


1519-1519: Improved SetBitIfKeyExist implementation.

Changed to delegate to the specialized method in the underlying cache, maintaining consistency with other conditional operations.

src/pika_kv.cc (17)

68-68: Add a remark on performance instrumentation usage.

The addition of STAGE_TIMER_GUARD(storage_duration_ms, true); aids in measuring command execution times. Ensure that the overhead from instrumentation is acceptable for high-throughput scenarios and does not introduce unintended contention.


209-211: No functional change detected.

These blank lines do not affect logic or structure. No further action needed.


501-501: Reconfirm performance overhead.

As with the other instrumentation lines, verify that the overhead introduced by STAGE_TIMER_GUARD(storage_duration_ms, true); is manageable under load.


538-538: Same instrumentation pattern.

No issues noted. Continue to monitor for potential latency impacts in production.


654-654: Repeated timer guard insertion.

The addition appears consistent. Ensure consistent usage and review trace logs for potential anomalies.


672-672: Stage timer addition for MGet.

Helpful for measuring DB call overhead. Confirm that extended metrics collection does not degrade performance significantly.


704-704: Cache timing instrumentation.

STAGE_TIMER_GUARD(cache_duration_ms, true); helps measure cache retrieval performance. No immediate concerns.


723-723: Another cache instrumentation line.

No functional concerns; recommended to ensure these metrics are regularly monitored and do not create log pollution.


983-983: Add instrumentation in DelvxCmd::Do.

Consistent usage of STAGE_TIMER_GUARD(storage_duration_ms, true);. No issues found.


1002-1002: MsetCmd instrumentation.

Same pattern. Ensure that any overhead introduced is acceptable in batch operations like MSet.


1213-1213: Append instrumentation to SetrangeCmd.

No direct problem here. Checking overhead under heavy concurrency is advisable.


1231-1233: Use of SetRangeIfKeyExist.

This change updates the cache operation to only set the range if the key already exists, combined with a timing guard. Confirm that this behavior is desired if some callers rely on creating a missing cache key.

Do you expect newly introduced keys to be cached, or should the operation silently skip if the key doesn't exist?


1247-1247: Single-line instrumentation.

Maintains consistency with other commands.


1399-1399: Blank line addition.

No effect on logic.


1455-1455: Changed multiplier from 1000 to 100.

Check if this shift in granularity (seconds*100) aligns with your intended Expireat semantics, which typically use milliseconds in other code paths.


1554-1555: Revised PTTL logic for non-existent keys.

Now always returns -2 if ttl_millsec != -3. Verify this is correct for keys that might have a TTL of -1. This could change the returned TTL for certain scenarios.


1605-1605: Inline enum initialization.

Initializing type to kNones looks fine. No issues detected.

src/cache/include/cache.h (9)

73-73: New SetRangeIfKeyExist method.

This aligns with the approach of only modifying existing cache entries. Verify that the calling sites handle the case where the key is absent.


79-79: Introduce HSetIfKeyExist.

Ensures hash fields are set only if the key already exists. This can prevent unintended key creation in the cache.


80-80: New HSetnxIfKeyExist.

Similar pattern. Ensure all usage contexts expect the key to exist beforehand.


82-82: New HMSetIfKeyExist.

Extends the conditional approach to multi-field sets. Check concurrency scenarios if partial writes are not expected.


102-102: Add LPushIfKeyExist.

Push to a list only if it exists. This can reduce accidental creation of lists.


111-111: Add RPushIfKeyExist.

Same logic as LPushIfKeyExist, but for the tail. No further issues.


116-116: Add SAddIfKeyExist for sets.

Prevents set creation if missing. Confirm expected behavior in your data model.


125-125: Add ZAddIfKeyExist for sorted sets.

Keeps the interface consistent. No immediate concerns.


161-161: New SetBitIfKeyExist.

Conditionally set bits in an existing key. This extends the "only if exists" principle to bit commands.

Comment thread codis/version
gitsha=`git log --pretty=format:"%H" -1`
if [ $? -ne 0 ]; then
version="unknown version"
gitsha ="unknown version gitsha"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix syntax error in error handling.

There's a syntax error in the fallback assignment for gitsha - there should not be a space between the variable name and the equals sign in bash.

-    gitsha ="unknown version gitsha"
+    gitsha="unknown version gitsha"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
gitsha ="unknown version gitsha"
gitsha="unknown version gitsha"

Comment thread codis/version
Comment on lines +17 to 20
goversion=$(go version | sed 's/go version //')
if [ $? -ne 0 ]; then
compile="unknown go version"
fi
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Error handling sets the wrong variable.

When the go version command fails, the error handler incorrectly sets compile instead of goversion.

goversion=$(go version | sed 's/go version //')
if [ $? -ne 0 ]; then
-    compile="unknown go version"
+    goversion="unknown go version"
fi
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
goversion=$(go version | sed 's/go version //')
if [ $? -ne 0 ]; then
compile="unknown go version"
fi
goversion=$(go version | sed 's/go version //')
if [ $? -ne 0 ]; then
goversion="unknown go version"
fi

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
src/pika_kv.cc (2)

1597-1598: Consider adding performance monitoring to TypeCmd::Do method

Unlike other command methods, the TypeCmd::Do method doesn't have a timer guard added. For consistency, consider adding a storage duration timer to this method as well.

void TypeCmd::Do() { 
+  STAGE_TIMER_GUARD(storage_duration_ms, true);
  enum storage::DataType type = storage::DataType::kNones;
  std::string key_type;
  rocksdb::Status s = db_->storage()->GetType(key_, type);

68-1964: Comprehensive performance monitoring is a good improvement

The systematic addition of timer guards across all command methods provides valuable performance metrics that can help identify bottlenecks and optimize the system. The use of both storage_duration_ms and cache_duration_ms will help distinguish between different types of operations.

A few suggestions for further improvements:

  1. Consider adding documentation that explains how these performance metrics are collected and accessed
  2. Ensure there's a way to toggle this instrumentation in production for cases where the overhead might be a concern

The changes to use methods that check for key existence (like SetRangeIfKeyExist) also address previously identified issues about ensuring keys exist before modification.

🧰 Tools
🪛 Cppcheck (2.10-2)

[performance] 214-214: Prefer prefix ++/-- operators for non-primitive types.

(postfixOperator)


[performance] 1013-1013: Prefer prefix ++/-- operators for non-primitive types.

(postfixOperator)


[performance] 1100-1100: Prefer prefix ++/-- operators for non-primitive types.

(postfixOperator)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 08f1a85 and 5c5d89d.

📒 Files selected for processing (6)
  • src/pika_client_conn.cc (4 hunks)
  • src/pika_kv.cc (25 hunks)
  • src/pika_list.cc (32 hunks)
  • src/pika_set.cc (31 hunks)
  • src/pika_zset.cc (53 hunks)
  • tools/pika_exporter/Makefile (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (5)
  • src/pika_list.cc
  • src/pika_client_conn.cc
  • tools/pika_exporter/Makefile
  • src/pika_set.cc
  • src/pika_zset.cc
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: Analyze (go)
  • GitHub Check: build_on_centos
  • GitHub Check: build_on_macos
  • GitHub Check: build_on_ubuntu
🔇 Additional comments (24)
src/pika_kv.cc (24)

68-68: Performance instrumentation added

A timer guard has been added to monitor storage duration for the SetCmd::Do() method, which is part of a larger effort to add performance tracking across various commands in the codebase.


457-458: Performance monitoring added to the Decr command

Timer guard implementation added to track storage duration, providing valuable performance metrics for the DecrCmd::Do() method.


495-496: Performance monitoring added to the Decrby command

Similar to other commands, storage duration timing has been added to track performance metrics for the DecrbyCmd::Do() method.


532-533: Performance monitoring added to GetSet command

Timer instrumentation added to the GetsetCmd::Do() method for measuring storage operation duration.


648-649: Performance monitoring added to Mget command

Storage duration timer added to the MgetCmd::Do() method to track database interaction performance.


665-666: Timer guard added to MgetCmd::Split

Monitoring storage duration for the Split operation ensures comprehensive performance tracking across all database access paths.


698-699: Cache performance monitoring added

Timer guard now tracks cache read operations, which complements the storage duration tracking for a complete performance picture.


717-718: Cache update performance tracking

Timer guard added to monitor the duration of cache update operations in MgetCmd::DoUpdateCache(), providing valuable metrics for cache write performance.


790-791: Performance monitoring for Keys command

Added timer guard to track storage operation duration for the KeysCmd::Do() method, which can be intensive for large keyspaces.


820-821: Performance monitoring for Setnx command

Timer guard added to track storage duration for the SetnxCmd::Do() method.


980-981: Performance monitoring for Delvx command

Timer instrumentation added to track storage duration for the DelvxCmd::Do() method.


1008-1009: Performance monitoring for Mset command

Timer guard added to track storage duration for the MsetCmd::Do() method, which handles multiple key-value pairs.


1050-1051: Performance tracking for Mset split operations

Timer guard added to monitor storage duration for the MsetCmd::Split() method, ensuring all database interaction paths are instrumented.


1095-1096: Performance monitoring for Msetnx command

Timer guard added to track storage duration for the MsetnxCmd::Do() method, providing consistency with other command instrumentation.


1147-1148: Performance monitoring for Getrange command

Timer guard added to track storage duration for the GetrangeCmd::Do() method.


1173-1174: Additional performance monitoring for Getrange

Timer guard added to the DoThroughDB method, ensuring all database access paths have performance metrics.


1207-1208: Performance monitoring for Setrange command

Timer guard added to track storage duration for the SetrangeCmd::Do() method.


1225-1226: Improved cache update with existence check

Two important changes:

  1. Added timer guard to track cache operation duration
  2. Changed the update method to SetRangeIfKeyExist, which ensures the key exists before modification

This change addresses a previous concern about ensuring key existence before cache operations.


941-941: Changed cache update method for Psetex command

The cache update method has been changed to Setxx with TTL conversion from milliseconds to seconds, which is consistent with other TTL handling in the codebase.


1240-1241: Performance monitoring for Strlen command

Timer guard added to track storage duration for the StrlenCmd::Do() method.


1685-1686: Performance monitoring for Scan command

Timer guard added to track storage duration for the ScanCmd::Do() method, which can be resource-intensive for large datasets.


1762-1763: Performance monitoring for Scanx command

Timer guard added to track storage duration for the ScanxCmd::Do() method.


1877-1878: Performance monitoring for PKScanRange command

Timer guard added to track storage duration for the PKScanRangeCmd::Do() method.


1963-1964: Performance monitoring for PKRScanRange command

Timer guard added to track storage duration for the PKRScanRangeCmd::Do() method, completing the instrumentation of scan-related commands.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5c5d89d and 057720a.

📒 Files selected for processing (3)
  • codis/pkg/utils/version.go (1 hunks)
  • tools/pika_exporter/Makefile (1 hunks)
  • tools/pika_exporter/main.go (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • tools/pika_exporter/main.go
  • tools/pika_exporter/Makefile
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: build_on_centos
  • GitHub Check: build_on_macos
  • GitHub Check: build_on_ubuntu
  • GitHub Check: Analyze (go)
🔇 Additional comments (2)
codis/pkg/utils/version.go (2)

4-4: Good standardization to semantic versioning

The change to a semantic versioning format (MAJOR.MINOR.PATCH) follows industry best practices and improves readability compared to the previous format mentioned in the summary.


5-5: Good addition of separate Git SHA constant

Separating the Git commit hash from the version string is a good practice for traceability while maintaining clean semantic versioning.

Version = "3.5.4"
Gitsha = "5c5d89d5478138d64bd071840beab30a64105075"
Compile = "2025-03-26 11:30:14 CST"
GoVersion = "go1.23.4 darwin/amd64"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Invalid Go version detected

The Go version "go1.23.4" does not exist as of April 2024 (latest stable would be around 1.22.x). Additionally, "darwin/amd64" indicates macOS-specific build information. These values should be dynamically generated at build time.


🏁 Script executed:

#!/bin/bash
# Check how the Go version is determined in the build system
grep -r "GoVersion" --include="*.go" --include="Makefile" .

Length of output: 740


Action Required: Update Hardcoded Go Version in codis/pkg/utils/version.go

  • The hardcoded value "go1.23.4 darwin/amd64" is problematic because:
    • The Go version "go1.23.4" does not correspond to any known stable release as of April 2024 (the latest stable releases are around "go1.22.x").
    • The inclusion of "darwin/amd64" ties this value to a specific platform instead of reflecting a dynamic, build-time determination.
  • Other parts of the codebase (e.g., in tools/pika_exporter/version.go and its Makefile) use a dynamic approach (e.g., "Filled in by build" or passing $(COMPILERVERSION)), indicating that the Go version string should be injected during the build process.
  • Recommendation: Update codis/pkg/utils/version.go to generate the Go version string dynamically at build time—ensuring consistency with the rest of the project and avoiding the use of an invalid static version.

Compile = "2023-02-23 11:25:09 +0800 by go version go1.19.6 linux/amd64"
Version = "3.5.4"
Gitsha = "5c5d89d5478138d64bd071840beab30a64105075"
Compile = "2025-03-26 11:30:14 CST"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Future compilation date detected

The compile timestamp is set to a future date (2025-03-26), which could cause confusion. This value should be dynamically generated during the build process rather than hardcoded.


🏁 Script executed:

#!/bin/bash
# Check how the compilation timestamp is generated in the build system
grep -r "Compile" --include="*.go" --include="Makefile" .

Length of output: 12916


Future Compilation Timestamp Issue – Fix Required

The constant timestamp in codis/pkg/utils/version.go (line 6) is hardcoded as "2025-03-26 11:30:14 CST", which is set to a future date. Our grep search confirms that this value is used directly (e.g., printed by several main packages) without any dynamic injection from the build process. This static assignment could lead to confusion or misinterpretation of build information.

Recommendations:

  • Replace the hardcoded value with a dynamically generated timestamp during the build.
  • Consider using Go’s ldflags (or a similar mechanism in your Makefile) to inject the current build timestamp.
  • Verify that all references to utils.Compile reflect the build-time value rather than a preset constant.

@Mixficsol Mixficsol closed this Mar 26, 2025
@Mixficsol Mixficsol deleted the 355_to_40 branch March 27, 2025 02:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

☢️ Bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants