mirror of
				https://github.com/optim-enterprises-bv/vault.git
				synced 2025-10-31 18:48:08 +00:00 
			
		
		
		
	This reverts commit 1e82fe9980.
			
			
This commit is contained in:
		| @@ -148,11 +148,7 @@ type ActivityLog struct { | |||||||
| 	// standbyFragmentsReceived. | 	// standbyFragmentsReceived. | ||||||
| 	fragmentLock sync.RWMutex | 	fragmentLock sync.RWMutex | ||||||
|  |  | ||||||
| 	// localFragmentLock protects partialMonthLocalClientTracker, localFragment, | 	// globalFragmentLock protects enable secondaryGlobalClientFragments, currentGlobalFragment | ||||||
| 	// standbyLocalFragmentsReceived. |  | ||||||
| 	localFragmentLock sync.RWMutex |  | ||||||
|  |  | ||||||
| 	// globalFragmentLock protects enable secondaryGlobalClientFragments, standbyGlobalFragmentsReceived, currentGlobalFragment |  | ||||||
| 	// and globalPartialMonthClientTracker | 	// and globalPartialMonthClientTracker | ||||||
| 	globalFragmentLock sync.RWMutex | 	globalFragmentLock sync.RWMutex | ||||||
|  |  | ||||||
| @@ -184,9 +180,6 @@ type ActivityLog struct { | |||||||
| 	// so it's appropriate to start the timer. | 	// so it's appropriate to start the timer. | ||||||
| 	newFragmentCh chan struct{} | 	newFragmentCh chan struct{} | ||||||
|  |  | ||||||
| 	// current local log fragment (may be nil) |  | ||||||
| 	localFragment *activity.LogFragment |  | ||||||
|  |  | ||||||
| 	// Channel to signal a new global fragment has been created | 	// Channel to signal a new global fragment has been created | ||||||
| 	// so it's appropriate to start the timer. Once the timer finishes | 	// so it's appropriate to start the timer. Once the timer finishes | ||||||
| 	// the secondary will send currentGlobalFragment to the primary | 	// the secondary will send currentGlobalFragment to the primary | ||||||
| @@ -204,12 +197,6 @@ type ActivityLog struct { | |||||||
| 	// Fragments received from performance standbys | 	// Fragments received from performance standbys | ||||||
| 	standbyFragmentsReceived []*activity.LogFragment | 	standbyFragmentsReceived []*activity.LogFragment | ||||||
|  |  | ||||||
| 	// Local fragments received from performance standbys |  | ||||||
| 	standbyLocalFragmentsReceived []*activity.LogFragment |  | ||||||
|  |  | ||||||
| 	// Global fragments received from performance standbys |  | ||||||
| 	standbyGlobalFragmentsReceived []*activity.LogFragment |  | ||||||
|  |  | ||||||
| 	// Fragments of global clients received from performance secondaries | 	// Fragments of global clients received from performance secondaries | ||||||
| 	secondaryGlobalClientFragments []*activity.LogFragment | 	secondaryGlobalClientFragments []*activity.LogFragment | ||||||
|  |  | ||||||
| @@ -232,9 +219,6 @@ type ActivityLog struct { | |||||||
| 	// partialMonthClientTracker tracks active clients this month.  Protected by fragmentLock. | 	// partialMonthClientTracker tracks active clients this month.  Protected by fragmentLock. | ||||||
| 	partialMonthClientTracker map[string]*activity.EntityRecord | 	partialMonthClientTracker map[string]*activity.EntityRecord | ||||||
|  |  | ||||||
| 	// partialMonthLocalClientTracker tracks active local clients this month.  Protected by localFragmentLock. |  | ||||||
| 	partialMonthLocalClientTracker map[string]*activity.EntityRecord |  | ||||||
|  |  | ||||||
| 	// globalPartialMonthClientTracker tracks active clients this month.  Protected by globalFragmentLock. | 	// globalPartialMonthClientTracker tracks active clients this month.  Protected by globalFragmentLock. | ||||||
| 	globalPartialMonthClientTracker map[string]*activity.EntityRecord | 	globalPartialMonthClientTracker map[string]*activity.EntityRecord | ||||||
|  |  | ||||||
| @@ -274,10 +258,6 @@ type ActivityLogCoreConfig struct { | |||||||
| 	// GlobalFragmentSendInterval sets the interval to send global data from the secondary to the primary | 	// GlobalFragmentSendInterval sets the interval to send global data from the secondary to the primary | ||||||
| 	// This is only for testing purposes | 	// This is only for testing purposes | ||||||
| 	GlobalFragmentSendInterval time.Duration | 	GlobalFragmentSendInterval time.Duration | ||||||
|  |  | ||||||
| 	// PerfStandbyFragmentSendInterval sets the interval to send fragment data from the perf standby to the active |  | ||||||
| 	// This is only for testing purposes |  | ||||||
| 	PerfStandbyFragmentSendInterval time.Duration |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // ActivityLogExportRecord is the output structure for activity export | // ActivityLogExportRecord is the output structure for activity export | ||||||
| @@ -355,11 +335,10 @@ func NewActivityLog(core *Core, logger log.Logger, view *BarrierView, metrics me | |||||||
| 		metrics:                         metrics, | 		metrics:                         metrics, | ||||||
| 		nodeID:                          hostname, | 		nodeID:                          hostname, | ||||||
| 		newFragmentCh:                   make(chan struct{}, 1), | 		newFragmentCh:                   make(chan struct{}, 1), | ||||||
|  | 		newGlobalClientFragmentCh:       make(chan struct{}, 1), | ||||||
| 		sendCh:                          make(chan struct{}, 1), // buffered so it can be triggered by fragment size | 		sendCh:                          make(chan struct{}, 1), // buffered so it can be triggered by fragment size | ||||||
| 		doneCh:                          make(chan struct{}, 1), | 		doneCh:                          make(chan struct{}, 1), | ||||||
| 		partialMonthClientTracker:       make(map[string]*activity.EntityRecord), | 		partialMonthClientTracker:       make(map[string]*activity.EntityRecord), | ||||||
| 		partialMonthLocalClientTracker:  make(map[string]*activity.EntityRecord), |  | ||||||
| 		newGlobalClientFragmentCh:       make(chan struct{}, 1), |  | ||||||
| 		globalPartialMonthClientTracker: make(map[string]*activity.EntityRecord), | 		globalPartialMonthClientTracker: make(map[string]*activity.EntityRecord), | ||||||
| 		clock:                           clock, | 		clock:                           clock, | ||||||
| 		currentSegment: segmentInfo{ | 		currentSegment: segmentInfo{ | ||||||
| @@ -376,8 +355,6 @@ func NewActivityLog(core *Core, logger log.Logger, view *BarrierView, metrics me | |||||||
| 			clientSequenceNumber: 0, | 			clientSequenceNumber: 0, | ||||||
| 		}, | 		}, | ||||||
| 		standbyFragmentsReceived:       make([]*activity.LogFragment, 0), | 		standbyFragmentsReceived:       make([]*activity.LogFragment, 0), | ||||||
| 		standbyLocalFragmentsReceived:  make([]*activity.LogFragment, 0), |  | ||||||
| 		standbyGlobalFragmentsReceived: make([]*activity.LogFragment, 0), |  | ||||||
| 		secondaryGlobalClientFragments: make([]*activity.LogFragment, 0), | 		secondaryGlobalClientFragments: make([]*activity.LogFragment, 0), | ||||||
| 		inprocessExport:                atomic.NewBool(false), | 		inprocessExport:                atomic.NewBool(false), | ||||||
| 		precomputedQueryWritten:        make(chan struct{}), | 		precomputedQueryWritten:        make(chan struct{}), | ||||||
| @@ -423,10 +400,11 @@ func (a *ActivityLog) saveCurrentSegmentToStorageLocked(ctx context.Context, for | |||||||
| 	defer a.metrics.MeasureSinceWithLabels([]string{"core", "activity", "segment_write"}, | 	defer a.metrics.MeasureSinceWithLabels([]string{"core", "activity", "segment_write"}, | ||||||
| 		a.clock.Now(), []metricsutil.Label{}) | 		a.clock.Now(), []metricsutil.Label{}) | ||||||
|  |  | ||||||
| 	// Swap out the pending regular fragments | 	// Swap out the pending fragments | ||||||
| 	a.fragmentLock.Lock() | 	a.fragmentLock.Lock() | ||||||
| 	currentFragment := a.fragment | 	localFragment := a.fragment | ||||||
| 	a.fragment = nil | 	a.fragment = nil | ||||||
|  |  | ||||||
| 	standbys := a.standbyFragmentsReceived | 	standbys := a.standbyFragmentsReceived | ||||||
| 	a.standbyFragmentsReceived = make([]*activity.LogFragment, 0) | 	a.standbyFragmentsReceived = make([]*activity.LogFragment, 0) | ||||||
| 	a.fragmentLock.Unlock() | 	a.fragmentLock.Unlock() | ||||||
| @@ -465,38 +443,14 @@ func (a *ActivityLog) saveCurrentSegmentToStorageLocked(ctx context.Context, for | |||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Measure the current regular fragment | 	// Measure the current fragment | ||||||
| 	if currentFragment != nil { |  | ||||||
| 		a.metrics.IncrCounterWithLabels([]string{"core", "activity", "fragment_size"}, |  | ||||||
| 			float32(len(currentFragment.Clients)), |  | ||||||
| 			[]metricsutil.Label{ |  | ||||||
| 				{"type", "entity"}, |  | ||||||
| 			}) |  | ||||||
| 		a.metrics.IncrCounterWithLabels([]string{"core", "activity", "fragment_size"}, |  | ||||||
| 			float32(len(currentFragment.NonEntityTokens)), |  | ||||||
| 			[]metricsutil.Label{ |  | ||||||
| 				{"type", "direct_token"}, |  | ||||||
| 			}) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Swap out the pending local fragments |  | ||||||
| 	a.localFragmentLock.Lock() |  | ||||||
| 	localFragment := a.localFragment |  | ||||||
| 	a.localFragment = nil |  | ||||||
|  |  | ||||||
| 	// standbyLocalFragments := a.standbyLocalFragmentsReceived |  | ||||||
| 	// a.standbyLocalFragmentsReceived = make([]*activity.LogFragment, 0) |  | ||||||
|  |  | ||||||
| 	a.localFragmentLock.Unlock() |  | ||||||
|  |  | ||||||
| 	// Measure the current local fragment |  | ||||||
| 	if localFragment != nil { | 	if localFragment != nil { | ||||||
| 		a.metrics.IncrCounterWithLabels([]string{"core", "activity", "local_fragment_size"}, | 		a.metrics.IncrCounterWithLabels([]string{"core", "activity", "fragment_size"}, | ||||||
| 			float32(len(localFragment.Clients)), | 			float32(len(localFragment.Clients)), | ||||||
| 			[]metricsutil.Label{ | 			[]metricsutil.Label{ | ||||||
| 				{"type", "entity"}, | 				{"type", "entity"}, | ||||||
| 			}) | 			}) | ||||||
| 		a.metrics.IncrCounterWithLabels([]string{"core", "activity", "local_fragment_size"}, | 		a.metrics.IncrCounterWithLabels([]string{"core", "activity", "fragment_size"}, | ||||||
| 			float32(len(localFragment.NonEntityTokens)), | 			float32(len(localFragment.NonEntityTokens)), | ||||||
| 			[]metricsutil.Label{ | 			[]metricsutil.Label{ | ||||||
| 				{"type", "direct_token"}, | 				{"type", "direct_token"}, | ||||||
| @@ -506,7 +460,7 @@ func (a *ActivityLog) saveCurrentSegmentToStorageLocked(ctx context.Context, for | |||||||
| 	// Collect new entities and new tokens. | 	// Collect new entities and new tokens. | ||||||
| 	saveChanges := false | 	saveChanges := false | ||||||
| 	newEntities := make(map[string]*activity.EntityRecord) | 	newEntities := make(map[string]*activity.EntityRecord) | ||||||
| 	for _, f := range append(standbys, currentFragment) { | 	for _, f := range append(standbys, localFragment) { | ||||||
| 		if f == nil { | 		if f == nil { | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| @@ -516,7 +470,7 @@ func (a *ActivityLog) saveCurrentSegmentToStorageLocked(ctx context.Context, for | |||||||
| 		for _, e := range f.Clients { | 		for _, e := range f.Clients { | ||||||
| 			// We could sort by timestamp to see which is first. | 			// We could sort by timestamp to see which is first. | ||||||
| 			// We'll ignore that; the order of the append above means | 			// We'll ignore that; the order of the append above means | ||||||
| 			// that we choose entries in currentFragment over those | 			// that we choose entries in localFragment over those | ||||||
| 			// from standby nodes. | 			// from standby nodes. | ||||||
| 			newEntities[e.ClientID] = e | 			newEntities[e.ClientID] = e | ||||||
| 		} | 		} | ||||||
| @@ -1595,12 +1549,6 @@ func (a *ActivityLog) perfStandbyFragmentWorker(ctx context.Context) { | |||||||
| 		endOfMonth.Stop() | 		endOfMonth.Stop() | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	sendInterval := activityFragmentSendInterval |  | ||||||
| 	// This changes the interval to a duration that was set for testing purposes |  | ||||||
| 	if a.configOverrides.PerfStandbyFragmentSendInterval.Microseconds() > 0 { |  | ||||||
| 		sendInterval = a.configOverrides.PerfStandbyFragmentSendInterval |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	sendFunc := func() { | 	sendFunc := func() { | ||||||
| 		ctx, cancel := context.WithTimeout(ctx, activityFragmentSendTimeout) | 		ctx, cancel := context.WithTimeout(ctx, activityFragmentSendTimeout) | ||||||
| 		defer cancel() | 		defer cancel() | ||||||
| @@ -1628,7 +1576,7 @@ func (a *ActivityLog) perfStandbyFragmentWorker(ctx context.Context) { | |||||||
| 				fragmentWaiting = true | 				fragmentWaiting = true | ||||||
| 				if !a.configOverrides.DisableTimers { | 				if !a.configOverrides.DisableTimers { | ||||||
| 					a.logger.Trace("reset fragment timer") | 					a.logger.Trace("reset fragment timer") | ||||||
| 					timer.Reset(sendInterval) | 					timer.Reset(activityFragmentSendInterval) | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		case <-timer.C: | 		case <-timer.C: | ||||||
| @@ -1665,11 +1613,6 @@ func (a *ActivityLog) perfStandbyFragmentWorker(ctx context.Context) { | |||||||
|  |  | ||||||
| 			a.fragmentLock.Unlock() | 			a.fragmentLock.Unlock() | ||||||
|  |  | ||||||
| 			// clear local active entity set |  | ||||||
| 			a.localFragmentLock.Lock() |  | ||||||
| 			a.partialMonthLocalClientTracker = make(map[string]*activity.EntityRecord) |  | ||||||
| 			a.localFragmentLock.Unlock() |  | ||||||
|  |  | ||||||
| 			// Set timer for next month. | 			// Set timer for next month. | ||||||
| 			// The current segment *probably* hasn't been set yet (via invalidation), | 			// The current segment *probably* hasn't been set yet (via invalidation), | ||||||
| 			// so don't rely on it. | 			// so don't rely on it. | ||||||
| @@ -1841,28 +1784,17 @@ func (c *Core) ResetActivityLog() []*activity.LogFragment { | |||||||
|  |  | ||||||
| 	allFragments := make([]*activity.LogFragment, 1) | 	allFragments := make([]*activity.LogFragment, 1) | ||||||
| 	a.fragmentLock.Lock() | 	a.fragmentLock.Lock() | ||||||
|  |  | ||||||
| 	allFragments[0] = a.fragment | 	allFragments[0] = a.fragment | ||||||
| 	a.fragment = nil | 	a.fragment = nil | ||||||
|  |  | ||||||
| 	allFragments = append(allFragments, a.standbyFragmentsReceived...) | 	allFragments = append(allFragments, a.standbyFragmentsReceived...) | ||||||
| 	a.standbyFragmentsReceived = make([]*activity.LogFragment, 0) | 	a.standbyFragmentsReceived = make([]*activity.LogFragment, 0) | ||||||
| 	a.secondaryGlobalClientFragments = make([]*activity.LogFragment, 0) | 	a.secondaryGlobalClientFragments = make([]*activity.LogFragment, 0) | ||||||
| 	a.partialMonthClientTracker = make(map[string]*activity.EntityRecord) | 	a.partialMonthClientTracker = make(map[string]*activity.EntityRecord) | ||||||
| 	a.fragmentLock.Unlock() | 	a.fragmentLock.Unlock() | ||||||
|  |  | ||||||
| 	// local fragments |  | ||||||
| 	a.localFragmentLock.Lock() |  | ||||||
| 	allFragments = append(allFragments, a.localFragment) |  | ||||||
| 	a.localFragment = nil |  | ||||||
| 	allFragments = append(allFragments, a.standbyLocalFragmentsReceived...) |  | ||||||
| 	a.standbyLocalFragmentsReceived = make([]*activity.LogFragment, 0) |  | ||||||
| 	a.partialMonthLocalClientTracker = make(map[string]*activity.EntityRecord) |  | ||||||
| 	a.localFragmentLock.Unlock() |  | ||||||
|  |  | ||||||
| 	// global fragments |  | ||||||
| 	a.globalFragmentLock.Lock() | 	a.globalFragmentLock.Lock() | ||||||
| 	a.globalPartialMonthClientTracker = make(map[string]*activity.EntityRecord) | 	a.globalPartialMonthClientTracker = make(map[string]*activity.EntityRecord) | ||||||
| 	a.standbyGlobalFragmentsReceived = make([]*activity.LogFragment, 0) |  | ||||||
| 	a.globalFragmentLock.Unlock() | 	a.globalFragmentLock.Unlock() | ||||||
| 	return allFragments | 	return allFragments | ||||||
| } | } | ||||||
| @@ -1901,16 +1833,11 @@ func (a *ActivityLog) AddActivityToFragment(clientID string, namespaceID string, | |||||||
|  |  | ||||||
| 	a.fragmentLock.RLock() | 	a.fragmentLock.RLock() | ||||||
| 	if a.enabled { | 	if a.enabled { | ||||||
| 		_, presentInRegularClientMap := a.partialMonthClientTracker[clientID] | 		_, present = a.partialMonthClientTracker[clientID] | ||||||
| 		_, presentInLocalClientmap := a.partialMonthLocalClientTracker[clientID] |  | ||||||
| 		if presentInRegularClientMap || presentInLocalClientmap { |  | ||||||
| 			present = true |  | ||||||
| 		} |  | ||||||
| 	} else { | 	} else { | ||||||
| 		present = true | 		present = true | ||||||
| 	} | 	} | ||||||
| 	a.fragmentLock.RUnlock() | 	a.fragmentLock.RUnlock() | ||||||
|  |  | ||||||
| 	if present { | 	if present { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -1919,24 +1846,17 @@ func (a *ActivityLog) AddActivityToFragment(clientID string, namespaceID string, | |||||||
| 	a.fragmentLock.Lock() | 	a.fragmentLock.Lock() | ||||||
| 	defer a.fragmentLock.Unlock() | 	defer a.fragmentLock.Unlock() | ||||||
|  |  | ||||||
| 	a.localFragmentLock.Lock() |  | ||||||
| 	defer a.localFragmentLock.Unlock() |  | ||||||
|  |  | ||||||
| 	a.globalFragmentLock.Lock() | 	a.globalFragmentLock.Lock() | ||||||
| 	defer a.globalFragmentLock.Unlock() | 	defer a.globalFragmentLock.Unlock() | ||||||
|  |  | ||||||
| 	// Re-check entity ID after re-acquiring lock | 	// Re-check entity ID after re-acquiring lock | ||||||
| 	_, presentInRegularClientMap := a.partialMonthClientTracker[clientID] | 	_, present = a.partialMonthClientTracker[clientID] | ||||||
| 	_, presentInLocalClientmap := a.partialMonthLocalClientTracker[clientID] |  | ||||||
| 	if presentInRegularClientMap || presentInLocalClientmap { |  | ||||||
| 		present = true |  | ||||||
| 	} |  | ||||||
| 	if present { | 	if present { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// create fragments if doesn't already exist |  | ||||||
| 	a.createCurrentFragment() | 	a.createCurrentFragment() | ||||||
|  | 	a.createCurrentGlobalFragment() | ||||||
|  |  | ||||||
| 	clientRecord := &activity.EntityRecord{ | 	clientRecord := &activity.EntityRecord{ | ||||||
| 		ClientID:      clientID, | 		ClientID:      clientID, | ||||||
| @@ -1954,22 +1874,18 @@ func (a *ActivityLog) AddActivityToFragment(clientID string, namespaceID string, | |||||||
| 		clientRecord.NonEntity = true | 		clientRecord.NonEntity = true | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// add the clients to the regular fragment |  | ||||||
| 	a.fragment.Clients = append(a.fragment.Clients, clientRecord) | 	a.fragment.Clients = append(a.fragment.Clients, clientRecord) | ||||||
| 	a.partialMonthClientTracker[clientRecord.ClientID] = clientRecord |  | ||||||
|  |  | ||||||
| 	if local, _ := a.isClientLocal(clientRecord); local { | 	// Check if the client is local | ||||||
| 		// If the client is local then add the client to the current local fragment | 	if local, _ := a.isClientLocal(clientRecord); !local { | ||||||
| 		a.localFragment.Clients = append(a.localFragment.Clients, clientRecord) |  | ||||||
| 		a.partialMonthLocalClientTracker[clientRecord.ClientID] = clientRecord |  | ||||||
| 	} else { |  | ||||||
| 		if _, ok := a.globalPartialMonthClientTracker[clientRecord.ClientID]; !ok { |  | ||||||
| 		// If the client is not local and has not already been seen, then add the client | 		// If the client is not local and has not already been seen, then add the client | ||||||
| 		// to the current global fragment | 		// to the current global fragment | ||||||
| 			a.currentGlobalFragment.Clients = append(a.currentGlobalFragment.Clients, clientRecord) | 		if _, ok := a.globalPartialMonthClientTracker[clientRecord.ClientID]; !ok { | ||||||
| 			a.globalPartialMonthClientTracker[clientRecord.ClientID] = clientRecord | 			a.globalPartialMonthClientTracker[clientRecord.ClientID] = clientRecord | ||||||
|  | 			a.currentGlobalFragment.Clients = append(a.currentGlobalFragment.Clients, clientRecord) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	a.partialMonthClientTracker[clientRecord.ClientID] = clientRecord | ||||||
| } | } | ||||||
|  |  | ||||||
| // isClientLocal checks whether the given client is on a local mount. | // isClientLocal checks whether the given client is on a local mount. | ||||||
| @@ -1992,25 +1908,25 @@ func (a *ActivityLog) isClientLocal(client *activity.EntityRecord) (bool, error) | |||||||
| 	return false, nil | 	return false, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| // Create the fragments (regular fragment, local fragment and global fragment) if it doesn't already exist. | // Create the current fragment if it doesn't already exist. | ||||||
| // Must be called with the fragmentLock, localFragmentLock and globalFragmentLock held. | // Must be called with the lock held. | ||||||
| func (a *ActivityLog) createCurrentFragment() { | func (a *ActivityLog) createCurrentFragment() { | ||||||
| 	if a.fragment == nil { | 	if a.fragment == nil { | ||||||
| 		// create regular fragment |  | ||||||
| 		a.fragment = &activity.LogFragment{ | 		a.fragment = &activity.LogFragment{ | ||||||
| 			OriginatingNode: a.nodeID, | 			OriginatingNode: a.nodeID, | ||||||
| 			Clients:         make([]*activity.EntityRecord, 0, 120), | 			Clients:         make([]*activity.EntityRecord, 0, 120), | ||||||
| 			NonEntityTokens: make(map[string]uint64), | 			NonEntityTokens: make(map[string]uint64), | ||||||
| 		} | 		} | ||||||
|  | 		// Signal that a new segment is available, start | ||||||
| 		// create local fragment | 		// the timer to send it. | ||||||
| 		a.localFragment = &activity.LogFragment{ | 		a.newFragmentCh <- struct{}{} | ||||||
| 			OriginatingNode: a.nodeID, | 	} | ||||||
| 			Clients:         make([]*activity.EntityRecord, 0, 120), |  | ||||||
| 			NonEntityTokens: make(map[string]uint64), |  | ||||||
| } | } | ||||||
|  |  | ||||||
| 		// create global fragment | // Create the current fragment to track global clients seen | ||||||
|  | // on cluster. Must be called with the globalFragmentLock held | ||||||
|  | func (a *ActivityLog) createCurrentGlobalFragment() { | ||||||
|  | 	if a.currentGlobalFragment == nil { | ||||||
| 		a.currentGlobalFragment = &activity.LogFragment{ | 		a.currentGlobalFragment = &activity.LogFragment{ | ||||||
| 			OriginatingCluster: a.core.ClusterID(), | 			OriginatingCluster: a.core.ClusterID(), | ||||||
| 			Clients:            make([]*activity.EntityRecord, 0), | 			Clients:            make([]*activity.EntityRecord, 0), | ||||||
| @@ -2021,10 +1937,6 @@ func (a *ActivityLog) createCurrentFragment() { | |||||||
| 			// the timer to send it | 			// the timer to send it | ||||||
| 			a.newGlobalClientFragmentCh <- struct{}{} | 			a.newGlobalClientFragmentCh <- struct{}{} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		// Signal that a new segment is available, start |  | ||||||
| 		// the timer to send it. |  | ||||||
| 		a.newFragmentCh <- struct{}{} |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -2048,61 +1960,33 @@ func (a *ActivityLog) receivedGlobalClientFragments(fragment *activity.LogFragme | |||||||
| func (a *ActivityLog) receivedFragment(fragment *activity.LogFragment) { | func (a *ActivityLog) receivedFragment(fragment *activity.LogFragment) { | ||||||
| 	a.logger.Trace("received fragment from standby", "node", fragment.OriginatingNode) | 	a.logger.Trace("received fragment from standby", "node", fragment.OriginatingNode) | ||||||
|  |  | ||||||
| 	isLocalFragment := false | 	a.fragmentLock.Lock() | ||||||
|  | 	defer a.fragmentLock.Unlock() | ||||||
|  |  | ||||||
| 	if !a.enabled { | 	if !a.enabled { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	a.fragmentLock.Lock() |  | ||||||
| 	defer a.fragmentLock.Unlock() |  | ||||||
|  |  | ||||||
| 	// Check if the received fragment from standby is a local fragment. |  | ||||||
| 	// A fragment can have all local clients or all non-local clients except for regular fragment (which has both currently but will be modified to only hold non-local clients later). |  | ||||||
| 	// Check the first client to identify the type of fragment. |  | ||||||
| 	if len(fragment.Clients) > 0 { |  | ||||||
| 		client := fragment.Clients[0] |  | ||||||
| 		if local, _ := a.isClientLocal(client); local { |  | ||||||
| 			isLocalFragment = true |  | ||||||
|  |  | ||||||
| 			a.localFragmentLock.Lock() |  | ||||||
| 			defer a.localFragmentLock.Unlock() |  | ||||||
| 		} else { |  | ||||||
| 	a.globalFragmentLock.Lock() | 	a.globalFragmentLock.Lock() | ||||||
| 	defer a.globalFragmentLock.Unlock() | 	defer a.globalFragmentLock.Unlock() | ||||||
| 		} | 	a.createCurrentGlobalFragment() | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	for _, e := range fragment.Clients { | 	for _, e := range fragment.Clients { | ||||||
| 		a.partialMonthClientTracker[e.ClientID] = e | 		a.partialMonthClientTracker[e.ClientID] = e | ||||||
| 		if isLocalFragment { |  | ||||||
| 			a.partialMonthLocalClientTracker[e.ClientID] = e | 		// If the client is global, then add to global maps and keep in a global fragment | ||||||
| 		} else { | 		if local, _ := a.isClientLocal(e); !local { | ||||||
| 			a.globalPartialMonthClientTracker[e.ClientID] = e | 			a.globalPartialMonthClientTracker[e.ClientID] = e | ||||||
|  | 			a.currentGlobalFragment.Clients = append(a.currentGlobalFragment.Clients, e) | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	a.standbyFragmentsReceived = append(a.standbyFragmentsReceived, fragment) | 	a.standbyFragmentsReceived = append(a.standbyFragmentsReceived, fragment) | ||||||
|  |  | ||||||
| 	if isLocalFragment { |  | ||||||
| 		a.standbyLocalFragmentsReceived = append(a.standbyLocalFragmentsReceived, fragment) |  | ||||||
| 	} else { |  | ||||||
| 		a.standbyGlobalFragmentsReceived = append(a.standbyGlobalFragmentsReceived, fragment) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// TODO: check if current segment is full and should be written | 	// TODO: check if current segment is full and should be written | ||||||
| } | } | ||||||
|  |  | ||||||
| // returns the active local and global clients for the current month |  | ||||||
| func (a *ActivityLog) GetAllPartialMonthClients() (map[string]*activity.EntityRecord, map[string]*activity.EntityRecord) { |  | ||||||
| 	a.localFragmentLock.Lock() |  | ||||||
| 	defer a.localFragmentLock.Unlock() |  | ||||||
|  |  | ||||||
| 	a.globalFragmentLock.Lock() |  | ||||||
| 	defer a.globalFragmentLock.Unlock() |  | ||||||
|  |  | ||||||
| 	return a.partialMonthLocalClientTracker, a.globalPartialMonthClientTracker |  | ||||||
| } |  | ||||||
|  |  | ||||||
| type ResponseCounts struct { | type ResponseCounts struct { | ||||||
| 	EntityClients    int `json:"entity_clients" mapstructure:"entity_clients"` | 	EntityClients    int `json:"entity_clients" mapstructure:"entity_clients"` | ||||||
| 	NonEntityClients int `json:"non_entity_clients" mapstructure:"non_entity_clients"` | 	NonEntityClients int `json:"non_entity_clients" mapstructure:"non_entity_clients"` | ||||||
|   | |||||||
| @@ -23,7 +23,6 @@ import ( | |||||||
| 	"github.com/go-test/deep" | 	"github.com/go-test/deep" | ||||||
| 	"github.com/golang/protobuf/proto" | 	"github.com/golang/protobuf/proto" | ||||||
| 	"github.com/hashicorp/go-uuid" | 	"github.com/hashicorp/go-uuid" | ||||||
| 	"github.com/hashicorp/vault/builtin/credential/userpass" |  | ||||||
| 	"github.com/hashicorp/vault/helper/constants" | 	"github.com/hashicorp/vault/helper/constants" | ||||||
| 	"github.com/hashicorp/vault/helper/namespace" | 	"github.com/hashicorp/vault/helper/namespace" | ||||||
| 	"github.com/hashicorp/vault/helper/timeutil" | 	"github.com/hashicorp/vault/helper/timeutil" | ||||||
| @@ -35,16 +34,7 @@ import ( | |||||||
|  |  | ||||||
| // TestActivityLog_Creation calls AddEntityToFragment and verifies that it appears correctly in a.fragment. | // TestActivityLog_Creation calls AddEntityToFragment and verifies that it appears correctly in a.fragment. | ||||||
| func TestActivityLog_Creation(t *testing.T) { | func TestActivityLog_Creation(t *testing.T) { | ||||||
| 	storage := &logical.InmemStorage{} | 	core, _, _ := TestCoreUnsealed(t) | ||||||
| 	coreConfig := &CoreConfig{ |  | ||||||
| 		CredentialBackends: map[string]logical.Factory{ |  | ||||||
| 			"userpass": userpass.Factory, |  | ||||||
| 		}, |  | ||||||
| 		Physical: storage.Underlying(), |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	cluster := NewTestCluster(t, coreConfig, nil) |  | ||||||
| 	core := cluster.Cores[0].Core |  | ||||||
|  |  | ||||||
| 	a := core.activityLog | 	a := core.activityLog | ||||||
| 	a.SetEnable(true) | 	a.SetEnable(true) | ||||||
| @@ -59,10 +49,6 @@ func TestActivityLog_Creation(t *testing.T) { | |||||||
| 		t.Fatal("activity log already has fragment") | 		t.Fatal("activity log already has fragment") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if a.localFragment != nil { |  | ||||||
| 		t.Fatal("activity log already has a local fragment") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	const entity_id = "entity_id_75432" | 	const entity_id = "entity_id_75432" | ||||||
| 	const namespace_id = "ns123" | 	const namespace_id = "ns123" | ||||||
| 	ts := time.Now() | 	ts := time.Now() | ||||||
| @@ -132,49 +118,6 @@ func TestActivityLog_Creation(t *testing.T) { | |||||||
| 	if actual != 1 { | 	if actual != 1 { | ||||||
| 		t.Errorf("mismatched number of tokens, %v vs %v", actual, 1) | 		t.Errorf("mismatched number of tokens, %v vs %v", actual, 1) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// test local fragment |  | ||||||
| 	localMe := &MountEntry{ |  | ||||||
| 		Table:    credentialTableType, |  | ||||||
| 		Path:     "userpass-local/", |  | ||||||
| 		Type:     "userpass", |  | ||||||
| 		Local:    true, |  | ||||||
| 		Accessor: "local_mount_accessor", |  | ||||||
| 	} |  | ||||||
| 	err := core.enableCredential(namespace.RootContext(nil), localMe) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 	const local_entity_id = "entity_id_75434" |  | ||||||
| 	local_ts := time.Now() |  | ||||||
|  |  | ||||||
| 	a.AddClientToFragment(local_entity_id, "root", local_ts.Unix(), false, "local_mount_accessor") |  | ||||||
|  |  | ||||||
| 	if a.localFragment.OriginatingNode != a.nodeID { |  | ||||||
| 		t.Errorf("mismatched node ID, %q vs %q", a.localFragment.OriginatingNode, a.nodeID) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if a.localFragment.Clients == nil { |  | ||||||
| 		t.Fatal("no local fragment entity slice") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if a.localFragment.NonEntityTokens == nil { |  | ||||||
| 		t.Fatal("no local fragment token map") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if len(a.localFragment.Clients) != 1 { |  | ||||||
| 		t.Fatalf("wrong number of entities %v", len(a.localFragment.Clients)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	er = a.localFragment.Clients[0] |  | ||||||
| 	if er.ClientID != local_entity_id { |  | ||||||
| 		t.Errorf("mimatched entity ID, %q vs %q", er.ClientID, local_entity_id) |  | ||||||
| 	} |  | ||||||
| 	if er.NamespaceID != "root" { |  | ||||||
| 		t.Errorf("mimatched namespace ID, %q vs %q", er.NamespaceID, "root") |  | ||||||
| 	} |  | ||||||
| 	if er.Timestamp != ts.Unix() { |  | ||||||
| 		t.Errorf("mimatched timestamp, %v vs %v", er.Timestamp, ts.Unix()) |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // TestActivityLog_Creation_WrappingTokens calls HandleTokenUsage for two wrapping tokens, and verifies that this | // TestActivityLog_Creation_WrappingTokens calls HandleTokenUsage for two wrapping tokens, and verifies that this | ||||||
| @@ -196,13 +139,6 @@ func TestActivityLog_Creation_WrappingTokens(t *testing.T) { | |||||||
| 		t.Fatal("activity log already has fragment") | 		t.Fatal("activity log already has fragment") | ||||||
| 	} | 	} | ||||||
| 	a.fragmentLock.Unlock() | 	a.fragmentLock.Unlock() | ||||||
|  |  | ||||||
| 	a.localFragmentLock.Lock() |  | ||||||
| 	if a.localFragment != nil { |  | ||||||
| 		t.Fatal("activity log already has local fragment") |  | ||||||
| 	} |  | ||||||
| 	a.localFragmentLock.Unlock() |  | ||||||
|  |  | ||||||
| 	const namespace_id = "ns123" | 	const namespace_id = "ns123" | ||||||
|  |  | ||||||
| 	te := &logical.TokenEntry{ | 	te := &logical.TokenEntry{ | ||||||
| @@ -413,10 +349,6 @@ func TestActivityLog_SaveTokensToStorage(t *testing.T) { | |||||||
| 		t.Errorf("fragment was not reset after write to storage") | 		t.Errorf("fragment was not reset after write to storage") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if a.localFragment != nil { |  | ||||||
| 		t.Errorf("local fragment was not reset after write to storage") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	out := &activity.TokenCount{} | 	out := &activity.TokenCount{} | ||||||
| 	protoSegment := readSegmentFromStorage(t, core, path) | 	protoSegment := readSegmentFromStorage(t, core, path) | ||||||
| 	err = proto.Unmarshal(protoSegment.Value, out) | 	err = proto.Unmarshal(protoSegment.Value, out) | ||||||
| @@ -449,10 +381,6 @@ func TestActivityLog_SaveTokensToStorage(t *testing.T) { | |||||||
| 		t.Errorf("fragment was not reset after write to storage") | 		t.Errorf("fragment was not reset after write to storage") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if a.localFragment != nil { |  | ||||||
| 		t.Errorf("local fragment was not reset after write to storage") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	protoSegment = readSegmentFromStorage(t, core, path) | 	protoSegment = readSegmentFromStorage(t, core, path) | ||||||
| 	out = &activity.TokenCount{} | 	out = &activity.TokenCount{} | ||||||
| 	err = proto.Unmarshal(protoSegment.Value, out) | 	err = proto.Unmarshal(protoSegment.Value, out) | ||||||
| @@ -522,10 +450,6 @@ func TestActivityLog_SaveTokensToStorageDoesNotUpdateTokenCount(t *testing.T) { | |||||||
| 		t.Errorf("fragment was not reset after write to storage") | 		t.Errorf("fragment was not reset after write to storage") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if a.localFragment != nil { |  | ||||||
| 		t.Errorf("local fragment was not reset after write to storage") |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Assert that no tokens have been written to the fragment | 	// Assert that no tokens have been written to the fragment | ||||||
| 	readSegmentFromStorageNil(t, core, tokenPath) | 	readSegmentFromStorageNil(t, core, tokenPath) | ||||||
|  |  | ||||||
| @@ -589,9 +513,6 @@ func TestActivityLog_SaveEntitiesToStorage(t *testing.T) { | |||||||
| 		t.Errorf("fragment was not reset after write to storage") | 		t.Errorf("fragment was not reset after write to storage") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if a.localFragment != nil { |  | ||||||
| 		t.Errorf("local fragment was not reset after write to storage") |  | ||||||
| 	} |  | ||||||
| 	protoSegment := readSegmentFromStorage(t, core, path) | 	protoSegment := readSegmentFromStorage(t, core, path) | ||||||
| 	out := &activity.EntityActivityLog{} | 	out := &activity.EntityActivityLog{} | ||||||
| 	err = proto.Unmarshal(protoSegment.Value, out) | 	err = proto.Unmarshal(protoSegment.Value, out) | ||||||
| @@ -680,8 +601,8 @@ func TestModifyResponseMonthsNilAppend(t *testing.T) { | |||||||
| } | } | ||||||
|  |  | ||||||
| // TestActivityLog_ReceivedFragment calls receivedFragment with a fragment and verifies it gets added to | // TestActivityLog_ReceivedFragment calls receivedFragment with a fragment and verifies it gets added to | ||||||
| // standbyFragmentsReceived and standbyGlobalFragmentsReceived. Send the same fragment again and then verify that it doesn't change the entity map but does | // standbyFragmentsReceived. Send the same fragment again and then verify that it doesn't change the entity map but does | ||||||
| // get added to standbyFragmentsReceived and standbyGlobalFragmentsReceived. | // get added to standbyFragmentsReceived. | ||||||
| func TestActivityLog_ReceivedFragment(t *testing.T) { | func TestActivityLog_ReceivedFragment(t *testing.T) { | ||||||
| 	core, _, _ := TestCoreUnsealed(t) | 	core, _, _ := TestCoreUnsealed(t) | ||||||
| 	a := core.activityLog | 	a := core.activityLog | ||||||
| @@ -723,10 +644,6 @@ func TestActivityLog_ReceivedFragment(t *testing.T) { | |||||||
| 		t.Fatalf("fragment count is %v, expected 1", len(a.standbyFragmentsReceived)) | 		t.Fatalf("fragment count is %v, expected 1", len(a.standbyFragmentsReceived)) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if len(a.standbyGlobalFragmentsReceived) != 1 { |  | ||||||
| 		t.Fatalf("fragment count is %v, expected 1", len(a.standbyGlobalFragmentsReceived)) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	// Send a duplicate, should be stored but not change entity map | 	// Send a duplicate, should be stored but not change entity map | ||||||
| 	a.receivedFragment(fragment) | 	a.receivedFragment(fragment) | ||||||
|  |  | ||||||
| @@ -735,9 +652,6 @@ func TestActivityLog_ReceivedFragment(t *testing.T) { | |||||||
| 	if len(a.standbyFragmentsReceived) != 2 { | 	if len(a.standbyFragmentsReceived) != 2 { | ||||||
| 		t.Fatalf("fragment count is %v, expected 2", len(a.standbyFragmentsReceived)) | 		t.Fatalf("fragment count is %v, expected 2", len(a.standbyFragmentsReceived)) | ||||||
| 	} | 	} | ||||||
| 	if len(a.standbyGlobalFragmentsReceived) != 2 { |  | ||||||
| 		t.Fatalf("fragment count is %v, expected 2", len(a.standbyGlobalFragmentsReceived)) |  | ||||||
| 	} |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // TestActivityLog_availableLogsEmptyDirectory verifies that availableLogs returns an empty slice when the log directory | // TestActivityLog_availableLogsEmptyDirectory verifies that availableLogs returns an empty slice when the log directory | ||||||
| @@ -1374,16 +1288,10 @@ func (a *ActivityLog) resetEntitiesInMemory(t *testing.T) { | |||||||
|  |  | ||||||
| 	a.l.Lock() | 	a.l.Lock() | ||||||
| 	defer a.l.Unlock() | 	defer a.l.Unlock() | ||||||
|  |  | ||||||
| 	a.fragmentLock.Lock() | 	a.fragmentLock.Lock() | ||||||
| 	defer a.fragmentLock.Unlock() | 	defer a.fragmentLock.Unlock() | ||||||
|  |  | ||||||
| 	a.localFragmentLock.Lock() |  | ||||||
| 	defer a.localFragmentLock.Unlock() |  | ||||||
|  |  | ||||||
| 	a.globalFragmentLock.Lock() | 	a.globalFragmentLock.Lock() | ||||||
| 	defer a.globalFragmentLock.Unlock() | 	defer a.globalFragmentLock.Unlock() | ||||||
|  |  | ||||||
| 	a.currentSegment = segmentInfo{ | 	a.currentSegment = segmentInfo{ | ||||||
| 		startTimestamp: time.Time{}.Unix(), | 		startTimestamp: time.Time{}.Unix(), | ||||||
| 		currentClients: &activity.EntityActivityLog{ | 		currentClients: &activity.EntityActivityLog{ | ||||||
| @@ -1394,7 +1302,6 @@ func (a *ActivityLog) resetEntitiesInMemory(t *testing.T) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	a.partialMonthClientTracker = make(map[string]*activity.EntityRecord) | 	a.partialMonthClientTracker = make(map[string]*activity.EntityRecord) | ||||||
| 	a.partialMonthLocalClientTracker = make(map[string]*activity.EntityRecord) |  | ||||||
| 	a.globalPartialMonthClientTracker = make(map[string]*activity.EntityRecord) | 	a.globalPartialMonthClientTracker = make(map[string]*activity.EntityRecord) | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -1591,12 +1498,9 @@ func TestActivityLog_loadPriorEntitySegment(t *testing.T) { | |||||||
| 		if tc.refresh { | 		if tc.refresh { | ||||||
| 			a.l.Lock() | 			a.l.Lock() | ||||||
| 			a.fragmentLock.Lock() | 			a.fragmentLock.Lock() | ||||||
| 			a.localFragmentLock.Lock() |  | ||||||
| 			a.partialMonthClientTracker = make(map[string]*activity.EntityRecord) | 			a.partialMonthClientTracker = make(map[string]*activity.EntityRecord) | ||||||
| 			a.partialMonthLocalClientTracker = make(map[string]*activity.EntityRecord) |  | ||||||
| 			a.currentSegment.startTimestamp = tc.time | 			a.currentSegment.startTimestamp = tc.time | ||||||
| 			a.fragmentLock.Unlock() | 			a.fragmentLock.Unlock() | ||||||
| 			a.localFragmentLock.Unlock() |  | ||||||
| 			a.l.Unlock() | 			a.l.Unlock() | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| @@ -4841,45 +4745,15 @@ func TestActivityLog_HandleEndOfMonth(t *testing.T) { | |||||||
| // clients and verifies that they are added correctly to the tracking data | // clients and verifies that they are added correctly to the tracking data | ||||||
| // structures | // structures | ||||||
| func TestAddActivityToFragment(t *testing.T) { | func TestAddActivityToFragment(t *testing.T) { | ||||||
| 	storage := &logical.InmemStorage{} | 	core, _, _ := TestCoreUnsealed(t) | ||||||
| 	coreConfig := &CoreConfig{ |  | ||||||
| 		CredentialBackends: map[string]logical.Factory{ |  | ||||||
| 			"userpass": userpass.Factory, |  | ||||||
| 		}, |  | ||||||
| 		Physical: storage.Underlying(), |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	cluster := NewTestCluster(t, coreConfig, nil) |  | ||||||
| 	core := cluster.Cores[0].Core |  | ||||||
| 	a := core.activityLog | 	a := core.activityLog | ||||||
| 	a.SetEnable(true) | 	a.SetEnable(true) | ||||||
|  |  | ||||||
| 	require.Nil(t, a.fragment) |  | ||||||
| 	require.Nil(t, a.localFragment) |  | ||||||
| 	require.Nil(t, a.currentGlobalFragment) |  | ||||||
|  |  | ||||||
| 	mount := "mount" | 	mount := "mount" | ||||||
| 	localMount := "localMount" |  | ||||||
| 	ns := "root" | 	ns := "root" | ||||||
| 	id := "id1" | 	id := "id1" | ||||||
|  |  | ||||||
| 	// keeps track of the number of clients added to localFragment |  | ||||||
| 	localCount := 0 |  | ||||||
|  |  | ||||||
| 	// add a client to regular fragment |  | ||||||
| 	a.AddActivityToFragment(id, ns, 0, entityActivityType, mount) | 	a.AddActivityToFragment(id, ns, 0, entityActivityType, mount) | ||||||
|  |  | ||||||
| 	// create a local mount accessor for local clients |  | ||||||
| 	localMe := &MountEntry{ |  | ||||||
| 		Table:    credentialTableType, |  | ||||||
| 		Path:     "userpass-local/", |  | ||||||
| 		Type:     "userpass", |  | ||||||
| 		Local:    true, |  | ||||||
| 		Accessor: localMount, |  | ||||||
| 	} |  | ||||||
| 	err := core.enableCredential(namespace.RootContext(nil), localMe) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 	testCases := []struct { | 	testCases := []struct { | ||||||
| 		name         string | 		name         string | ||||||
| 		id           string | 		id           string | ||||||
| @@ -4887,7 +4761,6 @@ func TestAddActivityToFragment(t *testing.T) { | |||||||
| 		isAdded      bool | 		isAdded      bool | ||||||
| 		expectedID   string | 		expectedID   string | ||||||
| 		isNonEntity  bool | 		isNonEntity  bool | ||||||
| 		isLocal      bool |  | ||||||
| 	}{ | 	}{ | ||||||
| 		{ | 		{ | ||||||
| 			name:         "duplicate", | 			name:         "duplicate", | ||||||
| @@ -4895,7 +4768,6 @@ func TestAddActivityToFragment(t *testing.T) { | |||||||
| 			activityType: entityActivityType, | 			activityType: entityActivityType, | ||||||
| 			isAdded:      false, | 			isAdded:      false, | ||||||
| 			expectedID:   id, | 			expectedID:   id, | ||||||
| 			isLocal:      false, |  | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:         "new entity", | 			name:         "new entity", | ||||||
| @@ -4903,7 +4775,6 @@ func TestAddActivityToFragment(t *testing.T) { | |||||||
| 			activityType: entityActivityType, | 			activityType: entityActivityType, | ||||||
| 			isAdded:      true, | 			isAdded:      true, | ||||||
| 			expectedID:   "new-id", | 			expectedID:   "new-id", | ||||||
| 			isLocal:      false, |  | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:         "new nonentity", | 			name:         "new nonentity", | ||||||
| @@ -4912,7 +4783,6 @@ func TestAddActivityToFragment(t *testing.T) { | |||||||
| 			isAdded:      true, | 			isAdded:      true, | ||||||
| 			expectedID:   "new-nonentity", | 			expectedID:   "new-nonentity", | ||||||
| 			isNonEntity:  true, | 			isNonEntity:  true, | ||||||
| 			isLocal:      true, |  | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:         "new acme", | 			name:         "new acme", | ||||||
| @@ -4921,7 +4791,6 @@ func TestAddActivityToFragment(t *testing.T) { | |||||||
| 			isAdded:      true, | 			isAdded:      true, | ||||||
| 			expectedID:   "pki-acme.new-acme", | 			expectedID:   "pki-acme.new-acme", | ||||||
| 			isNonEntity:  true, | 			isNonEntity:  true, | ||||||
| 			isLocal:      false, |  | ||||||
| 		}, | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			name:         "new secret sync", | 			name:         "new secret sync", | ||||||
| @@ -4930,22 +4799,11 @@ func TestAddActivityToFragment(t *testing.T) { | |||||||
| 			isAdded:      true, | 			isAdded:      true, | ||||||
| 			expectedID:   "new-secret-sync", | 			expectedID:   "new-secret-sync", | ||||||
| 			isNonEntity:  true, | 			isNonEntity:  true, | ||||||
| 			isLocal:      false, |  | ||||||
| 		}, |  | ||||||
| 		{ |  | ||||||
| 			name:         "new local entity", |  | ||||||
| 			id:           "new-local-id", |  | ||||||
| 			activityType: entityActivityType, |  | ||||||
| 			isAdded:      true, |  | ||||||
| 			expectedID:   "new-local-id", |  | ||||||
| 			isNonEntity:  false, |  | ||||||
| 			isLocal:      true, |  | ||||||
| 		}, | 		}, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	for _, tc := range testCases { | 	for _, tc := range testCases { | ||||||
| 		t.Run(tc.name, func(t *testing.T) { | 		t.Run(tc.name, func(t *testing.T) { | ||||||
| 			var mountAccessor string |  | ||||||
| 			a.fragmentLock.RLock() | 			a.fragmentLock.RLock() | ||||||
| 			numClientsBefore := len(a.fragment.Clients) | 			numClientsBefore := len(a.fragment.Clients) | ||||||
| 			a.fragmentLock.RUnlock() | 			a.fragmentLock.RUnlock() | ||||||
| @@ -4954,25 +4812,7 @@ func TestAddActivityToFragment(t *testing.T) { | |||||||
| 			globalClientsBefore := len(a.currentGlobalFragment.Clients) | 			globalClientsBefore := len(a.currentGlobalFragment.Clients) | ||||||
| 			a.globalFragmentLock.RUnlock() | 			a.globalFragmentLock.RUnlock() | ||||||
|  |  | ||||||
| 			numLocalClientsBefore := 0 |  | ||||||
|  |  | ||||||
| 			// add client to the fragment |  | ||||||
| 			if tc.isLocal { |  | ||||||
| 				// data already present in local fragment, get client count before adding activity to fragment |  | ||||||
| 				a.localFragmentLock.RLock() |  | ||||||
| 				numLocalClientsBefore = len(a.localFragment.Clients) |  | ||||||
| 				a.localFragmentLock.RUnlock() |  | ||||||
|  |  | ||||||
| 				mountAccessor = localMount |  | ||||||
| 				a.AddActivityToFragment(tc.id, ns, 0, tc.activityType, localMount) |  | ||||||
|  |  | ||||||
| 				require.NotNil(t, a.localFragment) |  | ||||||
| 				localCount++ |  | ||||||
| 			} else { |  | ||||||
| 				mountAccessor = mount |  | ||||||
| 			a.AddActivityToFragment(tc.id, ns, 0, tc.activityType, mount) | 			a.AddActivityToFragment(tc.id, ns, 0, tc.activityType, mount) | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			a.fragmentLock.RLock() | 			a.fragmentLock.RLock() | ||||||
| 			defer a.fragmentLock.RUnlock() | 			defer a.fragmentLock.RUnlock() | ||||||
| 			numClientsAfter := len(a.fragment.Clients) | 			numClientsAfter := len(a.fragment.Clients) | ||||||
| @@ -4980,36 +4820,14 @@ func TestAddActivityToFragment(t *testing.T) { | |||||||
| 			defer a.globalFragmentLock.RUnlock() | 			defer a.globalFragmentLock.RUnlock() | ||||||
| 			globalClientsAfter := len(a.currentGlobalFragment.Clients) | 			globalClientsAfter := len(a.currentGlobalFragment.Clients) | ||||||
|  |  | ||||||
| 			// if local client, verify if local fragment is updated | 			if tc.isAdded { | ||||||
| 			if tc.isLocal { | 				require.Equal(t, numClientsBefore+1, numClientsAfter) | ||||||
| 				a.localFragmentLock.RLock() |  | ||||||
| 				defer a.localFragmentLock.RUnlock() |  | ||||||
|  |  | ||||||
| 				numLocalClientsAfter := len(a.localFragment.Clients) |  | ||||||
| 				switch tc.isAdded { |  | ||||||
| 				case true: |  | ||||||
| 					require.Equal(t, numLocalClientsBefore+1, numLocalClientsAfter) |  | ||||||
| 				default: |  | ||||||
| 					require.Equal(t, numLocalClientsBefore, numLocalClientsAfter) |  | ||||||
| 				} |  | ||||||
| 			} else { |  | ||||||
| 				// verify global clients |  | ||||||
| 				switch tc.isAdded { |  | ||||||
| 				case true: |  | ||||||
| 				if tc.activityType != nonEntityTokenActivityType { | 				if tc.activityType != nonEntityTokenActivityType { | ||||||
| 					require.Equal(t, globalClientsBefore+1, globalClientsAfter) | 					require.Equal(t, globalClientsBefore+1, globalClientsAfter) | ||||||
| 				} | 				} | ||||||
| 				default: |  | ||||||
| 					require.Equal(t, globalClientsBefore, globalClientsAfter) |  | ||||||
| 				} |  | ||||||
| 			} |  | ||||||
|  |  | ||||||
| 			// for now local clients are added to both regular fragment and local fragment. |  | ||||||
| 			// this will be modified in ticket vault-31234 |  | ||||||
| 			if tc.isAdded { |  | ||||||
| 				require.Equal(t, numClientsBefore+1, numClientsAfter) |  | ||||||
| 			} else { | 			} else { | ||||||
| 				require.Equal(t, numClientsBefore, numClientsAfter) | 				require.Equal(t, numClientsBefore, numClientsAfter) | ||||||
|  | 				require.Equal(t, globalClientsBefore, globalClientsAfter) | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			require.Contains(t, a.partialMonthClientTracker, tc.expectedID) | 			require.Contains(t, a.partialMonthClientTracker, tc.expectedID) | ||||||
| @@ -5018,21 +4836,10 @@ func TestAddActivityToFragment(t *testing.T) { | |||||||
| 				NamespaceID:   ns, | 				NamespaceID:   ns, | ||||||
| 				Timestamp:     0, | 				Timestamp:     0, | ||||||
| 				NonEntity:     tc.isNonEntity, | 				NonEntity:     tc.isNonEntity, | ||||||
| 				MountAccessor: mountAccessor, | 				MountAccessor: mount, | ||||||
| 				ClientType:    tc.activityType, | 				ClientType:    tc.activityType, | ||||||
| 			}, a.partialMonthClientTracker[tc.expectedID])) | 			}, a.partialMonthClientTracker[tc.expectedID])) | ||||||
|  | 			if tc.activityType != nonEntityTokenActivityType { | ||||||
| 			if tc.isLocal { |  | ||||||
| 				require.Contains(t, a.partialMonthLocalClientTracker, tc.expectedID) |  | ||||||
| 				require.True(t, proto.Equal(&activity.EntityRecord{ |  | ||||||
| 					ClientID:      tc.expectedID, |  | ||||||
| 					NamespaceID:   ns, |  | ||||||
| 					Timestamp:     0, |  | ||||||
| 					NonEntity:     tc.isNonEntity, |  | ||||||
| 					MountAccessor: mountAccessor, |  | ||||||
| 					ClientType:    tc.activityType, |  | ||||||
| 				}, a.partialMonthLocalClientTracker[tc.expectedID])) |  | ||||||
| 			} else { |  | ||||||
| 				require.Contains(t, a.globalPartialMonthClientTracker, tc.expectedID) | 				require.Contains(t, a.globalPartialMonthClientTracker, tc.expectedID) | ||||||
| 				require.True(t, proto.Equal(&activity.EntityRecord{ | 				require.True(t, proto.Equal(&activity.EntityRecord{ | ||||||
| 					ClientID:      tc.expectedID, | 					ClientID:      tc.expectedID, | ||||||
| @@ -5047,81 +4854,6 @@ func TestAddActivityToFragment(t *testing.T) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| // TestGetAllPartialMonthClients adds activity for a local and regular clients and verifies that |  | ||||||
| // GetAllPartialMonthClients returns the right local and global clients |  | ||||||
| func TestGetAllPartialMonthClients(t *testing.T) { |  | ||||||
| 	storage := &logical.InmemStorage{} |  | ||||||
| 	coreConfig := &CoreConfig{ |  | ||||||
| 		CredentialBackends: map[string]logical.Factory{ |  | ||||||
| 			"userpass": userpass.Factory, |  | ||||||
| 		}, |  | ||||||
| 		Physical: storage.Underlying(), |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	cluster := NewTestCluster(t, coreConfig, nil) |  | ||||||
| 	core := cluster.Cores[0].Core |  | ||||||
| 	a := core.activityLog |  | ||||||
| 	a.SetEnable(true) |  | ||||||
|  |  | ||||||
| 	require.Nil(t, a.fragment) |  | ||||||
| 	require.Nil(t, a.localFragment) |  | ||||||
| 	require.Nil(t, a.currentGlobalFragment) |  | ||||||
|  |  | ||||||
| 	ns := "root" |  | ||||||
| 	mount := "mount" |  | ||||||
| 	localMount := "localMount" |  | ||||||
| 	clientID := "id1" |  | ||||||
| 	localClientID := "new-local-id" |  | ||||||
|  |  | ||||||
| 	// add a client to regular fragment, this should be added to globalPartialMonthClientTracker |  | ||||||
| 	a.AddActivityToFragment(clientID, ns, 0, entityActivityType, mount) |  | ||||||
|  |  | ||||||
| 	require.NotNil(t, a.localFragment) |  | ||||||
| 	require.NotNil(t, a.fragment) |  | ||||||
| 	require.NotNil(t, a.currentGlobalFragment) |  | ||||||
|  |  | ||||||
| 	// create a local mount accessor |  | ||||||
| 	localMe := &MountEntry{ |  | ||||||
| 		Table:    credentialTableType, |  | ||||||
| 		Path:     "userpass-local/", |  | ||||||
| 		Type:     "userpass", |  | ||||||
| 		Local:    true, |  | ||||||
| 		Accessor: localMount, |  | ||||||
| 	} |  | ||||||
| 	err := core.enableCredential(namespace.RootContext(nil), localMe) |  | ||||||
| 	require.NoError(t, err) |  | ||||||
|  |  | ||||||
| 	// add client to local fragment, this should be added to partialMonthLocalClientTracker |  | ||||||
| 	a.AddActivityToFragment(localClientID, ns, 0, entityActivityType, localMount) |  | ||||||
|  |  | ||||||
| 	require.NotNil(t, a.localFragment) |  | ||||||
|  |  | ||||||
| 	// GetAllPartialMonthClients returns the partialMonthLocalClientTracker and globalPartialMonthClientTracker |  | ||||||
| 	localClients, globalClients := a.GetAllPartialMonthClients() |  | ||||||
|  |  | ||||||
| 	// verify the returned localClients |  | ||||||
| 	require.Len(t, localClients, 1) |  | ||||||
| 	require.Contains(t, localClients, localClientID) |  | ||||||
| 	require.True(t, proto.Equal(&activity.EntityRecord{ |  | ||||||
| 		ClientID:      localClientID, |  | ||||||
| 		NamespaceID:   ns, |  | ||||||
| 		Timestamp:     0, |  | ||||||
| 		MountAccessor: localMount, |  | ||||||
| 		ClientType:    entityActivityType, |  | ||||||
| 	}, localClients[localClientID])) |  | ||||||
|  |  | ||||||
| 	// verify the returned globalClients |  | ||||||
| 	require.Len(t, globalClients, 1) |  | ||||||
| 	require.Contains(t, globalClients, clientID) |  | ||||||
| 	require.True(t, proto.Equal(&activity.EntityRecord{ |  | ||||||
| 		ClientID:      clientID, |  | ||||||
| 		NamespaceID:   ns, |  | ||||||
| 		Timestamp:     0, |  | ||||||
| 		MountAccessor: mount, |  | ||||||
| 		ClientType:    entityActivityType, |  | ||||||
| 	}, globalClients[clientID])) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // TestActivityLog_reportPrecomputedQueryMetrics creates 3 clients per type and | // TestActivityLog_reportPrecomputedQueryMetrics creates 3 clients per type and | ||||||
| // calls reportPrecomputedQueryMetrics. The test verifies that the metric sink | // calls reportPrecomputedQueryMetrics. The test verifies that the metric sink | ||||||
| // gets metrics reported correctly, based on the segment time matching the | // gets metrics reported correctly, based on the segment time matching the | ||||||
|   | |||||||
| @@ -57,27 +57,17 @@ func (c *Core) InjectActivityLogDataThisMonth(t *testing.T) map[string]*activity | |||||||
| 	return c.activityLog.partialMonthClientTracker | 	return c.activityLog.partialMonthClientTracker | ||||||
| } | } | ||||||
|  |  | ||||||
| // GetActiveClients returns the in-memory globalPartialMonthClientTracker and  partialMonthLocalClientTracker from an | // GetActiveClients returns the in-memory partialMonthClientTracker from an | ||||||
| // activity log. | // activity log. | ||||||
| func (c *Core) GetActiveClients() map[string]*activity.EntityRecord { | func (c *Core) GetActiveClients() map[string]*activity.EntityRecord { | ||||||
| 	out := make(map[string]*activity.EntityRecord) | 	out := make(map[string]*activity.EntityRecord) | ||||||
|  |  | ||||||
| 	c.stateLock.RLock() | 	c.stateLock.RLock() | ||||||
| 	c.activityLog.globalFragmentLock.RLock() | 	c.activityLog.globalFragmentLock.RLock() | ||||||
| 	c.activityLog.localFragmentLock.RLock() |  | ||||||
|  |  | ||||||
| 	// add active global clients |  | ||||||
| 	for k, v := range c.activityLog.globalPartialMonthClientTracker { | 	for k, v := range c.activityLog.globalPartialMonthClientTracker { | ||||||
| 		out[k] = v | 		out[k] = v | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// add active local clients |  | ||||||
| 	for k, v := range c.activityLog.partialMonthLocalClientTracker { |  | ||||||
| 		out[k] = v |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	c.activityLog.globalFragmentLock.RUnlock() | 	c.activityLog.globalFragmentLock.RUnlock() | ||||||
| 	c.activityLog.localFragmentLock.RUnlock() |  | ||||||
| 	c.stateLock.RUnlock() | 	c.stateLock.RUnlock() | ||||||
|  |  | ||||||
| 	return out | 	return out | ||||||
| @@ -178,9 +168,6 @@ func (a *ActivityLog) ExpectCurrentSegmentRefreshed(t *testing.T, expectedStart | |||||||
| 	if a.partialMonthClientTracker == nil { | 	if a.partialMonthClientTracker == nil { | ||||||
| 		t.Errorf("expected non-nil partialMonthClientTracker") | 		t.Errorf("expected non-nil partialMonthClientTracker") | ||||||
| 	} | 	} | ||||||
| 	if a.partialMonthLocalClientTracker == nil { |  | ||||||
| 		t.Errorf("expected non-nil partialMonthLocalClientTracker") |  | ||||||
| 	} |  | ||||||
| 	if len(a.currentSegment.currentClients.Clients) > 0 { | 	if len(a.currentSegment.currentClients.Clients) > 0 { | ||||||
| 		t.Errorf("expected no current entity segment to be loaded. got: %v", a.currentSegment.currentClients) | 		t.Errorf("expected no current entity segment to be loaded. got: %v", a.currentSegment.currentClients) | ||||||
| 	} | 	} | ||||||
| @@ -190,9 +177,6 @@ func (a *ActivityLog) ExpectCurrentSegmentRefreshed(t *testing.T, expectedStart | |||||||
| 	if len(a.partialMonthClientTracker) > 0 { | 	if len(a.partialMonthClientTracker) > 0 { | ||||||
| 		t.Errorf("expected no active entity segment to be loaded. got: %v", a.partialMonthClientTracker) | 		t.Errorf("expected no active entity segment to be loaded. got: %v", a.partialMonthClientTracker) | ||||||
| 	} | 	} | ||||||
| 	if len(a.partialMonthLocalClientTracker) > 0 { |  | ||||||
| 		t.Errorf("expected no active entity segment to be loaded. got: %v", a.partialMonthLocalClientTracker) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if verifyTimeNotZero { | 	if verifyTimeNotZero { | ||||||
| 		if a.currentSegment.startTimestamp == 0 { | 		if a.currentSegment.startTimestamp == 0 { | ||||||
| @@ -271,11 +255,3 @@ func (c *Core) GetActiveGlobalFragment() *activity.LogFragment { | |||||||
| func (c *Core) GetSecondaryGlobalFragments() []*activity.LogFragment { | func (c *Core) GetSecondaryGlobalFragments() []*activity.LogFragment { | ||||||
| 	return c.activityLog.secondaryGlobalClientFragments | 	return c.activityLog.secondaryGlobalClientFragments | ||||||
| } | } | ||||||
|  |  | ||||||
| func (c *Core) GetActiveLocalFragment() *activity.LogFragment { |  | ||||||
| 	return c.activityLog.localFragment |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (c *Core) GetActiveFragment() *activity.LogFragment { |  | ||||||
| 	return c.activityLog.fragment |  | ||||||
| } |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 divyaac
					divyaac