summaryrefslogtreecommitdiff
path: root/src/master.c
diff options
context:
space:
mode:
authorAndreas Baumann <mail@andreasbaumann.cc>2014-11-30 16:42:35 +0100
committerAndreas Baumann <mail@andreasbaumann.cc>2014-11-30 16:42:35 +0100
commit55f9c3d2f3320917dba48c4c532c54483a0bce2b (patch)
treed28cac3ffca7e4467390149f15073d0530e730c8 /src/master.c
parent1cb35fad9924bfa1ae33a6e6aff2e6c5d5b5f454 (diff)
downloadbiruda-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.c50
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;