Add thread-safety when reading the bulkImportReport-files.

This commit is contained in:
Lampros Smyrnaios 2023-09-15 11:54:32 +03:00
parent 846c53913f
commit 903c3e1ffc
2 changed files with 7 additions and 3 deletions

View File

@ -224,6 +224,8 @@ public class BulkImportController {
// Write the contents of the report-file to a string (efficiently!) and return the whole content as an HTTP-response.
final StringBuilder stringBuilder = new StringBuilder(25_000);
String line;
FileUtils.fileAccessLock.lock();
try ( BufferedReader in = new BufferedReader(new InputStreamReader(Files.newInputStream(Paths.get(this.bulkImportReportLocation, bulkImportReportId + ".json"))), FileUtils.twentyFiveKb) ) {
while ( (line = in.readLine()) != null )
stringBuilder.append(line).append("\n"); // The "readLine()" does not return the line-term char.
@ -234,6 +236,8 @@ public class BulkImportController {
String errorMsg = "Failed to read the contents of report-file with ID: " + bulkImportReportId;
logger.error(errorMsg, e);
return ResponseEntity.internalServerError().body(errorMsg); // It's ok to give the file-path to the user, since the report already contains the file-path.
} finally {
FileUtils.fileAccessLock.unlock();
}
String json = stringBuilder.toString().trim();

View File

@ -698,12 +698,12 @@ public class FileUtils {
}
private static final Lock fileWriteLock = new ReentrantLock(true);
public static final Lock fileAccessLock = new ReentrantLock(true);
public String writeToFile(String fileFullPath, String stringToWrite, boolean shouldLockThreads)
{
if ( shouldLockThreads ) // In case multiple threads write to the same file. for ex. during the bulk-import procedure.
fileWriteLock.lock();
fileAccessLock.lock();
try ( BufferedWriter bufferedWriter = new BufferedWriter(Files.newBufferedWriter(Paths.get(fileFullPath)), halfMb) )
{
@ -714,7 +714,7 @@ public class FileUtils {
return errorMsg;
} finally {
if ( shouldLockThreads )
fileWriteLock.unlock();
fileAccessLock.unlock();
}
return null;
}