Bug 121364

Summary: [gmirror] Removing all providers create a "zombie" mirror
Product: Base System Reporter: Kena <kena>
Component: kernAssignee: Andrey V. Elsukov <ae>
Status: Closed FIXED    
Severity: Affects Only Me    
Priority: Normal    
Version: 7.0-STABLE   
Hardware: Any   
OS: Any   

Description Kena 2008-03-04 19:50:01 UTC
It is not possible to re-enable or re-activate a gmirror after all its providers have been removed with "gmirror remove", possibly while the array was rebuilding.

How-To-Repeat: (prepare two similarly sized disks da0 and da1)

1. gmirror label test1 da0 da1
2. newfs -U mirror/test1
3. gmirror remove test1 da1
4. gmirror insert test1 da1
5. (while da1 is rebuilding:) gmirror remove test1 da0
6. gmirror remove test1 da1

(this causes a failure in the rebuild of da1)

Here the intent is to "reload" the array completely from da0, but all operations fail:

- gmirror insert test1 da0 => fails with "test1 does not exist"

- gmirror activate test1 da0 -> fails with "test1 already activated"
Comment 1 Kena 2008-03-04 20:53:54 UTC
Hi,

additional note: after rebooting the system,

after running "gmirror load" the message

GEOM_MIRROR: Device "test1" is destroyed.

is printed, then the system hangs.
Comment 2 Volker Werth freebsd_committer freebsd_triage 2008-03-05 02:50:55 UTC
Responsible Changed
From-To: freebsd-bugs->freebsd-geom


Over to maintainer(s).
Comment 3 Volker Werth freebsd_committer freebsd_triage 2008-03-05 03:36:46 UTC
State Changed
From-To: open->feedback

Please provide output of `gmirror list'
Comment 4 Kena 2008-03-05 07:26:24 UTC
Hi,

since the two aforementioned disks (da0 and da1) are now in production  
elsewhere, I am repeating the test with ggate. I believe the results  
are similar as in my previous report.

0. for i in 0 1; do dd if=/dev/zero of=d$i bs=1024 count=100k; ggatel  
create d$i; done

1. gmirror label -h test1 ggate0 ggate1; gmirror list

Geom name: test1
State: COMPLETE
Components: 2
Balance: split
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 538186880
Providers:
1. Name: mirror/test1
    Mediasize: 104857088 (100M)
    Sectorsize: 512
    Mode: r0w0e0
Consumers:
1. Name: ggate0
    Mediasize: 104857600 (100M)
    Sectorsize: 512
    Mode: r1w1e1
    State: ACTIVE
    Priority: 0
    Flags: NONE
    GenID: 0
    SyncID: 1
    ID: 731206240
2. Name: ggate1
    Mediasize: 104857600 (100M)
    Sectorsize: 512
    Mode: r1w1e1
    State: ACTIVE
    Priority: 1
    Flags: NONE
    GenID: 0
    SyncID: 1
    ID: 501776423

At this point dmesg reports:
GEOM_MIRROR: Device mirror/test1 launched (2/2).

2. gmirror remove test1 ggate1 ; gmirror insert test1 ggate1 ; gmirror  
remove test1 ggate0; gmirror list

(no output from gmirror list)

At this point dmesg reports:
GEOM_MIRROR: Device test1: provider ggate1 destroyed.
GEOM_MIRROR: Device test1: rebuilding provider ggate1.
GEOM_MIRROR: Device test1: provider ggate0 destroyed.
GEOM_MIRROR: Device test1: provider mirror/test1 destroyed.
GEOM_MIRROR: Device test1: rebuilding provider ggate1 stopped.
GEOM_MIRROR: Synchronization request failed (error=6).  
ggate1[WRITE(offset=917504, length=131072)]
GEOM_MIRROR: Device test1: provider ggate1 disconnected.
GEOM_MIRROR: Device test1 destroyed.


3. (intending to "re-activate" the mirror from provider ggate0, which  
should be "clean"):

# gmirror rebuild test1 ggate0
gmirror: No such device: test1.

# gmirror activate test1 ggate0
Cannot read metadata from ggate0: Invalid argument.
gmirror: Not fully done.

(note: gmirror label was done with -h, so I would expect that the  
metadata is there?)

4. Rebooting the system (for a fresh start), then

# ggatel create d0; ggatel create d1; gmirror load
<prompt does not return>

On the console, dmesg reports:
GEOM_MIRROR: Device test1 destroyed.


Let me know if you need anything else.

-- 
kena
Comment 5 Volker Werth freebsd_committer freebsd_triage 2008-05-14 22:02:05 UTC
State Changed
From-To: feedback->open


Feedback has been provided.
Comment 6 Andrey V. Elsukov freebsd_committer freebsd_triage 2013-11-11 14:39:41 UTC
State Changed
From-To: open->closed

This is already fixed with r235600 and merged to stable branches. Thanks! 


Comment 7 Andrey V. Elsukov freebsd_committer freebsd_triage 2013-11-11 14:39:41 UTC
Responsible Changed
From-To: freebsd-geom->ae

Take it.