You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ge...@apache.org on 2021/10/22 14:06:42 UTC

[lucene-solr] branch branch_8_10 updated: SOLR-15696: Fix ShardBackupId parsing for backups

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

gerlowskija pushed a commit to branch branch_8_10
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git


The following commit(s) were added to refs/heads/branch_8_10 by this push:
     new 6a6484b  SOLR-15696: Fix ShardBackupId parsing for backups
6a6484b is described below

commit 6a6484ba396927727b16e5061384d3cd80d616b2
Author: Jason Gerlowski <ge...@apache.org>
AuthorDate: Tue Oct 19 08:07:05 2021 -0400

    SOLR-15696: Fix ShardBackupId parsing for backups
    
    Incremental backups store metadata files whose names are constructed in
    part on the name of individual shards. These filenames are then parsed
    later on to extract the shard name and "backup ID".
    
    The parsing in question was overly-brittle though, not accounting for
    the variations that shard-splitting etc. produce in shard names. This
    caused incremental backups to fail for any collection that had
    previously performed a shard-split.
    
    This commit updates the parsing logic to handle these cases more
    flexibly, allowing post-shardsplit backups to now succeed.
---
 solr/CHANGES.txt                                   |  2 +-
 .../org/apache/solr/core/backup/ShardBackupId.java | 10 +++--
 .../apache/solr/core/backup/ShardBackupIdTest.java | 52 ++++++++++++++++++++++
 3 files changed, 60 insertions(+), 4 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index 95af73c..4cfbebb 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -10,7 +10,7 @@ Consult the LUCENE_CHANGES.txt file for additional, low level, changes in this r
 
 Bug Fixes
 ---------------------
-(No changes)
+* SOLR-15696: Incremental backups no longer fail on collections where a 'SPLITSHARD' operation previously occurred. (Jason Gerlowski)
 
 ==================  8.10.1 ==================
 
diff --git a/solr/core/src/java/org/apache/solr/core/backup/ShardBackupId.java b/solr/core/src/java/org/apache/solr/core/backup/ShardBackupId.java
index 78de78d..3fd4f63 100644
--- a/solr/core/src/java/org/apache/solr/core/backup/ShardBackupId.java
+++ b/solr/core/src/java/org/apache/solr/core/backup/ShardBackupId.java
@@ -16,6 +16,8 @@
  */
 package org.apache.solr.core.backup;
 
+import java.util.Arrays;
+
 /**
  * Represents the ID of a particular backup point for a particular shard.
  *
@@ -55,12 +57,14 @@ public class ShardBackupId {
 
     public static ShardBackupId from(String idString) {
         final String[] idComponents = idString.split("_");
-        if (idComponents.length != 3) {
+        if (idComponents.length < 3 || ! idString.startsWith("md_")) {
             throw new IllegalArgumentException("Unable to parse invalid ShardBackupId: " + idString);
         }
 
-        final BackupId containingBackupId = new BackupId(Integer.parseInt(idComponents[2]));
-        return new ShardBackupId(idComponents[1], containingBackupId);
+        final String backupIdString = idComponents[idComponents.length - 1]; // Backup ID is always the last component
+        final String shardId = String.join("_", Arrays.asList(idComponents).subList(1, idComponents.length - 1));
+        final BackupId containingBackupId = new BackupId(Integer.parseInt(backupIdString));
+        return new ShardBackupId(shardId, containingBackupId);
     }
 
     public static ShardBackupId fromShardMetadataFilename(String filenameString) {
diff --git a/solr/core/src/test/org/apache/solr/core/backup/ShardBackupIdTest.java b/solr/core/src/test/org/apache/solr/core/backup/ShardBackupIdTest.java
new file mode 100644
index 0000000..5a8558b7
--- /dev/null
+++ b/solr/core/src/test/org/apache/solr/core/backup/ShardBackupIdTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.solr.core.backup;
+
+import org.apache.solr.SolrTestCaseJ4;
+import org.junit.Test;
+
+public class ShardBackupIdTest extends SolrTestCaseJ4 {
+
+    @Test
+    public void testCanParseIDFromStringWithUnsplitShardName() {
+        final String idString = "md_shard1_0";
+
+        final ShardBackupId parsedId = ShardBackupId.from(idString);
+
+        assertEquals("shard1", parsedId.getShardName());
+        assertEquals(new BackupId(0), parsedId.getContainingBackupId());
+    }
+
+    @Test
+    public void testCanParseIdFromStringWithSplitShardName() {
+        final String idString = "md_shard2_0_5";
+
+        final ShardBackupId parsedId = ShardBackupId.from(idString);
+
+        assertEquals("shard2_0", parsedId.getShardName());
+        assertEquals(new BackupId(5), parsedId.getContainingBackupId());
+    }
+
+    @Test
+    public void testCanParseIdFromStringWithManySplitShardName() {
+        final String idString = "md_shard2_0_1_3";
+        final ShardBackupId parsedId = ShardBackupId.from(idString);
+
+        assertEquals("shard2_0_1", parsedId.getShardName());
+        assertEquals(new BackupId(3), parsedId.getContainingBackupId());
+    }
+}