mirror of
https://github.com/pgsty/minio.git
synced 2026-11-11 18:15:29 +03:00
Merge restore test race fix
Three restore tests no longer race the release of the restore lock that POST hands to its worker.
This commit is contained in:
@@ -98,6 +98,21 @@ func (d restoreGenerationOffline) WriteMetadata(ctx context.Context, orig, bucke
|
|||||||
return d.StorageAPI.WriteMetadata(ctx, orig, bucket, object, fi)
|
return d.StorageAPI.WriteMetadata(ctx, orig, bucket, object, fi)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// restoreCaptureOptions returns a background restore that records its
|
||||||
|
// options instead of restoring. When the background restore returns, the POST
|
||||||
|
// handler releases the restore lock it handed over. A test that restores later
|
||||||
|
// with the recorded options would race that release and could run with a lock
|
||||||
|
// context canceled under it. So the lock is released here, before the options
|
||||||
|
// are recorded, and the later restore takes it again, as a queued worker whose
|
||||||
|
// lock ended does.
|
||||||
|
func restoreCaptureOptions(captured chan<- ObjectOptions) func(context.Context, string, string, ObjectOptions) error {
|
||||||
|
return func(_ context.Context, _, _ string, opts ObjectOptions) error {
|
||||||
|
opts.Transition.owner.release()
|
||||||
|
captured <- opts
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// restoreGenerationMetadata returns the version's metadata on each drive.
|
// restoreGenerationMetadata returns the version's metadata on each drive.
|
||||||
func restoreGenerationMetadata(t *testing.T, disks []StorageAPI, r *restoreTest, versionID string) []map[string]string {
|
func restoreGenerationMetadata(t *testing.T, disks []StorageAPI, r *restoreTest, versionID string) []map[string]string {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
@@ -196,10 +211,7 @@ func TestRestoreAttemptGenerationFencing(t *testing.T) {
|
|||||||
er.getDisks = func() []StorageAPI { return wrapped }
|
er.getDisks = func() []StorageAPI { return wrapped }
|
||||||
captured := make(chan ObjectOptions, 2)
|
captured := make(chan ObjectOptions, 2)
|
||||||
layer := newRestoreIsolationLayer(r)
|
layer := newRestoreIsolationLayer(r)
|
||||||
layer.restore = func(_ context.Context, _, _ string, opts ObjectOptions) error {
|
layer.restore = restoreCaptureOptions(captured)
|
||||||
captured <- opts
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
var older ObjectOptions
|
var older ObjectOptions
|
||||||
if mode != "worker" {
|
if mode != "worker" {
|
||||||
if rec := restoreIsolationPOST(t, r, layer, oi.VersionID); rec.Code != http.StatusOK {
|
if rec := restoreIsolationPOST(t, r, layer, oi.VersionID); rec.Code != http.StatusOK {
|
||||||
@@ -541,10 +553,7 @@ func TestExpireRestoredUsesQuorumGeneration(t *testing.T) {
|
|||||||
}
|
}
|
||||||
captured := make(chan ObjectOptions, 1)
|
captured := make(chan ObjectOptions, 1)
|
||||||
layer := newRestoreIsolationLayer(r)
|
layer := newRestoreIsolationLayer(r)
|
||||||
layer.restore = func(_ context.Context, _, _ string, opts ObjectOptions) error {
|
layer.restore = restoreCaptureOptions(captured)
|
||||||
captured <- opts
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
metaWrites.Store(true)
|
metaWrites.Store(true)
|
||||||
rec := restoreIsolationPOST(t, r, layer, oi.VersionID)
|
rec := restoreIsolationPOST(t, r, layer, oi.VersionID)
|
||||||
metaWrites.Store(false)
|
metaWrites.Store(false)
|
||||||
@@ -634,10 +643,7 @@ func TestRestoreHealNeedsRestoreQuorum(t *testing.T) {
|
|||||||
versionID = oi.VersionID
|
versionID = oi.VersionID
|
||||||
captured := make(chan ObjectOptions, 1)
|
captured := make(chan ObjectOptions, 1)
|
||||||
layer := newRestoreIsolationLayer(r)
|
layer := newRestoreIsolationLayer(r)
|
||||||
layer.restore = func(_ context.Context, _, _ string, opts ObjectOptions) error {
|
layer.restore = restoreCaptureOptions(captured)
|
||||||
captured <- opts
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
if rec := restoreIsolationPOST(t, r, layer, versionID); rec.Code != http.StatusOK {
|
if rec := restoreIsolationPOST(t, r, layer, versionID); rec.Code != http.StatusOK {
|
||||||
t.Fatal(rec.Body.String())
|
t.Fatal(rec.Body.String())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user