Details
-
Bug
-
Status: Closed
-
Major - P3
-
Resolution: Done
-
WT2.6.1
-
None
-
None
Description
Hi!
I got a crash while recreating index:
#include <assert.h>
|
#include <stdio.h>
|
#include <stdlib.h>
|
#include <string.h>
|
|
#include <wiredtiger.h>
|
|
#define WT_HOME "db"
|
|
#define WT_CALL(call) \
|
do { \
|
const int __rc = call; \
|
if (__rc != 0) { \
|
fprintf(stderr, # call " at (%s:%d) failed: %s [%d]\n", __FILE__, __LINE__, wiredtiger_strerror(__rc), __rc); \
|
exit(EXIT_FAILURE); \
|
} \
|
} while (0)
|
|
static int
|
me(WT_EXTRACTOR *extractor, WT_SESSION *session,
|
const WT_ITEM *key, const WT_ITEM *value,
|
WT_CURSOR *result_cursor)
|
{
|
//some extractor
|
//it's not called in this program
|
exit(1);
|
}
|
|
static WT_EXTRACTOR my_extractor = {me, NULL, NULL};
|
|
|
int
|
main(void)
|
{
|
WT_CONNECTION *conn;
|
WT_SESSION *session;
|
WT_CURSOR *cursor;
|
|
const char* idx1 = "index:main:aab";
|
const char* idx2 = "index:main:aaa"; // "aaa" < "aab" by strcmp
|
|
|
assert(system("rm -rf \"" WT_HOME "\" && mkdir \"" WT_HOME "\"") == 0);
|
|
WT_CALL(wiredtiger_open(WT_HOME, NULL, "create", &conn));
|
WT_CALL(conn->open_session(conn, NULL, NULL, &session));
|
|
|
WT_CALL(session->create(session, "table:main", "columns=(k,v)"));
|
|
|
WT_CALL(conn->add_extractor(conn, "ex1", &my_extractor, NULL));
|
WT_CALL(conn->add_extractor(conn, "ex2", &my_extractor, NULL));
|
|
//create both indexes
|
WT_CALL(session->create(session, idx1, "extractor=ex1,key_format=u"));
|
WT_CALL(session->create(session, idx2, "extractor=ex2,key_format=u"));
|
|
//recreate index 1
|
WT_CALL(session->drop(session, idx1, "force=true"));
|
WT_CALL(session->create(session, idx1, "extractor=ex1,key_format=u"));
|
|
//recreate index 2
|
WT_CALL(session->drop(session, idx2, "force=true")); //crash
|
WT_CALL(session->create(session, idx2, "extractor=ex2,key_format=u"));
|
|
WT_CALL(conn->close(conn, NULL));
|
|
return 0;
|
}
|
gdb backtrace is:
Program received signal SIGSEGV, Segmentation fault.
|
__wt_schema_get_index (session=0x7ffff290b900, uri=0x4016c6 "index:main:aaa", quiet=1, tablep=0x7fffffffde30, indexp=0x7fffffffde10)
|
at /wiredtiger/2.6.1/src/src/schema/schema_open.c:572
|
572 if (strcmp(idx->name, uri) == 0) {
|
|
#0 __wt_schema_get_index (session=0x7ffff290b900, uri=0x4016c6 "index:main:aaa", quiet=1, tablep=0x7fffffffde30, indexp=0x7fffffffde10)
|
at /wiredtiger/2.6.1/src/src/schema/schema_open.c:572
|
#1 0x00007ffff47ba780 in __drop_index (session=0x7ffff290b900, uri=0x4016c6 "index:main:aaa", cfg=<optimized out>, force=<optimized out>)
|
at /wiredtiger/2.6.1/src/src/schema/schema_drop.c:88
|
#2 __wt_schema_drop (session=0x7ffff290b900, uri=0x4016c6 "index:main:aaa", cfg=0x7fffffffde70)
|
at /wiredtiger/2.6.1/src/src/schema/schema_drop.c:182
|
#3 0x00007ffff47c40f7 in __session_drop (wt_session=0x7ffff290b900, uri=0x4016c6 "index:main:aaa", config=<optimized out>)
|
at /wiredtiger/2.6.1/src/src/session/session_api.c:530
|
#4 0x00000000004013d9 in main () at main.cpp:64
|
|
Its look like __wt_schema_get_table() returns WT_TABLE structure with
table->nindices > 0
|
and
table->indices[i] == NULL
|
if recreating index in the same order as in the above code with indexes
strcmp(idx1, idx2) > 0
|