• WSUSでmovecontent完了後、sqlserverがCPU 100%に貼りついて何もできなくなった話

    結論

    WSUSサーバのディスク容量が逼迫してきたので、HDDを増設しContentを移動したが、 (この環境では)movecontentしないでアンインストール& 再インストール時にWsusContentのpathを変更した方がよかった。

    経緯

    HDD増設後NTFSフォーマットして、新ドライブ下フォルダにWsusContentを移動

    > cd "C:\Program Files\Update Services\Tools" 
    > wsusutil.exe movecontent F:\WSUS F:\move.log
    

    wsustil.exeが完了、コマンドプロンプトに戻ってきた。 上記move.logの内容は下記のとおりで正常に終わったぽい。

    2015-05-08T11:58:50 Successfully stopped WsusService.
    2015-05-08T11:58:50 Beginning content file location change to F:\WSUS
    2015-05-08T13:11:16 Successfully copied content files.
    2015-05-08T13:11:16 Successfully copied application files.
    2015-05-08T13:11:30 Successfully changed WUS configuration.
    2015-05-08T13:11:31 Successfully changed IIS virtual directory path.
    2015-05-08T13:11:31 Successfully removed existing local content network shares.
    2015-05-08T13:11:31 Successfully created local content network shares.
    2015-05-08T13:11:31 Successfully changed registry value for content store directory.
    2015-05-08T13:11:31 Successfully changed content file location.
    2015-05-08T13:11:33 Successfully started WsusService.
    2015-05-08T13:11:33 Content integrity check and repair...
    2015-05-08T13:11:37 Initiated content integrity check and repair.
    

    で、WSUS管理コンソールを開いたら応答がなく、 タスクマネージャーで確認したら、sqlserver(Windows Internal Databaseを使用)が CPUを食い尽くしていた。(4コア機なので実際は25%)

    WSUSのログ"C:\Program Files\Update Services\LogFiles\SoftwareDistribution.log"を確認すると、SQLserverへの接続がタイムアウトしたというエラーが出ている。 上記move.logの最後にあるように、wsusutil.exeの実行は終了しても その後wsusservice実行の中で整合性チェック&repairが呼出されるらしい。

    この処理に要する時間は、更新の数に依存するらしいが目安は不明。 以下のURLによれば「in some cases several days」もあり得るという。

    https://social.technet.microsoft.com/Forums/en-US/99df985b-f88b-471b-9b66-fd92203de323/wsus-not-working-after-movecontent?forum=winserverwsus

    開発の都合で、多数の製品を同期しており更新の数は多かった。 (管理コンソールが開かなくなったので確認できていない。 WsusContent下のファイル数でいえば3万ぐらいだったと思う)

    結局、1週間たってもCPU貼りつき状態のままだったのでアンインストール&再インストールした。 ネットワーク環境の問題もあるので一般化できないが、メタデータ同期+コンテンツDLしなおしで3日必要だった。

    環境

    • Windows Server 2008 R2 SP1
      • Windows Internal Database
      • WSUS 3.0 SP2
  • GAEアプリケーションを HRDに移行

    移行といっても「GAEに移行した」のとおり、static contentをservletで公開しているだけなのでdashboardのdeprecate警告を消したかっただけ。

    Master/Slave から HRD への移行にあるようにM/Sなアプリケーションを複製し、HRDなアプリケーションを作成。
    DataStoreを使ってないのでMigration Toolを実行することもなし。
    ついでにApp Engine SDKを最新化したら、appengine-web.xmlに<threadsafe>指定が必須になってたらしく追記。

    参考:appengine-web.xml does not contain a <threadsafe> element

    独自ドメインで公開しているアプリケーションをどうやって設定するのか忘れてしまっていた。

    GAEアプリケーションは、http://some-appid.appspot.comという感じのURLで公開される。
    (2年前の話なので今も同じかわからないが)独自ドメインで公開する場合は、そのドメインでGoogle Appsを利用できるようにしておいて、Google Appsから利用するサービスとして登録する。

    このサイトの場合、

    1. breeze.ccドメインのDNSに、ghs.google.comを指すCNAMEレコードとしてpassing.breeze.ccを登録する(ここの場合、既に登録済)
    2. GAEのダッシュボードから、移行後アプリケーションのApplication Settings→Domain Setup→Add Domainでドメイン名追加(ここならbreeze.cc)
    3. Google Appsのダッシュボードから、設定→「(移行前アプリケーション) の設定」で、http://passing.breeze.cc/を削除
    4. 同様に「(移行後アプリケーション)の設定」で、http://passing.breeze.cc/を追加

    という感じ。

  • redmineの プラグインを 2.0から 2.1に移行する

    前回と似たような話。

    自分ところのプラグインでredmine 2.1向けに影響があったのは以下のとおり。

    1. prototype/script.aculo.us→ jQuery
    2. wikiマクロ出力の変化

    1はなんというか地道にjQuery向けに書きなおした。

    2。今まではwikiマクロからStringを返すとhtml(を表す文字列)だったけど、HTMLエスケープされるように変わった。htmlとして出力してという表明が必要になった。といってもhtml_safeメソッドを呼んであげるだけ。
    wikiマクロの中から例外を飛ばしてエラーメッセージを出したい時に、例外オブジェクトに与えるmesageをhtmlエスケープしてあげないといけない不自然さがなくなったのはよかった。

         macro  :graphviz_me do |wiki_content_obj, args|
    m = WikiGraphvizHelper::Macro.new(self, wiki_content_obj)
    m.graphviz_me(args, params[:id]).html_safe
    end

    https://github.com/tckz/redmine-wiki_graphviz_plugin
    https://github.com/tckz/redmine_wiki_preview_ext
    https://github.com/tckz/redmine_wiki_astah

    redmine 2.1におけるwikiマクロに関する最も大きな変化は、マクロの引数に複数行テキストを使用できるようになったことだなー。

    #3061 Let macros optionally match over multiple lines and ignore single curly braces

    今までredmine本体に手を入れないといけなかったWiki External Filter Pluginがそのまま動くようにできるから、対応図種が豊富なこれでいいやん、て。

  • redmineの プラグインを 2.0用に移行する

    Redmineによるタスクマネジメント実践技法

    redmine 2.0がリリースされて一ヶ月ちょい。
    新featureが出てくる前に自作のプラグインも移行しておかないとなーと思いつつ放置してたんだけど、やっと手をつけた。

    以下のURLを参考にした。

    Redmine 2.0.xにプラグインを移植する
    Redmine2.0へのプラグインのマイグレーションについて


    自分のところでひっかかったこと。

    • RAILS_ROOTが使えない
       → Rails.root
    • RAILS_DEFAULT_LOGGERが使えない
       →Rails.logger
    • RAILS_ROOT/vendor/plugin/が変更された
       →RAILS_ROOT/plugin/
    • routesの定義の仕方
       →ActionController::Routing::Routes.draw からRedmineApp::Application.routes.drawに
      RedmineApp::Application.routes.draw do
        match 'projects/:project_id/wiki/:id/graphviz', :to => 'wiki_graphviz#graphviz'
      end
      
    • テンプレートのファイル名が変わった
       →*.rhtml から *.html.erbに
    • テスト用webサーバ他のコマンドが変わった
       →./script/sever から ./script/rails server に
       →./script/runner から ./script/rails runner に
    • ActionController::Base.cache_configured? がprivateになった
       →意図が違うが ActionController::Base.perform_caching で代替


    ここからはredmine 2.0への移行じゃなくて、ruby 1.8から1.9に変えたことでひっかかったこと。

    • String#eachがなくなった
       →String#each_line とか
    • proc+ブロックで得たProcオブジェクトのブロック内でreturnしたら呼び出し元メソッドがreturnした
      これを知らなくてすごく悩んだ。
      Redmineのviewフック内でコントローラにrender_to_stringをsendしている。
      テンプレート内でクロージャ(proc由来のProcオブジェクト)を使ってtrue/falseを返しているつもりだったのだけど、viewフックメソッドからtrueが返る状態になってしまった。
      lambdaに変更した。


    それぞれremdine-2.0ブランチ
    https://github.com/tckz/redmine-wiki_graphviz_plugin
    https://github.com/tckz/redmine_wiki_preview_ext
    https://github.com/tckz/redmine_wiki_astah


    でも、redmine 2.0系のfeatureが増えてくるまでは、運用環境は1.4系のままかな。

  • redmineの wikiのプレビュー表示を移動可能にする

    ss.png redmineの wikiマクロで graphviz その4で編集中の内容で画像を描画できるようになった。
    だけど、プレビュー表示領域は編集領域の下方にあるため、dotをちょっと直して→画像確認→ちょっと直す、ということを繰り返そうと思うと都度上下に行ったり来たりしないといけないので面倒。

    プレビュー領域をドラッグして見やすい位置に移動したい。右側とか。

    ということで、wikiページ編集のプレビュー表示をドラッグ可能にするwiki_preview_extプラグイン
    https://github.com/tckz/redmine_wiki_preview_ext


    viewのフックを使って所定のコントローラ×アクションの場合に、javascriptコードを差し込んでドラッグ可能にする。
        class ViewListener < Redmine::Hook::ViewListener
    def view_layouts_base_body_bottom(context)
    context[:controller].send(:render_to_string,
    :template => 'wiki_preview_ext/body_bottom',
    :layout => false,
    :locals => {:context => context})
    end
    end
    redmine 1.3はscript.aculo.usを使っているのでこれをそのまま使わせてもらい、Draggableでdiv#previewをまるごと移動できるようにした。
        new Draggable(preview, {scroll: window});
    preview.setStyle({cursor: "move"});
    ノブを付けたかったけど、プレビュー機能がdiv配下をAjax.Updaterで更新しているのと、当該要素周辺の構造は変えないようにしたかったのでdiv全体にDraggable適用した。

    wikにオートプレビュー機能を追加するプラグインは既にあって、編集と同時にプレビュー更新することができる。
    既存のオートプレビュープラグインと併用するか、wiki_preview_extプラグインのオートプレビュー機能をプラグイン設定画面で有効にする。