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

From: "Rob_pg" <robert7390(at)comcast(dot)net>
To: pgsql-general(at)postgresql(dot)org
Subject: writing a foreign data wrapper for hdfs, but getting and undefined symbol error for hdfsConnect
Date: 2011-10-25 20:16:20
Message-ID: 201110251316.20361.robert7390@comcast.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

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;
}
/////////////////////////////////////////////////////////////////////

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Tom Lane 2011-10-25 20:43:28 Re: writing a foreign data wrapper for hdfs, but getting and undefined symbol error for hdfsConnect
Previous Message Michael Glaesemann 2011-10-25 20:11:57 Re: Saving score of 3 players into a table