[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[kagemai-users:0337] Re: Internal Server Error の原因について



福岡です。

"Hidekazu Fukui" san wrote:
 
| 影舞 0.8.4 をインストールし、使いはじめたのですが、ときどき、500 Internal
| Server Error がでます。
| [統計]をクリックと出ることが多いように感じます。
| それでも、ブラウザを何度か「更新」するとページが表示されるようになったりしま
| す。
(snip) 
|  Apache のエラーログには、
| 
| [Wed Dec  8 18:56:17 2004] [error] mod_ruby: error in ruby
| /home/httpd/html/kagemai/lib/kagemai/kagemai.rb:89:in `action': No such
| action : admin (Kagemai::ParameterError)
| 	from ./guest.cgi:80:in `execute'
| 	from /home/httpd/html/kagemai/html/admin.rbx:8
| 	from /usr/lib/ruby/1.8/apache/ruby-run.rb:70:in `load'
| 	from /usr/lib/ruby/1.8/apache/ruby-run.rb:70:in `handler'

このエラーは、lib/kagemai/cgi/action/admin.rb というファイルが
正しくロードされていないことをあらわしています。もちろん、何度か
更新すれば表示されるということは、影舞のファイルが欠落している
わけではないはずですが。

質問ですが、このエラーは、複数の人が(あるいは一人でもタグブラウザ
などで)同時にアクセスしていないときにも発生するでしょうか。
もし、同時アクセス時にしか発生しないように思えるのであれば、
lib/kagemai/kagemai.rb に対する以下のパッチを試してみてください。

このパッチで解決しない or 単一のアクセスしかないときにも発生する
ようであれば、もう少し考えてみたいと思います。

Index: kagemai.rb
===================================================================
RCS file: /cvsroot/kagemai/kagemai/lib/kagemai/kagemai.rb,v
retrieving revision 1.2
diff -u -r1.2 kagemai.rb
--- kagemai.rb	3 Aug 2004 22:12:37 -0000	1.2
+++ kagemai.rb	9 Dec 2004 12:15:45 -0000
@@ -91,26 +91,30 @@
     end
     
     private
+    @@load_mutex = Mutex.new
+    
     def load_actions(dir)
-      # load actions
-      Dir.glob(dir + "/*\.rb").each do |action_script|
-        require action_script.untaint
-      end
-      
-      # init action map
-      actions = Hash.new
-      default = nil
-      ObjectSpace.each_object(Class) do |class_obj|
-        ancestors = class_obj.ancestors
-        ancestors.delete(class_obj)
-        if ancestors.include?(Kagemai::Action) then
-          actions[class_obj.name] = class_obj
-          default = class_obj if class_obj.default?
+      @@load_mutex.synchronize {
+        # load actions
+        Dir.glob(dir + "/*\.rb").each do |action_script|
+          require action_script.untaint
         end
-      end
         
-      raise InitializeError, 'No default action loaded.' unless default
-      [actions, default]
+        # init action map
+        actions = Hash.new
+        default = nil
+        ObjectSpace.each_object(Class) do |class_obj|
+          ancestors = class_obj.ancestors
+          ancestors.delete(class_obj)
+          if ancestors.include?(Kagemai::Action) then
+            actions[class_obj.name] = class_obj
+            default = class_obj if class_obj.default?
+          end
+        end        
+        raise InitializeError, 'No default action loaded.' unless default
+        [actions, default]
+      }
     end
+    
   end
 end

-- 
福岡ともゆき <fukuoka@xxxxxxxxxxxxx>
http://www.daifukuya.com/