Libelektra: testshell_markdown_tutorial_crypto:失敗

作成日 2019年11月26日  ·  17コメント  ·  ソース: ElektraInitiative/libelektra

問題を再現する手順

gpgme開発ファイルを使用しながらlibelektraをビルドします。 (fedoraではgpgme-devel
使った

cmake -DBUILD_DOCUMENTATION=ON -DBINDINGS="ALL" -DBUILD_SHARED=ON -DBUILD_STATIC=ON -DBUILD_FULL=ON -DENABLE_COVERAGE=OFF -DENABLE_OPTIMIZATIONS=ON -DENABLE_DEBUG=ON -DENABLE_LOGGER=OFF -DBUILD_STATIC=ON -DCMAKE_INSTALL_PREFIX="$INSTALL_DIR" -DKDB_DB_SYSTEM="$SYSTEM_DIR" DCMAKE_INSTALL_PREFIX=./releaseInstallDir -DPLUGINS="ALL" -DTOOLS="ALL" ..

しかし、すべてが問題に関連しているわけではありません。

make run_all

期待される結果

Test #215: testshell_markdown_tutorial_crypto ........... Passed    2.58 sec

実結果

tmpfsなどの/ tmpに問題があるようです。 私はfedoraとdebianバスター(docker内)で問題が発生します。

249/262 Test #215: testshell_markdown_tutorial_crypto ...........***Failed    2.58 sec
Input: /home/mpranj/workspace/libelektra/doc/tutorials/crypto.md
kdb mount test.ini user/tests ini
kdb set user/tests/password 1234
kdb file user/tests/password | xargs cat
kdb rm user/tests/password
kdb umount user/tests
kdb mount test.ini user/tests fcrypt "encrypt/key=$(kdb gen-gpg-testkey)" ini
kdb set user/tests/password 1234

ERROR - RET:
Return value “5” does not match “0”

kdb file user/tests/password | xargs cat

ERROR - RET:
Return value “123” does not match “0”

kdb rm user/tests/password

ERROR - RET:
Return value “11” does not match “0”

kdb umount user/tests
kdb mount test.ini user/tests fcrypt "sign/key=$(kdb gen-gpg-testkey)" ini
kdb set user/tests/password 1234

ERROR - RET:
Return value “5” does not match “0”

kdb file user/tests/password | xargs cat

ERROR - RET:
Return value “123” does not match “0”

kdb rm user/tests/password

ERROR - RET:
Return value “11” does not match “0”

kdb umount user/tests
kdb mount test.ini user/tests fcrypt "sign/key=$(kdb gen-gpg-testkey),encrypt/key=$(kdb gen-gpg-testkey)" ini
kdb set user/tests/password 1234

ERROR - RET:
Return value “5” does not match “0”

kdb file user/tests/password | xargs cat

ERROR - RET:
Return value “123” does not match “0”

kdb rm user/tests/password

ERROR - RET:
Return value “11” does not match “0”

kdb umount user/tests
kdb mount test.ini user/tests crypto_gcrypt "crypto/key=$(kdb gen-gpg-testkey)" base64 ini
kdb meta-set user/tests/password crypto/encrypt 1
kdb set user/tests/password 1234
kdb set user/tests/unencrypted "I am not encrypted"
kdb file user/tests/password | xargs cat
kdb meta-set user/tests/password crypto/encrypt 0
kdb file user/tests/password | xargs cat
kdb rm user/tests/unencrypted
kdb rm user/tests/password
kdb umount user/tests
shell_recorder /tmp/tmp.FLYIzi6Q4K RESULTS: 31 test(s) done 9 error(s).

—— Protocol ————————————————————————————————————————————————————
CMD: kdb mount test.ini user/tests ini
RET: 0

CMD: kdb set user/tests/password 1234
RET: 0
STDOUT: Create a new key user/tests/password with string "1234"

CMD: kdb file user/tests/password | xargs cat
RET: 0
STDOUT: password=1234

CMD: kdb rm user/tests/password
RET: 0

CMD: kdb umount user/tests
RET: 0

CMD: kdb mount test.ini user/tests fcrypt "encrypt/key=$(kdb gen-gpg-testkey)" ini
RET: 0

CMD: kdb set user/tests/password 1234
RET: 5
=== FAILED return value does not match expected pattern 0
STDERR: Sorry, module fcrypt issued the error C01100:
Resource: Renaming file /tmp/test.ini.2110573:1574783987.412609.tmpZJttxQ to /home/mpranj/.config/test.ini.2110573:1574783987.412609.tmp failed. Reason: Invalid cross-device link
ERROR: C01100

CMD: kdb file user/tests/password | xargs cat
RET: 123
=== FAILED return value does not match expected pattern 0
STDERR: cat: /home/mpranj/.config/test.ini: No such file or directory

CMD: kdb rm user/tests/password
RET: 11
=== FAILED return value does not match expected pattern 0
STDERR: Did not find the key

CMD: kdb umount user/tests
RET: 0

CMD: kdb mount test.ini user/tests fcrypt "sign/key=$(kdb gen-gpg-testkey)" ini
RET: 0

CMD: kdb set user/tests/password 1234
RET: 5
=== FAILED return value does not match expected pattern 0
STDERR: Sorry, module fcrypt issued the error C01100:
Resource: Renaming file /tmp/test.ini.2110783:1574783987.564306.tmpRJuvgG to /home/mpranj/.config/test.ini.2110783:1574783987.564306.tmp failed. Reason: Invalid cross-device link
ERROR: C01100

CMD: kdb file user/tests/password | xargs cat
RET: 123
=== FAILED return value does not match expected pattern 0
STDERR: cat: /home/mpranj/.config/test.ini: No such file or directory

CMD: kdb rm user/tests/password
RET: 11
=== FAILED return value does not match expected pattern 0
STDERR: Did not find the key

CMD: kdb umount user/tests
RET: 0

CMD: kdb mount test.ini user/tests fcrypt "sign/key=$(kdb gen-gpg-testkey),encrypt/key=$(kdb gen-gpg-testkey)" ini
RET: 0

CMD: kdb set user/tests/password 1234
RET: 5
=== FAILED return value does not match expected pattern 0
STDERR: Sorry, module fcrypt issued the error C01100:
Resource: Renaming file /tmp/test.ini.2111010:1574783987.747497.tmpti3bSR to /home/mpranj/.config/test.ini.2111010:1574783987.747497.tmp failed. Reason: Invalid cross-device link
ERROR: C01100

CMD: kdb file user/tests/password | xargs cat
RET: 123
=== FAILED return value does not match expected pattern 0
STDERR: cat: /home/mpranj/.config/test.ini: No such file or directory

CMD: kdb rm user/tests/password
RET: 11
=== FAILED return value does not match expected pattern 0
STDERR: Did not find the key

CMD: kdb umount user/tests
RET: 0

CMD: kdb mount test.ini user/tests crypto_gcrypt "crypto/key=$(kdb gen-gpg-testkey)" base64 ini
RET: 0

CMD: kdb meta-set user/tests/password crypto/encrypt 1
RET: 0

CMD: kdb set user/tests/password 1234
RET: 0
STDOUT: Set string to "1234"

CMD: kdb set user/tests/unencrypted "I am not encrypted"
RET: 0
STDOUT: Create a new key user/tests/unencrypted with string "I am not encrypted"

CMD: kdb file user/tests/password | xargs cat
RET: 0
STDOUT: unencrypted=I am not encrypted
#<strong i="19">@META</strong> crypto/encrypt = 1
password=@BASE64IyFjcnlwdG8wMBEAAACCBjEzmVhqufXSsgK4VPRDUC9GyQxBhocVbgZwimonK+xHaRCSX/blNDSVdIoSRg0n

CMD: kdb meta-set user/tests/password crypto/encrypt 0
RET: 0

CMD: kdb file user/tests/password | xargs cat
RET: 0
STDOUT: unencrypted=I am not encrypted
#<strong i="20">@META</strong> crypto/encrypt = 0
password=1234

CMD: kdb rm user/tests/unencrypted
RET: 0

CMD: kdb rm user/tests/password
RET: 0

CMD: kdb umount user/tests
RET: 0
————————————————————————————————————————————————————————————————

システムインフォメーション

  • エレクトラバージョン:マスター
  • オペレーティングシステム:Fedora
  • 他の関連ソフトウェアのバージョン?

その他のログファイルと出力

bug work in progress

最も参考になるコメント

この問題はもっと頻繁に発生する可能性があると思います。 fcryptのドキュメントでは、 /tmpをRAMディスクに再マウントすることをお勧めします。 したがって、実際には、このエラーをすぐにトリガーすることをお勧めします。

私は適切な修正を提供しようとします。

ビルド用に別のTMPDIRを明示的に構成するだけです。 ターゲットシステムで問題が再発する場合は、再度開いて、より適切な解決策を見つけることができます。

これは、ビルドサーバーの回避策としても問題ありません。

全てのコメント17件

@ markus2330これはkdb run_all -v > ~elektra/$VERSION/run_all 2>&1 )に反映されます。

