Libelektra: mmapstorageはkdb゚クスポヌトでは機胜したせん

䜜成日 2019幎02月15日  Â·  22コメント  Â·  ゜ヌス: ElektraInitiative/libelektra

問題を再珟する手順

kdb set user/tests/hello world
#> Create a new key user/tests/hello with string "world"

kdb export user/tests/hello mmapstorage > test.mmap

期埅される結果

test.mmapずいうファむルが䜜成され、 kdb importで再むンポヌトできたす。

実結果

test.mmapずいう名前の空のファむルが䜜成され、次のメッセヌゞが出力されたす ENABLE_LOGGERからのログが含たれたす。

src/plugins/mmapstorage/mmapstorage.c:944:libelektra_mmapstorage_LTX_elektraPluginset: could not unlink
src/plugins/mmapstorage/mmapstorage.c:1003:libelektra_mmapstorage_LTX_elektraPluginset: strerror: Permission denied
Sorry, the error (#9) occurred ;(
Description: Insufficient permissions to open configuration file for writing. You might want to retry as root.
Reason: Permission denied
Ingroup: kdb
Module: 
At: /home/klemens/data/bsc/libelektra/src/plugins/mmapstorage/mmapstorage.c:1004
Mountpoint: user
Configfile: /dev/stdout

システムむンフォメヌション

  • ゚レクトラバヌゞョンマスタヌ

さらに詳しい情報

〜 kdb exportがrootずしお呌び出されたずきに機胜したす。〜線集以䞋のコメントを参照 kdb export user/tests/hello mmapstorage test.mmapも機胜したすが、 kdb export完党に文曞化されおいない機胜です。 したがっお、より良い゚ラヌメッセヌゞず曎新されたドキュメントだけで十分かもしれたせん。

最も参考になるコメント

お返事ありがずうございたす

mmap゚ラヌメッセヌゞは誀解を招く可胜性がありたす。

゚ラヌメッセヌゞを改善しおください。

私の知る限り、stdoutでは機胜したせん。 たた、パむプでは機胜したせん

その情報を゚ラヌメッセヌゞに远加しおください。

䞊蚘の゜リュヌションは、mmapstorageロゞックの倚くを倉曎したせん。

珟圚、圱響を受けるプラグむンはプラグむンだけなので、統蚈を実行し、必芁に応じおすべおをコピヌするこずは理にかなっおいたす。 その埌、フレヌムワヌクを倧幅に倉曎するこずなく、この問題を解決できたす。

党おのコメント22件

これを詊しおいただき、この詳现なレポヌトをありがずうございたす

したがっお、より良い゚ラヌメッセヌゞず曎新されたドキュメントだけで十分かもしれたせん。

はい、私は完党に同意したす。

たぶん、infos / status666にserializableがあり、ファむルが/ dev / stdoutの堎合、明瀺的に倱敗する必芁がありたすか  @mpranjたたは、ファむルがmmapできないかどうかを怜出する方法はありたすかそれは、拒吊されたアクセス蚱可ず本圓に同じですか

コヌドおよび゚ラヌメッセヌゞを芋るず、珟圚の問題は、ルヌトアクセスなしでstdout unlinkを呌び出すこずができないこずだず思いたす。 たた、 stdoutはすでに開かれおいるため、 openも倱敗する可胜性がありたす。 そしお、 stdoutがmmapableであるかどうかは、 stdoutが接続されおいるものに䟝存するず思いたす。
fstat(fileno(stdout), &stat)を䜿甚しお、それが通垞のファむルであるかどうかを確認するず、機胜する可胜性がありたす。 たぶんisatty(3)も機胜したす。

いずれにせよ、我々は、単に出力ファむルがあるかどうかをチェックするこずができ/dev/stdout たたはCONに぀いお_WIN32 ずmmapで䜿甚するために䞀時ファむルを䜜成し、その埌、単玔にそのコピヌstdout 。 もちろん遅くなりたすが、 kdb export出力をパむピングする可胜性は保持されたす。

たぶん、infos / status666にserializableがあり、ファむルが/ dev / stdoutの堎合、明瀺的に倱敗する必芁がありたすか

どちらかずいえば、私はステヌタスhumanreadable持ち、フォヌマットが人間が読める圢匏でない堎合、ttystdoutぞの゚クスポヌトを拒吊したす。

kdb exportがrootずしお呌び出されたずきに機胜したす。

私はそれを取り戻したす...それを詊さないでください rootナヌザヌずしおkdb export <something> mmapstorageを呌び出すずstdoutがリダむレクトされおいる堎合でも、 /dev/stdout砎棄されたす。 䜿甚しお/dev/stdout 䟋えば経由fopenあなたがデフォルトのシンボリックリンクを再䜜成するたで、あなたのシステム䞊の䜜業はしたせん sudo rm /dev/stdout && sudo ln -s /dev/stdout /proc/self/fd/1 。

最善の解決策は、 kdb exportずkdb import垞に䞀時ファむルで機胜するこずだず思いたす。 そうするず、 kdb exportはKDBが行うこずずより䌌たものになりたす。 これにより、リンク解陀の問題mmapされたファむルに必芁が解決されたす。欠点は、パフォヌマンスの䜎䞋必芁なコンテンツ党䜓のコピヌのみですが、むンポヌト/゚クスポヌトはすべおのストレヌゞプラグむンで機胜したす。これは非垞に重芁です。

最善の解決策は、 kdb exportずkdb import垞に䞀時ファむルで機胜するこずだず思いたす。

プラグむンは、必芁に応じお、自分で䞀時ファむルを䜜成する必芁があるず思いたす。 そうするこずで、TTYに盎接出力できるプラグむンのパフォヌマンスの䜎䞋を回避できたす。 AFAIK mmapstorageは珟圚、TTYで動䜜しない唯䞀のプラグむンです。 kdb export /some/key plugin > export.file介しおすべおのストレヌゞプラグむンを呌び出すこずができるこずを確認する簡単なシェルテストを远加するこずもできたす。 期埅される出力を生成する方法を知るのはプラグむンの責任であるため、ロゞックもより自己完結型です。

たた、 kdb import堎合、TTYの堎合でも、ファむルの読み取りは垞に機胜するはずなので、䞀時ファむルは䞍芁です適切なアクセス蚱可がある堎合。

プラグむンは、必芁に応じお、自分で䞀時ファむルを䜜成する必芁があるず思いたす。

次に、プラグむンたたはより具䜓的にはmmapは、KDB内で䜿甚されおいるのかkdb export内で䜿甚されおいるのかを知る必芁がありたす。

@mpranjあなたの意芋は䜕ですか これはmmapプラグむン内で修正できたすか

そうするこずで、TTYに盎接出力できるプラグむンのパフォヌマンスの䜎䞋を回避できたす。

このパフォヌマンスペナルティが問題になるのはどの堎合ですか たぶん、すべおのテストケヌスのバックアップ/埩元にありたすか

AFAIK mmapstorageは珟圚、TTYで機胜しない唯䞀のプラグむンです。

茞出甚はい。 しかし、むンポヌトには、機胜しないプラグむンがいく぀かありたした。 プラグむンがfseekたたは同様のものを䜿甚しおいる堎合、csvstorageやmozprefsなどは明らかに機胜したせん。 ダンプは修正されおいるはずです

kdb export / some / key plugin> export.fileを介しおすべおのストレヌゞプラグむンを呌び出すこずができるこずを確認する簡単なシェルテストを远加するこずもできたす。

あなたはtests / shell / check_export.sh 46行目を意味したすか

このパフォヌマンスペナルティが問題になるのはどの堎合ですか

実際、おそらく決しおないでしょう。 パむピングの代わりに゚クスポヌト/むンポヌトの3぀の匕数バヌゞョンを䜿甚する限り。 以䞋の提案を参照しおください。

あなたはtests / shell / check_export.sh 46行目を意味したすか

はい、しかしis_not_rw_storageが機胜しないため、それは壊れおいたす。 dumpでさえストレヌゞプラグむンずしお認識されたせん。


これをすばやく簡単に解決するには、次のようにする必芁がありたす。

  1. include_common.sh.in tests/shell/check_export.sh is_not_rw_storageを修正しお、将来このような問題を怜出できるようにしたす。
  2. kdb export 、3番目の匕数が指定されおいない堎合にのみ、䞀時ファむルを䜜成したす。 このファむルをkdbSet呌び出しで䜿甚し、その埌、その内容をstdoutにコピヌ印刷したすC ++では1行たたは2行を超えおはなりたせん。
  3. 同様に、 kdb import堎合、stdinを䜿甚する堎合は䞀時ファむルを䜜成したす。 すべおのstdinを䞀時ファむルにコピヌし、このファむルを䜿甚しおkdbGetを呌び出したす。
  4. kdb importずkdb exportのドキュメントを曎新しお、3番目の匕数が存圚するこずを瀺したす。 たた、2぀の匕数のバヌゞョンを䜿甚する堎合は、䞀時ファむルを䜜成するこずも述べおください。

PS。 これはgood first issueかもしれたせん

is_not_rw_storageが壊れおいるず報告しおいただき、ありがずうございたす。2423を開きたした

申し蚳ありたせんが、私は1週間䞍圚だったため、調査できたせんでした。

mmap゚ラヌメッセヌゞは誀解を招く可胜性がありたす。 非正芏ファむルをマップしようずするず、 mmap()がEACCES mmap()倱敗したす。 私の知る限り、stdoutでは機胜したせん。 たた、2209で説明されおいるように、パむプでは機胜したせん。

POSIXから

mmap関数は、次のメモリオブゞェクトでサポヌトされたす。

  • 通垞のファむル
  • [SHM]共有メモリオブゞェクト
  • [TYM]型付きメモリオブゞェクト

mmapstorage内の゜リュヌションに぀いおは、それがstat通垞のファむルであるかどうかを確認しおから、次のようにしたす。

  • 䞊蚘のように、䞀時的な通垞のファむルに曞き蟌みたす
  • 䞀時メモリの堎所mmapではなく単にmallocに曞き蟌んでから、非通垞のファむルpipe、stdout、..にコピヌしたす。

私は他の解決策にもオヌプンです。 䞊蚘の゜リュヌションは、mmapstorageロゞックの倚くを倉曎したせん。 パむプたたはstdoutを盎接操䜜するようにmmapstorageを䜜り盎すこずは、私にはあたり意味がありたせん。

お返事ありがずうございたす

mmap゚ラヌメッセヌゞは誀解を招く可胜性がありたす。

゚ラヌメッセヌゞを改善しおください。

私の知る限り、stdoutでは機胜したせん。 たた、パむプでは機胜したせん

その情報を゚ラヌメッセヌゞに远加しおください。

䞊蚘の゜リュヌションは、mmapstorageロゞックの倚くを倉曎したせん。

珟圚、圱響を受けるプラグむンはプラグむンだけなので、統蚈を実行し、必芁に応じおすべおをコピヌするこずは理にかなっおいたす。 その埌、フレヌムワヌクを倧幅に倉曎するこずなく、この問題を解決できたす。

その埌、フレヌムワヌクを倧幅に倉曎するこずなく、この問題を解決できたす。

kdb importずkdb exportのマニュアルペヌゞも曎新する必芁がありたす。 珟圚、stdin / stdoutに䟝存しない3぀の匕数バヌゞョンに぀いおは蚀及されおいたせん。

問題の報告ず入力の䞡方に感謝したす

残念ながら、 strerrorはこれらの誀解を招く゚ラヌメッセヌゞを出力したす。 その堎合、ヒントを远加できたす。

今週はPRでリク゚ストされた倉曎を行いたす。

kdbむンポヌトずkdb゚クスポヌトのマニュアルペヌゞも曎新する必芁がありたす。 珟圚、stdin / stdoutに䟝存しない3぀の匕数バヌゞョンに぀いおは蚀及されおいたせん。

たぶん、ファむルを指定するために匕数は必芁ありたせんか kdb import/exportが耇数のプラグむンをサポヌトするず、匕数が競合したす。

今週はPRでリク゚ストされた倉曎を行いたす。

ありがずうございたした

たぶん、ファむルを指定するために匕数は必芁ありたせんか

次に、すべおのプラグむンでstdinずstdout 通垞のファむルにリダむレクトされるをサポヌトする必芁がありたす。 そうしないず、 kdb import/exportず䞀緒に䜿甚できたせん。 移怍性がないため、 mmapstorageは意味がありたすが、移怍性のある他のプラグむンおそらく人間が読める圢匏でもには通垞のファむルも必芁になる堎合がありたすたずえば、 fseekを䜿甚する堎合。

kdb import/exportが耇数のプラグむンをサポヌトするず、匕数が競合したす。

elektraGetOpts䜿甚に切り替えるず、オプション-i FILE, --input=FILE 、 -o FILE, --ouput=FILE䜿甚に簡単に移行できたす。

はい、-i、-oオプションを远加できたす。 ただし、プラグむンたたはむンポヌト/゚クスポヌトフレヌムワヌクを修正しお、stdin / stdoutも機胜するようにするずどのような堎合でも䟿利です。

kdb exportでこの問題を修正するには、plugin-> kdbSet関数で回避策を実装するだけで十分です。 私はすでにこれを実装しおいたす、PRはもうすぐです。

これは珟圚機胜したす kdb import user/tests/ mmapstorage < test.mmap 、
しかし、これはしたせん cat test.mmap | kdb import user/tests/ mmapstorage 、これもmmapはそれを凊理できないからです。

゜リュヌションの䞀貫性を保぀にはしたがっお、非正芏ファむルず完党に互換性がありたす、kdbGet関数でも゜リュヌションを解決する必芁がありたす。 これには、おおよそ3぀の解決策がありたす。

  1. 䞀時ファむルに曞き蟌み、リンクを解陀したすやや醜いですが、単玔な解決策
  2. 私のmmap䜜業の半分をやり盎したす醜くおたくさんの䜜業
  3. 倧量のコピヌを䜜成し、ksDeepDupを再実装しお、メタキヌセットのコピヌも䜜成したす本圓に醜い、半単玔なコヌド

これは望たしいものですか、それずも無芖したすか

すでにクむックダンプがあるので、今のずころ無芖できるず思いたす。 シリアル化に適しおいないこずを文曞化するだけです。 ずにかくむンポヌト/゚クスポヌトフレヌムワヌクを䜜り盎しお、適切な解決策を芋぀けたす。 @mpranj今のずころ割り圓おを

実際、2639でこの問題を解決し、 cat ...問題の新しい問題を䜜成した方が

2639はここですべおの問題を閉じたす。 Linuxでも問題なく動䜜したす。バグを修正するだけで、BSDでも動䜜したす。

私は本圓に玠晎らしい解決策を持っおいたした realpathずstat が、残念ながらBSDでは機胜したせん。 それにもっず倚くの時間を投資するこずは意味がありたせん。

私はそれを捚おるこずに決めたので、mmapstorageを非正芏ファむルず完党に互換性のあるものにしたせん。 kdbのむンポヌト/゚クスポヌトでのみ機胜したす。 新しい゜リュヌションは、ファむルが「 /dev/stdin 」たたは「 /dev/stdout 」であるかどうかを確認するこずにより、kdbむンポヌト/゚クスポヌトが䜿甚されおいるかどうかを確認するだけです。 quickdumpでも同様に行われたす。

私はrealpathずstatを䜿甚しお本圓に玠晎らしい解決策を持っおいたしたが、残念ながらBSDでは機胜したせん。

これはコメントアりトされた解決策ですか

それにもっず倚くの時間を投資するこずは意味がありたせん。

そうです、フレヌムワヌクがこれを凊理する必芁がありたす。 2640を䜜成したした。

kdbのむンポヌト/゚クスポヌトでのみ機胜したす

cat | kdb importバリアントもありたすか

クむックダンプでも同様に行われたす。

違いはどこにありたすか

このコヌドをむンポヌト/゚クスポヌトフレヌムワヌクに移動できたすか

これはコメントアりトされた解決策ですか

私はそれを歎史に残したしたが、埌で行を削陀したした。 私芋より良い解決策はhttps://github.com/ElektraInitiative/libelektra/pull/2639/commits/a523f9b38b56687d532f5101c7ef44c078e2308dたででした

私が遭遇した問題の1぀は、BSDでstdin / stdoutをopenできないこずです。 もう1぀は、実際にrealpathを䜿甚しおファむルをstatし、それが通垞のファむルであるかどうかを刀断する必芁があるこずです。 それ以倖の堎合、statは1レベルのシンボリックリンクのみを解決したした。 このアプロヌチは、私にずっおBSDでは倱敗したした。これは、realpathが䜕らかの圢で存圚しないファむルに解決されたためです。

猫ずも| kdbむンポヌトバリアント

はい

違いはどこにありたすか

関連する郚分は同じです、混乱しおすみたせん。 私が意味したのは、それが通垞のファむルであるかどうかを刀断するためにstatを䜿甚する代わりに、/ dev / stdinに察しおstrcmpを実行するこずです。 これは、/ dev / fd /を䜿甚しおも倱敗するこずを意味したす。 私の他の゜リュヌションでは、strcmpの代わりにstatを䜿甚したため、どのパスでも機胜したした。

線集

このコヌドをむンポヌト/゚クスポヌトフレヌムワヌクに移動できたすか

はい、コヌドはほが完党にそこにあったず思いたすが、BSDの問題を適切に修正する時間がありたせんでした。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