mgoでReplSetに対してcollectionを作成できなかった

たかがPub/SubごときにRedisを使うのは、構成要素に余計なものが増えて嫌だなーってなっていた。
で、MongoDBでPub/Subすることにした。

ところが、globalsign/mgoを使ってcapped collectionを作ろうとすると、 not master のエラーで死ぬ。
どうやらレプリカセットのsecondaryに繋ごうとして死ぬっぽいが、デフォルトって普通は primary だよな?
よく分からん。

分からんものはどうしようもないから、うまいことやる。
mgoのgodocを見ると、 Strong mode なるものが存在している。
これは自称 強力な整合モード らしく、要するに primary っぽい。
なので、 session.SetMode(mgo.Strong) を指定するとcollectionを作れた。

ちゃんと書くならこんなんかな?
めんどくさいから must の方にブチ込んだけど。

func session(address string, ssl bool) (*mgo.Session, error) {
	dialInfo, err := mgo.ParseURL(address)
	if err != nil {
		return nil, err
	}
	if ssl {
		tlsConfig := &tls.Config{}
		dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) {
			conn, err := tls.Dial("tcp", addr.String(), tlsConfig)
			return conn, err
		}
	}
	session, err := mgo.DialWithInfo(dialInfo)
	session.SetMode(mgo.Strong, true)
	return mgo.DialWithInfo(dialInfo)
}

流石に primary のままはアホなので、戻すのを忘れないようにしておく。
と言っても defersecondaryPreferred とかに戻せばいいだけ。

session.SetMode(mgo.Strong, true)
defer session.SetMode(mgo.SecondaryPreferred, true)

みたいな感じ。

https://github.com/mohemohe/parakeet/commit/c0234571c35b47d4aa30b9fcc4f188fad2a83e44?diff=unified