Errno::EPIPE: Broken pipe:


#1

ciao,
ho questo pezzo di codice in enviroment.rb:

fork do
ticker = CalTicker.new()
ticker.run
end

def run
loop do
appointments = Calendariable.find(:all, :conditions =>
“(start_time BETWEEN '#{Time.now.strftime(”%F %H:00")}’ AND '#{(Time.now

  • 3600).strftime("%F %H:00")}’)")
    appointments.each do |appo|
    appo.calendar_type.camelcase.constantize.find(appo.calendar_id).trigger_now()
    end
    sleep 3600
    end
    end

problema, appena faccio un altra query al db (quindi appena carico una
pagina del sito) mi parte un
"Errno::EPIPE: Broken pipe: SELECT * FROM “calendariables” WHERE
((start_time BETWEEN ‘2009-03-31 12:00’ AND ‘2009-03-31 13:00’) AND
deleted = ‘false’) "

Qualche idea?

Preferirei non dover fare un demone esterno all’applicazione…


#2

Ciao!

E’ un problema di Rails o uno del db? Che dice il suo log?

Paolo

Alessandro S. wrote:

ciao,
ho questo pezzo di codice in enviroment.rb:

fork do
ticker = CalTicker.new()
ticker.run
end

def run
loop do
appointments = Calendariable.find(:all, :conditions =>
“(start_time BETWEEN '#{Time.now.strftime(”%F %H:00")}’ AND '#{(Time.now

  • 3600).strftime("%F %H:00")}’)")
    appointments.each do |appo|
    appo.calendar_type.camelcase.constantize.find(appo.calendar_id).trigger_now()
    end
    sleep 3600
    end
    end

problema, appena faccio un altra query al db (quindi appena carico una
pagina del sito) mi parte un
"Errno::EPIPE: Broken pipe: SELECT * FROM “calendariables” WHERE
((start_time BETWEEN ‘2009-03-31 12:00’ AND ‘2009-03-31 13:00’) AND
deleted = ‘false’) "

Qualche idea?

Preferirei non dover fare un demone esterno all’applicazione…


#3

il log di postgres dice :

2009-03-31 17:11:20 CEST LOG: unexpected EOF on client connection

Paolo M. wrote:

Ciao!

E’ un problema di Rails o uno del db? Che dice il suo log?

Paolo


#4

Alessandro S. wrote:

il log di postgres dice :

2009-03-31 17:11:20 CEST LOG: unexpected EOF on client connection

Sostanzialmente hai un loop infinito in environment.rb che fa query al
db e poi delle normali query nei controller. L’impressione è che questo
tipo di concorrenza non sia gestito o da rails o dal driver postgres ma
non è che googlando abbia trovato granché tranne questo pastie che non
ho capito se ha a che fare col tuo caso
http://pastie.org/pastes/11811/reply
Forse la scarsità di risultati è dovuto al fatto che a pochi è venuto in
mente di usare environment.rb come deamon e non come semplice script di
configurazione :wink:

Eventualmente prova ad aggiungere config.threadsafe! alla configurazione
(solo con la 2.3). Se il problema era la concorrenza non supportata,
magari così lo sistema.

Però perché non sposti quel codice in uno script da lanciare con
script/runner? Ti occuperà più ram ma sicuramente sopravviverà meglio al
tempo e alle prossime release di Rails. Proprio oggi un piccolo
pasticcio che ho fatto un paio d’anni fa mi si è ritorto contro
facendomi perdere tre d’ore tra debug e sistemazione del codice (è
un’altra puntata della mia serie “migrazione a rails 2.3 e gettext”).
Meglio usare le soluzioni canoniche, anche quando sembrano meno
brillanti di quelle che ci inventiamo :slight_smile:

Paolo


#5

Alessandro S. wrote:

Volevo evitare di usare DRB o simili ma mi sà che alla fine mi tocca…

Non usare DRb. Fai invece un programmino ruby a parte e lancialo con
script/runner così ti carica i modelli e le configurazione di rails ed
accedi al db con activerecord. Se stai su Unix fallo poi partire con uno
script in
/etc/init.d insieme all’applicazione rails così sopravvive ai reboot
pure lui.

Paolo


#6

Però perché non sposti quel codice in uno script da lanciare con
script/runner? Ti occuperà più ram ma sicuramente sopravviverà meglio al
tempo e alle prossime release di Rails. Proprio oggi un piccolo
pasticcio che ho fatto un paio d’anni fa mi si è ritorto contro
facendomi perdere tre d’ore tra debug e sistemazione del codice (è
un’altra puntata della mia serie “migrazione a rails 2.3 e gettext”).
Meglio usare le soluzioni canoniche, anche quando sembrano meno
brillanti di quelle che ci inventiamo :slight_smile:

Paolo

Volevo evitare di usare DRB o simili ma mi sà che alla fine mi tocca…