編集:ホストとしてfedora(およびdockerでのみdebian)を使用したシナリオでのみ失敗する可能性があるため、a7 / v2でこの部分を実行しようと試みることができます。

いいえ、それは間違いなくショートッパーではありません。 おそらく、前回の実行で一時ファイルがまだ残っているか、#2957が完全に修正されていないことが原因である可能性があります。

うまくいけば、 @ petermax2には0.9.2の前に修正する時間があります:wink:

@mpranjリリースノートなどでサポートが必要ですか?

上からcmakeコマンドを使用して2bc994ae8b3f3a04396303ece106ea563764e490を最初からビルドすると、問題を再現できません。

    Start 188: testshell_markdown_tutorial_crypto 
222/235 Test #188: testshell_markdown_tutorial_crypto ...........   Passed    3.16 sec

たぶんあなたのビルドディレクトリはどういうわけか壊れています。 新しい(空の)ビルドディレクトリでコンパイルしてテストしてみてください。

@ petermax2とても早くチェックしてくれてありがとう。 ホストシステム(fedora)とdebianバスタードッカーコンテナーで数回試しました。 また、ビルドディレクトリを何度もクリーンアップしました。

それが私の側の問題である可能性は常にあります。 後でまたチェックします!

うーん変だ! 昨日、ビルドとテストにDebian:stableコンテナを使用したと思います。 夕方にFedoraでもう一度試すことができます。 現時点では、トラブルシューティングを行う時間があまりありませんが、簡単に説明します。

