Trinacria Grid Virtual Laboratory GFAL: Grid File Access Library Java API Diego Scardaci INFN - Catania Progetto Trigrid Catania, 30.06.2006 FESR www.trigrid.it GFAL: Grid File Access Library GFAL: Libreria client POSIX (like) I/O per l’accesso diretto ai dati Perché GFAL: • L’interazione con gli SE richiede l’utilizzo di alcuni componenti: – Servizio di file catalog per localizzare le repliche – Storage Resource Management (SRM) – Meccanismi di accesso ai file da un SE sul Worker Node. • GFAL effettua questi task per te: – Nasconde queste interazioni all’utente – Fornisce un’interfaccia POSIX per le operazioni di I/O; – Utilizza la shared library (versioni threaded e unthreaded): libgfal.so, libgfal_pthr.so – Richiede un unico header file: gfal_api.h – Fornisce all’utente tutti I comandi necessari per lo storage management – Offre un’interfaccia all’SRM • Protocolli supportati: – file (accesso locale o nfs-like) – dcap, gsidcap and kdcap (accesso dCache) – rfio (accesso castor) e gsirfio (dpm) Catania, Progetto TriGrid VL, 30.06.2006 2 GFAL: File I/O C API (I) int gfal_access (const char *path, int amode); int gfal_chmod (const char *path, mode_t mode); int gfal_close (int fd); int gfal_creat (const char *filename, mode_t mode); off_t gfal_lseek (int fd, off_t offset, int whence); int gfal_open (const char * filename, int flags, mode_t mode); ssize_t gfal_read (int fd, void *buf, size_t size); int gfal_rename (const char *old_name, const char *new_name); ssize_t gfal_setfilchg (int, const void *, size_t); int gfal_stat (const char *filename, struct stat *statbuf); Catania, Progetto TriGrid VL, 30.06.2006 3 GFAL: File I/O C API (II) int gfal_unlink (const char *filename); ssize_t gfal_write (int fd, const void *buf, size_t size); int gfal_closedir (DIR *dirp); int gfal_mkdir (const char *dirname, mode_t mode); DIR *gfal_opendir (const char *dirname); struct dirent *gfal_readdir (DIR *dirp); int gfal_rmdir (const char *dirname); Catania, Progetto TriGrid VL, 30.06.2006 4 GFAL: File I/O Java API Motivazione: • Fornire delle API GFAL al sempre più vasto gruppo di programmatori Java. Perché Java: • Velocità di sviluppo • Semplicità di sviluppo (maggior numero di programmatori disponibili) • “Write once, run anywhere" Catania, Progetto TriGrid VL, 30.06.2006 5 GFAL Java API: Le classi • GFalFile: rappresentazione di un file remoto (memorizzato su uno SE). • GFalDirectory: rappresentazione di una directory remota di uno SE. • GFalUtilities: raggruppa alcune importanti utility. Catania, Progetto TriGrid VL, 30.06.2006 6 GFalFile: createFile • public int createFile(String name, int mode, boolean isSurl, boolean isLargeFile) throws GFalFileException – name = nome logico di uno SE o un SURL (es. srm://aliserv6.ct.infn.it/dpm/ct.infn.it/home/gilda/generated/2006-0622/filetest) – mode = permessi di accesso da associare al file che si sta creando. – isSurl = se “true” il parametro name contiene un SURL, se “false” il parametro name contiene il nome di uno SE – isLargeFile = se “true” indica che il file deve essere creato come large file (fino a 263 bytes). Catania, Progetto TriGrid VL, 30.06.2006 7 GFalFile: openFile • public int openFile(String fileName, int flags, int mode, boolean isLargeFile) throws GFalFileException – name = il nome del file in uno dei seguenti formati: lfn, guid, SURL o TURL. – flags = OR delle seguenti costanti: READONLY, WRITEONLY, CREAT, LARGEFILE (se utilizzi CREAT name non può essere nè un lfn nè un GUID). – mode = permessi di accesso associati al file che si sta creando. – isLargeFile = indica se è o non è un large file. Catania, Progetto TriGrid VL, 30.06.2006 8 GFalFile: gli altri metodi public byte[] readFile(int size) Legge size bytes dal file precedentemente aperto. public int writeFile(byte[] buffer) Scrive l’array di bytes buffer sul file precedentemente aperto. public long lseekFile(long offset, int seekMode, boolean isLargeFile) Posiziona/Riposiziona ad offset il puntatore del file associato a questo oggetto. public int closeFile() Chiude il file. public int lfcRegisterFile(java.lang.String logical FileName) Registra il file associato a questo oggetto nel catalogo lfc. public java.lang.String getSurl() Restituisce il SURL del file associato a questo oggetto. Catania, Progetto TriGrid VL, 30.06.2006 9 GFalDirectory public int openDir(String dirName) Apre una directory. public String[] readDir() Legge il contenuto di una directory. public int closeDir() Chiude una directory. public static int makeDir(String dirName, int mode) Crea una directory. public static int rmDir(String dirName) Cancella una directory. Catania, Progetto TriGrid VL, 30.06.2006 10 GFalUtilities public int accessFile(java.lang.String fileName, int mode) Controlla l’esistenza o l’accessibilità di un file/directory path, in base al bit pattern settato in mode, utilizzando l’ID dell’utente reale. public int chmodFile(java.lang.String fileName, int mode) Cambia la modalità di accesso ad un file o a una directory. public long[] statFile(java.lang.String fileName, boolean largeFile) Restituisce informazioni relative ad un file/directory (ad es. la dimensione). public long[] lstatFile(java.lang.String fileName, boolean largeFile) Come statFile eccetto per i link simbolici. In questo caso sono restituite informazioni relative al link e non al file puntato dal link. public int renameFile(java.lang.String oldName, java.lang.String newName) Rinomina un file/directory. public int deleteFile(java.lang.String fileName) Cancella un file/directory. Catania, Progetto TriGrid VL, 30.06.2006 11 Configurare l’ambiente • Librerie GFAL: gfal.jar, libGFalFile.so e libgfal.so • Variabili d’ambiente: – – – – LCG_RFIO_TYPE=<SE type> (es. LCG_RFIO_TYPE=dpm) LCG_GFAL_VO=<your VO> LD_LIBRARY_PATH=<path libGFalFIle.so>:$LD_LIBRARY_PATH CLASSPATH=<path gfal.jar>:$CLASSPATH • Librerie aggiuntive: lcg_util, globus_ftp_client_gcc32, globus_gass_copy_gcc32 • Prima di eseguire un applicativo che utilizza le API GFAL assicurati di possedere un proxy valido. Catania, Progetto TriGrid VL, 30.06.2006 12 GFAL JAVA API: Un esempio import it.infn.catania.gfal.*; public class Sample { public static void main (String args[]) { String fileName = "aliserv6.ct.infn.it"; try { GFalFile gFalFile= new GFalFile(); gFalFile.createFile(fileName,644,false,false); byte[] dati = new byte[1024]; int ret = gFalFile.writeFile(dati); if (ret==-1) { System.exit(1); } ret = gFalFile.closeFile(); if (ret==-1) { System.exit(1); } ret = gFalFile.lfcRegisterFile(“lfn:/grid/gilda/test/1.dat”); if (ret==-1) { System.exit(1); } } catch (GFalFileException exc) { exc.printStackTrace(); } Catania, Progetto TriGrid VL, 30.06.2006 13 }} GFAL JAVA API: Soluzione Tecnica APPLICATIVO JAVA J N I GFAL API JAVA WRAPPER GFAL API GFAL API C SERVIZI GRID Catania, Progetto TriGrid VL, 30.06.2006 14 GFAL JAVA API: Soluzione Tecnica Classe Java: package it.infn.catania.gfal; … public class GFalFile { static { System.loadLibrary(“GFalFile”); } … private native int openGFalFile(String fileName, int mode, int perm, boolean isLargeFile); private native int closeGFalFile(int fd); … public int openFile(String fileName, int flags, int mode, boolean isLargeFile) throws GFalFileException { … int ret = openGFalFile(fileName, flags, mode, isLargeFile); … } } Catania, Progetto TriGrid VL, 30.06.2006 15 GFAL JAVA API: Soluzione Tecnica Wrapper C (libGFalFile.so): #include <gfal_api.h> #include <jni.h> #include "it_infn_catania_gfal_GFalFile.h" … JNIEXPORT jint JNICALL Java_it_infn_catania_gfal_GFalFile_openGFalFile (JNIEnv *env, jobject obj, jstring fileName, jint mode, jint permission, jboolean largeFile) { int fd; const char *str = (*env)->GetStringUTFChars(env, fileName, 0); if(largeFile) fd = gfal_open64(str, mode, permission); else fd = gfal_open(str, mode, permission); (*env)->ReleaseStringUTFChars(env, fileName, str); …//check errors return fd; } Catania, Progetto TriGrid VL, 30.06.2006 16 GFAL API: Javadoc Catania, Progetto TriGrid VL, 30.06.2006 17 GFAL API: Javadoc Catania, Progetto TriGrid VL, 30.06.2006 18