Author: metze Date: 2005-09-30 02:07:34 +0000 (Fri, 30 Sep 2005) New Revision: 10640
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=10640 Log: - add some short path for the composite helper functions they will be used in the next commit metze Modified: branches/tmp/samba4-winsrepl/source/include/structs.h branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_out_connection.c branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_out_helpers.c branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_server.h Changeset: Modified: branches/tmp/samba4-winsrepl/source/include/structs.h =================================================================== --- branches/tmp/samba4-winsrepl/source/include/structs.h 2005-09-30 01:56:02 UTC (rev 10639) +++ branches/tmp/samba4-winsrepl/source/include/structs.h 2005-09-30 02:07:34 UTC (rev 10640) @@ -269,8 +269,10 @@ struct wreplsrv_owner; struct wreplsrv_in_connection; struct wreplsrv_in_call; +struct wreplsrv_out_connection; struct wreplsrv_pull_table_io; struct wreplsrv_pull_names_io; +struct wreplsrv_pull_cycle_io; struct winsdb_record; Modified: branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_out_connection.c =================================================================== --- branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_out_connection.c 2005-09-30 01:56:02 UTC (rev 10639) +++ branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_out_connection.c 2005-09-30 02:07:34 UTC (rev 10640) @@ -46,6 +46,9 @@ partner->pull.last_status = wreplsrv_pull_cycle_recv(partner->pull.creq); partner->pull.creq = NULL; + talloc_free(partner->pull.cycle_io); + partner->pull.cycle_io = NULL; + if (!NT_STATUS_IS_OK(partner->pull.last_status)) { interval = partner->pull.error_count * partner->pull.retry_interval; interval = MIN(interval, partner->pull.interval); @@ -76,7 +79,17 @@ { struct wreplsrv_partner *partner = talloc_get_type(ptr, struct wreplsrv_partner); - partner->pull.creq = wreplsrv_pull_cycle_send(partner); + partner->pull.cycle_io = talloc(partner, struct wreplsrv_pull_cycle_io); + if (!partner->pull.cycle_io) { + goto requeue; + } + + + partner->pull.cycle_io->in.partner = partner; + partner->pull.cycle_io->in.num_owners = 0; + partner->pull.cycle_io->in.owners = NULL; + partner->pull.cycle_io->in.wreplconn = NULL; + partner->pull.creq = wreplsrv_pull_cycle_send(partner, partner->pull.cycle_io); if (!partner->pull.creq) { DEBUG(1,("wreplsrv_pull_cycle_send(%s) failed\n", partner->address)); Modified: branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_out_helpers.c =================================================================== --- branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_out_helpers.c 2005-09-30 01:56:02 UTC (rev 10639) +++ branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_out_helpers.c 2005-09-30 02:07:34 UTC (rev 10640) @@ -113,12 +113,12 @@ } } -static struct composite_context *wreplsrv_out_connect_send(struct wreplsrv_partner *partner) +static struct composite_context *wreplsrv_out_connect_send(struct wreplsrv_partner *partner, + struct wreplsrv_out_connection *wreplconn) { struct composite_context *c = NULL; struct wreplsrv_service *service = partner->service; struct wreplsrv_out_connect_state *state = NULL; - struct wreplsrv_out_connection *wreplconn; c = talloc_zero(partner, struct composite_context); if (!c) goto failed; @@ -131,6 +131,17 @@ c->event_ctx = service->task->event_ctx; c->private_data = state; + /* we have a connection given, so use it */ + if (wreplconn) { + if (wreplconn->sock->dead) { + goto failed; + } + state->stage = WREPLSRV_OUT_CONNECT_STAGE_DONE; + state->wreplconn= wreplconn; + composite_trigger_done(c); + return c; + } + /* we have a connection already, so use it */ if (partner->pull.wreplconn) { if (!partner->pull.wreplconn->sock->dead) { @@ -295,8 +306,16 @@ c->event_ctx = service->task->event_ctx; c->private_data = state; - state->stage = WREPLSRV_PULL_TABLE_STAGE_WAIT_CONNECTION; - state->creq = wreplsrv_out_connect_send(io->in.partner); + if (io->in.num_owners) { + state->table_io.out.num_partners = io->in.num_owners; + state->table_io.out.partners = io->in.owners; + state->stage = WREPLSRV_PULL_TABLE_STAGE_DONE; + composite_trigger_done(c); + return c; + } + + state->stage = WREPLSRV_PULL_TABLE_STAGE_WAIT_CONNECTION; + state->creq = wreplsrv_out_connect_send(io->in.partner, NULL); if (!state->creq) goto failed; state->creq->async.fn = wreplsrv_pull_table_handler_creq; @@ -437,7 +456,7 @@ c->private_data = state; state->stage = WREPLSRV_PULL_NAMES_STAGE_WAIT_CONNECTION; - state->creq = wreplsrv_out_connect_send(io->in.partner); + state->creq = wreplsrv_out_connect_send(io->in.partner, io->in.wreplconn); if (!state->creq) goto failed; state->creq->async.fn = wreplsrv_pull_names_handler_creq; @@ -478,7 +497,7 @@ struct wreplsrv_pull_cycle_state { enum wreplsrv_pull_cycle_stage stage; struct composite_context *c; - struct wreplsrv_partner *partner; + struct wreplsrv_pull_cycle_io *io; struct wreplsrv_pull_table_io table_io; uint32_t current; struct wreplsrv_pull_names_io names_io; @@ -496,10 +515,10 @@ BOOL do_pull = False; for (i=state->current; i < state->table_io.out.num_owners; i++) { - current_owner = wreplsrv_find_owner(state->partner->pull.table, + current_owner = wreplsrv_find_owner(state->io->in.partner->pull.table, state->table_io.out.owners[i].address); - local_owner = wreplsrv_find_owner(state->partner->service->table, + local_owner = wreplsrv_find_owner(state->io->in.partner->service->table, state->table_io.out.owners[i].address); /* * this means we are ourself the current owner, @@ -530,7 +549,8 @@ state->current = i; if (do_pull) { - state->names_io.in.partner = state->partner; + state->names_io.in.partner = state->io->in.partner; + state->names_io.in.wreplconn = state->io->in.wreplconn; state->names_io.in.owner = current_owner->owner; state->names_io.in.owner.min_version = old_max_version; state->creq = wreplsrv_pull_names_send(state, &state->names_io); @@ -557,13 +577,13 @@ for (i=0; i < state->table_io.out.num_owners; i++) { BOOL is_our_addr; - is_our_addr = wreplsrv_is_our_address(state->partner->service, + is_our_addr = wreplsrv_is_our_address(state->io->in.partner->service, state->table_io.out.owners[i].address); if (is_our_addr) continue; - status = wreplsrv_add_table(state->partner->service, - state->partner, - &state->partner->pull.table, + status = wreplsrv_add_table(state->io->in.partner->service, + state->io->in.partner, + &state->io->in.partner->pull.table, state->table_io.out.owners[i].address, state->table_io.out.owners[i].max_version); NT_STATUS_NOT_OK_RETURN(status); @@ -584,7 +604,7 @@ { NTSTATUS status; - status = wreplsrv_apply_records(state->partner, &state->names_io); + status = wreplsrv_apply_records(state->io->in.partner, &state->names_io); NT_STATUS_NOT_OK_RETURN(status); talloc_free(state->names_io.out.names); @@ -654,26 +674,28 @@ return; } -struct composite_context *wreplsrv_pull_cycle_send(struct wreplsrv_partner *partner) +struct composite_context *wreplsrv_pull_cycle_send(TALLOC_CTX *mem_ctx, struct wreplsrv_pull_cycle_io *io) { struct composite_context *c = NULL; - struct wreplsrv_service *service = partner->service; + struct wreplsrv_service *service = io->in.partner->service; struct wreplsrv_pull_cycle_state *state = NULL; - c = talloc_zero(partner, struct composite_context); + c = talloc_zero(mem_ctx, struct composite_context); if (!c) goto failed; state = talloc_zero(c, struct wreplsrv_pull_cycle_state); if (!state) goto failed; state->c = c; - state->partner = partner; + state->io = io; c->state = COMPOSITE_STATE_IN_PROGRESS; c->event_ctx = service->task->event_ctx; c->private_data = state; state->stage = WREPLSRV_PULL_CYCLE_STAGE_WAIT_TABLE_REPLY; - state->table_io.in.partner = partner; + state->table_io.in.partner = io->in.partner; + state->table_io.in.num_owners = io->in.num_owners; + state->table_io.in.owners = io->in.owners; state->creq = wreplsrv_pull_table_send(state, &state->table_io); if (!state->creq) goto failed; Modified: branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_server.h =================================================================== --- branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_server.h 2005-09-30 01:56:02 UTC (rev 10639) +++ branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_server.h 2005-09-30 02:07:34 UTC (rev 10640) @@ -108,11 +108,6 @@ uint32_t peer_ctx; } assoc_ctx; - /* - * are we currently doing something on the connection? - */ - BOOL processing; - /* * the client socket to the partner, * NULL if not yet connected @@ -176,6 +171,9 @@ /* the current pending pull cycle request */ struct composite_context *creq; + /* the pull cycle io params */ + struct wreplsrv_pull_cycle_io *cycle_io; + /* the current timed_event to the next pull cycle */ struct timed_event *te; } pull;
