Make assets watchers run as singletons

Previously, multiple copies of the watchers started from the different
shells would run simultaneously, which left the possiblity of zombie
watchers, increased resource consumption, and incorrect results. This
fixes that problem by only starting a watcher if that same command isn't
already in the process list.

Fixes LMS-499
This commit is contained in:
Calen Pennington
2013-06-14 21:17:08 -04:00
parent d99ad53ae9
commit 64912a7741
4 changed files with 18 additions and 2 deletions

View File

@@ -5,6 +5,9 @@ These are notable changes in edx-platform. This is a rolling list of changes,
in roughly chronological order, most recent first. Add your entries at or near
the top. Include a label indicating the component affected.
Common: Make asset watchers run as singletons (so they won't start if the
watcher is already running in another shell).
Common: Make rake provide better error messages if packages are missing.
Common: Repairs development documentation generation by sphinx.

View File

@@ -4,3 +4,4 @@ gem 'sass', '3.1.15'
gem 'bourbon', '~> 1.3.6'
gem 'colorize', '~> 0.5.8'
gem 'launchy', '~> 2.1.2'
gem 'sys-proctable', '~> 0.9.3'

View File

@@ -114,9 +114,9 @@ namespace :assets do
task :_watch => (prereq_tasks + ["assets:#{asset_type}:debug"]) do
cmd = send(asset_type.to_s + "_cmd", watch=true, debug=true)
if cmd.kind_of?(Array)
cmd.each {|c| background_process(c)}
cmd.each {|c| singleton_process(c)}
else
background_process(cmd)
singleton_process(cmd)
end
end
end

View File

@@ -1,4 +1,6 @@
require 'digest/md5'
require 'sys/proctable'
require 'colorize'
def find_executable(exec)
path = %x(which #{exec}).strip
@@ -84,6 +86,16 @@ def background_process(*command)
end
end
# Runs a command as a background process, as long as no other processes
# tagged with the same tag are running
def singleton_process(*command)
if Sys::ProcTable.ps.select {|proc| proc.cmdline.include?(command.join(' '))}.empty?
background_process(*command)
else
puts "Process '#{command.join(' ')} already running, skipping".blue
end
end
def environments(system)
Dir["#{system}/envs/**/*.py"].select{|file| ! (/__init__.py$/ =~ file)}.map do |env_file|
env_file.gsub("#{system}/envs/", '').gsub(/\.py/, '').gsub('/', '.')