33
33
import java .lang .Thread .UncaughtExceptionHandler ;
34
34
import java .util .Arrays ;
35
35
import java .util .List ;
36
+ import java .util .Timer ;
37
+ import java .util .TimerTask ;
36
38
import java .util .logging .Level ;
37
39
import java .util .logging .Logger ;
38
40
41
+ import org .opensolaris .opengrok .configuration .RuntimeEnvironment ;
39
42
import org .opensolaris .opengrok .OpenGrokLogger ;
40
43
41
44
/**
@@ -110,12 +113,21 @@ public int exec(boolean reportExceptions) {
110
113
*/
111
114
public int exec (final boolean reportExceptions , StreamHandler handler ) {
112
115
int ret = -1 ;
113
-
114
116
ProcessBuilder processBuilder = new ProcessBuilder (cmdList );
117
+ final String cmd_str = processBuilder .command ().toString ();
118
+ final String dir_str ;
119
+ File cwd = processBuilder .directory ();
120
+ if (cwd == null ) {
121
+ dir_str = System .getProperty ("user.dir" );
122
+ } else {
123
+ dir_str = cwd .toString ();
124
+ }
125
+
115
126
if (workingDirectory != null ) {
116
127
processBuilder .directory (workingDirectory );
117
128
if (processBuilder .environment ().containsKey ("PWD" )) {
118
- processBuilder .environment ().put ("PWD" , workingDirectory .getAbsolutePath ());
129
+ processBuilder .environment ().put ("PWD" ,
130
+ workingDirectory .getAbsolutePath ());
119
131
}
120
132
}
121
133
@@ -129,6 +141,7 @@ public int exec(final boolean reportExceptions, StreamHandler handler) {
129
141
Process process = null ;
130
142
try {
131
143
process = processBuilder .start ();
144
+ final Process proc = process ;
132
145
133
146
final InputStream errorStream = process .getErrorStream ();
134
147
final SpoolHandler err = new SpoolHandler ();
@@ -148,9 +161,24 @@ public void run() {
148
161
});
149
162
thread .start ();
150
163
164
+ /*
165
+ * Setup timer so if the process get stuck we can terminate it and
166
+ * make progress instead of hanging the whole indexer.
167
+ */
168
+ Timer t = new Timer ();
169
+ t .schedule (new TimerTask () {
170
+ @ Override public void run () {
171
+ OpenGrokLogger .getLogger ().log (Level .INFO ,
172
+ "Terminating process of command {0} in directory {1} " +
173
+ "due to timeout" , new Object []{cmd_str , dir_str });
174
+ proc .destroy ();
175
+ }
176
+ }, RuntimeEnvironment .getInstance ().getCommandTimeout () * 1000 );
177
+
151
178
handler .processStream (process .getInputStream ());
152
179
153
180
ret = process .waitFor ();
181
+ t .cancel ();
154
182
process = null ;
155
183
thread .join ();
156
184
stderr = err .getBytes ();
@@ -175,17 +203,12 @@ public void run() {
175
203
}
176
204
177
205
if (ret != 0 && reportExceptions ) {
178
- int MAX_MSG_SZ = 512 ; /* limit to avoid floodding the logs */
206
+ int MAX_MSG_SZ = 512 ; /* limit to avoid flooding the logs */
179
207
StringBuilder msg = new StringBuilder ("Non-zero exit status " )
180
208
.append (ret ).append (" from command " )
181
- .append (processBuilder .command ().toString ())
182
- .append (" in directory " );
183
- File cwd = processBuilder .directory ();
184
- if (cwd == null ) {
185
- msg .append (System .getProperty ("user.dir" ));
186
- } else {
187
- msg .append (cwd .toString ());
188
- }
209
+ .append (cmd_str )
210
+ .append (" in directory " )
211
+ .append (dir_str );
189
212
if (stderr != null && stderr .length > 0 ) {
190
213
msg .append (": " );
191
214
if (stderr .length > MAX_MSG_SZ ) {
0 commit comments