Project

General

Profile

Bug(バグ) #3352

プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面が表示できない場合がある

Added by Yuya Watanabe over 6 years ago. Updated over 2 years ago.

Status:
Won't fix(対応せず)
Priority:
High(高め)
Target version:
Start date:
2013-05-21
Due date:
% Done:

0%

3.6 で発生するか:
Yes (はい)
3.8 で発生するか:
Yes (はい)

Description

概要

プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面(/pc_backend.php/plugin/list)が表示できない場合がある.

具体的には,インストールしているプラグインが多い状態で plugins.openpne.jp に接続できない場合に実行時間が大きくなり,設定によっては画面がレンダリングされない.

原因

プラグインリスト画面(/pc_backend.php/plugin/list)を表示する際,コード部としては下記部分を通るが,それぞれのプラグインについてインスタンスを生成しようとする.このとき,各生成プロセスでは registerChannel() を呼び出しており,ここで数秒ほどブロックされ,例外を握りつぶした後処理を終了して次のインスタンス生成処理に移る.このプロセスが全プラグインに対して行われるため,全体として実行時間が大きくなって表示が遅くなり,数が多い場合には表示されない.

lib/plugin/opInstalledPluginManager.class.php
 67   public function getInstalledPlugins()
 68   {
 69     $result = array();
 70 
 71     $plugins = sfContext::getInstance()->getConfiguration()->getAllOpenPNEPlugins();
 72     foreach ($plugins as $pluginName)
 73     {
 74       $result[$pluginName] = $this->getPluginInstance($pluginName);
 75     }
 76 
 77     return $result;
 78   }
lib/plugin/opPluginManager.class.php
 50       try
 51       {
 52         $environment->registerChannel($this->channel, true);     
 53       }
 54       catch (sfPluginException $e) {}

Related issues

Related to OpenPNE 3 - Backport(バックポート) #4038: プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面が表示できない場合がある Fixed(完了) 2016-11-14
Related to OpenPNE 3 - Backport(バックポート) #4039: プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面が表示できない場合がある Fixed(完了) 2016-11-14

History

#1 Updated by Yuya Watanabe over 6 years ago

  • Description updated (diff)

#2 Updated by Yuya Watanabe over 6 years ago

おそらく同じ原因になると思うのでここに記述しておきます.


リリースしようとするプラグインの開発者ロールが lead であるとき, プラグインチャンネルサーバに接続できない状態で opPlugin:define を実行したとき下記のようなメッセージを出力する.

実際には本文に書かれている部分で例外が握りつぶされている状態のため,その影響が開発者ロールの部分に影響しているのではないかと思う.

$ ./symfony opPlugin:define opCommunityTopicPlugin 1.0.5 stable "release" 
Warning: Invalid argument supplied for foreach() in /path_to_openpne_dir/lib/plugin/opPluginManager.class.php on line 102
PEAR_PackageFileManager2 Error: Package validation failed:
Error: Invalid tag order in <package>, found <date> expected one of "lead" 

#3 Updated by Shinichi Urabe almost 5 years ago

  • Priority changed from Normal(通常) to High(高め)

#4 Updated by kaoru n almost 4 years ago

  • Target version set to OpenPNE 3.9.0-old

#5 Updated by Youichi Kimura almost 4 years ago

opPlugin::__construct() より抜粋:

    $info = $this->getPackageInfo();
    if ($info)
    {
      $this->version = (string)$info->version->release;
      $this->summary = (string)$info->summary;
    }
    else
    {
      try
      {
        $manager = new opPluginManager($dispatcher);
        $package = $manager->getEnvironment()->getRegistry()->getPackage($pluginName, opPluginManager::getDefaultPluginChannelServerName());
        if ($package)
        {
          $this->version = $package->getVersion();
          $this->summary = $package->getSummary();
        }
      }
      catch (Exception $e)
      {
        $message = array(
          'fail to get plugin package information cause: '.get_class($e).' : '.$e->getMessage(),
          'priority' => sfLogger::NOTICE
        );
        $dispatcher->notify(new sfEvent($this, 'application.log', $message));

        $this->version = '';
        $this->summary = '';
      }
    }

