From c6c2d10cabf26de1363090e397a20e0ec61f85a1 Mon Sep 17 00:00:00 2001 From: Richard Henwood Date: Wed, 28 Nov 2012 11:32:45 +0000 Subject: [PATCH] LUDOC-28 llapi: clean up sample code Clean up the examples for using the lustreapi interfaces. This code is updated following fixes for the client API which are tracked against LU-1606. Signed-off-by: Richard Henwood Change-Id: I87f8f5a5d7f7f4792e088b45863b6656391525e9 Reviewed-on: http://review.whamcloud.com/1879 Tested-by: Hudson Reviewed-by: Andreas Dilger --- SettingLustreProperties.xml | 430 ++++++++++++++++++++------------------------ 1 file changed, 194 insertions(+), 236 deletions(-) diff --git a/SettingLustreProperties.xml b/SettingLustreProperties.xml index d7a7a76..d023dab 100644 --- a/SettingLustreProperties.xml +++ b/SettingLustreProperties.xml @@ -29,8 +29,7 @@ Use llapi_file_create to set Lustre properties for a new file.
Synopsis - #include <lustre/liblustreapi.h> -#include <lustre/lustre_user.h> + #include <lustre/lustreapi.h> int llapi_file_create(char *name, long stripe_size, int stripe_offset, int stripe_count, int stripe_pattern); @@ -132,13 +131,8 @@ return -1; Use llapi_file_get_stripe to get striping information for a file or directory on a Lustre file system.
Synopsis - #include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <liblustre.h> -#include <lustre/lustre_idl.h> -#include <lustre/liblustreapi.h> -#include <lustre/lustre_user.h> + +#include <lustre/lustreapi.h> int llapi_file_get_stripe(const char *path, void *lum);
@@ -365,54 +359,54 @@ struct lov_user_ost_data_v1 lmm_objects[0];
Examples - #include <sys/vfs.h> -#include <liblustre.h> -#include <lnet/lnetctl.h> -#include <obd.h> -#include <lustre_lib.h> -#include <lustre/liblustreapi.h> -#include <obd_lov.h> + +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <lustre/lustreapi.h> + static inline int maxint(int a, int b) { -return a > b ? a : b; + return a > b ? a : b; } static void *alloc_lum() { -int v1, v3, join; -v1 = sizeof(struct lov_user_md_v1) + -LOV_MAX_STRIPE_COUNT * sizeof(struct lov_user_ost_data_v1); -v3 = sizeof(struct lov_user_md_v3) + -LOV_MAX_STRIPE_COUNT * sizeof(struct lov_user_ost_data_v1); -return malloc(maxint(v1, v3)); + int v1, v3, join; + v1 = sizeof(struct lov_user_md_v1) + + LOV_MAX_STRIPE_COUNT * sizeof(struct lov_user_ost_data_v1); + v3 = sizeof(struct lov_user_md_v3) + + LOV_MAX_STRIPE_COUNT * sizeof(struct lov_user_ost_data_v1); + return malloc(maxint(v1, v3)); } int main(int argc, char** argv) { -struct lov_user_md *lum_file = NULL; -int rc; -int lum_size; -if (argc != 2) { -fprintf(stderr, "Usage: %s <filename>\n", argv[0]); -return 1; -} -lum_file = alloc_lum(); -if (lum_file == NULL) { -rc = ENOMEM; -goto cleanup; -} -rc = llapi_file_get_stripe(argv[1], lum_file); -if (rc) { -rc = errno; -goto cleanup; -} -/* stripe_size stripe_count */ -printf("%d %d\n", -lum_file->lmm_stripe_size, -lum_file->lmm_stripe_count); + struct lov_user_md *lum_file = NULL; + int rc; + int lum_size; + if (argc != 2) { + fprintf(stderr, "Usage: %s <filename>\n", argv[0]); + return 1; + } + lum_file = alloc_lum(); + if (lum_file == NULL) { + rc = ENOMEM; + goto cleanup; + } + rc = llapi_file_get_stripe(argv[1], lum_file); + if (rc) { + rc = errno; + goto cleanup; + } + /* stripe_size stripe_count */ + printf("%d %d\n", + lum_file->lmm_stripe_size, + lum_file->lmm_stripe_count); cleanup: -if (lum_file != NULL) -free(lum_file); -return rc; -} + if (lum_file != NULL) + free(lum_file); + return rc; +} +
@@ -422,13 +416,7 @@ return rc; The llapi_file_open command opens (or creates) a file or device on a Lustre filesystem.
Synopsis - #include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <liblustre.h> -#include <lustre/lustre_idl.h> -#include <lustre/liblustreapi.h> -#include <lustre/lustre_user.h> + #include <lustre/lustreapi.h> int llapi_file_open(const char *name, int flags, int mode, unsigned long long stripe_size, int stripe_offset, int stripe_count, int stripe_pattern); @@ -569,29 +557,25 @@ int llapi_file_create(const char *name, unsigned long long
Example - #include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <errno.h> + #include <stdio.h> -#include <liblustre.h> -#include <lustre/lustre_idl.h> -#include <lustre/liblustreapi.h> -#include <lustre/lustre_user.h> +#include <lustre/lustreapi.h> + int main(int argc, char *argv[]) { - int rc; - if (argc != 2) - return -1; - rc = llapi_file_create(argv[1], 1048576, 0, 2, LOV_PATTERN_RAID0); - if (rc < 0) { - fprintf(stderr, "file creation has failed, %s\n", strerror(-rc)); - return -1; - } - printf("%s with stripe size 1048576, striped across 2 OSTs," - " has been created!\n", argv[1]); - return 0; -} + int rc; + if (argc != 2) + return -1; + rc = llapi_file_create(argv[1], 1048576, 0, 2, LOV_PATTERN_RAID0); + if (rc < 0) { + fprintf(stderr, "file creation has failed, %s\n", strerror(-rc)); + return -1; + } + printf("%s with stripe size 1048576, striped across 2 OSTs," + " has been created!\n", argv[1]); + return 0; +} +
@@ -601,10 +585,7 @@ int main(int argc, char *argv[]) Use llapi_quotactl to manipulate disk quotas on a Lustre file system.
Synopsis - #include <liblustre.h> -#include <lustre/lustre_idl.h> -#include <lustre/liblustreapi.h> -#include <lustre/lustre_user.h> + #include <lustre/lustreapi.h> int llapi_quotactl(char" " *mnt," " struct if_quotactl" " *qctl) struct if_quotactl { @@ -809,8 +790,7 @@ struct obd_uuid { Use llapi_path2fid to get the FID from the pathname.
Synopsis - #include <lustre/liblustreapi.h> -#include <lustre/lustre_user.h> + #include <lustre/lustreapi.h> int llapi_path2fid(const char *path, unsigned long long *seq, unsigned long *oid, unsigned long *ver)
@@ -828,224 +808,202 @@ int llapi_path2fid(const char *path, unsigned long long *seq, unsigned long *oid
Example Using the <literal>llapi</literal> Library Use llapi_file_create to set Lustre properties for a new file. For a synopsis and description of llapi_file_create and examples of how to use it, see . - You can set striping from inside programs like ioctl. To compile the sample program, you need to download libtest.c and liblustreapi.c files from the Lustre source tree. + You can set striping from inside programs like ioctl. To compile the sample program, you need to install the Lustre client source RPM. A simple C program to demonstrate striping API - libtest.c - /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- + +/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- * vim:expandtab:shiftwidth=8:tabstop=8: * - * lustredemo - simple code examples of liblustreapi functions + * lustredemo - a simple example of lustreapi functions */ - #include <stdio.h> #include <fcntl.h> -#include <sys/stat.h> -#include <sys/types.h> #include <dirent.h> #include <errno.h> -#include <string.h> -#include <unistd.h> #include <stdlib.h> -#include <lustre/liblustreapi.h> -#include <lustre/lustre_user.h> +#include <lustre/lustreapi.h> #define MAX_OSTS 1024 #define LOV_EA_SIZE(lum, num) (sizeof(*lum) + num * sizeof(*lum->lmm_objects)) #define LOV_EA_MAX(lum) LOV_EA_SIZE(lum, MAX_OSTS) - - - - -/* -This program provides crude examples of using the liblustre API functions -*/ - +/* + * This program provides crude examples of using the lustreapi API functions + */ /* Change these definitions to suit */ - - - #define TESTDIR "/tmp" /* Results directory */ #define TESTFILE "lustre_dummy" /* Name for the file we create/destroy */ #define FILESIZE 262144 /* Size of the file in words */ #define DUMWORD "DEADBEEF" /* Dummy word used to fill files */ #define MY_STRIPE_WIDTH 2 /* Set this to the number of OST required */ #define MY_LUSTRE_DIR "/mnt/lustre/ftest" - - + int close_file(int fd) -{ - if (close(fd) < 0) { - fprintf(stderr, "File close failed: %d (%s)\n", errno, strerror(errno)); - return -1; - } - return 0; +{ + if (close(fd) < 0) { + fprintf(stderr, "File close failed: %d (%s)\n", errno, strerror(errno)); + return -1; + } + return 0; } - + int write_file(int fd) { - char *stng = DUMWORD; - int cnt = 0; - - for( cnt = 0; cnt < FILESIZE; cnt++) { + char *stng = DUMWORD; + int cnt = 0; + + for( cnt = 0; cnt < FILESIZE; cnt++) { write(fd, stng, sizeof(stng)); - } - return 0; + } + return 0; } /* Open a file, set a specific stripe count, size and starting OST - Adjust the parameters to suit */ - + * Adjust the parameters to suit */ int open_stripe_file() { - char *tfile = TESTFILE; - int stripe_size = 65536; /* System default is 4M */ - int stripe_offset = -1; /* Start at default */ - int stripe_count = MY_STRIPE_WIDTH; /*Single stripe for this demo*/ - int stripe_pattern = 0; /* only RAID 0 at this time */ - int rc, fd; - /* - */ - rc = llapi_file_create(tfile, -stripe_size,stripe_offset,stripe_count,stripe_pattern); - /* result code is inverted, we may return -EINVAL or an ioctl error. - We borrow an error message from sanity.c - */ - if (rc) { + char *tfile = TESTFILE; + int stripe_size = 65536; /* System default is 4M */ + int stripe_offset = -1; /* Start at default */ + int stripe_count = MY_STRIPE_WIDTH; /*Single stripe for this demo*/ + int stripe_pattern = 0; /* only RAID 0 at this time */ + int rc, fd; + + rc = llapi_file_create(tfile, + stripe_size,stripe_offset,stripe_count,stripe_pattern); + /* result code is inverted, we may return -EINVAL or an ioctl error. + * We borrow an error message from sanity.c + */ + if (rc) { fprintf(stderr,"llapi_file_create failed: %d (%s) \n", rc, strerror(-rc)); return -1; } /* llapi_file_create closes the file descriptor, we must re-open */ fd = open(tfile, O_CREAT | O_RDWR | O_LOV_DELAY_CREATE, 0644); if (fd < 0) { - fprintf(stderr, "Can't open %s file: %d (%s)\n", tfile, errno, strerror(errno)); - return -1; + fprintf(stderr, "Can't open %s file: %d (%s)\n", tfile, errno, strerror(errno)); + return -1; } return fd; } - + /* output a list of uuids for this file */ int get_my_uuids(int fd) { - struct obd_uuid uuids[1024], *uuidp; /* Output var */ - int obdcount = 1024; - int rc,i; - - rc = llapi_lov_get_uuids(fd, uuids, &obdcount); - if (rc != 0) { - fprintf(stderr, "get uuids failed: %d (%s)\n",errno, strerror(errno)); + struct obd_uuid uuids[1024], *uuidp; /* Output var */ + int obdcount = 1024; + int rc,i; + + rc = llapi_lov_get_uuids(fd, uuids, &obdcount); + if (rc != 0) { + fprintf(stderr, "get uuids failed: %d (%s)\n",errno, strerror(errno)); } printf("This file system has %d obds\n", obdcount); for (i = 0, uuidp = uuids; i < obdcount; i++, uuidp++) { - printf("UUID %d is %s\n",i, uuidp->uuid); + printf("UUID %d is %s\n",i, uuidp->uuid); } return 0; } - + /* Print out some LOV attributes. List our objects */ int get_file_info(char *path) { - - struct lov_user_md *lump; - int rc; - int i; - - lump = malloc(LOV_EA_MAX(lump)); - if (lump == NULL) { - return -1; + + struct lov_user_md *lump; + int rc; + int i; + + lump = malloc(LOV_EA_MAX(lump)); + if (lump == NULL) { + return -1; } - + rc = llapi_file_get_stripe(path, lump); - + if (rc != 0) { - fprintf(stderr, "get_stripe failed: %d (%s)\n",errno, strerror(errno)); - return -1; + fprintf(stderr, "get_stripe failed: %d (%s)\n",errno, strerror(errno)); + return -1; } - - printf("Lov magic %u\n", lump->lmm_magic); - printf("Lov pattern %u\n", lump->lmm_pattern); - printf("Lov object id %llu\n", lump->lmm_object_id); - printf("Lov object group %llu\n", lump->lmm_object_gr); - printf("Lov stripe size %u\n", lump->lmm_stripe_size); - printf("Lov stripe count %hu\n", lump->lmm_stripe_count); - printf("Lov stripe offset %u\n", lump->lmm_stripe_offset); - for (i = 0; i < lump->lmm_stripe_count; i++) { - printf("Object index %d Objid %llu\n", lump->lmm_objects[i].l_ost_idx, lump->lmm_objects[i].l_object_id); + + printf("Lov magic %u\n", lump->lmm_magic); + printf("Lov pattern %u\n", lump->lmm_pattern); + printf("Lov object id %llu\n", lump->lmm_object_id); + printf("Lov stripe size %u\n", lump->lmm_stripe_size); + printf("Lov stripe count %hu\n", lump->lmm_stripe_count); + printf("Lov stripe offset %u\n", lump->lmm_stripe_offset); + for (i = 0; i < lump->lmm_stripe_count; i++) { + printf("Object index %d Objid %llu\n", lump->lmm_objects[i].l_ost_idx, lump->lmm_objects[i].l_object_id); } - - - free(lump); - return rc; - + + free(lump); + return rc; + } + /* Ping all OSTs that belong to this filesystem */ - int ping_osts() { - DIR *dir; - struct dirent *d; - char osc_dir[100]; - int rc; - - sprintf(osc_dir, "/proc/fs/lustre/osc"); - dir = opendir(osc_dir); - if (dir == NULL) { - printf("Can't open dir\n"); - return -1; - } - while((d = readdir(dir)) != NULL) { - if ( d->d_type == DT_DIR ) { - if (! strncmp(d->d_name, "OSC", 3)) { - printf("Pinging OSC %s ", d->d_name); - rc = llapi_ping("osc", d->d_name); - if (rc) { - printf(" bad\n"); - } else { - printf(" good\n"); - } - } - } - } - return 0; - + DIR *dir; + struct dirent *d; + char osc_dir[100]; + int rc; + + sprintf(osc_dir, "/proc/fs/lustre/osc"); + dir = opendir(osc_dir); + if (dir == NULL) { + printf("Can't open dir\n"); + return -1; + } + while((d = readdir(dir)) != NULL) { + if ( d->d_type == DT_DIR ) { + if (! strncmp(d->d_name, "OSC", 3)) { + printf("Pinging OSC %s ", d->d_name); + rc = llapi_ping("osc", d->d_name); + if (rc) { + printf(" bad\n"); + } else { + printf(" good\n"); + } + } + } + } + return 0; + } - + int main() { - int file; - int rc; - char filename[100]; - char sys_cmd[100]; - - sprintf(filename, "%s/%s",MY_LUSTRE_DIR, TESTFILE); - - printf("Open a file with striping\n"); - file = open_stripe_file(); - if ( file < 0 ) { - printf("Exiting\n"); - exit(1); - - - - - } - printf("Getting uuid list\n"); - rc = get_my_uuids(file); - printf("Write to the file\n"); - rc = write_file(file); - rc = close_file(file); - printf("Listing LOV data\n"); - rc = get_file_info(filename); - printf("Ping our OSTs\n"); - rc = ping_osts(); - - /* the results should match lfs getstripe */ - printf("Confirming our results with lfs getstripe\n"); - sprintf(sys_cmd, "/usr/bin/lfs getstripe %s/%s", MY_LUSTRE_DIR, TESTFILE); - system(sys_cmd); - - printf("All done\n"); - exit(rc); -} - + int file; + int rc; + char filename[100]; + char sys_cmd[100]; + + sprintf(filename, "%s/%s",MY_LUSTRE_DIR, TESTFILE); + + printf("Open a file with striping\n"); + file = open_stripe_file(); + if ( file < 0 ) { + printf("Exiting\n"); + exit(1); + } + printf("Getting uuid list\n"); + rc = get_my_uuids(file); + printf("Write to the file\n"); + rc = write_file(file); + rc = close_file(file); + printf("Listing LOV data\n"); + rc = get_file_info(filename); + printf("Ping our OSTs\n"); + rc = ping_osts(); + + /* the results should match lfs getstripe */ + printf("Confirming our results with lfs getstripe\n"); + sprintf(sys_cmd, "/usr/bin/lfs getstripe %s/%s", MY_LUSTRE_DIR, TESTFILE); + system(sys_cmd); + + printf("All done\n"); + exit(rc); +} + Makefile for sample application: gcc -g -O2 -Wall -o lustredemo libtest.c -llustreapi -- 1.8.3.1