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

Develop
この記事は約2分で読めます。

⚠️ このエントリーは1年以上前に作成されたものです。情報の賞味期限切れにご注意ください。

たかが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)
}
Go

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

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

みたいな感じ。

Merge pull request #39 from mohemohe/PKT-36 · mohemohe/parakeet@c023457
#36 ReplSet環境でpubsub用collectionが作成されないのを修正

タイトルとURLをコピーしました