Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-3815

replica sets: can't set priority of current primary to zero

    XMLWordPrintableJSON

Details

    • Icon: Improvement Improvement
    • Resolution: Done
    • Icon: Major - P3 Major - P3
    • None
    • None
    • Replication
    • Fully Compatible

    Description

      I wanted to set the priority of the current replica set primary to zero. Here's a log of what happened:

       
      PRIMARY> rs.status();
      {
              "set" : "foo",
              "date" : ISODate("2011-09-12T18:48:54Z"),
              "myState" : 1,
              "members" : [
                      {
                              "_id" : 0,
                              "name" : "localhost:27017",
                              "health" : 1,
                              "state" : 1,
                              "stateStr" : "PRIMARY",
                              "optime" : {
                                      "t" : 1315530008000,
                                      "i" : 1
                              },
                              "optimeDate" : ISODate("2011-09-09T01:00:08Z"),
                              "self" : true
                      },
                      {
                              "_id" : 1,
                              "name" : "localhost:27018",
                              "health" : 1,
                              "state" : 2,
                              "stateStr" : "SECONDARY",
                              "uptime" : 39,
                              "optime" : {
                                      "t" : 1315530008000,
                                      "i" : 1
                              },
                              "optimeDate" : ISODate("2011-09-09T01:00:08Z"),
                              "lastHeartbeat" : ISODate("2011-09-12T18:48:53Z"),
                              "pingMs" : 0
                      },
                      {
                              "_id" : 2,
                              "name" : "localhost:27019",
                              "health" : 1,
                              "state" : 2,
                              "stateStr" : "SECONDARY",
                              "uptime" : 27,
                              "optime" : {
                                      "t" : 1315530008000,
                                      "i" : 1
                              },
                              "optimeDate" : ISODate("2011-09-09T01:00:08Z"),
                              "lastHeartbeat" : ISODate("2011-09-12T18:48:53Z"),
                              "pingMs" : 4
                      }
              ],
              "ok" : 1
      }
      PRIMARY> var myconf = rs.conf();
      PRIMARY> myconf.members[0].priority = 0;
      0
      PRIMARY> myconf
      {
              "_id" : "foo",
              "version" : 4,
              "members" : [
                      {
                              "_id" : 0,
                              "host" : "localhost:27017",
                              "priority" : 0
                      },
                      {
                              "_id" : 1,
                              "host" : "localhost:27018"
                      },
                      {
                              "_id" : 2,
                              "host" : "localhost:27019"
                      }
              ]
      }
      PRIMARY> rs.reconfig(myconf);
      {
              "assertion" : "initiation and reconfiguration of a replica set must be s
      ent to a node that can become primary",
              "assertionCode" : 13420,
              "errmsg" : "db assertion failure",
              "ok" : 0
      }
      PRIMARY> exit
      bye
       
      cwestin@tellus ~/mongo
      $ ./mongo --port 27018
      MongoDB shell version: 2.1.0-pre-
      connecting to: 127.0.0.1:27018/test
      SECONDARY> var myconf = rs.conf();
      SECONDARY> myconf.members[0].priority = 0;
      0
      SECONDARY> myconf
      {
              "_id" : "foo",
              "version" : 4,
              "members" : [
                      {
                              "_id" : 0,
                              "host" : "localhost:27017",
                              "priority" : 0
                      },
                      {
                              "_id" : 1,
                              "host" : "localhost:27018"
                      },
                      {
                              "_id" : 2,
                              "host" : "localhost:27019"
                      }
              ]
      }
      SECONDARY> rs.reconfig(myconf);
      {
              "errmsg" : "replSetReconfig command must be sent to the current replica
      set primary.",
              "ok" : 0
      }
      SECONDARY>

      You can't set the priority of the current primary to zero because you can only send reconfigure commands to a node that can become primary? That appears to be failing because the result would cause the node to no longer be able to become primary. But you can't send the same thing to a secondary either, even though it could become primary.

      You can work around this by asking the original primary to step down, and then issuing the appropriate priority request to the new primary.

      However, the priority change here pretty much amounts to a permanent stepDown() request, so it seems like it should work on the primary; if it can step down, this should be doable.

      Attachments

        Activity

          People

            matt.dannenberg Matt Dannenberg
            dan@mongodb.com Daniel Pasette (Inactive)
            Votes:
            1 Vote for this issue
            Watchers:
            6 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: