tylerdurden83
11-02-2009, 10:56
Posto prima il codice:
long length = file.length();
while (true) {
if (length <= file.length()){
if ((line = input.readLine()) != null)
new myObject(line, dbM);
if (file.length() >= length)
length = file.length();
continue;
} else {
fs.close();
fileReader.close();
input.close();
file = new File(log);
fs = new FileInputStream(log);
fileReader = new InputStreamReader(fs);
input = new BufferedReader(fileReader);
length = file.length();
System.out.print("["+Utilities.getDate() + "] ");
System.out.println("["+Thread.currentThread().getName() + "] recreated [" +log+ "].");
}
try {
Thread.sleep(1000L);
//... if it's 2 am
System.out.print("["+Utilities.getDate() + "] ");
System.out.print("["+Thread.currentThread().getName() + "] ");
System.out.println("is alive.");
} catch (InterruptedException x) {
}
}
In pratica, all'avvio simulo un tail -f su un certo file, salvandomi le sue dimensioni allo startup. Il controllo sulla dimensione del file e il blocco else sono dovuti al fatto che a una certa ora del giorno, facciamo le 22, parte una cat/dev null sul file, e ho bisogno che il thread se ne accorga per ricreare lo stream e così via.
Una vulnerabilità sarebbe se la cat/dev null viene lanciata mentre il flusso di esecuzione è tra
if (file.length() >= length)
e
length = file.length();
ma se questo fosse il caso non mi troverei la System.out inclusa nel blocco try dato che il flusso entrerebbe in loop nell'if iniziale senza aver mai lanciato il blocco else.
Questa mattina, dopo che tutto ha funzionato senza problemi per un bel po', ho notato nel log che la System.out del blocco else era stata stampata, e la rotazione è andata a buon fine come sempre, tuttavia verso l'1 del mattino il thread si è apparentemente appeso, dato che non è più partita la System.out del blocco try.
myObject inserisce la linea letta in un DB, e farebbe crashare tutto se l'inserimento dovesse fallire (come è gia capitato per problemi di rete etc)
Cosa potrebbe essere successo al mio thread?
Ringrazio tutti come sempre,
TD
long length = file.length();
while (true) {
if (length <= file.length()){
if ((line = input.readLine()) != null)
new myObject(line, dbM);
if (file.length() >= length)
length = file.length();
continue;
} else {
fs.close();
fileReader.close();
input.close();
file = new File(log);
fs = new FileInputStream(log);
fileReader = new InputStreamReader(fs);
input = new BufferedReader(fileReader);
length = file.length();
System.out.print("["+Utilities.getDate() + "] ");
System.out.println("["+Thread.currentThread().getName() + "] recreated [" +log+ "].");
}
try {
Thread.sleep(1000L);
//... if it's 2 am
System.out.print("["+Utilities.getDate() + "] ");
System.out.print("["+Thread.currentThread().getName() + "] ");
System.out.println("is alive.");
} catch (InterruptedException x) {
}
}
In pratica, all'avvio simulo un tail -f su un certo file, salvandomi le sue dimensioni allo startup. Il controllo sulla dimensione del file e il blocco else sono dovuti al fatto che a una certa ora del giorno, facciamo le 22, parte una cat/dev null sul file, e ho bisogno che il thread se ne accorga per ricreare lo stream e così via.
Una vulnerabilità sarebbe se la cat/dev null viene lanciata mentre il flusso di esecuzione è tra
if (file.length() >= length)
e
length = file.length();
ma se questo fosse il caso non mi troverei la System.out inclusa nel blocco try dato che il flusso entrerebbe in loop nell'if iniziale senza aver mai lanciato il blocco else.
Questa mattina, dopo che tutto ha funzionato senza problemi per un bel po', ho notato nel log che la System.out del blocco else era stata stampata, e la rotazione è andata a buon fine come sempre, tuttavia verso l'1 del mattino il thread si è apparentemente appeso, dato che non è più partita la System.out del blocco try.
myObject inserisce la linea letta in un DB, e farebbe crashare tutto se l'inserimento dovesse fallire (come è gia capitato per problemi di rete etc)
Cosa potrebbe essere successo al mio thread?
Ringrazio tutti come sempre,
TD