この問題はFedoraで再現可能です。

The following tests FAILED:
 41 - testshell_markdown_base64 (Failed)
 56 - testshell_markdown_csvstorage (Failed)
 76 - testshell_markdown_iconv (Failed)
 78 - testshell_markdown_ini (Failed)
 93 - testshell_markdown_mini (Failed)
116 - testmod_resolver (Failed)
181 - testshell_markdown_tutorial_crypto (Failed)

多分これは暗号チュートリアル固有の問題ではありません。 調査する必要があります。

kdb gen-gpg-testkeyが見つかりません。 この問題は、#3246(KDB_EXEC_PATH)に関連しています。

編集:分析はtestshell_markdown_tutorial_cryptoに対してのみ有効です。 私は今のところ他のテストをチェックしていません。

この問題をご覧いただきありがとうございます。

私は他のテストがtbhに失敗するのを見たことがありません。 これは同じ問題ですか? インストールされたkdbでさえ作業しませんでした、makerun_allでctestを実行しただけです。

長期的には、fedora dockerイメージ(#3227)も追加して、このようなものを以前にキャッチします。

これは同じ問題ですか?

いいえ、おそらくいくつかの異なる問題があります。

長期的には、fedoradockerの画像もいくつか追加します

非常に良いアイデア!

以前の投稿を編集して、分析の意味を明確にしました。

問題は私のマシンに限定されていません。 次のrename()呼び出しが失敗するため、テストは失敗します。
https://github.com/ElektraInitiative/libelektra/blob/263cbe69686a9f087204a7f3660b007d1de22da2/src/plugins/fcrypt/fcrypt.c#L231

その理由は、/ tmpがデフォルトでFedoraの個別のマウントポイントであるためですが、Debianの場合はそうではありませんでした。 したがって、異なるマウントポイント間でファイルの名前を変更することはできません。

(非常に汚れた)パッチを適用することにより、これが問題であることを確認しました。 リゾルバーの実装との整合性を保ち、一時ファイルを元のファイルと同じディレクトリに配置することを提案します。

@ petermax2どう思いますか?適切なパッチで修正する時間がありますか?

fcryptが使用するtmpディレクトリは、プラグイン構成を介して設定できます。

fcryptは、構成オプションfcrypt / tmpdirを使用して、暗号化および復号化中に一時ファイルのパスを生成します。 そのような構成オプションが提供されていない場合、fcryptは環境変数TMPDIRを使用しようとします。 環境でTMPDIRが設定されていない場合は、/ tmpがデフォルトディレクトリとして使用されます。

(_Source_:プラグインのドキュメント

Fedoraのようなビルドジョブを軽減する最も簡単な方法は、別のディレクトリを使用することです。 ビルドサーバーでは、ローカルビルドディレクトリを使用できます。 どう思いますか?

@ petermax2どう思いますか?適切なパッチで修正する時間がありますか?

週末に余暇を割り当てることはできますが、適切な解決策として何を考えていますか?

週末に余暇を割り当てることはできますが、適切な解決策として何を考えていますか?

何もオーバーエンジニアリングする必要はありません。 私が提案したように、一時ファイルをターゲットファイルと同じディレクトリに配置します。 これは、変更をコミットするときにresolverが行う方法であるため、ある程度一貫性があります。

ビルド用に別のTMPDIRを構成するだけでも問題ありません。 私はその変更を自分で実装できます。

私たちはあなたがここで提案するものは何でも行きます。

名前の変更ドキュメントから:

[EXDEV]
[CX] [Option Start] The links named by new and old are on different file systems and the implementation does not support links between file systems. [Option End]

編集:同じエラーでsudoで失敗します:

213: CMD: kdb set user/tests/password 1234
213: RET: 5
213: === FAILED return value does not match expected pattern 0
213: STDERR: Sorry, module fcrypt issued the error C01100:
213: Resource: Renaming file /tmp/test.ini.571145:1586371945.946855.tmpHdGEMt to /root/.config/test.ini.571145:1586371945.946855.tmp failed. Reason: Invalid cross-device link
213: ERROR: C01100

単純な解決策は、 rename操作をコピー+削除に置き換えることです。

ビルド用に別のTMPDIRを明示的に構成するだけです。 ターゲットシステムで問題が再発する場合は、再度開いて、より適切な解決策を見つけることができます。

この問題はもっと頻繁に発生する可能性があると思います。 fcryptのドキュメントでは、 /tmpをRAMディスクに再マウントすることをお勧めします。 したがって、実際には、このエラーをすぐにトリガーすることをお勧めします。

私は適切な修正を提供しようとします。

ビルド用に別のTMPDIRを明示的に構成するだけです。 ターゲットシステムで問題が再発する場合は、再度開いて、より適切な解決策を見つけることができます。

これは、ビルドサーバーの回避策としても問題ありません。

ご覧いただきありがとうございます!

単純な解決策は、名前変更操作をコピー+削除に置き換えることです。

コードを置き換えるのではなく、名前の変更に失敗した場合に置き換えます。 (また、その場合はソースファイルを細断処理します。)次に、/ tmpにRAMディスクがない場合は速度が向上し、/ tmpにRAMディスクがある場合はセキュリティが向上します。

このページは役に立ちましたか?
0 / 5 - 0 評価