🐈

Rust/Diesel/Docker環境でConnectionPoolがクラッシュした

2023/01/05に公開

概要

新年早々Dockerのバージョン依存的なバグに遭遇して2日程潰れてた
現象としてはDieselを使ってMySQLのPool Connectionを作るだけの処理だけど、ローカルだと正常に動いて本番でクラッシュする。(Dockerfileは同じ)

 let manager = ConnectionManager::<MysqlConnection>::new(database_url.as_str());

    let pool = r2d2::Pool::builder()
        .max_size(1)
        .build(manager);
    // ↑ここでクラッシュ
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 1, kind: PermissionDenied, message: "Operation not permitted" }', 
, /home/user/.cargo/registry/src/github.com-1ecc6299db9ec823/scheduled-thread-pool-0.2.6/src/lib.rs:320:44

試したこと

DBに接続できていないのか?と思いつつ、Poolを使わなければ普通にSELECT文も動作するし問題なく接続できる。(パフォーマンスの低下は許容できないのでPoolを使わない選択肢は無い)
インストールしてるパッケージやライブラリを見直しても特に変化無し、Dieselも1系から2系に更新しても意味なし、そもそもローカルで動いてるので根本原因そこじゃないとは思ってはいた。

r2d2のコードを追っても、明らかにコード内でクラッシュしてるようにも思えず。
https://github.com/sfackler/r2d2

OS的なやつかと思ってDebian/Alpine Linux/Ubuntu全部のベースイメージ試しても全滅。
苦し紛れに本番のDockerバージョン上げたら解決した。

docker --version
Docker version 18.06.1  // 更新前
Docker version 20.10.17 // 更新後

Dockerのリリースバージョンまで追う気はでないけど、おそらくDockerのバージョン的なバグ
そうでないなら内部的に何かぶっ壊れていたのかな?

Discussion