コード例 #1
0
ファイル: SyncBase.c プロジェクト: YichiLL/ccnx
extern void
SyncInit(struct SyncBaseStruct *bp) {
    if (bp != NULL) {
        struct ccnr_handle *ccnr = bp->ccnr;
        char *here = "Sync.SyncInit";
        
        if (ccnr != NULL) {
            // called when there is a Repo that is ready for Sync activity
            // TBD: read sync state and restart at the saved commit point
            struct SyncPrivate *priv = bp->priv;
            bp->debug = ccnr->syncdebug;
            
            int enable = 1;
            char *s = getenv("CCNS_ENABLE");
            if (s != NULL && s[0] != 0)
                enable = strtol(s, NULL, 10);
            
            if (enable <= 0) return;
            
            char *debugStr = getenv("CCNS_DEBUG");
            
            // enable/disable storing of sync tree nodes
            // default is to store
            priv->useRepoStore = getEnvLimited("CCNS_REPO_STORE", 0, 1, 1);
            
            // enable/disable stable recovery point
            // default is to disable recovery, but to calculate stable points
            priv->stableEnabled = getEnvLimited("CCNS_STABLE_ENABLED", 0, 1, 1);
            
            // get faux error percent
            priv->fauxErrorTrigger = getEnvLimited("CCNS_FAUX_ERROR",
                                                   0, 99, 0);
            
            // get private flags for SyncActions
            priv->syncActionsPrivate = getEnvLimited("CCNS_ACTIONS_PRIVATE",
                                                     0, 255, 3);
            
            // heartbeat rate
            priv->heartbeatMicros = getEnvLimited("CCNS_HEARTBEAT_MICROS",
                                                  10000, 10*1000000, 200000);
            
            // root advise lifetime
            priv->rootAdviseFresh = getEnvLimited("CCNS_ROOT_ADVISE_FRESH",
                                                  1, 30, 4);
            
            // root advise lifetime
            priv->rootAdviseLifetime = getEnvLimited("CCNS_ROOT_ADVISE_LIFETIME",
                                                     1, 30, 20);
            
            // root advise lifetime
            priv->fetchLifetime = getEnvLimited("CCNS_NODE_FETCH_LIFETIME",
                                                1, 30, 4);

            // max node or content fetches busy per root
            priv->maxFetchBusy = getEnvLimited("CCNS_MAX_FETCH_BUSY",
                                               1, 100, 6);

            // max number of compares busy
            priv->maxComparesBusy = getEnvLimited("CCNS_MAX_COMPARES_BUSY",
                                               1, 100, 4);
            
            
            if (bp->debug >= CCNL_INFO) {
                char temp[1024];
                int pos = 0;
                pos += snprintf(temp+pos, sizeof(temp)-pos,
                                "CCNS_ENABLE=%d",
                                enable);
                pos += snprintf(temp+pos, sizeof(temp)-pos,
                                ",CCNS_DEBUG=%s",
                                debugStr);
                pos += snprintf(temp+pos, sizeof(temp)-pos,
                                ",CCNS_REPO_STORE=%d",
                                priv->useRepoStore);
                pos += snprintf(temp+pos, sizeof(temp)-pos,
                                ",CCNS_STABLE_ENABLED=%d",
                                priv->stableEnabled);
                pos += snprintf(temp+pos, sizeof(temp)-pos,
                                ",CCNS_FAUX_ERROR=%d",
                                priv->fauxErrorTrigger);
                pos += snprintf(temp+pos, sizeof(temp)-pos,
                                ",CCNS_ACTIONS_PRIVATE=%d",
                                priv->syncActionsPrivate);
                pos += snprintf(temp+pos, sizeof(temp)-pos,
                                ",CCNS_HEARTBEAT_MICROS=%d",
                                priv->heartbeatMicros);
                pos += snprintf(temp+pos, sizeof(temp)-pos,
                                ",CCNS_ROOT_ADVISE_FRESH=%d",
                                priv->rootAdviseFresh);
                pos += snprintf(temp+pos, sizeof(temp)-pos,
                                ",CCNS_ROOT_ADVISE_LIFETIME=%d",
                                priv->rootAdviseLifetime);
                pos += snprintf(temp+pos, sizeof(temp)-pos,
                                ",CCNS_NODE_FETCH_LIFETIME=%d",
                                priv->fetchLifetime);
                pos += snprintf(temp+pos, sizeof(temp)-pos,
                                ",CCNS_MAX_FETCH_BUSY=%d",
                                priv->maxFetchBusy);
                pos += snprintf(temp+pos, sizeof(temp)-pos,
                                ",CCNS_MAX_COMPARES_BUSY=%d",
                                priv->maxComparesBusy);
#if (CCN_API_VERSION >= 4004)
                pos += snprintf(temp+pos, sizeof(temp)-pos,
                                ",defer_verification=%d",
                                ccn_defer_verification(bp->ccn, -1));
#endif
                ccnr_msg(ccnr, "%s, %s", here, temp);
            }
            
            SyncStartHeartbeat(bp);
        }
    }
}
コード例 #2
0
ファイル: ccnr_init.c プロジェクト: GabrielLiz/ccnx
/**
 * Create a new ccnr instance
 * @param progname - name of program binary, used for locating helpers
 * @param logger - logger function
 * @param loggerdata - data to pass to logger function
 */
