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

houston pushed a commit to branch branch_9_0
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/branch_9_0 by this push:
     new 7e132e7  SOLR-15982: Add end time value to backup response (#595)
7e132e7 is described below

commit 7e132e7596cf95bd466bad8a06a9d3b9533b3704
Author: ijioio <[email protected]>
AuthorDate: Thu Feb 17 23:41:03 2022 +0300

    SOLR-15982: Add end time value to backup response (#595)
    
    * Standardize backup response keys
    
    Co-authored-by: Houston Putman <[email protected]>
    (cherry picked from commit 958a070c9280505717264fa6af65d2204accec44)
---
 solr/CHANGES.txt                                   |  2 ++
 .../solr/cloud/api/collections/BackupCmd.java      | 35 ++++++++++++++--------
 .../java/org/apache/solr/handler/SnapShooter.java  | 17 ++++++++---
 .../deployment-guide/pages/backup-restore.adoc     |  6 ++--
 .../pages/collection-management.adoc               | 28 +++++++++++++++++
 .../pages/major-changes-in-solr-9.adoc             |  6 ++++
 6 files changed, 76 insertions(+), 18 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index eab0318..d0bac8b 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -242,6 +242,8 @@ when told to. The admin UI now tells it to. (Nazerke 
Seidan, David Smiley)
 
 * SOLR-15965: Use better signatures for the PKI Authentication plugin. (Mike 
Drob)
 
+* SOLR-15982: Add end time value to backup response, standardize backup 
response key names and date formats (Artem Abeleshev, Christine Poerschke, 
Houston Putman)
+
 Build
 ---------------------
 * LUCENE-9077 LUCENE-9433: Support Gradle build, remove Ant support from trunk 
(Dawid Weiss, Erick Erickson, Uwe Schindler et.al.)
diff --git 
a/solr/core/src/java/org/apache/solr/cloud/api/collections/BackupCmd.java 
b/solr/core/src/java/org/apache/solr/cloud/api/collections/BackupCmd.java
index 7c92e54..7aab964 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/BackupCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/BackupCmd.java
@@ -111,11 +111,15 @@ public class BackupCmd implements 
CollApiCmds.CollectionApiCommand {
               throw e;
             }
           } else {
-            copyIndexFiles(backupUri, collectionName, message, results);
+            copyIndexFiles(backupUri, collectionName, message, results, 
backupProperties, backupMgr);
           }
           break;
         }
         case CollectionAdminParams.NO_INDEX_BACKUP_STRATEGY: {
+          NamedList<Object> response = new SimpleOrderedMap<>();
+          response.add("collection", collectionName);
+          response.add("startTime", backupProperties.getStartTime());
+          results.add("response", response);
           break;
         }
       }
@@ -137,6 +141,13 @@ public class BackupCmd implements 
CollApiCmds.CollectionApiCommand {
 
       backupMgr.writeBackupProperties(backupProperties);
 
+      // It is safe to extract results here
+      @SuppressWarnings("unchecked")
+      NamedList<Object> response = (NamedList<Object>) results.get("response");
+      // Note that endTime can't be handled within aggregateResults call
+      // since it is defined later
+      response.add("endTime", backupProperties.getEndTime());
+      
       log.info("Completed backing up ZK data for backupName={}", backupName);
 
       int maxNumBackup = message.getInt(CoreAdminParams.MAX_NUM_BACKUP_POINTS, 
-1);
@@ -257,7 +268,7 @@ public class BackupCmd implements 
CollApiCmds.CollectionApiCommand {
     }
 
     //Aggregating result from different shards
-    NamedList<Object> aggRsp = aggregateResults(results, collectionName, 
slices, backupManager, backupProperties);
+    NamedList<Object> aggRsp = aggregateResults(results, collectionName, 
slices, backupManager, backupProperties, true);
     results.add("response", aggRsp);
   }
 
