static void state_recruit_reference() { receive_message(); //for non-seeders, there is nothing to do, except listening if(role == SEEDER) { if(rec_counter < (RECRUIT_TIMEOUT)) { enable_tx = 1; if(recruit_reference() == 1) { //when recruitment terminated -> state transition state = SAVE_DATA; message_out(EMPTY, EMPTY, EMPTY); enable_tx = 0; } } else if(rec_counter >= RECRUIT_TIMEOUT && rec_counter <= (RECRUIT_TIMEOUT + RECRUIT_CONT)) { enable_tx = 0; } else if(rec_counter >= (RECRUIT_TIMEOUT + RECRUIT_CONT + (id % RECRUIT_TIMEOUT))) { rec_counter = 0; enable_tx = 1; } ++rec_counter; } if(rh_reset_c++ >= RH_RESET_MAX) { rh_reset(); rh_reset_c = 0; } }
//main program loop void user_program(void) { switch(state){ case INIT: state_init(); break; case CONSTRUCT_ID: state_construct_id(); break; case TEST_ID: state_test_id(); break; case ELECT_SEED_TOP: state_elect_seeder_top(); break; case ELECT_SEED_BOTTOM: state_elect_seeder_bottom(); break; case CHECK_SEEDER: state_check_seeder(); break; case AWAIT_R_R: state_await_r_r(); break; case RECRUIT_REFERENCE: state_recruit_reference(); break; case SAVE_DATA: state_save_data(); break; case AWAIT_OTHERS: receive_message(); if(rh_reset_c++ >= RH_RESET_MAX) { //if seeder is not responsive, reset rh state rh_reset(); rh_reset_c = 0; } break; case ERROR_STATE: break; } #ifdef DEBUG_LED switch(role) { case ND: LED_WHITE; break; case SEEDER: LED_RED; break; case BOTTOM_SEEDER: LED_ORANGE; break; case BOT: LED_GREEN; break; default: LED_BLUE; break; } switch(state){ case INIT: case CONSTRUCT_ID: case TEST_ID: LED_TURQOISE; break; case ELECT_SEED_TOP: case ELECT_SEED_BOTTOM: break; case CHECK_SEEDER: if(counter % 50 >= 25) LED_BLUE; break; case SAVE_DATA: LED_OFF; break; case AWAIT_OTHERS: if(role != BOT) LED_OFF; break; case ERROR_STATE: LED_RED; _delay_ms(300); LED_ORANGE; _delay_ms(300); break; default: break; } #endif #ifdef DEBUG_MSG NEWLINE; kprints("id: "); kprinti(id); NEWLINE; kprints("state "); kprinti(state); NEWLINE; kprints("neighbours"); kprinti(neighbours->size); NEWLINE; struct neighbour *nd; struct list_node *cur; for(cur = neighbours->head; cur != 0; cur = cur->next) { nd = (struct neighbour *) cur->data; kprinti(nd->id); } NEWLINE; kprints("seeders "); kprinti(n_of_seeders()); NEWLINE; struct seeder *s; for(cur = seeders_list()->head ;cur != 0; cur = cur->next) { s = (struct seeder *) cur->data; kprinti(s->id); } NEWLINE; kprints("enable_tx "); kprinti(enable_tx); NEWLINE; #endif #ifndef DEBUG_MSG _delay_ms(5); #endif }
int AsyncPutHandler::handle_exception(ACE_HANDLE fd) { S3Status st = status(); // Was this a successful completion? if (st == S3StatusOK) { LOG(lgr, 6, (void *) this << ' ' << keystr(m_keydata, m_keysize) << " SUCCESS"); // Update the blockstore accounting. m_s3bs.update_put_stats(this); // Call the completion handler. m_cmpl.bp_complete(m_keydata, m_keysize, m_argp); // IMPORTANT - We get destructed here; Don't touch *anything* // after this! // m_s3bs.remove_handler(this); } // Retryable failure? else if (S3_status_is_retryable(st)) { if (--m_retries > 0) { LOG(lgr, 5, (void *) this << ' ' << keystr(m_keydata, m_keysize) << ": " << st << ": RETRY"); rh_reset(); // Reset our state. m_s3bs.initiate_put(this); // This path doesn't destroy the handler ... } else { LOG(lgr, 2, (void *) this << ' ' << keystr(m_keydata, m_keysize) << ": " << st << " TOO MANY RETRIES"); ostringstream errstrm; errstrm << FILELINE << "too many S3 retries"; InternalError ex(errstrm.str().c_str()); m_cmpl.bp_error(m_keydata, m_keysize, m_argp, ex); // IMPORTANT - We get destructed here; Don't touch *anything* // after this! // m_s3bs.remove_handler(this); } } // Permanent failure ... bitter ... else { // Call the error handler. ostringstream errstrm; LOG(lgr, 2, (void *) this << ' ' << keystr(m_keydata, m_keysize) << " UNEXPECTED: " << st); errstrm << FILELINE << "unexpected S3 error: " << st; InternalError ex(errstrm.str().c_str()); m_cmpl.bp_error(m_keydata, m_keysize, m_argp, ex); // IMPORTANT - We get destructed here; Don't touch *anything* // after this! // m_s3bs.remove_handler(this); } return 0; }