Пример #1
0
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;
    }
}
Пример #2
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
}
Пример #3
0
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;
}