diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2014-11-30 16:42:35 +0100 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2014-11-30 16:42:35 +0100 |
commit | 55f9c3d2f3320917dba48c4c532c54483a0bce2b (patch) | |
tree | d28cac3ffca7e4467390149f15073d0530e730c8 /src/master.c | |
parent | 1cb35fad9924bfa1ae33a6e6aff2e6c5d5b5f454 (diff) | |
download | biruda-55f9c3d2f3320917dba48c4c532c54483a0bce2b.tar.gz biruda-55f9c3d2f3320917dba48c4c532c54483a0bce2b.tar.bz2 |
updating worker state now in master from coordinator state messages
Diffstat (limited to 'src/master.c')
-rw-r--r-- | src/master.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/src/master.c b/src/master.c index 2761667..e1c53de 100644 --- a/src/master.c +++ b/src/master.c @@ -32,6 +32,51 @@ static void recompute_coordinator_states( void ) } } +static void update_workers( coordinator_t *coord, json_object *obj ) +{ + json_object *worker_array; + json_object_object_get_ex( obj, "workers", &worker_array ); + coord->nof_workers = json_object_array_length( worker_array ); + + for( int i = 0; i < coord->nof_workers; i++ ) { + json_object *worker_obj; + worker_obj= json_object_array_get_idx( worker_array, i ); + + json_object *name_obj; + json_object_object_get_ex( worker_obj, "name", &name_obj ); + const char *name = json_object_get_string( name_obj ); + + json_object *mode_obj; + json_object_object_get_ex( worker_obj, "mode", &mode_obj ); + const char *mode = json_object_get_string( mode_obj ); + + json_object *command_obj; + json_object_object_get_ex( worker_obj, "command", &command_obj ); + const char *command = json_object_get_string( command_obj ); + + json_object *state_obj; + json_object_object_get_ex( worker_obj, "state", &state_obj ); + + for( int j = 0; j < coord->nof_workers; j++ ) { + worker_t *w = &coord->worker[j]; + + if( strcmp( w->name, name ) == 0 ) { + w->mode = worker_execution_mode_from_str( mode ); + if( command != NULL ) { + w->command = strdup( command ); + } else { + w->mode = WORKER_EXECUTION_DISABLED; + } + w->state = worker_state_from_str( json_object_get_string( state_obj ) ); + } else { + // TODO: add new worker + } + } + } + + // TODO: check for deleted workers +} + static int register_coordinator( json_object *obj ) { json_object *host_obj; @@ -57,6 +102,7 @@ static int register_coordinator( json_object *obj ) strcmp( coord->host, host ) == 0 ) { time( &coord->lastAlive ); coord->alive = true; + update_workers( coord, obj ); fprintf( stderr, "master: already registered coordinator from host '%s' (%d)\n", host, pos ); return 0; } @@ -114,6 +160,10 @@ static int register_coordinator( json_object *obj ) } else { w->mode = WORKER_EXECUTION_DISABLED; } + + json_object *state_obj; + json_object_object_get_ex( worker_obj, "state", &state_obj ); + w->state = worker_state_from_str( json_object_get_string( state_obj ) ); } return 0; |