static NTSTATUS wreplsrv_pull_cycle_next_owner_do_work(struct wreplsrv_pull_cycle_state *state) { struct wreplsrv_owner *current_owner=NULL; struct wreplsrv_owner *local_owner; uint32_t i; uint64_t old_max_version = 0; bool do_pull = false; for (i=state->current; i < state->table_io.out.num_owners; i++) { current_owner = wreplsrv_find_owner(state->io->in.partner->service, state->io->in.partner->pull.table, state->table_io.out.owners[i].address); local_owner = wreplsrv_find_owner(state->io->in.partner->service, state->io->in.partner->service->table, state->table_io.out.owners[i].address); /* * this means we are ourself the current owner, * and we don't want replicate ourself */ if (!current_owner) continue; /* * this means we don't have any records of this owner * so fetch them */ if (!local_owner) { do_pull = true; break; } /* * this means the remote partner has some new records of this owner * fetch them */ if (current_owner->owner.max_version > local_owner->owner.max_version) { do_pull = true; old_max_version = local_owner->owner.max_version; break; } } state->current = i; if (do_pull) { 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 + 1; state->creq = wreplsrv_pull_names_send(state, &state->names_io); NT_STATUS_HAVE_NO_MEMORY(state->creq); state->creq->async.fn = wreplsrv_pull_cycle_handler_creq; state->creq->async.private_data = state; return STATUS_MORE_ENTRIES; } return NT_STATUS_OK; }
/* update the wins_owner_table max_version, if the given version is the highest version if no entry for the wins_owner exists yet, create one */ NTSTATUS wreplsrv_add_table(struct wreplsrv_service *service, TALLOC_CTX *mem_ctx, struct wreplsrv_owner **_table, const char *wins_owner, uint64_t version) { struct wreplsrv_owner *table = *_table; struct wreplsrv_owner *cur; if (!wins_owner || strcmp(wins_owner, "0.0.0.0") == 0) { wins_owner = service->wins_db->local_owner; } cur = wreplsrv_find_owner(service, table, wins_owner); /* if it doesn't exists yet, create one */ if (!cur) { cur = talloc_zero(mem_ctx, struct wreplsrv_owner); NT_STATUS_HAVE_NO_MEMORY(cur); cur->owner.address = talloc_strdup(cur, wins_owner); NT_STATUS_HAVE_NO_MEMORY(cur->owner.address); cur->owner.min_version = 0; cur->owner.max_version = 0; cur->owner.type = 1; /* don't know why this is always 1 */ cur->partner = wreplsrv_find_partner(service, wins_owner); DLIST_ADD_END(table, cur, struct wreplsrv_owner *); *_table = table; }