- 
    Type:
Bug
 - 
    Resolution: Done
 - 
    Priority:
Major - P3
 - 
    Affects Version/s: 2.4.3
 - 
    Component/s: Replication
 - 
    Environment:AMD Turion(tm) II Dual-Core Mobile M540, 4GB RAM, Ubuntu 13.04, kernel 3.5.0-28-generic
 
- 
        Fully Compatible
 - 
        ALL
 - 
        
 - 
        None
 
- 
        None
 - 
        None
 - 
        None
 - 
        None
 - 
        None
 - 
        None
 
Hello,
Hope this is not a duplicated issue.
Let's assume there are 3 nodes in replica set (#1, #2, #3).
> rs.status()
{
        "set" : "set0",
        "date" : ISODate("2013-05-23T12:48:07Z"),
        "myState" : 2,
        "syncingTo" : "krogon:27001",
        "members" : [
                {
                        "_id" : 0,
                        "name" : "krogon:27001",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 29,
                        "optime" : {
                                "t" : 1369313180,
                                "i" : 2
                        },
                        "optimeDate" : ISODate("2013-05-23T12:46:20Z"),
                        "lastHeartbeat" : ISODate("2013-05-23T12:48:06Z"),
                        "lastHeartbeatRecv" : ISODate("2013-05-23T12:48:07Z"),
                        "pingMs" : 0
                },
                {
                        "_id" : 1,
                        "name" : "krogon:27002",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 29,
                        "optime" : {
                                "t" : 1369313180,
                                "i" : 2
                        },
                        "optimeDate" : ISODate("2013-05-23T12:46:20Z"),
                        "lastHeartbeat" : ISODate("2013-05-23T12:48:06Z"),
                        "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
                        "pingMs" : 0,
                        "lastHeartbeatMessage" : "syncing to: krogon:27001",
                        "syncingTo" : "krogon:27001"
                },
                {
                        "_id" : 2,
                        "name" : "krogon:27003",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 31,
                        "optime" : {
                                "t" : 1369313180,
                                "i" : 2
                        },
                        "optimeDate" : ISODate("2013-05-23T12:46:20Z"),
                        "errmsg" : "syncing to: krogon:27001",
                        "self" : true
                }
        ],
        "ok" : 1
}
When there is a network connectivity problem to primary node (#1), election is taking place and new primary is being designed (#3). Then inserting new data will update optime on #2 and #3. Old primary is alive but cannot communicate with other nodes.
> rs.status()
{
        "set" : "set0",
        "date" : ISODate("2013-05-23T12:55:44Z"),
        "myState" : 1,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "krogon:27001",
                        "health" : 0,
                        "state" : 8,
                        "stateStr" : "(not reachable/healthy)",
                        "uptime" : 0,
                        "optime" : {
                                "t" : 1369313180,
                                "i" : 2
                        },
                        "optimeDate" : ISODate("2013-05-23T12:46:20Z"),
                        "lastHeartbeat" : ISODate("2013-05-23T12:55:13Z"),
                        "lastHeartbeatRecv" : ISODate("2013-05-23T12:55:43Z"),
                        "pingMs" : 0
                },
                {
                        "_id" : 1,
                        "name" : "krogon:27002",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 486,
                        "optime" : {
                                "t" : 1369313742,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2013-05-23T12:55:42Z"),
                        "lastHeartbeat" : ISODate("2013-05-23T12:55:43Z"),
                        "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
                        "pingMs" : 0,
                        "syncingTo" : "krogon:27003"
                },
                {
                        "_id" : 2,
                        "name" : "krogon:27003",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 488,
                        "optime" : {
                                "t" : 1369313742,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2013-05-23T12:55:42Z"),
                        "self" : true
                }
        ],
        "ok" : 1
}
Log from #1:
[rsHealthPoll] replset info krogon:27002 thinks that we are down [rsHealthPoll] replset info krogon:27003 thinks that we are down
Log from #2:
[rsHealthPoll] replset info krogon:27001 heartbeat failed, retrying [rsHealthPoll] replSet info krogon:27001 is down (or slow to respond): [rsHealthPoll] replSet member krogon:27001 is now in state DOWN [rsMgr] not electing self, krogon:27003 would veto with 'krogon:27002 is trying to elect itself but krogon:27001 is already primary and more up-to-date' [rsMgr] not electing self, krogon:27003 would veto with 'krogon:27002 is trying to elect itself but krogon:27001 is already primary and more up-to-date' [rsMgr] not electing self, krogon:27003 would veto with 'krogon:27002 is trying to elect itself but krogon:27001 is already primary and more up-to-date' [rsHealthPoll] replset info krogon:27001 heartbeat failed, retrying [rsMgr] not electing self, krogon:27003 would veto with 'krogon:27002 is trying to elect itself but krogon:27001 is already primary and more up-to-date' [rsBackgroundSync] Socket recv() timeout 127.0.1.1:27001 [rsBackgroundSync] SocketException: remote: 127.0.1.1:27001 error: 9001 socket exception [3] server [127.0.1.1:27001] [rsBackgroundSync] replSet db exception in producer: 10278 dbclient error communicating with server: krogon:27001 [conn9] replSet info voting yea for krogon:27003 (2) [rsMgr] replSet not trying to elect self as responded yea to someone else recently [rsHealthPoll] replset info krogon:27001 heartbeat failed, retrying [rsMgr] not electing self, krogon:27003 would veto with 'I am already primary, krogon:27002 can try again once I've stepped down' [rsHealthPoll] replSet member krogon:27003 is now in state PRIMARY [rsBackgroundSync] replSet syncing to: krogon:27003 [rsHealthPoll] replset info krogon:27001 heartbeat failed, retrying [rsSyncNotifier] replset setting oplog notifier to krogon:27003 [rsHealthPoll] replset info krogon:27001 heartbeat failed, retrying [rsHealthPoll] couldn't connect to krogon:27001: couldn't connect to server krogon:27001
Logs from #3:
[rsHealthPoll] couldn't connect to krogon:27001: couldn't connect to server krogon:27001 [rsHealthPoll] replSet info krogon:27001 is down (or slow to respond): [rsHealthPoll] replSet member krogon:27001 is now in state DOWN [rsBackgroundSync] Socket recv() timeout 127.0.1.1:27001 [rsBackgroundSync] SocketException: remote: 127.0.1.1:27001 error: 9001 socket exception [3] server [127.0.1.1:27001] [rsBackgroundSync] replSet db exception in producer: 10278 dbclient error communicating with server: krogon:27001 [rsMgr] replSet info electSelf 2 [rsMgr] replSet PRIMARY [rsHealthPoll] couldn't connect to krogon:27001: couldn't connect to server krogon:27001
Now the connectivity is back. Election is taking part. Old primary should (#1) rollback data which was not replicated and become secondary. After become secondary it should download data from new master (#3), which has higher optime.
Hovewer during election old primary (#1) becomes primary again. New primary (#3) after swiching to secondary is syncing to old primary (#1) with older optime which causes data loss.
> rs.status()
{
        "set" : "set0",
        "date" : ISODate("2013-05-23T12:59:37Z"),
        "myState" : 2,
        "syncingTo" : "krogon:27001",
        "members" : [
                {
                        "_id" : 0,
                        "name" : "krogon:27001",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 59,
                        "optime" : {
                                "t" : 1369313180,
                                "i" : 2
                        },
                        "optimeDate" : ISODate("2013-05-23T12:46:20Z"),
                        "lastHeartbeat" : ISODate("2013-05-23T12:59:36Z"),
                        "lastHeartbeatRecv" : ISODate("2013-05-23T12:59:37Z"),
                        "pingMs" : 0
                },
                {
                        "_id" : 1,
                        "name" : "krogon:27002",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 719,
                        "optime" : {
                                "t" : 1369313180,
                                "i" : 2
                        },
                        "optimeDate" : ISODate("2013-05-23T12:46:20Z"),
                        "lastHeartbeat" : ISODate("2013-05-23T12:59:37Z"),
                        "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
                        "pingMs" : 0,
                        "syncingTo" : "krogon:27001"
                },
                {
                        "_id" : 2,
                        "name" : "krogon:27003",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 721,
                        "optime" : {
                                "t" : 1369313180,
                                "i" : 2
                        },
                        "optimeDate" : ISODate("2013-05-23T12:46:20Z"),
                        "errmsg" : "syncing to: krogon:27001",
                        "self" : true
                }
        ],
        "ok" : 1
}
LOGS from #3:
[rsHealthPoll] couldn't connect to krogon:27001: couldn't connect to server krogon:27001 [rsHealthPoll] replSet member krogon:27001 is up [rsHealthPoll] replSet member krogon:27001 is now in state PRIMARY [rsMgr] replSet relinquishing primary state [rsMgr] replSet SECONDARY [rsMgr] replSet closing client sockets after relinquishing primary [rsBackgroundSync] replSet syncing to: krogon:27001 [rsHealthPoll] replset info krogon:27001 heartbeat failed, retrying [conn14] SocketException handling request, closing client connection: 9001 socket exception [2] server [127.0.0.1:53226] [rsBackgroundSync] replSet we are ahead of the sync source, will try to roll back [rsBackgroundSync] replSet rollback 0 [rsBackgroundSync] replSet ROLLBACK [rsBackgroundSync] replSet rollback 1 [rsBackgroundSync] replSet rollback 2 FindCommonPoint [rsBackgroundSync] replSet info rollback our last optime: May 23 14:56:36:1 [rsBackgroundSync] replSet info rollback their last optime: May 23 14:46:20:2 [rsBackgroundSync] replSet info rollback diff in end of log times: 616 seconds [rsBackgroundSync] replSet rollback found matching events at May 23 14:46:20:2 [rsBackgroundSync] replSet rollback findcommonpoint scanned : 142 [rsBackgroundSync] replSet replSet rollback 3 fixup [rsBackgroundSync] replSet rollback 3.5 [rsBackgroundSync] replSet rollback 4 n:100 [rsBackgroundSync] replSet minvalid=May 23 14:46:20 519e0f9c:2 [rsBackgroundSync] replSet rollback 4.6 [rsBackgroundSync] replSet rollback 4.7 [rsBackgroundSync] replSet rollback 5 d:0 u:100 [rsBackgroundSync] replSet rollback 6 [rsBackgroundSync] replSet rollback 7 [rsBackgroundSync] replSet rollback done [rsBackgroundSync] replSet RECOVERING [rsBackgroundSync] replSet syncing to: krogon:27001 [rsSync] replSet SECONDARY [rsBackgroundSync] replSet syncing to: krogon:27001
- is duplicated by
 - 
                    
SERVER-10768 add proper support for SIGSTOP and SIGCONT (currently, on replica set primary can cause data loss)
-         
 - Closed
 
 -         
 - 
                    
SERVER-8145 Two primaries for the same replica set
-         
 - Closed
 
 -         
 - 
                    
SERVER-10575 Two Primaries if Replica Set Heartbeats Fail in One Direction: "Old" Primary doesn't relinquish.
-         
 - Closed
 
 -         
 
- related to
 - 
                    
SERVER-9283 lastHeartbeatRecv flaps between invalid and valid dates
-         
 - Closed
 
 -