mgoでReplSetに対してcollectionを作成できなかった
公開: 08/08/2019, 01:59:52
たかが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
のままはアホなので、戻すのを忘れないようにしておく。
と言っても defer
で secondaryPreferred
とかに戻せばいいだけ。
session.SetMode(mgo.Strong, true)
defer session.SetMode(mgo.SecondaryPreferred, true)
みたいな感じ。
https://github.com/mohemohe/parakeet/commit/c0234571c35b47d4aa30b9fcc4f188fad2a83e44?diff=unified