Thu Oct 26 13:09:57 PDT 2006
- Previous message: [Slony1-commit] By wieck: Add GCC= declaration to Makefile.global to enable gcc specific
- Next message: [Slony1-commit] By wieck: Added a new command to slonik.
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Log Message: ----------- Added a new command to slonik. SYNC (id = <nodeid>) will issue a SYNC event on the specified node. The purpose of this command is to have a slonik generated event to wait for. This is needed in order to be able to wait for subscriptions to complete. Jan Tags: ---- REL_1_2_STABLE Modified Files: -------------- slony1-engine/src/ducttape: test_5_subscribe (r1.1 -> r1.1.6.1) slony1-engine/src/slonik: parser.y (r1.25 -> r1.25.2.1) scan.l (r1.24 -> r1.24.2.1) slonik.c (r1.67 -> r1.67.2.1) slonik.h (r1.27 -> r1.27.2.1) -------------- next part -------------- Index: test_5_subscribe =================================================================== RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/ducttape/test_5_subscribe,v retrieving revision 1.1 retrieving revision 1.1.6.1 diff -Lsrc/ducttape/test_5_subscribe -Lsrc/ducttape/test_5_subscribe -u -w -r1.1 -r1.1.6.1 --- src/ducttape/test_5_subscribe +++ src/ducttape/test_5_subscribe @@ -28,10 +28,15 @@ on error { exit 1; } + echo '***** Waiting for subscribe set to arrive on origin'; + wait for event (origin = 2, confirmed = 1); + echo '***** Subscribe set received on origin - issue SYNC'; + sync (id = 1); + echo '***** Waiting for SYNC to be done on subscriber'; + wait for event (origin = 1, confirmed = 2); + echo '***** Subscription complete'; _EOF_ -sleep 30 - echo "**** Merging set 999 into 1" slonik <<_EOF_ cluster name = T1; Index: scan.l =================================================================== RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/scan.l,v retrieving revision 1.24 retrieving revision 1.24.2.1 diff -Lsrc/slonik/scan.l -Lsrc/slonik/scan.l -u -w -r1.24 -r1.24.2.1 --- src/slonik/scan.l +++ src/slonik/scan.l @@ -125,6 +125,7 @@ subscribe { return K_SUBSCRIBE; } success { return K_SUCCESS; } switch { return K_SWITCH; } +sync { return K_SYNC; } table { return K_TABLE; } timeout { return K_TIMEOUT; } trigger { return K_TRIGGER; } Index: slonik.h =================================================================== RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/slonik.h,v retrieving revision 1.27 retrieving revision 1.27.2.1 diff -Lsrc/slonik/slonik.h -Lsrc/slonik/slonik.h -u -w -r1.27 -r1.27.2.1 --- src/slonik/slonik.h +++ src/slonik/slonik.h @@ -49,6 +49,7 @@ typedef struct SlonikStmt_update_functions_s SlonikStmt_update_functions; typedef struct SlonikStmt_wait_event_s SlonikStmt_wait_event; typedef struct SlonikStmt_switch_log_s SlonikStmt_switch_log; +typedef struct SlonikStmt_sync_s SlonikStmt_sync; typedef enum { @@ -87,7 +88,8 @@ STMT_UPDATE_FUNCTIONS, STMT_WAIT_EVENT, STMT_SWITCH_LOG, - STMT_ERROR + STMT_ERROR, + STMT_SYNC } Slonik_stmttype; struct SlonikScript_s @@ -431,6 +433,13 @@ }; +struct SlonikStmt_sync_s +{ + SlonikStmt hdr; + int no_id; +}; + + extern SlonikScript *parser_script; @@ -553,6 +562,7 @@ extern int slonik_update_functions(SlonikStmt_update_functions * stmt); extern int slonik_wait_event(SlonikStmt_wait_event * stmt); extern int slonik_switch_log(SlonikStmt_switch_log * stmt); +extern int slonik_sync(SlonikStmt_sync * stmt); extern int slon_scanint64(char *str, int64 * result); Index: parser.y =================================================================== RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/parser.y,v retrieving revision 1.25 retrieving revision 1.25.2.1 diff -Lsrc/slonik/parser.y -Lsrc/slonik/parser.y -u -w -r1.25 -r1.25.2.1 --- src/slonik/parser.y +++ src/slonik/parser.y @@ -160,6 +160,7 @@ %type <statement> stmt_repair_config %type <statement> stmt_wait_event %type <statement> stmt_switch_log +%type <statement> stmt_sync %type <opt_list> option_list %type <opt_list> option_list_item %type <opt_list> option_list_items @@ -241,6 +242,7 @@ %token K_UPDATE %token K_YES %token K_WAIT +%token K_SYNC /* * Other scanner tokens @@ -483,6 +485,8 @@ | stmt_error ';' { yyerrok; $$ = $1; } + | stmt_sync + { $$ = $1; } ; stmt_echo : lno K_ECHO literal ';' @@ -1474,6 +1478,32 @@ } ; +stmt_sync : lno K_SYNC option_list + { + SlonikStmt_sync *new; + statement_option opt[] = { + STMT_OPTION_INT( O_ID, -1 ), + STMT_OPTION_END + }; + + new = (SlonikStmt_sync *) + malloc(sizeof(SlonikStmt_sync)); + memset(new, 0, sizeof(SlonikStmt_sync)); + new->hdr.stmt_type = STMT_SYNC; + new->hdr.stmt_filename = current_file; + new->hdr.stmt_lno = $1; + + if (assign_options(opt, $3) == 0) + { + new->no_id = opt[0].ival; + } + else + parser_errors++; + + $$ = (SlonikStmt *)new; + } + ; + option_list : ';' { $$ = NULL; } | '(' option_list_items ')' ';' Index: slonik.c =================================================================== RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/slonik/slonik.c,v retrieving revision 1.67 retrieving revision 1.67.2.1 diff -Lsrc/slonik/slonik.c -Lsrc/slonik/slonik.c -u -w -r1.67 -r1.67.2.1 --- src/slonik/slonik.c +++ src/slonik/slonik.c @@ -70,51 +70,8 @@ static void script_rollback_all(SlonikStmt * stmt, SlonikScript * script); static void script_disconnect_all(SlonikScript * script); - -/* - * make a copy of the array of lines, with token replaced by replacement - * the first time it occurs on each line. - * - * This does most of what sed was used for in the shell script, but - * doesn't need any regexp stuff. - */ -void -replace_token(char *resout, char *lines, const char *token, const char *replacement) -{ - int numlines = 1; - int i, - o; - char result_set[4096]; - int toklen, - replen; - - for (i = 0; lines[i]; i++) - numlines++; - - toklen = strlen(token); - replen = strlen(replacement); - - for (i = o = 0; i < numlines; i++, o++) - { - /* just copy pointer if NULL or no change needed */ - if (!lines[i] || (strncmp((const char *)lines + i, token, toklen))) - { - if (lines[i] == 0x0d) /* ||(lines[i] == 0x0a)) */ - break; - - result_set[o] = lines[i]; - continue; - } - /* if we get here a change is needed - set up new line */ - strncpy((char *)result_set + o, replacement, replen); - o += replen - 1; - i += toklen - 1; - } - - result_set[o] = '\0'; - memcpy(resout, result_set, o); - -} +static void replace_token(char *resout, char *lines, const char *token, + const char *replacement); /* ---------- * main @@ -1139,6 +1096,25 @@ } break; + case STMT_SYNC: + { + SlonikStmt_sync *stmt = + (SlonikStmt_sync *) hdr; + + if (stmt->no_id == -1) + { + printf("%s:%d: Error: " + "node ID must be specified\n", + hdr->stmt_filename, hdr->stmt_lno); + errors++; + } + + if (script_check_adminfo(hdr, stmt->no_id) < 0) + errors++; + + } + break; + } hdr = hdr->next; @@ -1574,6 +1550,16 @@ } break; + case STMT_SYNC: + { + SlonikStmt_sync *stmt = + (SlonikStmt_sync *) hdr; + + if (slonik_sync(stmt) < 0) + errors++; + } + break; + } if (current_try_level == 0) @@ -4186,6 +4172,36 @@ } +int +slonik_sync(SlonikStmt_sync * stmt) +{ + SlonikAdmInfo *adminfo1; + SlonDString query; + + adminfo1 = get_active_adminfo((SlonikStmt *) stmt, stmt->no_id); + if (adminfo1 == NULL) + return -1; + + if (db_begin_xact((SlonikStmt *) stmt, adminfo1) < 0) + return -1; + + dstring_init(&query); + + slon_mkquery(&query, + "select \"_%s\".createEvent('_%s', 'SYNC'); ", + stmt->hdr.script->clustername, + stmt->hdr.script->clustername); + if (db_exec_command((SlonikStmt *) stmt, adminfo1, &query) < 0) + { + dstring_free(&query); + return -1; + } + + dstring_free(&query); + return 0; +} + + /* * scanint8 --- try to parse a string into an int8. * @@ -4252,6 +4268,52 @@ return true; } + +/* + * make a copy of the array of lines, with token replaced by replacement + * the first time it occurs on each line. + * + * This does most of what sed was used for in the shell script, but + * doesn't need any regexp stuff. + */ +static void +replace_token(char *resout, char *lines, const char *token, const char *replacement) +{ + int numlines = 1; + int i, + o; + char result_set[4096]; + int toklen, + replen; + + for (i = 0; lines[i]; i++) + numlines++; + + toklen = strlen(token); + replen = strlen(replacement); + + for (i = o = 0; i < numlines; i++, o++) + { + /* just copy pointer if NULL or no change needed */ + if (!lines[i] || (strncmp((const char *)lines + i, token, toklen))) + { + if (lines[i] == 0x0d) /* ||(lines[i] == 0x0a)) */ + break; + + result_set[o] = lines[i]; + continue; + } + /* if we get here a change is needed - set up new line */ + strncpy((char *)result_set + o, replacement, replen); + o += replen - 1; + i += toklen - 1; + } + + result_set[o] = '\0'; + memcpy(resout, result_set, o); +} + + /* * Local Variables: * tab-width: 4
- Previous message: [Slony1-commit] By wieck: Add GCC= declaration to Makefile.global to enable gcc specific
- Next message: [Slony1-commit] By wieck: Added a new command to slonik.
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Slony1-commit mailing list