2007-04-23 04:43:47 +04:00
/*
Unix SMB / CIFS mplementation .
DSDB replication service periodic handling
Copyright ( C ) Stefan Metzmacher 2007
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-10 06:07:03 +04:00
the Free Software Foundation ; either version 3 of the License , or
2007-04-23 04:43:47 +04:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
2007-07-10 06:07:03 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2007-04-23 04:43:47 +04:00
*/
# include "includes.h"
2009-01-30 02:39:30 +03:00
# include "lib/events/events.h"
2007-04-23 04:43:47 +04:00
# include "dsdb/samdb/samdb.h"
# include "auth/auth.h"
# include "smbd/service.h"
# include "lib/messaging/irpc.h"
# include "dsdb/repl/drepl_service.h"
# include "lib/ldb/include/ldb_errors.h"
2008-10-11 23:31:42 +04:00
# include "../lib/util/dlinklist.h"
2007-04-23 04:43:47 +04:00
# include "librpc/gen_ndr/ndr_misc.h"
# include "librpc/gen_ndr/ndr_drsuapi.h"
# include "librpc/gen_ndr/ndr_drsblobs.h"
static void dreplsrv_periodic_run ( struct dreplsrv_service * service ) ;
2008-12-29 22:24:57 +03:00
static void dreplsrv_periodic_handler_te ( struct tevent_context * ev , struct tevent_timer * te ,
2007-04-23 04:43:47 +04:00
struct timeval t , void * ptr )
{
struct dreplsrv_service * service = talloc_get_type ( ptr , struct dreplsrv_service ) ;
WERROR status ;
service - > periodic . te = NULL ;
dreplsrv_periodic_run ( service ) ;
status = dreplsrv_periodic_schedule ( service , service - > periodic . interval ) ;
if ( ! W_ERROR_IS_OK ( status ) ) {
2009-09-19 05:05:55 +04:00
task_server_terminate ( service - > task , win_errstr ( status ) , false ) ;
2007-04-23 04:43:47 +04:00
return ;
}
}
WERROR dreplsrv_periodic_schedule ( struct dreplsrv_service * service , uint32_t next_interval )
{
TALLOC_CTX * tmp_mem ;
2008-12-29 22:24:57 +03:00
struct tevent_timer * new_te ;
2007-04-23 04:43:47 +04:00
struct timeval next_time ;
/* prevent looping */
if ( next_interval = = 0 ) next_interval = 1 ;
next_time = timeval_current_ofs ( next_interval , 50 ) ;
if ( service - > periodic . te ) {
/*
* if the timestamp of the new event is higher ,
* as current next we don ' t need to reschedule
*/
if ( timeval_compare ( & next_time , & service - > periodic . next_event ) > 0 ) {
return WERR_OK ;
}
}
/* reset the next scheduled timestamp */
service - > periodic . next_event = next_time ;
new_te = event_add_timed ( service - > task - > event_ctx , service ,
service - > periodic . next_event ,
dreplsrv_periodic_handler_te , service ) ;
W_ERROR_HAVE_NO_MEMORY ( new_te ) ;
tmp_mem = talloc_new ( service ) ;
DEBUG ( 2 , ( " dreplsrv_periodic_schedule(%u) %sscheduled for: %s \n " ,
next_interval ,
( service - > periodic . te ? " re " : " " ) ,
nt_time_string ( tmp_mem , timeval_to_nttime ( & next_time ) ) ) ) ;
talloc_free ( tmp_mem ) ;
talloc_free ( service - > periodic . te ) ;
service - > periodic . te = new_te ;
return WERR_OK ;
}
static void dreplsrv_periodic_run ( struct dreplsrv_service * service )
{
TALLOC_CTX * mem_ctx ;
DEBUG ( 2 , ( " dreplsrv_periodic_run(): schedule pull replication \n " ) ) ;
mem_ctx = talloc_new ( service ) ;
dreplsrv_schedule_pull_replication ( service , mem_ctx ) ;
talloc_free ( mem_ctx ) ;
2009-09-12 09:22:26 +04:00
DEBUG ( 2 , ( " dreplsrv_periodic_run(): run pending_ops memory=%u \n " ,
( unsigned ) talloc_total_blocks ( service ) ) ) ;
2007-04-23 04:43:47 +04:00
2009-09-11 16:47:11 +04:00
/* the KCC might have changed repsFrom */
dreplsrv_refresh_partitions ( service ) ;
2007-04-23 04:43:47 +04:00
dreplsrv_run_pending_ops ( service ) ;
2009-09-13 12:16:13 +04:00
dreplsrv_notify_run_ops ( service ) ;
2007-04-23 04:43:47 +04:00
}