opPlugin::getPackageInfo() は、プラグインの package.xml がローカルに存在すればその情報を返し、ファイルが無ければ false を返すメソッドです。

抜粋した上記のコードはプラグインのバージョンと説明文を取得する処理です。
もしプラグインの package.xml が存在する場合は、plugins.openpne.jp を使用せず package.xml の情報のみ使用しています。
もし package.xml が存在しない場合は、plugins.openpne.jp からパッケージ情報を取得してそこから不足しているバージョン情報等を埋めています。


package.xml が存在しない場合にプラグインチャンネルサーバーからパッケージ情報を取得しようとしている理由は http://trac.openpne.jp/ticket/3610 に記載があり、

チャネルサーバからダウンロードしてインストールした場合、プラグインのディレクトリ直下にpackage.xmlがないため。

とされています。実際に ./symfony opPlugin:install タスクを使用してプラグインをインストールすると package.xml のない状態でインストールされます。
この場合はプラグインチャンネルサーバーからパッケージ情報を取得しようとしますが、実際には plugins/.registry/ ディレクトリ以下にキャッシュされているため plugins.openpne.jp への接続は行われません。

問題となるのは、opPlugin:install によってインストールされたプラグインではなく、かつ package.xml を持たないプラグインです。このようなプラグインは plugins.openpne.jp からパッケージ情報の取得が試みられますが、この取得はほぼ失敗すると考えられます。そもそも plugins.openpne.jp にプラグインをリリースしているプラグインは前述の opPlugin:install の場合を除いて必ず package.xml を持っているためです。

#6 Updated by Youichi Kimura about 3 years ago

  • Status changed from New(新規) to Pending Review(レビュー待ち)
  • Assignee set to Youichi Kimura
  • % Done changed from 0 to 50
  • 3.6 で発生するか changed from Unknown (未調査) to Yes (はい)
  • 3.8 で発生するか changed from Unknown (未調査) to Yes (はい)

下記 Pull Request にて修正しました
https://github.com/openpne/OpenPNE3/pull/343

#7 Updated by isao sano almost 3 years ago

  • Related to Backport(バックポート) #4038: プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面が表示できない場合がある added

#8 Updated by isao sano almost 3 years ago

  • Related to Backport(バックポート) #4039: プラグインチャンネルサーバに接続できない場合に管理画面のプラグインリスト画面が表示できない場合がある added

#10 Updated by Shinichi Urabe almost 3 years ago

  • Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
  • % Done changed from 50 to 70

#11 Updated by Youichi Kimura over 2 years ago

再現手順:

  1. OpenPNE に「opPlugin:install 経由でインストールされたプラグインではなく」かつ「package.xml がないプラグイン」を plugins ディレクトリに追加する
  2. OpenPNE.yml に以下の記述を追加する
    • default_plugin_channel_server: "localhost:8081" 
      
  3. symfony cc を実行
  4. 下記コマンドを実行して応答しない状態のプラグインチャンネルサーバーを再現する (nc コマンドがインストールされた環境が必要)
    • nc -l -p 8081
      
  5. 管理画面の「プラグイン設定」を開く
    • この時、実行中の nc コマンドでは以下のような出力が確認できます
    • GET /channel.xml HTTP/1.1
      Host: localhost:8081
      User-Agent: PEAR/1.9.0/PHP/5.6.22-0+deb8u1
      Connection: close
      
  6. 500 Internal Server Error のエラーが返る

#12 Updated by isao sano over 2 years ago

  • Status changed from Pending Testing(テスト待ち) to Won't fix(対応せず)
  • % Done changed from 70 to 0

OpenPNE 3.8.23 にて対応済みであったため、対応せずとします。

Also available in: Atom PDF