diff --git a/modules/dcache/src/main/java/org/dcache/pool/repository/FlatFileStore.java b/modules/dcache/src/main/java/org/dcache/pool/repository/FlatFileStore.java index 6410191bbad..2d271d42ce9 100644 --- a/modules/dcache/src/main/java/org/dcache/pool/repository/FlatFileStore.java +++ b/modules/dcache/src/main/java/org/dcache/pool/repository/FlatFileStore.java @@ -107,7 +107,11 @@ public FileStoreState isOk() { Files.createFile(tmp); return FileStoreState.OK; } catch (IOException e) { - return FileStoreState.FAILED; + if (e.getMessage().contains("Read-only file system")) { + return FileStoreState.READ_ONLY; + } else { + return FileStoreState.FAILED; + } } } } diff --git a/modules/dcache/src/main/java/org/dcache/pool/repository/meta/db/AbstractBerkeleyDBReplicaStore.java b/modules/dcache/src/main/java/org/dcache/pool/repository/meta/db/AbstractBerkeleyDBReplicaStore.java index 81514929778..3d85658941b 100644 --- a/modules/dcache/src/main/java/org/dcache/pool/repository/meta/db/AbstractBerkeleyDBReplicaStore.java +++ b/modules/dcache/src/main/java/org/dcache/pool/repository/meta/db/AbstractBerkeleyDBReplicaStore.java @@ -35,6 +35,7 @@ import java.nio.file.Files; import java.nio.file.OpenOption; import java.nio.file.Path; +import java.nio.file.ReadOnlyFileSystemException; import java.util.Map; import java.util.Properties; import java.util.Set; @@ -154,14 +155,20 @@ public synchronized FileStoreState isOk() { Files.deleteIfExists(tmp); Files.createFile(tmp); + //TODO check if (database.isFailed()) { return FileStoreState.FAILED; } return FileStoreState.OK; } catch (IOException e) { - LOGGER.error("Failed to touch {}: {}", tmp, messageOrClassName(e)); - return FileStoreState.FAILED; + if (e.getMessage().contains("Read-only file system")) { + LOGGER.error("Filesystem in read-only mode {}: {}", tmp, messageOrClassName(e)); + return FileStoreState.READ_ONLY; + } else { + LOGGER.error("Failed to touch {}: {}", tmp, messageOrClassName(e)); + return FileStoreState.FAILED; + } } } diff --git a/modules/dcache/src/main/java/org/dcache/pool/repository/meta/db/BerkeleyDBMetaDataRepository.java b/modules/dcache/src/main/java/org/dcache/pool/repository/meta/db/BerkeleyDBMetaDataRepository.java index 644fea0ec14..39752d59e40 100644 --- a/modules/dcache/src/main/java/org/dcache/pool/repository/meta/db/BerkeleyDBMetaDataRepository.java +++ b/modules/dcache/src/main/java/org/dcache/pool/repository/meta/db/BerkeleyDBMetaDataRepository.java @@ -178,6 +178,9 @@ public void remove(PnfsId id) throws CacheException { public FileStoreState isOk() { if (_fileStore.isOk() == FileStoreState.OK && super.isOk() == FileStoreState.OK){ return FileStoreState.OK; + } else if (_fileStore.isOk() == FileStoreState.READ_ONLY && super.isOk() == FileStoreState.READ_ONLY){ + return FileStoreState.READ_ONLY; + } else { return FileStoreState.FAILED; diff --git a/modules/dcache/src/main/java/org/dcache/pool/repository/meta/file/FileMetaDataRepository.java b/modules/dcache/src/main/java/org/dcache/pool/repository/meta/file/FileMetaDataRepository.java index 3277e8b91c5..87c7eadb729 100644 --- a/modules/dcache/src/main/java/org/dcache/pool/repository/meta/file/FileMetaDataRepository.java +++ b/modules/dcache/src/main/java/org/dcache/pool/repository/meta/file/FileMetaDataRepository.java @@ -14,6 +14,7 @@ import java.nio.file.Files; import java.nio.file.OpenOption; import java.nio.file.Path; +import java.nio.file.ReadOnlyFileSystemException; import java.nio.file.StandardOpenOption; import java.util.List; import java.util.Set; @@ -191,8 +192,13 @@ public synchronized FileStoreState isOk() { Files.createFile(tmp); return FileStoreState.OK; } catch (IOException e) { - LOGGER.error("Failed to touch " + tmp + ": " + messageOrClassName(e), e); - return FileStoreState.FAILED; + if (e.getMessage().contains("Read-only file system")) { + LOGGER.error("Filesystem in read-only mode {}: {}", tmp, messageOrClassName(e)); + return FileStoreState.READ_ONLY; + } else { + LOGGER.error("Failed to touch {}: {}", tmp, messageOrClassName(e)); + return FileStoreState.FAILED; + } } } diff --git a/modules/dcache/src/main/java/org/dcache/pool/repository/v5/CheckHealthTask.java b/modules/dcache/src/main/java/org/dcache/pool/repository/v5/CheckHealthTask.java index 6067ca6ca27..f3b6cd9a769 100644 --- a/modules/dcache/src/main/java/org/dcache/pool/repository/v5/CheckHealthTask.java +++ b/modules/dcache/src/main/java/org/dcache/pool/repository/v5/CheckHealthTask.java @@ -71,6 +71,11 @@ public void run() { case OPEN: if (_replicaStore.isOk() == FileStoreState.FAILED) { _repository.fail(FaultAction.DISABLED, "I/O test failed"); + }else if (_replicaStore.isOk() == FileStoreState.READ_ONLY){ + LOGGER.error( + "Read-only file system"); + + _repository.fail(FaultAction.READONLY, "I/O test failed, READ_ONLY Error"); } if (!checkSpaceAccounting()) {