Пример #1
0
Файл: csn.c Проект: leto/389-ds
CSN *csn_dup(const CSN *csn)
{
	CSN *newcsn= NULL;
    if(csn!=NULL)
    {
		newcsn= csn_new();
		csn_init_by_csn(newcsn,csn);
    }
	return newcsn;
}
Пример #2
0
Файл: csn.c Проект: leto/389-ds
CSN *csn_new_by_string(const char *s)
{
	CSN *newcsn= NULL;
	if(s!=NULL)
	{
	    if(_csnIsValidString(s))
		{
			newcsn= csn_new();
			csn_init_by_string(newcsn,s);
		}
	}
	return newcsn;
}
Пример #3
0
int 
csngen_new_csn (CSNGen *gen, CSN **csn, PRBool notify)
{
	int rc = CSN_SUCCESS;
    time_t cur_time;
	int delta;

	if (gen == NULL || csn == NULL)
	{
		slapi_log_err(SLAPI_LOG_ERR, "csngen_new_csn", "Invalid argument\n");
		return CSN_INVALID_PARAMETER;
	}

	*csn = csn_new ();
	if (*csn == NULL)
	{
		slapi_log_err(SLAPI_LOG_ERR, "csngen_new_csn", "Memory allocation failed\n");
		return CSN_MEMORY_ERROR;
	}

    slapi_rwlock_wrlock (gen->lock);

    if (g_sampled_time == 0)
        csngen_update_time ();

    cur_time = g_sampled_time;

    /* check if the time should be adjusted */
	delta = cur_time - gen->state.sampled_time;
    if (delta > 0)
    {
        rc = _csngen_adjust_local_time (gen, cur_time);
        if (rc != CSN_SUCCESS)
        {
            slapi_rwlock_unlock (gen->lock);
            return rc;
        }
    }
	else if (delta < -300) {
		/*
		 * The maxseqnum could support up to 65535 CSNs per second.
		 * That means that we could avoid duplicated CSN's for
		 * delta up to 300 secs if update rate is 200/sec (usually
		 * the max rate is below 20/sec).
		 * Beyond 300 secs, we advance gen->state.sampled_time by
		 * one sec to recycle seqnum.
		 */
        slapi_log_err(SLAPI_LOG_WARNING, "csngen_new_csn", "Too much time skew (%d secs). Current seqnum=%0x\n", delta, gen->state.seq_num );
        rc = _csngen_adjust_local_time (gen, gen->state.sampled_time+1);
        if (rc != CSN_SUCCESS)
        {
            slapi_rwlock_unlock (gen->lock);
            return rc;
        }
		
	}

    if (gen->state.seq_num == CSN_MAX_SEQNUM)
    {
        slapi_log_err(SLAPI_LOG_INFO, "csngen_new_csn", "Sequence rollover; "
                        "local offset updated.\n");
        gen->state.local_offset ++;
        gen->state.seq_num = 0;
    }

    (*csn)->tstamp = CSN_CALC_TSTAMP(gen);
    (*csn)->seqnum = gen->state.seq_num ++;
    (*csn)->rid = gen->state.rid;
	(*csn)->subseqnum = 0;

    /* The lock is intentionally unlocked before callbacks are called.
       This is to prevent deadlocks. The callback management code has
       its own lock */
    slapi_rwlock_unlock (gen->lock);

    /* notify modules that registered interest in csn generation */
    if (notify)
    {
        _csngen_call_callbacks (gen, *csn, 0);
    }
    
	return rc;
}