[ 
https://issues.apache.org/jira/browse/SOLR-18584?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Boyi Dai updated SOLR-18584:
----------------------------
    Description: 
When RESTORE targets a collection that doesn't exist, RestoreCmd 
(RestoreOnANewCollection) creates the collection, marks all its shards 
CONSTRUCTION, creates one replica per shard, installs the backed up data on 
each shard, and only then marks the shards ACTIVE. If installing the data fails 
for a shard, requestShardsToRestore() throws and markAllShardsAsActive() is 
never called. The collection is left in ZooKeeper with every shard in 
CONSTRUCTION.

Unlike a failure to create the initial replicas, which deletes the collection, 
nothing cleans this up. Retrying the same RESTORE now finds the collection, so 
it takes the existing collection path (RestoreOnExistingCollection). That path 
restores the data and reports success, but never marks CONSTRUCTION shards 
ACTIVE. Updates to the collection are then rejected because no active shard 
covers their hash range.

This was found through code analysis, and I reproduced it with a test using the 
test framework's error-throwing backup repository. It happens when RESTORE is 
called synchronously. An async RESTORE doesn't abort when restoring a shard 
fails (see the TODO in ShardRequestTracker.processResponses): it reports 
FAILED, but still marks the shards ACTIVE and leaves the collection in place 
without the data that failed to restore.

*Steps to reproduce:*
 # Back up a collection.
 # Synchronously RESTORE the backup to a new collection T, with restoring the 
shard data failing (e.g. the backup repository fails to copy an index file).
 # Retry the same RESTORE once the repository works again.
 # Result: the retry succeeds, but T's shards stay in CONSTRUCTION, so updates 
to T fail.

*Expected:* a failed restore to a new collection shouldn't leave a 
half-restored collection behind, and a retry should produce a usable collection.

*Proposed fix:* under discussion. Deleting the collection on failure, 
re-activating shards on retry, and refusing a retry when every shard is under 
construction each have a problem; see the comments here and on the PR. Options 
being considered are an explicit “restore in progress” marker on the new 
collection or making shard activation synchronous.

  was:
When RESTORE targets a collection that doesn't exist, RestoreCmd 
(RestoreOnANewCollection) creates the collection, marks all its shards 
CONSTRUCTION, creates one replica per shard, installs the backed up data on 
each shard, and only then marks the shards ACTIVE. If installing the data fails 
for a shard, requestShardsToRestore() throws and markAllShardsAsActive() is 
never called. The collection is left in ZooKeeper with every shard in 
CONSTRUCTION.

Unlike a failure to create the initial replicas, which deletes the collection, 
nothing cleans this up. Retrying the same RESTORE now finds the collection, so 
it takes the existing collection path (RestoreOnExistingCollection). That path 
restores the data and reports success, but never marks CONSTRUCTION shards 
ACTIVE. Updates to the collection are then rejected because no active shard 
covers their hash range.

This was found through code analysis, and I reproduced it with a test using the 
test framework's error-throwing backup repository. It happens when RESTORE is 
called synchronously. An async RESTORE doesn't abort when restoring a shard 
fails (see the TODO in ShardRequestTracker.processResponses): it reports 
FAILED, but still marks the shards ACTIVE and leaves the collection in place 
without the data that failed to restore.

*Steps to reproduce:*
# Back up a collection.
# Synchronously RESTORE the backup to a new collection T, with restoring the 
shard data failing (e.g. the backup repository fails to copy an index file).
# Retry the same RESTORE once the repository works again.
# Result: the retry succeeds, but T's shards stay in CONSTRUCTION, so updates 
to T fail.

*Expected:* a failed restore to a new collection shouldn't leave a 
half-restored collection behind, and a retry should produce a usable collection.

*Proposed fix:* if anything fails after the collection is created and before 
its shards are marked ACTIVE, delete the collection, as is already done when 
the initial replicas can't be created, and treat a shard restore failure 
recorded by an async request the same way. A retry then restores to a new 
collection again. I have a patch with a test and will open a PR.


> A failed RESTORE to a new collection leaves its shards in CONSTRUCTION, and 
> retrying the restore doesn't fix them
> -----------------------------------------------------------------------------------------------------------------
>
>                 Key: SOLR-18584
>                 URL: https://issues.apache.org/jira/browse/SOLR-18584
>             Project: Solr
>          Issue Type: Bug
>          Components: Backup/Restore
>            Reporter: Boyi Dai
>            Priority: Minor
>              Labels: pull-request-available
>          Time Spent: 40m
>  Remaining Estimate: 0h
>
> When RESTORE targets a collection that doesn't exist, RestoreCmd 
> (RestoreOnANewCollection) creates the collection, marks all its shards 
> CONSTRUCTION, creates one replica per shard, installs the backed up data on 
> each shard, and only then marks the shards ACTIVE. If installing the data 
> fails for a shard, requestShardsToRestore() throws and 
> markAllShardsAsActive() is never called. The collection is left in ZooKeeper 
> with every shard in CONSTRUCTION.
> Unlike a failure to create the initial replicas, which deletes the 
> collection, nothing cleans this up. Retrying the same RESTORE now finds the 
> collection, so it takes the existing collection path 
> (RestoreOnExistingCollection). That path restores the data and reports 
> success, but never marks CONSTRUCTION shards ACTIVE. Updates to the 
> collection are then rejected because no active shard covers their hash range.
> This was found through code analysis, and I reproduced it with a test using 
> the test framework's error-throwing backup repository. It happens when 
> RESTORE is called synchronously. An async RESTORE doesn't abort when 
> restoring a shard fails (see the TODO in 
> ShardRequestTracker.processResponses): it reports FAILED, but still marks the 
> shards ACTIVE and leaves the collection in place without the data that failed 
> to restore.
> *Steps to reproduce:*
>  # Back up a collection.
>  # Synchronously RESTORE the backup to a new collection T, with restoring the 
> shard data failing (e.g. the backup repository fails to copy an index file).
>  # Retry the same RESTORE once the repository works again.
>  # Result: the retry succeeds, but T's shards stay in CONSTRUCTION, so 
> updates to T fail.
> *Expected:* a failed restore to a new collection shouldn't leave a 
> half-restored collection behind, and a retry should produce a usable 
> collection.
> *Proposed fix:* under discussion. Deleting the collection on failure, 
> re-activating shards on retry, and refusing a retry when every shard is under 
> construction each have a problem; see the comments here and on the PR. 
> Options being considered are an explicit “restore in progress” marker on the 
> new collection or making shard activation synchronous.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to