2行のコードの変更に数日かかることがある方法

開発者の作業はコードの行数で測定できると他の誰かが信じているのだろうか? 私たちの赤い目で、この神話を世界と同じくらい古いものにしようとしましょう。









2行のコードを変更するのは難しいですか?



この物語の主人公は、テスト用の人気のあるリレーショナルデータベースのオープンソースプロジェクトH2データベース、 SQL用のWebコンソールであり、 LevelDB / Berkeley DB Java Edition / SQLite 3の類似物も含まれています。 redshift jdbcドライバーと一緒に使用しようとするまで。



AWSにはそのようなデータベースがあり、 RedshiftはPostgreSQL 8.0.2の時代の分岐点です 。 同じ10年のどこかで、彼の競合相手であるgreenplum-dbが登場しました。 。 最新のPostgreSQL 9.6とRedshiftの化石ワイヤープロトコルドライバーpostgresql 8.xのドライバーがアプリケーションで競合していることを発見したとき、私はこの気持ちに理由がないとは思いませんでした。



H2 WebコンソールでPostgreSQL 9.6に接続するときに、PGワイヤプロトコル8.xが使用されることがわかりました。 結果は私を悲しませ、私はこれがどのように起こり得るかを理解し始めました。 接続を取得するためにラインにもたらされたデバッグ:



DriverManager.getConnection(url, prop);
      
      





JNDIでもjavax.sql.DataSourceでもないため、すべてが仕様に従って見えるようです。



DriverManagerの詳細を確認します。 すべてがすでに知られており、期待されています。 静的な初期化ブロックでは、ServiceLoaderを使用してjava.sql.Driverの実装者をロードし、jar内のMETA-INF / services / java.sql.Driver実装レコードを使用してこれを宣言します。 Class.forName(ドライバー)の使用をキャンセルしてから長い時間が経過しているため、最新のドライバーはすべて、この化石呼び出しなしでロードされます。 ここで私にとって新しいものは何もありません。



接続を要求すると、ドライバーは、registeredDriversフィールドに登録された順にソートされます。 それぞれのDriverManagerは、チェーンでdriver.connect(url、info)を呼び出します。 特定のドライバーがデータベース接続オブジェクトを返した場合、関数からそれを返します。 ドライバーチェーンからの接続URLを処理する最初のものが勝ちます!



ドライバー自体は、jdbc: subprotocol subprotocolを処理できるかどうかを分析します。 不幸なことに、redshift jdbcドライバーは「redshift」だけでなく「postgresql」も処理しましたが、2000年代中期の古代のコードを使用していました。 接続URL要求がpostgres 9.6ドライバーに到達しないことは明らかです。



赤方偏移jdbc開発者にカルマで1つプラス-古代のPG実装のクラスは別のパッケージに隠されていて、 jar hellの org.postgresql.Driverと競合しないようにしてくれました 私はもっ​​と「新鮮な」ドライバーを使用しようとしましたが、依存関係がドライバーjar内の依存ネストjarでパックされているため、スプリングブート実行可能jar内では機能しませんでした。



同時に、H2コンソールとは異なり、 HikariCP接続プールは新しいpostgresqlドライバーを正しく作成します。 ユーザーがdriverClassを指定したため、ユーザーはそれを呼び出してDriverManagerに依存しません。 これは、redshift jdbcが作成した地獄で機能します。 その理由はすぐに判明し、問題の解決方法が明らかになりました。



パッチは週末に作成され、プルリクエストとしてプロジェクトリポジトリに送信され、同時にエラーリクエストが作成されまし 。 その後、h2databaseリポジトリで2番目にアクティブな貢献者について、変更の対応と議論が始まりました。 このプルリクエストに対するすべての要件とコメントが満たされ、変更がメインプロジェクトコードに受け入れられました。 2行の変更と赤方偏移ドライバーのために、多くの空き時間がかかりました。 しかし、すでに興奮と原則の問題がありました-化石プロトコルが現代のものと重複する世界で生き残るために。 この問題を詳しく調査していただき、ありがとうございます。 人気のあるオープンソースプロジェクトでプルリクエストを受け入れる際の細心の注意は、品質の向上に役立つと考えています。 バグを修正するための2行がプロジェクトに表示されるまで、ほぼ2日が経過しました。



schemaspyの新しい機能に対する別のプルリクエストが1週間以上ハングしています。 ここでの私のせいです。問題は、Linuxで開発されたが、Windowsシステムでは動作しなかったことです。 私はすぐにテストしなかったことを悔い改めました。



数行のコードが時間をどのように消費したかを共有します。 興味深い物語や探偵のジャンルの物語はありますか?



All Articles