8201183: sjavac build failures: "Connection attempt failed: Connection refused"

Reviewed-by: erikj, ihse
This commit is contained in:
Daniel Jeliński 2024-04-11 12:42:24 +00:00
parent ff5c9a4dde
commit ecc603ca9b

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2022, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -50,17 +50,16 @@ public class PortFile {
// Followed by a 4 byte int, with the port nr.
// Followed by a 8 byte long, with cookie nr.
private String filename;
private File file;
private File stopFile;
private final String filename;
private final File file;
private final File stopFile;
private RandomAccessFile rwfile;
private FileChannel channel;
// FileLock used to solve inter JVM synchronization, lockSem used to avoid
// JVM internal OverlappingFileLockExceptions.
// Class invariant: lock.isValid() <-> lockSem.availablePermits() == 0
private FileLock lock;
private Semaphore lockSem = new Semaphore(1);
private final Semaphore lockSem = new Semaphore(1);
private boolean containsPortInfo;
private int serverPort;
@ -89,17 +88,18 @@ public class PortFile {
}
// The rwfile should only be readable by the owner of the process
// and no other! How do we do that on a RandomAccessFile?
channel = rwfile.getChannel();
}
/**
* Lock the port file.
*/
public void lock() throws IOException, InterruptedException {
if (channel == null) {
initializeChannel();
}
lockSem.acquire();
if (rwfile != null) {
throw new IllegalStateException("rwfile not null");
}
initializeChannel();
FileChannel channel = rwfile.getChannel();
lock = channel.lock();
}
@ -110,8 +110,7 @@ public class PortFile {
public void getValues() {
containsPortInfo = false;
if (lock == null) {
// Not locked, remain ignorant about port file contents.
return;
throw new IllegalStateException("Must lock before calling getValues");
}
try {
if (rwfile.length()>0) {
@ -156,6 +155,9 @@ public class PortFile {
* Store the values into the locked port file.
*/
public void setValues(int port, long cookie) throws IOException {
if (lock == null) {
throw new IllegalStateException("Must lock before calling setValues");
}
rwfile.seek(0);
// Write the magic nr that identifies a port file.
rwfile.writeInt(magicNr);
@ -169,19 +171,19 @@ public class PortFile {
* Delete the port file.
*/
public void delete() throws IOException, InterruptedException {
// Access to file must be closed before deleting.
rwfile.close();
file.delete();
// Wait until file has been deleted (deletes are asynchronous on Windows!) otherwise we
if (!file.exists()) { // file deleted already
return;
}
// Keep trying until file has been deleted, otherwise we
// might shutdown the server and prevent another one from starting.
for (int i = 0; i < 10 && file.exists(); i++) {
for (int i = 0; i < 10 && file.exists() && !file.delete(); i++) {
Thread.sleep(1000);
}
if (file.exists()) {
throw new IOException("Failed to delete file.");
}
// allow some time for late clients to connect
Thread.sleep(1000);
}
/**
@ -210,10 +212,12 @@ public class PortFile {
*/
public void unlock() throws IOException {
if (lock == null) {
return;
throw new IllegalStateException("Not locked");
}
lock.release();
lock = null;
rwfile.close();
rwfile = null;
lockSem.release();
}