Search Postgresql Archives

writing a foreign data wrapper for hdfs, but getting and undefined symbol error for hdfsConnect

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I've been working on creating a foreign data wrapper for hdfs on using version 
9.1.0. This is my first time creating C functions against postgres, so 
hopefully this falls under the 'newbie' category and is easy to solve.

The source code code does compile resulting in a shared library:

file mylibrary.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), 		
dynamically linked, not stripped

ldd mylibrary.so
        linux-vdso.so.1 =>  (0x00007fff40fff000)
        libc.so.6 => /lib/libc.so.6 (0x00007f3adb8cc000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f3adbe72000)

But, the library fails to load when I use the LOAD statement:

LOAD mylibrary.so

The error is:

 ERROR:  could not load library "mylibrary.so": mylibrary.so: undefined symbol: 
hdfsConnect

I already figured it needs to recognize the hadoop shared library, libhdfs.so.0 
but loading hdfs directly, of course, results in the following error:

ERROR:  incompatible library "/home/robert/lib/libhdfs.so.0": missing magic 
block
HINT:  Extension libraries are required to use the PG_MODULE_MAGIC macro.

So how do I manage to load hdfs? All that is required at this point for the 
data wrapper to do is to open and read a very small file.

Here's the snippet in question:

/////////////////////////////////////////////////////////////////////
#include "hdfs.h"

#include <string.h>
#include <stdio.h>

#include "postgres.h"
#include "fmgr.h"
#include "funcapi.h"
#include "foreign/fdwapi.h"
#include "foreign/foreign.h"
#include "commands/explain.h"
#include "commands/defrem.h"
#include "catalog/pg_foreign_table.h"

PG_MODULE_MAGIC;

typedef struct {
  char     *connection,
           *filename,
           *limit,
           *offset;
  hdfsFS   *fs;
  hdfsFile *fp;
} hdfsFdwExecutionState;

extern Datum hdfs_fdw_handler(PG_FUNCTION_ARGS);
.
.
.
// here's where the function "hdfsConnect" is first called

static void hdfsBeginForeignScan(ForeignScanState *node, int eflags) {
  hdfsFdwExecutionState *festate;
  char  *recordset  = malloc(LINE_LENGTH*sizeof(*recordset)),
        *connection = "default",
        *filename,
        *limit,
        *offset;
  hdfsFS   fs;
  hdfsFile fp;

  if (eflags & EXEC_FLAG_EXPLAIN_ONLY) return;

  hdfsGetOptions(RelationGetRelid(node->ss.ss_currentRelation), &filename, 
&limit, &offset);

  festate           = (hdfsFdwExecutionState *) 
palloc(sizeof(hdfsFdwExecutionState));

  fs                = hdfsConnect(connection, 0);
  fp                = setFILEoffset(fs, filename, offset);

  festate->filename = filename;
  festate->limit    = limit;
  festate->offset   = offset;
  festate->fs       = fs;
  festate->fp       = (void *) fp;

  node->fdw_state = (void *) festate;
}
/////////////////////////////////////////////////////////////////////




-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux