[TurboGears] master.kidをいじると、"TypeError: 'NoneType' object is not callable"が発生する、ことがある。その4

環境

この現象は、TurboGears 1.0.1で確認しました。

はじめに

この記事は、id:SumiTomohiko:20070214:1171463510の続きです。

現象

id:SumiTomohiko:20070214:1171449131と同じです。

対策

CherryPyを再起動します。

原因

分かりません。

詳細

以下のようなシェルスクリプトtest.shで、現象が発生しないか調査しました。CherryPyを起動した後、touchコマンドでmaster.kidを更新し、Rubyスクリプトtest.rbでリクエストを送信します。

#!/bin/sh

echo "$0 start."

# CherryPyを起動する。
python start-car.py > /dev/null 2>&1 &

# CherryPyが起動し終わるのを待つ。
sleep 30

# テストを実施する。
ruby test.rb > /dev/null 2>&1
n=$?
echo "Before touch: ${n}"

# master.kidを更新する。
touch car/templates/master.kid

# テストを実施する。
ruby test.rb > /dev/null 2>&1
m=$?
echo "After touch: ${m}"

# CherryPyを停止する。
ps awx | grep "python start-car.py" | awk '{print $1}' | xargs kill -TERM

exit `expr ${n} + ${m}`

# vim: tabstop=2 shiftwidth=2 expandtab

test.rbは、以下の通りです。

# ruby

require "open-uri"

url = [
  "/article/edit/",
  "/article/search/",
  "/article/list/",
  "/article/show/?id=1"]

count = 0
error_url = []
10.times do
  url.each do |s|
    begin
      address = "http://127.0.0.1:8080#{s}"
      open(address)
    rescue
      error_url.push(address)
      count += 1
    end
  end
end

puts error_url
puts count

exit(count)

# vim: tabstop=2 shiftwidth=2 expandtab

その結果、現象が再現しました。現象が発生したのは常にmaster.kidをtouchした後で、その前ではエラーにはなりませんでした。

次に、touchした後、CherryPyを再起動する次のtest-restart.shを実行しました。

#!/bin/sh

echo "$0 start."

# CherryPyを起動する。
python start-car.py > /dev/null 2>&1 &

# CherryPyが起動し終わるのを待つ。
sleep 30

# テストを実施する。
ruby test.rb > /dev/null 2>&1
n=$?
echo "Before touch: ${n}"

# master.kidを更新する。
touch car/templates/master.kid

# CherryPyを再起動する。
ps awx | grep "python start-car.py" | awk '{print $1}' | xargs kill -TERM
python start-car.py > /dev/null 2>&1 &
sleep 30

# テストを実施する。
ruby test.rb > /dev/null 2>&1
m=$?
echo "After touch: ${m}"

# CherryPyを停止する。
ps awx | grep "python start-car.py" | awk '{print $1}' | xargs kill -TERM

exit `expr ${n} + ${m}`

# vim: tabstop=2 shiftwidth=2 expandtab

その結果、エラーは発生しませんでした。

次のRubyスクリプトtest-all.rbによって、test.shとtest-restart.shを何度も実行してみましたが、結果は同じで、test.shではエラーが発生し、test-restart.shではエラーは発生しませんでした。

# ruby

scripts = ["./test.sh", "./test-restart.sh"]

error_count = [0, 0]

10.times do
  scripts.each_with_index do |script, i|
    puts "execute #{script}."
    `#{script}`
    error = $? >> 8
    puts "error: #{error}"
    error_count[i] += error
  end
end

error_count.each_with_index do |count, i|
  puts "#{scripts[i]}: total_error_count=#{count}"
end

# vim: tabstop=2 shiftwidth=2 expandtab

以上より、master.kidを更新した後は、CherryPyを再起動した方がよいと思われます。