{"record":{"id":"fe01c93911c336fe","repo":"pentaho/pentaho-kettle","slug":"repositorymeta-error-writingmetadata","errorCode":null,"errorMessage":"RepositoryMeta.Error.WritingMetadata","messagePattern":"RepositoryMeta\\.Error\\.WritingMetadata","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/repository/RepositoriesMeta.java","lineNumber":374,"sourceCode":"      retval += conn.getXML();\n    }\n\n    for ( int i = 0; i < nrRepositories(); i++ ) {\n      RepositoryMeta ri = getRepository( i );\n      retval += ri.getXML();\n    }\n\n    retval += \"  </repositories>\" + Const.CR;\n    return retval;\n  }\n\n  public void writeData() throws KettleException {\n    try {\n      FileOutputStream fos = new FileOutputStream( new File( getKettleUserRepositoriesFile() ) );\n      fos.write( getXML().getBytes() );\n      fos.close();\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"RepositoryMeta.Error.WritingMetadata\" ), e );\n    }\n  }\n\n  public String toString() {\n    return getClass().getSimpleName();\n  }\n\n  public RepositoriesMeta clone() {\n    RepositoriesMeta meta = new RepositoriesMeta();\n    meta.clear();\n    for ( DatabaseMeta dbMeta : databases ) {\n      meta.addDatabase( dbMeta );\n    }\n    for ( RepositoryMeta repMeta : repositories ) {\n      meta.addRepository( repMeta.clone() );\n    }\n    return meta;\n  }","sourceCodeStart":356,"sourceCodeEnd":392,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/repository/RepositoriesMeta.java#L356-L392","documentation":"RepositoriesMeta.writeData() serializes the in-memory repository list with getXML() and writes it to the file returned by getKettleUserRepositoriesFile() (typically ~/.kettle/repositories.xml). Any exception creating or writing the FileOutputStream is wrapped in a KettleException with message \"RepositoryMeta.Error.WritingMetadata\" (\"Error writing metadata to repositories.xml\").","triggerScenarios":"Calling writeData() (e.g. after addRepository() to persist a new repository definition) when the target directory does not exist, the process lacks write permission, the disk is full, or getXML() serialization fails.","commonSituations":"First run where ~/.kettle does not exist; read-only home directory or restricted service account (e.g. Pentaho server running as a user without a writable HOME); disk quota exceeded; antivirus locking the file on Windows.","solutions":["Ensure the directory ~/.kettle exists and is writable by the process user (mkdir and chown/chmod as needed).","Check that the KETTLE_HOME / user home resolves correctly for the account running the JVM.","Free disk space or raise the quota if the disk is full.","Close other processes locking repositories.xml (editors, sync clients, antivirus scans).","Inspect the wrapped cause for the precise IOException (e.g. FileNotFoundException => path/permission issue)."],"exampleFix":"// before: assumes ~/.kettle exists\nrepositoriesMeta.addRepository(repoMeta);\nrepositoriesMeta.writeData();\n// after: guarantee the directory exists first\nFile kettleDir = new File(System.getProperty(\"user.home\"), \".kettle\");\nif (!kettleDir.exists() && !kettleDir.mkdirs()) {\n  throw new IllegalStateException(\"Cannot create \" + kettleDir);\n}\nrepositoriesMeta.addRepository(repoMeta);\nrepositoriesMeta.writeData();","handlingStrategy":"validation","validationCode":"File f = new File(repositoriesMeta.getKettleUserRepositoriesFile());\nFile dir = f.getParentFile();\nif (dir != null && !dir.canWrite()) throw new IllegalStateException(\"Cannot write to \" + dir);","typeGuard":null,"tryCatchPattern":"try { repositoriesMeta.writeData(); } catch (KettleException e) { log.error(\"Failed writing repositories.xml\", e); throw new IllegalStateException(\"Check ~/.kettle writability and disk space\", e); }","preventionTips":["Create ~/.kettle with correct ownership before first run","Run services under an account with a writable HOME","Monitor disk space/quota on hosts running PDI","Avoid concurrent processes writing repositories.xml simultaneously"],"tags":["file-io","repository-metadata","persistence","pdi"],"backgroundTag":"file-write-failed","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}