mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-10-29 17:52:32 +00:00
This reverts commit 1e82fe9980.
This commit is contained in:
@@ -148,11 +148,7 @@ type ActivityLog struct {
|
||||
// standbyFragmentsReceived.
|
||||
fragmentLock sync.RWMutex
|
||||
|
||||
// localFragmentLock protects partialMonthLocalClientTracker, localFragment,
|
||||
// standbyLocalFragmentsReceived.
|
||||
localFragmentLock sync.RWMutex
|
||||
|
||||
// globalFragmentLock protects enable secondaryGlobalClientFragments, standbyGlobalFragmentsReceived, currentGlobalFragment
|
||||
// globalFragmentLock protects enable secondaryGlobalClientFragments, currentGlobalFragment
|
||||
// and globalPartialMonthClientTracker
|
||||
globalFragmentLock sync.RWMutex
|
||||
|
||||
@@ -184,9 +180,6 @@ type ActivityLog struct {
|
||||
// so it's appropriate to start the timer.
|
||||
newFragmentCh chan struct{}
|
||||
|
||||
// current local log fragment (may be nil)
|
||||
localFragment *activity.LogFragment
|
||||
|
||||
// Channel to signal a new global fragment has been created
|
||||
// so it's appropriate to start the timer. Once the timer finishes
|
||||
// the secondary will send currentGlobalFragment to the primary
|
||||
@@ -204,12 +197,6 @@ type ActivityLog struct {
|
||||
// Fragments received from performance standbys
|
||||
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
|
||||
secondaryGlobalClientFragments []*activity.LogFragment
|
||||
|
||||
@@ -232,9 +219,6 @@ type ActivityLog struct {
|
||||
// partialMonthClientTracker tracks active clients this month. Protected by fragmentLock.
|
||||
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 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
|
||||
// This is only for testing purposes
|
||||
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
|
||||
@@ -355,11 +335,10 @@ func NewActivityLog(core *Core, logger log.Logger, view *BarrierView, metrics me
|
||||
metrics: metrics,
|
||||
nodeID: hostname,
|
||||
newFragmentCh: make(chan struct{}, 1),
|
||||
newGlobalClientFragmentCh: make(chan struct{}, 1),
|
||||
sendCh: make(chan struct{}, 1), // buffered so it can be triggered by fragment size
|
||||
doneCh: make(chan struct{}, 1),
|
||||
partialMonthClientTracker: make(map[string]*activity.EntityRecord),
|
||||
partialMonthLocalClientTracker: make(map[string]*activity.EntityRecord),
|
||||
newGlobalClientFragmentCh: make(chan struct{}, 1),
|
||||
globalPartialMonthClientTracker: make(map[string]*activity.EntityRecord),
|
||||
clock: clock,
|
||||
currentSegment: segmentInfo{
|
||||
@@ -376,8 +355,6 @@ func NewActivityLog(core *Core, logger log.Logger, view *BarrierView, metrics me
|
||||
clientSequenceNumber: 0,
|
||||
},
|
||||
standbyFragmentsReceived: make([]*activity.LogFragment, 0),
|
||||
standbyLocalFragmentsReceived: make([]*activity.LogFragment, 0),
|
||||
standbyGlobalFragmentsReceived: make([]*activity.LogFragment, 0),
|
||||
secondaryGlobalClientFragments: make([]*activity.LogFragment, 0),
|
||||
inprocessExport: atomic.NewBool(false),
|
||||
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"},
|
||||
a.clock.Now(), []metricsutil.Label{})
|
||||
|
||||
// Swap out the pending regular fragments
|
||||
// Swap out the pending fragments
|
||||
a.fragmentLock.Lock()
|
||||
currentFragment := a.fragment
|
||||
localFragment := a.fragment
|
||||
a.fragment = nil
|
||||
|
||||
standbys := a.standbyFragmentsReceived
|
||||
a.standbyFragmentsReceived = make([]*activity.LogFragment, 0)
|
||||
a.fragmentLock.Unlock()
|
||||
@@ -465,38 +443,14 @@ func (a *ActivityLog) saveCurrentSegmentToStorageLocked(ctx context.Context, for
|
||||
return nil
|
||||
}
|
||||
|
||||
// Measure the current regular 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
|
||||
// Measure the current fragment
|
||||
if localFragment != nil {
|
||||
a.metrics.IncrCounterWithLabels([]string{"core", "activity", "local_fragment_size"},
|
||||
a.metrics.IncrCounterWithLabels([]string{"core", "activity", "fragment_size"},
|
||||
float32(len(localFragment.Clients)),
|
||||
[]metricsutil.Label{
|
||||
{"type", "entity"},
|
||||
})
|
||||
a.metrics.IncrCounterWithLabels([]string{"core", "activity", "local_fragment_size"},
|
||||
a.metrics.IncrCounterWithLabels([]string{"core", "activity", "fragment_size"},
|
||||
float32(len(localFragment.NonEntityTokens)),
|
||||
[]metricsutil.Label{
|
||||
{"type", "direct_token"},
|
||||
@@ -506,7 +460,7 @@ func (a *ActivityLog) saveCurrentSegmentToStorageLocked(ctx context.Context, for
|
||||
// Collect new entities and new tokens.
|
||||
saveChanges := false
|
||||
newEntities := make(map[string]*activity.EntityRecord)
|
||||
for _, f := range append(standbys, currentFragment) {
|
||||
for _, f := range append(standbys, localFragment) {
|
||||
if f == nil {
|
||||
continue
|
||||
}
|
||||
@@ -516,7 +470,7 @@ func (a *ActivityLog) saveCurrentSegmentToStorageLocked(ctx context.Context, for
|
||||
for _, e := range f.Clients {
|
||||
// We could sort by timestamp to see which is first.
|
||||
// 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.
|
||||
newEntities[e.ClientID] = e
|
||||
}
|
||||
@@ -1595,12 +1549,6 @@ func (a *ActivityLog) perfStandbyFragmentWorker(ctx context.Context) {
|
||||
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() {
|
||||
ctx, cancel := context.WithTimeout(ctx, activityFragmentSendTimeout)
|
||||
defer cancel()
|
||||
@@ -1628,7 +1576,7 @@ func (a *ActivityLog) perfStandbyFragmentWorker(ctx context.Context) {
|
||||
fragmentWaiting = true
|
||||
if !a.configOverrides.DisableTimers {
|
||||
a.logger.Trace("reset fragment timer")
|
||||
timer.Reset(sendInterval)
|
||||
timer.Reset(activityFragmentSendInterval)
|
||||
}
|
||||
}
|
||||
case <-timer.C:
|
||||
@@ -1665,11 +1613,6 @@ func (a *ActivityLog) perfStandbyFragmentWorker(ctx context.Context) {
|
||||
|
||||
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.
|
||||
// The current segment *probably* hasn't been set yet (via invalidation),
|
||||
// so don't rely on it.
|
||||
@@ -1841,28 +1784,17 @@ func (c *Core) ResetActivityLog() []*activity.LogFragment {
|
||||
|
||||
allFragments := make([]*activity.LogFragment, 1)
|
||||
a.fragmentLock.Lock()
|
||||
|
||||
allFragments[0] = a.fragment
|
||||
a.fragment = nil
|
||||
|
||||
allFragments = append(allFragments, a.standbyFragmentsReceived...)
|
||||
a.standbyFragmentsReceived = make([]*activity.LogFragment, 0)
|
||||
a.secondaryGlobalClientFragments = make([]*activity.LogFragment, 0)
|
||||
a.partialMonthClientTracker = make(map[string]*activity.EntityRecord)
|
||||
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.globalPartialMonthClientTracker = make(map[string]*activity.EntityRecord)
|
||||
a.standbyGlobalFragmentsReceived = make([]*activity.LogFragment, 0)
|
||||
a.globalFragmentLock.Unlock()
|
||||
return allFragments
|
||||
}
|
||||
@@ -1901,16 +1833,11 @@ func (a *ActivityLog) AddActivityToFragment(clientID string, namespaceID string,
|
||||
|
||||
a.fragmentLock.RLock()
|
||||
if a.enabled {
|
||||
_, presentInRegularClientMap := a.partialMonthClientTracker[clientID]
|
||||
_, presentInLocalClientmap := a.partialMonthLocalClientTracker[clientID]
|
||||
if presentInRegularClientMap || presentInLocalClientmap {
|
||||
present = true
|
||||
}
|
||||
_, present = a.partialMonthClientTracker[clientID]
|
||||
} else {
|
||||
present = true
|
||||
}
|
||||
a.fragmentLock.RUnlock()
|
||||
|
||||
if present {
|
||||
return
|
||||
}
|
||||
@@ -1919,24 +1846,17 @@ func (a *ActivityLog) AddActivityToFragment(clientID string, namespaceID string,
|
||||
a.fragmentLock.Lock()
|
||||
defer a.fragmentLock.Unlock()
|
||||
|
||||
a.localFragmentLock.Lock()
|
||||
defer a.localFragmentLock.Unlock()
|
||||
|
||||
a.globalFragmentLock.Lock()
|
||||
defer a.globalFragmentLock.Unlock()
|
||||
|
||||
// Re-check entity ID after re-acquiring lock
|
||||
_, presentInRegularClientMap := a.partialMonthClientTracker[clientID]
|
||||
_, presentInLocalClientmap := a.partialMonthLocalClientTracker[clientID]
|
||||
if presentInRegularClientMap || presentInLocalClientmap {
|
||||
present = true
|
||||
}
|
||||
_, present = a.partialMonthClientTracker[clientID]
|
||||
if present {
|
||||
return
|
||||
}
|
||||
|
||||
// create fragments if doesn't already exist
|
||||
a.createCurrentFragment()
|
||||
a.createCurrentGlobalFragment()
|
||||
|
||||
clientRecord := &activity.EntityRecord{
|
||||
ClientID: clientID,
|
||||
@@ -1954,22 +1874,18 @@ func (a *ActivityLog) AddActivityToFragment(clientID string, namespaceID string,
|
||||
clientRecord.NonEntity = true
|
||||
}
|
||||
|
||||
// add the clients to the regular fragment
|
||||
a.fragment.Clients = append(a.fragment.Clients, clientRecord)
|
||||
a.partialMonthClientTracker[clientRecord.ClientID] = clientRecord
|
||||
|
||||
if local, _ := a.isClientLocal(clientRecord); local {
|
||||
// If the client is local then add the client to the current local fragment
|
||||
a.localFragment.Clients = append(a.localFragment.Clients, clientRecord)
|
||||
a.partialMonthLocalClientTracker[clientRecord.ClientID] = clientRecord
|
||||
} else {
|
||||
// Check if the client is local
|
||||
if local, _ := a.isClientLocal(clientRecord); !local {
|
||||
// If the client is not local and has not already been seen, then add the client
|
||||
// to the current global fragment
|
||||
if _, ok := a.globalPartialMonthClientTracker[clientRecord.ClientID]; !ok {
|
||||
// If the client is not local and has not already been seen, then add the client
|
||||
// to the current global fragment
|
||||
a.currentGlobalFragment.Clients = append(a.currentGlobalFragment.Clients, 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.
|
||||
@@ -1992,25 +1908,25 @@ func (a *ActivityLog) isClientLocal(client *activity.EntityRecord) (bool, error)
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// Create the fragments (regular fragment, local fragment and global fragment) if it doesn't already exist.
|
||||
// Must be called with the fragmentLock, localFragmentLock and globalFragmentLock held.
|
||||
// Create the current fragment if it doesn't already exist.
|
||||
// Must be called with the lock held.
|
||||
func (a *ActivityLog) createCurrentFragment() {
|
||||
if a.fragment == nil {
|
||||
// create regular fragment
|
||||
a.fragment = &activity.LogFragment{
|
||||
OriginatingNode: a.nodeID,
|
||||
Clients: make([]*activity.EntityRecord, 0, 120),
|
||||
NonEntityTokens: make(map[string]uint64),
|
||||
}
|
||||
// Signal that a new segment is available, start
|
||||
// the timer to send it.
|
||||
a.newFragmentCh <- struct{}{}
|
||||
}
|
||||
}
|
||||
|
||||
// create local fragment
|
||||
a.localFragment = &activity.LogFragment{
|
||||
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{
|
||||
OriginatingCluster: a.core.ClusterID(),
|
||||
Clients: make([]*activity.EntityRecord, 0),
|
||||
@@ -2021,10 +1937,6 @@ func (a *ActivityLog) createCurrentFragment() {
|
||||
// the timer to send it
|
||||
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) {
|
||||
a.logger.Trace("received fragment from standby", "node", fragment.OriginatingNode)
|
||||
|
||||
isLocalFragment := false
|
||||
a.fragmentLock.Lock()
|
||||
defer a.fragmentLock.Unlock()
|
||||
|
||||
if !a.enabled {
|
||||
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()
|
||||
defer a.globalFragmentLock.Unlock()
|
||||
}
|
||||
}
|
||||
a.globalFragmentLock.Lock()
|
||||
defer a.globalFragmentLock.Unlock()
|
||||
a.createCurrentGlobalFragment()
|
||||
|
||||
for _, e := range fragment.Clients {
|
||||
a.partialMonthClientTracker[e.ClientID] = e
|
||||
if isLocalFragment {
|
||||
a.partialMonthLocalClientTracker[e.ClientID] = e
|
||||
} else {
|
||||
|
||||
// If the client is global, then add to global maps and keep in a global fragment
|
||||
if local, _ := a.isClientLocal(e); !local {
|
||||
a.globalPartialMonthClientTracker[e.ClientID] = e
|
||||
a.currentGlobalFragment.Clients = append(a.currentGlobalFragment.Clients, e)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
// 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 {
|
||||
EntityClients int `json:"entity_clients" mapstructure:"entity_clients"`
|
||||
NonEntityClients int `json:"non_entity_clients" mapstructure:"non_entity_clients"`
|
||||
|
||||
@@ -23,7 +23,6 @@ import (
|
||||
"github.com/go-test/deep"
|
||||
"github.com/golang/protobuf/proto"
|
||||
"github.com/hashicorp/go-uuid"
|
||||
"github.com/hashicorp/vault/builtin/credential/userpass"
|
||||
"github.com/hashicorp/vault/helper/constants"
|
||||
"github.com/hashicorp/vault/helper/namespace"
|
||||
"github.com/hashicorp/vault/helper/timeutil"
|
||||
@@ -35,16 +34,7 @@ import (
|
||||
|
||||
// TestActivityLog_Creation calls AddEntityToFragment and verifies that it appears correctly in a.fragment.
|
||||
func TestActivityLog_Creation(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
|
||||
core, _, _ := TestCoreUnsealed(t)
|
||||
|
||||
a := core.activityLog
|
||||
a.SetEnable(true)
|
||||
@@ -59,10 +49,6 @@ func TestActivityLog_Creation(t *testing.T) {
|
||||
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 namespace_id = "ns123"
|
||||
ts := time.Now()
|
||||
@@ -132,49 +118,6 @@ func TestActivityLog_Creation(t *testing.T) {
|
||||
if 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
|
||||
@@ -196,13 +139,6 @@ func TestActivityLog_Creation_WrappingTokens(t *testing.T) {
|
||||
t.Fatal("activity log already has fragment")
|
||||
}
|
||||
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"
|
||||
|
||||
te := &logical.TokenEntry{
|
||||
@@ -413,10 +349,6 @@ func TestActivityLog_SaveTokensToStorage(t *testing.T) {
|
||||
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{}
|
||||
protoSegment := readSegmentFromStorage(t, core, path)
|
||||
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")
|
||||
}
|
||||
|
||||
if a.localFragment != nil {
|
||||
t.Errorf("local fragment was not reset after write to storage")
|
||||
}
|
||||
|
||||
protoSegment = readSegmentFromStorage(t, core, path)
|
||||
out = &activity.TokenCount{}
|
||||
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")
|
||||
}
|
||||
|
||||
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
|
||||
readSegmentFromStorageNil(t, core, tokenPath)
|
||||
|
||||
@@ -589,9 +513,6 @@ func TestActivityLog_SaveEntitiesToStorage(t *testing.T) {
|
||||
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)
|
||||
out := &activity.EntityActivityLog{}
|
||||
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
|
||||
// standbyFragmentsReceived and standbyGlobalFragmentsReceived. Send the same fragment again and then verify that it doesn't change the entity map but does
|
||||
// get added to standbyFragmentsReceived and standbyGlobalFragmentsReceived.
|
||||
// standbyFragmentsReceived. Send the same fragment again and then verify that it doesn't change the entity map but does
|
||||
// get added to standbyFragmentsReceived.
|
||||
func TestActivityLog_ReceivedFragment(t *testing.T) {
|
||||
core, _, _ := TestCoreUnsealed(t)
|
||||
a := core.activityLog
|
||||
@@ -723,10 +644,6 @@ func TestActivityLog_ReceivedFragment(t *testing.T) {
|
||||
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
|
||||
a.receivedFragment(fragment)
|
||||
|
||||
@@ -735,9 +652,6 @@ func TestActivityLog_ReceivedFragment(t *testing.T) {
|
||||
if len(a.standbyFragmentsReceived) != 2 {
|
||||
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
|
||||
@@ -1374,16 +1288,10 @@ func (a *ActivityLog) resetEntitiesInMemory(t *testing.T) {
|
||||
|
||||
a.l.Lock()
|
||||
defer a.l.Unlock()
|
||||
|
||||
a.fragmentLock.Lock()
|
||||
defer a.fragmentLock.Unlock()
|
||||
|
||||
a.localFragmentLock.Lock()
|
||||
defer a.localFragmentLock.Unlock()
|
||||
|
||||
a.globalFragmentLock.Lock()
|
||||
defer a.globalFragmentLock.Unlock()
|
||||
|
||||
a.currentSegment = segmentInfo{
|
||||
startTimestamp: time.Time{}.Unix(),
|
||||
currentClients: &activity.EntityActivityLog{
|
||||
@@ -1394,7 +1302,6 @@ func (a *ActivityLog) resetEntitiesInMemory(t *testing.T) {
|
||||
}
|
||||
|
||||
a.partialMonthClientTracker = make(map[string]*activity.EntityRecord)
|
||||
a.partialMonthLocalClientTracker = 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 {
|
||||
a.l.Lock()
|
||||
a.fragmentLock.Lock()
|
||||
a.localFragmentLock.Lock()
|
||||
a.partialMonthClientTracker = make(map[string]*activity.EntityRecord)
|
||||
a.partialMonthLocalClientTracker = make(map[string]*activity.EntityRecord)
|
||||
a.currentSegment.startTimestamp = tc.time
|
||||
a.fragmentLock.Unlock()
|
||||
a.localFragmentLock.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
|
||||
// structures
|
||||
func TestAddActivityToFragment(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
|
||||
core, _, _ := TestCoreUnsealed(t)
|
||||
a := core.activityLog
|
||||
a.SetEnable(true)
|
||||
|
||||
require.Nil(t, a.fragment)
|
||||
require.Nil(t, a.localFragment)
|
||||
require.Nil(t, a.currentGlobalFragment)
|
||||
|
||||
mount := "mount"
|
||||
localMount := "localMount"
|
||||
ns := "root"
|
||||
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)
|
||||
|
||||
// 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 {
|
||||
name string
|
||||
id string
|
||||
@@ -4887,7 +4761,6 @@ func TestAddActivityToFragment(t *testing.T) {
|
||||
isAdded bool
|
||||
expectedID string
|
||||
isNonEntity bool
|
||||
isLocal bool
|
||||
}{
|
||||
{
|
||||
name: "duplicate",
|
||||
@@ -4895,7 +4768,6 @@ func TestAddActivityToFragment(t *testing.T) {
|
||||
activityType: entityActivityType,
|
||||
isAdded: false,
|
||||
expectedID: id,
|
||||
isLocal: false,
|
||||
},
|
||||
{
|
||||
name: "new entity",
|
||||
@@ -4903,7 +4775,6 @@ func TestAddActivityToFragment(t *testing.T) {
|
||||
activityType: entityActivityType,
|
||||
isAdded: true,
|
||||
expectedID: "new-id",
|
||||
isLocal: false,
|
||||
},
|
||||
{
|
||||
name: "new nonentity",
|
||||
@@ -4912,7 +4783,6 @@ func TestAddActivityToFragment(t *testing.T) {
|
||||
isAdded: true,
|
||||
expectedID: "new-nonentity",
|
||||
isNonEntity: true,
|
||||
isLocal: true,
|
||||
},
|
||||
{
|
||||
name: "new acme",
|
||||
@@ -4921,7 +4791,6 @@ func TestAddActivityToFragment(t *testing.T) {
|
||||
isAdded: true,
|
||||
expectedID: "pki-acme.new-acme",
|
||||
isNonEntity: true,
|
||||
isLocal: false,
|
||||
},
|
||||
{
|
||||
name: "new secret sync",
|
||||
@@ -4930,22 +4799,11 @@ func TestAddActivityToFragment(t *testing.T) {
|
||||
isAdded: true,
|
||||
expectedID: "new-secret-sync",
|
||||
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 {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
var mountAccessor string
|
||||
a.fragmentLock.RLock()
|
||||
numClientsBefore := len(a.fragment.Clients)
|
||||
a.fragmentLock.RUnlock()
|
||||
@@ -4954,25 +4812,7 @@ func TestAddActivityToFragment(t *testing.T) {
|
||||
globalClientsBefore := len(a.currentGlobalFragment.Clients)
|
||||
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()
|
||||
defer a.fragmentLock.RUnlock()
|
||||
numClientsAfter := len(a.fragment.Clients)
|
||||
@@ -4980,36 +4820,14 @@ func TestAddActivityToFragment(t *testing.T) {
|
||||
defer a.globalFragmentLock.RUnlock()
|
||||
globalClientsAfter := len(a.currentGlobalFragment.Clients)
|
||||
|
||||
// if local client, verify if local fragment is updated
|
||||
if tc.isLocal {
|
||||
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 {
|
||||
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)
|
||||
if tc.activityType != nonEntityTokenActivityType {
|
||||
require.Equal(t, globalClientsBefore+1, globalClientsAfter)
|
||||
}
|
||||
} else {
|
||||
require.Equal(t, numClientsBefore, numClientsAfter)
|
||||
require.Equal(t, globalClientsBefore, globalClientsAfter)
|
||||
}
|
||||
|
||||
require.Contains(t, a.partialMonthClientTracker, tc.expectedID)
|
||||
@@ -5018,21 +4836,10 @@ func TestAddActivityToFragment(t *testing.T) {
|
||||
NamespaceID: ns,
|
||||
Timestamp: 0,
|
||||
NonEntity: tc.isNonEntity,
|
||||
MountAccessor: mountAccessor,
|
||||
MountAccessor: mount,
|
||||
ClientType: tc.activityType,
|
||||
}, a.partialMonthClientTracker[tc.expectedID]))
|
||||
|
||||
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 {
|
||||
if tc.activityType != nonEntityTokenActivityType {
|
||||
require.Contains(t, a.globalPartialMonthClientTracker, tc.expectedID)
|
||||
require.True(t, proto.Equal(&activity.EntityRecord{
|
||||
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
|
||||
// calls reportPrecomputedQueryMetrics. The test verifies that the metric sink
|
||||
// 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
|
||||
}
|
||||
|
||||
// GetActiveClients returns the in-memory globalPartialMonthClientTracker and partialMonthLocalClientTracker from an
|
||||
// GetActiveClients returns the in-memory partialMonthClientTracker from an
|
||||
// activity log.
|
||||
func (c *Core) GetActiveClients() map[string]*activity.EntityRecord {
|
||||
out := make(map[string]*activity.EntityRecord)
|
||||
|
||||
c.stateLock.RLock()
|
||||
c.activityLog.globalFragmentLock.RLock()
|
||||
c.activityLog.localFragmentLock.RLock()
|
||||
|
||||
// add active global clients
|
||||
for k, v := range c.activityLog.globalPartialMonthClientTracker {
|
||||
out[k] = v
|
||||
}
|
||||
|
||||
// add active local clients
|
||||
for k, v := range c.activityLog.partialMonthLocalClientTracker {
|
||||
out[k] = v
|
||||
}
|
||||
|
||||
c.activityLog.globalFragmentLock.RUnlock()
|
||||
c.activityLog.localFragmentLock.RUnlock()
|
||||
c.stateLock.RUnlock()
|
||||
|
||||
return out
|
||||
@@ -178,9 +168,6 @@ func (a *ActivityLog) ExpectCurrentSegmentRefreshed(t *testing.T, expectedStart
|
||||
if a.partialMonthClientTracker == nil {
|
||||
t.Errorf("expected non-nil partialMonthClientTracker")
|
||||
}
|
||||
if a.partialMonthLocalClientTracker == nil {
|
||||
t.Errorf("expected non-nil partialMonthLocalClientTracker")
|
||||
}
|
||||
if len(a.currentSegment.currentClients.Clients) > 0 {
|
||||
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 {
|
||||
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 a.currentSegment.startTimestamp == 0 {
|
||||
@@ -271,11 +255,3 @@ func (c *Core) GetActiveGlobalFragment() *activity.LogFragment {
|
||||
func (c *Core) GetSecondaryGlobalFragments() []*activity.LogFragment {
|
||||
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