@@ -265,19 +276,18 @@ public class BackupCmd implements 
CollApiCmds.CollectionApiCommand {
                                              String collectionName,
                                              Collection<Slice> slices,
                                              BackupManager backupManager,
-                                             BackupProperties backupProps) {
+                                             BackupProperties backupProps,
+                                             boolean incremental) {
     NamedList<Object> aggRsp = new SimpleOrderedMap<>();
     aggRsp.add("collection", collectionName);
     aggRsp.add("numShards", slices.size());
-    if (backupManager != null) {
+    if(incremental) {
       aggRsp.add("backupId", backupManager.getBackupId().id);
     }
-    if (backupProps != null) {
-      aggRsp.add("indexVersion", backupProps.getIndexVersion());
-      aggRsp.add("startTime", backupProps.getStartTime());
-    }
+    aggRsp.add("indexVersion", backupProps.getIndexVersion());
+    aggRsp.add("startTime", backupProps.getStartTime());
 
-    // Optional options for incremental backups
+    // Optional options for backups
     Optional<Integer> indexFileCount = Optional.empty();
     Optional<Integer> uploadedIndexFileCount = Optional.empty();
     Optional<Double> indexSizeMB = Optional.empty();
@@ -297,7 +307,7 @@ public class BackupCmd implements 
CollApiCmds.CollectionApiCommand {
         uploadedIndexFileCount = Optional.of(uploadedIndexFileCount.orElse(0) 
+ shardUploadedIndexFileCount);
       }
       Double shardIndexSizeMB = (Double) shardResp.get("indexSizeMB");
-      if (shardUploadedIndexFileCount != null) {
+      if (shardIndexSizeMB != null) {
         indexSizeMB = Optional.of(indexSizeMB.orElse(0.0) + shardIndexSizeMB);
       }
       Double shardUploadedIndexFileMB = (Double) 
shardResp.get("uploadedIndexFileMB");
@@ -331,7 +341,8 @@ public class BackupCmd implements 
CollApiCmds.CollectionApiCommand {
     return params;
   }
 
-  private void copyIndexFiles(URI backupPath, String collectionName, 
ZkNodeProps request, NamedList<Object> results) throws Exception {
+  private void copyIndexFiles(URI backupPath, String collectionName, 
ZkNodeProps request, NamedList<Object> results, BackupProperties 
backupProperties,
+      BackupManager backupManager) throws Exception {
     String backupName = request.getStr(NAME);
     String asyncId = request.getStr(ASYNC);
     String repoName = request.getStr(CoreAdminParams.BACKUP_REPOSITORY);
@@ -395,7 +406,7 @@ public class BackupCmd implements 
CollApiCmds.CollectionApiCommand {
     shardRequestTracker.processResponses(results, shardHandler, true, "Could 
not backup all shards");
 
     //Aggregating result from different shards
-    NamedList<Object> aggRsp = aggregateResults(results, collectionName, 
slices, null, null);
+    NamedList<Object> aggRsp = aggregateResults(results, collectionName, 
slices, backupManager, backupProperties, false);
     results.add("response", aggRsp);
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/handler/SnapShooter.java 
b/solr/core/src/java/org/apache/solr/handler/SnapShooter.java
index 443613f..b885091 100644
--- a/solr/core/src/java/org/apache/solr/handler/SnapShooter.java
+++ b/solr/core/src/java/org/apache/solr/handler/SnapShooter.java
@@ -21,6 +21,7 @@ import java.lang.invoke.MethodHandles;
 import java.net.URI;
 import java.nio.file.Paths;
 import java.text.SimpleDateFormat;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -259,7 +260,7 @@ public class SnapShooter {
     boolean success = false;
     try {
       NamedList<Object> details = new SimpleOrderedMap<>();
-      details.add("startTime", new Date().toString());//bad; should be 
Instant.now().toString()
+      details.add("startTime", Instant.now().toString());
 
       Collection<String> files = indexCommit.getFileNames();
       Directory dir = 
solrCore.getDirectoryFactory().get(solrCore.getIndexDir(), DirContext.DEFAULT, 
solrCore.getSolrConfig().indexConfig.lockType);
@@ -272,9 +273,13 @@ public class SnapShooter {
         solrCore.getDirectoryFactory().release(dir);
       }
 
-      details.add("fileCount", files.size());
+      String endTime = Instant.now().toString();
+      
+      details.add("fileCount", files.size()); // DEPRECATED: for removal, 
replaced with indexFileCount
+      details.add("indexFileCount", files.size());
       details.add("status", "success");
-      details.add("snapshotCompletedAt", new Date().toString());//bad; should 
be Instant.now().toString()
+      details.add("snapshotCompletedAt", endTime); // DEPRECATED: for removal, 
replaced with endTime
+      details.add("endTime", endTime);
       details.add("snapshotName", snapshotName);
       details.add("directoryName", directoryName);
       if (log.isInfoEnabled()) {
@@ -320,14 +325,18 @@ public class SnapShooter {
     log.info("Deleting snapshot: {}", snapshotName);
 
     NamedList<Object> details = new NamedList<>();
+    details.add("startTime", Instant.now().toString());
     details.add("snapshotName", snapshotName);
       
     try {
       URI path = baseSnapDirPath.resolve("snapshot." + snapshotName);
       backupRepo.deleteDirectory(path);
 
+      String endTime = Instant.now().toString();
+      
       details.add("status", "success");
-      details.add("snapshotDeletedAt", new Date().toString());
+      details.add("snapshotDeletedAt", endTime); // DEPRECATED: for removal, 
replaced with endTime
+      details.add("endTime", endTime);
 
     } catch (IOException e) {
       details.add("status", "Unable to delete snapshot: " + snapshotName);
diff --git 
a/solr/solr-ref-guide/modules/deployment-guide/pages/backup-restore.adoc 
b/solr/solr-ref-guide/modules/deployment-guide/pages/backup-restore.adoc
index c6eef7a..70c6267 100644
--- a/solr/solr-ref-guide/modules/deployment-guide/pages/backup-restore.adoc
+++ b/solr/solr-ref-guide/modules/deployment-guide/pages/backup-restore.adoc
@@ -140,10 +140,12 @@ 
http://localhost:8983/solr/gettingstarted/replication?command=details&wt=xml
 [source,xml]
 ----
 <lst name="backup">
-  <str name="startTime">Sun Apr 12 16:22:50 DAVT 2015</str>
+  <str name="startTime">2022-02-11T17:19:33.271461700Z</str>
   <int name="fileCount">10</int>
+  <int name="indexFileCount">10</int>
   <str name="status">success</str>
-  <str name="snapshotCompletedAt">Sun Apr 12 16:22:50 DAVT 2015</str>
+  <str name="snapshotCompletedAt">2022-02-11T17:19:34.363859100Z</str>
+  <str name="endTime">2022-02-11T17:19:34.363859100Z</str>
   <str name="snapshotName">my_backup</str>
 </lst>
 ----
diff --git 
a/solr/solr-ref-guide/modules/deployment-guide/pages/collection-management.adoc 
b/solr/solr-ref-guide/modules/deployment-guide/pages/collection-management.adoc
index 8376982..95e0a9b 100644
--- 
a/solr/solr-ref-guide/modules/deployment-guide/pages/collection-management.adoc
+++ 
b/solr/solr-ref-guide/modules/deployment-guide/pages/collection-management.adoc
@@ -1658,6 +1658,34 @@ A boolean parameter allowing users to choose whether to 
create an incremental (`
 If unspecified, backups are done incrementally by default.
 Incremental backups are preferred in all known circumstances and snapshot 
backups are deprecated, so this parameter should only be used after much 
consideration.
 
+
+[example.tab-pane#backup-response-incremental]
+====
+[.tab-label]*Incremental Backup Response*
+
+[source,json]
+----
+{
+    "response": {
+        "collection": "techproducts",
+        "numShards": 2,
+        "backupId": 0,
+        "indexVersion": "9.0.0",
+        "startTime": "2022-02-11T17:20:44.157305500Z",
+        "indexFileCount": 22,
+        "uploadedIndexFileCount": 22,
+        "indexSizeMB": 0.007,
+        "uploadedIndexFileMB": 0.007,
+        "shardBackupIds": [
+            "md_shard2_0",
+            "md_shard1_0"
+        ],
+        "endTime": "2022-02-11T17:20:45.245534400Z"
+    }
+}
+----
+====
+
 [[listbackup]]
 == LISTBACKUP: List Backups
 
diff --git 
a/solr/solr-ref-guide/modules/upgrade-notes/pages/major-changes-in-solr-9.adoc 
b/solr/solr-ref-guide/modules/upgrade-notes/pages/major-changes-in-solr-9.adoc
index 7b41a5c..a77eb09 100644
--- 
a/solr/solr-ref-guide/modules/upgrade-notes/pages/major-changes-in-solr-9.adoc
+++ 
b/solr/solr-ref-guide/modules/upgrade-notes/pages/major-changes-in-solr-9.adoc
@@ -111,6 +111,12 @@ All the usages are replaced by 
BaseHttpSolrClient.RemoteSolrException and BaseHt
 In previous versions there was a field returned in async backup status 
responses, `Response`. This has now been renamed to `msg`, to better fit other 
collections API responses.
 The `response` field is now a map, containing information about the backup 
(`startTime`, `indexSizeMB`, `indexFileCount`, etc.).
 
+* SOLR-15982: For collection's snapshot backup request responses additional 
fields `indexVersion`, `indexFileCount`, etc. were added similar to incremental 
backup request responses.
+Also, both snapshot and incremental backup request responses will now contain 
`starTime` and `endTime`.
+Snapshot backup shard's response were updated to add fields `indexFileCount` 
and `endTime`, snapshot delete shard's response were updated to add fields 
`startTime` and `endTime`.
+Previous fields `fileCount`, `snapshotCompletedAt` and `snapshotDeletedAt` of 
backup and delete shard's responses are now deprecated and will be removed in 
future releases.
+All date/time fields of backup and delete related shard's responses have been 
updated to use `Instance` instead of `Date`, meaning the output will be in the 
standard ISO 8601 Format.
+
 * SOLR-15884: In Backup request responses, the `response` key now uses a map 
to return information instead of a list.
 This is only applicable for users returning information in JSON format, which 
is the default behavior.
 

Reply via email to