PUBLIC struct ccnr_handle *
r_init_create(const char *progname, ccnr_logger logger, void *loggerdata)
{
    char *sockname = NULL;
    const char *portstr = NULL;
    const char *listen_on = NULL;
    const char *d = NULL;
    struct ccnr_handle *h = NULL;
    struct hashtb_param param = {0};
    struct ccn_charbuf *config = NULL;
    int res;
    
    h = calloc(1, sizeof(*h));
    if (h == NULL)
        return(h);
    h->notify_after = 0; //CCNR_MAX_ACCESSION;
    h->logger = logger;
    h->loggerdata = loggerdata;
    h->logpid = (int)getpid();
    h->progname = progname;
    h->debug = -1;
    config = r_init_read_config(h);
    if (config == NULL)
        goto Bail;
    r_init_parse_config(h, config, 0); /* silent pass to pick up CCNR_DEBUG */
    h->debug = 1; /* so that we see any complaints */
    h->debug = r_init_debug_getenv(h, "CCNR_DEBUG");
    res = r_init_parse_config(h, config, 1);
    if (res < 0) {
        h->running = -1;
        goto Bail;
    }
    r_init_parse_config(h, config, 2);
    sockname = r_net_get_local_sockname();
    h->skiplinks = ccn_indexbuf_create();
    h->face_limit = 10; /* soft limit */
    h->fdholder_by_fd = calloc(h->face_limit, sizeof(h->fdholder_by_fd[0]));
    param.finalize_data = h;
    param.finalize = &r_fwd_finalize_nameprefix;
    h->nameprefix_tab = hashtb_create(sizeof(struct nameprefix_entry), &param);
    param.finalize = 0; // PRUNED &r_fwd_finalize_propagating;
    h->propagating_tab = hashtb_create(sizeof(struct propagating_entry), &param);
    param.finalize = &r_proto_finalize_enum_state;
    h->enum_state_tab = hashtb_create(sizeof(struct enum_state), &param);
    h->min_stale = ~0;
    h->max_stale = 0;
    h->unsol = ccn_indexbuf_create();
    h->ticktock.descr[0] = 'C';
    h->ticktock.micros_per_base = 1000000;
    h->ticktock.gettime = &r_util_gettime;
    h->ticktock.data = h;
    h->sched = ccn_schedule_create(h, &h->ticktock);
    h->starttime = h->sec;
    h->starttime_usec = h->usec;
    h->oldformatcontentgrumble = 1;
    h->oldformatinterestgrumble = 1;
    h->cob_limit = 4201;
    h->start_write_scope_limit = r_init_confval(h, "CCNR_START_WRITE_SCOPE_LIMIT", 0, 3, 3);
    h->debug = 1; /* so that we see any complaints */
    h->debug = r_init_debug_getenv(h, "CCNR_DEBUG");
    h->syncdebug = r_init_debug_getenv(h, "CCNS_DEBUG");
    portstr = getenv("CCNR_STATUS_PORT");
    if (portstr == NULL || portstr[0] == 0 || strlen(portstr) > 10)
        portstr = "";
    h->portstr = portstr;
    ccnr_msg(h, "CCNR_DEBUG=%d CCNR_DIRECTORY=%s CCNR_STATUS_PORT=%s", h->debug, h->directory, h->portstr);
    listen_on = getenv("CCNR_LISTEN_ON");
    if (listen_on != NULL && listen_on[0] != 0)
        ccnr_msg(h, "CCNR_LISTEN_ON=%s", listen_on);
    
    if (ccnr_init_repo_keystore(h, NULL) < 0) {
        h->running = -1;
        goto Bail;
    }
    r_util_reseed(h);
    r_store_init(h);
    if (h->running == -1) goto Bail;
    while (h->active_in_fd >= 0) {
        r_dispatch_process_input(h, h->active_in_fd);
        r_store_trim(h, h->cob_limit);
        ccn_schedule_run(h->sched);
    }
    ccnr_msg(h, "Repository file is indexed");
    if (h->face0 == NULL) {
        struct fdholder *fdholder;
        fdholder = calloc(1, sizeof(*fdholder));
        if (dup2(open("/dev/null", O_RDONLY), 0) == -1)
            ccnr_msg(h, "stdin: %s", strerror(errno));
        fdholder->filedesc = 0;
        fdholder->flags = (CCNR_FACE_GG | CCNR_FACE_NORECV);
        r_io_enroll_face(h, fdholder);
    }
    ccnr_direct_client_start(h);
    d = getenv("CCNR_SKIP_VERIFY");
#if (CCN_API_VERSION >= 4004)
    if (d != NULL && strcmp(d, "1") == 0) {
        ccnr_msg(h, "CCNR_SKIP_VERIFY=%s", d);
        ccn_defer_verification(h->direct_client, 1);
    }
#endif
    if (ccn_connect(h->direct_client, NULL) != -1) {
        int af = 0;
        int bufsize;
        int flags;
        int fd;
        struct fdholder *fdholder;

        fd = ccn_get_connection_fd(h->direct_client);
        // Play a dirty trick here - if this wins, we can fix it right in the c lib later on...
        af = try_tcp_instead(fd);  
        flags = CCNR_FACE_CCND;
        if (af == AF_INET)
            flags |= CCNR_FACE_INET;
        else if (af == AF_INET6)
            flags |= CCNR_FACE_INET6;
        else
            flags |= CCNR_FACE_LOCAL;
        fdholder = r_io_record_fd(h, fd, "CCND", 5, flags);
        if (fdholder == NULL) abort();
        ccnr_uri_listen(h, h->direct_client, "ccnx:/%C1.M.S.localhost/%C1.M.SRV/repository",
                        &ccnr_answer_req, OP_SERVICE);
        ccnr_uri_listen(h, h->direct_client, "ccnx:/%C1.M.S.neighborhood/%C1.M.SRV/repository",
                        &ccnr_answer_req, OP_SERVICE);
        bufsize = r_init_confval(h, "CCNR_MIN_SEND_BUFSIZE", 1, 2097152, 16384);
        establish_min_send_bufsize(h, fd, bufsize);
    }
    else
        ccn_disconnect(h->direct_client); // Apparently ccn_connect error case needs work.
    if (1 == r_init_confval(h, "CCNS_ENABLE", 0, 1, 1)) {
        h->sync_plumbing = calloc(1, sizeof(struct sync_plumbing));
        h->sync_plumbing->ccn = h->direct_client;
        h->sync_plumbing->sched = h->sched;
        h->sync_plumbing->client_methods = &sync_client_methods;
        h->sync_plumbing->client_data = h;
        h->sync_base = SyncNewBaseForActions(h->sync_plumbing);
    }
    if (-1 == load_policy(h))
        goto Bail;
    r_net_listen_on(h, listen_on);
    ccnr_internal_client_start(h);
    r_proto_init(h);
    r_proto_activate_policy(h, h->parsed_policy);
    if (merge_files(h) == -1)
        r_init_fail(h, __LINE__, "Unable to merge additional repository data files.", errno);
    if (h->running == -1) goto Bail;
    if (h->sync_plumbing) {
        // Start sync running
        // returns < 0 if a failure occurred
        // returns 0 if the name updates should fully restart
        // returns > 0 if the name updates should restart at last fence
        res = h->sync_plumbing->sync_methods->sync_start(h->sync_plumbing, NULL);
        if (res < 0) {
            r_init_fail(h, __LINE__, "starting sync", res);
            abort();
        }
        else if (res > 0) {
            // XXX: need to work out details of starting from last fence.
            // By examination of code, SyncActions won't take this path
        }
    }
Bail:
    if (sockname)
        free(sockname);
    sockname = NULL;
    ccn_charbuf_destroy(&config);
    if (h->running == -1)
        r_init_destroy(&h);
    return(h);
}