6 返信 最新の回答 日時: Dec 9, 2014 6:04 PM ユーザー:FMJ_Support

    「サーバー上のスクリプト実行」で「終了するまで待つ」にチェックをし...

    hide2good

      概要

      「サーバー上のスクリプト実行」で「終了するまで待つ」にチェックをしても未完了で処理が継続される

      製品

      FileMaker Server

      バージョン

      13v4

      オペレーティングシステムのバージョン

      WndowsServer2010

      問題の内容

      FMS13v4にFMP Advanced v3にて接続。

      サーバで公開しているファイル内のスクリプトで、サーバスクリプトを含む処理で
      サーバの終了を待つにチェックを入れているにもかかわらず、
      サーバの処理が完了していない状態で次のスクリプトが実行されてしまう。

      問題の再現方法

      特にネットワークが遅い場合や件数が多い場合に発生する。

      以下のスクリプトを実行すると、Excelから取り込んだデータは、まずテーブルXのフィールド1にセットされ、
      スクリプトBでフィールド2にコピーされ、最終的にテーブルYのフィールド3にセットされる。

      しかし実際には、テーブルXのフィールド1と2にはExcelの値がセットされるが、テーブルYはフィールド3が
      空っぽでテーブルXと同じ件数のレコードが作られる作成されることがある。

      しかし、これをデバックモードで実行したり、全置換でダイアログありにすると再現しなくなる。

      ----------------------------------------------------------------------------------------------------------------
      スクリプトA
      レコードのインポート(Excel -> テーブルXのフィールド1)
      サーバ上のスクリプトを実行(終了するまで待つ)スクリプトB
      レコードのインポート(FileMakerのテーブルXのフィールド2 -> FileMakerのテーブルYのフィールド3)
      ----------------------------------------------------------------------------------------------------------------
      スクリプトB
      レイアウト切り替え(テーブルX)
      フィールド内容の全置換(ダイアログなし)フィールド2にフィールド1の値をセット
      ----------------------------------------------------------------------------------------------------------------

      予想された結果

      上記のスクリプトを実行すると、Excelから取り込んだデータは、まずテーブルXのフィールド1にセットされ、
      スクリプトBでフィールド2にコピーされ、最終的にテーブルYのフィールド3にセットされる。

      実際の結果

      テーブルXのフィールド1と2にはExcelの値がセットされるが、テーブルYはフィールド3が空でテーブルXと
      同じ件数のレコードが作られる。

      表示されたエラーメッセージの正確な内容

      -

      設定情報

      -

      対処方法

      サーバ上のスクリプトを実行の後に「スクリプトの一時停止/続行(1秒)」を追加する。

        • 1. Re: 「サーバー上のスクリプト実行」で「終了するまで待つ」にチェックをし...
          TSGalJ

          Hidetsugu Asada 様

          平素は弊社製品をご愛顧いただき、誠にありがとうございます。

          ご投稿の不具合について、当方にて再現ができておりませんが、一時停止を入れると安定する場合があるとのことで、パフォーマンスや実行タイミングに起因する不具合かもしれません。

          市場での不具合事例として、開発部門に報告させていただきます。

          また、ご投稿の例は実際のスクリプトとは異なり省略されていると思われますが、[レコードのインポート]スクリプトステップの前や後に、インポート状態の確認用ステップなどを挿入することで、問題発生の回避率が高まるかもしれません。

          今後とも弊社製品をよろしくお願い申し上げます。

          ファイルメーカー株式会社
          TSGalJ

          • 2. Re: 「サーバー上のスクリプト実行」で「終了するまで待つ」にチェックをし...
            hide2good

            お回答ありがとうございます。

            >ご投稿の不具合について、当方にて再現ができておりませんが、一時停止を入れると安定する場合があるとのことで、パフォーマンスや実行タイミングに起因する不具合かもしれません。

            まさにご指摘の通りだと推察しております。

            もともと、この現象を初めて確認したのは、回線の細い中国からの接続でした。

            回線が細いと全置換などが全く使い物にならなくなるため、大部分の機能をサーバスクリプトへの置き換えを行いました。

            このプログラムではファイルの取り込みや結果の確認や継続指示、データ更新などが組み合わさっており、ローカルスクリプトとサーバースクリプトを行ったり来たりします。

            その中で日本で問題なく動くものが中国で実施したら動かなかったりしたもので、どこに問題があるのかを調査している中でここにたどり着きました。

            >また、ご投稿の例は実際のスクリプトとは異なり省略されていると思われますが、[レコードのインポート]スクリプトステップの前や後に、インポート状態の確認用ステップなどを挿入することで、問題発生の回避率が高まるかもしれません。

            当然以下のようにやるべきことは実施しております。

            >>しかし、これをデバックモードで実行したり、全置換でダイアログありにすると再現しなくなる。

            サーバスクリプトの処理完了を待たずにスクリプトが継続されてしまうのが問題で、もしかするとサーバ側がデータベースの更新のリクエストを投げた時点で作業終了を返すのかもしれませんが、たとえそれであっても更新の指示を受けているデータベースが更新前の情報を提供してもらっても困るので、当方としてはバグだと認識しております。
             

            • 3. Re: 「サーバー上のスクリプト実行」で「終了するまで待つ」にチェックをし...
              fukky

              サーバー上のスクリプト実行で多量のレコードをインポートすれば分かることですが、
              処理が完了していてもクライアント側でインポートしたレコードを確認できるまでに時間が掛かることがあります。
              ODBCインポートなどで数十万件単位でインポートすると顕著に確認できます。

              数件のインポートであっても貧弱なワイドエリアネットワークなどではサーバー上では処理が完了しているものの
              クライアント側で扱えるまでに時間が掛かることが起こりえるのではないでしょうか。

              FileMaker Server としては処理がおわっていますので、
              [終了を待つ]オプションは正しく機能しているといえるでしょう。

              もちろんクライアントで確認できる状態ではじめて"終了"という仕様ならばいいのですが......
              一概に不具合とは言い難いのではないかと思います。

              レコードへの編集などはサーバー上のスクリプト実行で行い、
              表示などのみをクライアントで行うといった工夫は必要かと存じます。

              • 4. Re: 「サーバー上のスクリプト実行」で「終了するまで待つ」にチェックをし...
                hide2good

                ご回答ありがとうございます。

                >処理が完了していてもクライアント側でインポートしたレコードを確認できるまでに時間が掛かることがあります。

                レコードの確認に時間がかかることは特に問題があるとは思いません。

                排他制御の問題として、サーバが処理を投げたことを終了と解して、次のスクリプトに移行したとしても、データベースが処理中のため、同じデータベースに対する読み取りが、待たされるなら問題ないと考えております。

                問題なのは、排他制御もされていない状態で書き込み中のデータベースをデータが不完全な状態で読み込ませていることが問題だと考えております。もしそのような状態にしかコントロールできないのなら、更新が完了するところを待って終了というべきだと思います。

                そうでなければ、このスクリプトの終了を待つというオプションは存在意味がないと思います。

                 

                 

                • 5. Re: 「サーバー上のスクリプト実行」で「終了するまで待つ」にチェックをし...
                  fukky

                  メーカーの肩を持つわけではないですが、
                  求めている "終了" の定義があまりにも無茶なように思います。
                  "サーバー上での処理結果をすべてのクライアントが認識できることをサーバーが認識した時" と受け取れますが......

                  データベースはレコード単位で管理されているのですから、
                  書込がおわったレコードから順に処理可能になることは問題ないでしょう。

                  書込中のデータベースをデータベース単位で排他するというのは、複数ユーザでの運用を否定することになります。

                  "インポート対象のファイルの全体がインポートしきれていない状態"
                  これはインポート先のデータベースからしてみれば不完全ではありません。
                  ユーザの考える"完全"をスクリプトで把握する必要があるでしょう。

                  ワイドエリアネットワークなど混在環境でクライアントが認識できる状態の把握まで
                  サーバーで管理することはサーバーのパフォーマンスを著しく下げるのではないかと思います。

                  安定性の期待できないと利用側が認識できているワイドエリアネットワークでは
                  サーバーでインポートした直後にクライアントから処理をするという運用は適さないではないでしょうか。

                  • 6. Re: 「サーバー上のスクリプト実行」で「終了するまで待つ」にチェックをし...
                    FMJ_Support

                    Hidetsugu Asada 様、fukky 様

                    製品へのご意見、ご要望を賜りまして、誠にありがとうございます。

                    サーバーサイドでスクリプトを実行する機能の、スクリプトの完了を待つオプションについては、ヘルプなどの記載からすると、環境などにより期待した動作をしない場合があるのはご投稿の通りで、改善について開発部門に要望させていただいております。

                     

                    なお、以前のバージョンからとなりますが、ネットワークが細い、接続数が多い、負荷が高い環境で、クライアントとサーバーとの連携を想定したスクリプトが想定外の動作になる場合には、極力サーバー側での一括処理になるような手法をお取りいただくことで、安定性を確保できるとの情報を複数のデベロッパ様よりご報告いただいており、現状での回避方法としてご検討いただければ幸いです。

                    今後とも弊社製品をご愛顧いただきますようお願い申し上げます。

                    ファイルメーカー株式会社

                    TSgalJ