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