This is an automated email from the ASF dual-hosted git repository.

twice pushed a commit to branch unstable
in repository https://gitbox.apache.org/repos/asf/kvrocks.git


The following commit(s) were added to refs/heads/unstable by this push:
     new a64cabf4 Add support for LASTSAVE command (#1702)
a64cabf4 is described below

commit a64cabf4b091fe48b85fa7bdc74d74cf775f6011
Author: xq2010 <[email protected]>
AuthorDate: Mon Aug 28 21:06:02 2023 +0800

    Add support for LASTSAVE command (#1702)
    
    Co-authored-by: xuqing <[email protected]>
    Co-authored-by: Twice <[email protected]>
    Co-authored-by: Binbin <[email protected]>
---
 src/commands/cmd_server.cc          | 14 ++++++++++++++
 src/server/server.cc                |  7 ++++++-
 src/server/server.h                 |  1 +
 tests/gocase/unit/info/info_test.go |  1 -
 4 files changed, 21 insertions(+), 2 deletions(-)

diff --git a/src/commands/cmd_server.cc b/src/commands/cmd_server.cc
index 760adaed..d9b972de 100644
--- a/src/commands/cmd_server.cc
+++ b/src/commands/cmd_server.cc
@@ -980,6 +980,19 @@ static uint64_t GenerateConfigFlag(const 
std::vector<std::string> &args) {
   return 0;
 }
 
+class CommandLastSave : public Commander {
+ public:
+  Status Execute(Server *svr, Connection *conn, std::string *output) override {
+    if (!conn->IsAdmin()) {
+      return {Status::RedisExecErr, errAdminPermissionRequired};
+    }
+
+    int64_t unix_sec = svr->GetLastBgsaveTime();
+    *output = redis::Integer(unix_sec);
+    return Status::OK();
+  }
+};
+
 class CommandRestore : public Commander {
  public:
   Status Parse(const std::vector<std::string> &args) override {
@@ -1080,6 +1093,7 @@ REDIS_REGISTER_COMMANDS(MakeCmdAttr<CommandAuth>("auth", 
2, "read-only ok-loadin
 
                         MakeCmdAttr<CommandCompact>("compact", 1, "read-only 
no-script", 0, 0, 0),
                         MakeCmdAttr<CommandBGSave>("bgsave", 1, "read-only 
no-script", 0, 0, 0),
+                        MakeCmdAttr<CommandLastSave>("lastsave", 1, "read-only 
no-script", 0, 0, 0),
                         MakeCmdAttr<CommandFlushBackup>("flushbackup", 1, 
"read-only no-script", 0, 0, 0),
                         MakeCmdAttr<CommandSlaveOf>("slaveof", 3, "read-only 
exclusive no-script", 0, 0, 0),
                         MakeCmdAttr<CommandStats>("stats", 1, "read-only", 0, 
0, 0), )
diff --git a/src/server/server.cc b/src/server/server.cc
index b00decf6..3b583cbe 100644
--- a/src/server/server.cc
+++ b/src/server/server.cc
@@ -986,6 +986,11 @@ int64_t Server::GetCachedUnixTime() {
   return unix_time.load();
 }
 
+int64_t Server::GetLastBgsaveTime() {
+  std::lock_guard<std::mutex> lg(db_job_mu_);
+  return last_bgsave_time_ == -1 ? start_time_ : last_bgsave_time_;
+}
+
 void Server::GetStatsInfo(std::string *info) {
   std::ostringstream string_stream;
   string_stream << "# Stats\r\n";
@@ -1074,7 +1079,7 @@ void Server::GetInfo(const std::string &ns, const 
std::string &section, std::str
 
     std::lock_guard<std::mutex> lg(db_job_mu_);
     string_stream << "bgsave_in_progress:" << (is_bgsave_in_progress_ ? 1 : 0) 
<< "\r\n";
-    string_stream << "last_bgsave_time:" << last_bgsave_time_ << "\r\n";
+    string_stream << "last_bgsave_time:" << (last_bgsave_time_ == -1 ? 
start_time_ : last_bgsave_time_) << "\r\n";
     string_stream << "last_bgsave_status:" << last_bgsave_status_ << "\r\n";
     string_stream << "last_bgsave_time_sec:" << last_bgsave_time_sec_ << 
"\r\n";
   }
diff --git a/src/server/server.h b/src/server/server.h
index b598e520..953cbbbc 100644
--- a/src/server/server.h
+++ b/src/server/server.h
@@ -211,6 +211,7 @@ class Server {
   void SetLastRandomKeyCursor(const std::string &cursor);
 
   static int64_t GetCachedUnixTime();
+  int64_t GetLastBgsaveTime();
   void GetStatsInfo(std::string *info);
   void GetServerInfo(std::string *info);
   void GetMemoryInfo(std::string *info);
diff --git a/tests/gocase/unit/info/info_test.go 
b/tests/gocase/unit/info/info_test.go
index b0078a59..136be197 100644
--- a/tests/gocase/unit/info/info_test.go
+++ b/tests/gocase/unit/info/info_test.go
@@ -72,7 +72,6 @@ func TestInfo(t *testing.T) {
 
        t.Run("get bgsave information by INFO", func(t *testing.T) {
                require.Equal(t, "0", util.FindInfoEntry(rdb, 
"bgsave_in_progress", "persistence"))
-               require.Equal(t, "-1", util.FindInfoEntry(rdb, 
"last_bgsave_time", "persistence"))
                require.Equal(t, "ok", util.FindInfoEntry(rdb, 
"last_bgsave_status", "persistence"))
                require.Equal(t, "-1", util.FindInfoEntry(rdb, 
"last_bgsave_time_sec", "persistence"))
 

Reply via email to