6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /**
25 * @test
26 * @bug 8137121
27 * @summary (fc) Infinite loop FileChannel.truncate
28 * @run main/othervm LoopingTruncate
29 */
30
31 import java.nio.ByteBuffer;
32 import java.nio.channels.FileChannel;
33 import java.nio.file.Files;
34 import java.nio.file.Path;
35 import static java.nio.file.StandardOpenOption.*;
36
37 public class LoopingTruncate {
38
39 // (int)FATEFUL_SIZE == -3 == IOStatus.INTERRUPTED
40 static long FATEFUL_SIZE = 0x1FFFFFFFDL;
41
42 static long TIMEOUT = 10_000; // 10 seconds
43
44 public static void main(String[] args) throws Throwable {
45 Path path = Files.createTempFile("LoopingTruncate.tmp", null);
46 try {
47 Thread th = new Thread(() -> {
48 try (FileChannel fc = FileChannel.open(path, CREATE, WRITE)) {
49 fc.position(FATEFUL_SIZE + 1L);
50 fc.write(ByteBuffer.wrap(new byte[] {0}));
51 fc.truncate(FATEFUL_SIZE);
52 } catch (Exception e) {
53 throw new RuntimeException(e);
54 }});
55 th.start();
56 th.join(TIMEOUT);
57
58 if (th.isAlive()) {
59 th.interrupt();
60 throw new RuntimeException("Failed to complete on time");
61 }
62 } finally {
63 Files.deleteIfExists(path);
64 }
65 }
66 }
|
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 /**
25 * @test
26 * @bug 8137121 8137230
27 * @summary (fc) Infinite loop FileChannel.truncate
28 * @run main/othervm LoopingTruncate
29 */
30
31 import java.nio.ByteBuffer;
32 import java.nio.channels.FileChannel;
33 import java.nio.channels.ClosedByInterruptException;
34 import java.nio.file.Files;
35 import java.nio.file.Path;
36 import static java.nio.file.StandardOpenOption.*;
37
38 public class LoopingTruncate {
39
40 // (int)FATEFUL_SIZE == -3 == IOStatus.INTERRUPTED
41 static long FATEFUL_SIZE = 0x1FFFFFFFDL;
42
43 static long TIMEOUT = 20_000; // 20 seconds
44
45 public static void main(String[] args) throws Throwable {
46 Path path = Files.createTempFile("LoopingTruncate.tmp", null);
47 try (FileChannel fc = FileChannel.open(path, CREATE, WRITE)) {
48 fc.position(FATEFUL_SIZE + 1L);
49 fc.write(ByteBuffer.wrap(new byte[] {0}));
50
51 Thread th = new Thread(() -> {
52 try {
53 fc.truncate(FATEFUL_SIZE);
54 } catch (ClosedByInterruptException ignore) {
55 } catch (Exception e) {
56 throw new RuntimeException(e);
57 }});
58 th.start();
59 th.join(TIMEOUT);
60
61 if (th.isAlive()) {
62 System.err.println("Stack trace of the guilty thread:");
63 for (StackTraceElement el : th.getStackTrace()) {
64 System.err.println("\t" + el);
65 }
66 System.err.println();
67
68 th.interrupt();
69 th.join();
70 throw new RuntimeException("Failed to complete on time");
71 }
72 } finally {
73 Files.deleteIfExists(path);
74 }
75 }
76 }
|