8484 saManager searchattribute.Manager
8585 healthServer * health.Server
8686 historyClient historyservice.HistoryServiceClient
87- namespaceRegistry namespace.Registry
8887 clusterMetadataManager persistence.ClusterMetadataManager
8988 clusterMetadata clustermetadata.Metadata
9089 clientFactory svc.Factory
@@ -101,7 +100,6 @@ type (
101100 SaManager searchattribute.Manager
102101 healthServer * health.Server
103102 historyClient historyservice.HistoryServiceClient
104- namespaceRegistry namespace.Registry
105103 clusterMetadataManager persistence.ClusterMetadataManager
106104 clusterMetadata clustermetadata.Metadata
107105 clientFactory svc.Factory
@@ -125,7 +123,6 @@ func NewOperatorHandlerImpl(
125123 saManager : args .SaManager ,
126124 healthServer : args .healthServer ,
127125 historyClient : args .historyClient ,
128- namespaceRegistry : args .namespaceRegistry ,
129126 clusterMetadataManager : args .clusterMetadataManager ,
130127 clusterMetadata : args .clusterMetadata ,
131128 clientFactory : args .clientFactory ,
@@ -280,18 +277,22 @@ func (h *OperatorHandlerImpl) addSearchAttributesSQL(
280277 if nsName == "" {
281278 return errNamespaceNotSet
282279 }
283- ns , err := h .namespaceRegistry .GetNamespace (namespace .Name (nsName ))
280+ resp , err := client .DescribeNamespace (
281+ ctx ,
282+ & workflowservice.DescribeNamespaceRequest {Namespace : nsName },
283+ )
284284 if err != nil {
285285 return serviceerror .NewUnavailable (fmt .Sprintf (errUnableToGetNamespaceInfoMessage , nsName ))
286286 }
287287
288288 dbCustomSearchAttributes := searchattribute .GetSqlDbIndexSearchAttributes ().CustomSearchAttributes
289289 cmCustomSearchAttributes := currentSearchAttributes .Custom ()
290- mapper := ns .CustomSearchAttributesMapper ()
291- fieldToAliasMap := util .CloneMapNonNil (mapper .FieldToAliasMap ())
290+ upsertFieldToAliasMap := make (map [string ]string )
291+ fieldToAliasMap := resp .Config .CustomSearchAttributeAliases
292+ aliasToFieldMap := util .InverseMap (fieldToAliasMap )
292293 for saName , saType := range request .GetSearchAttributes () {
293294 // check if alias is already in use
294- if _ , err := mapper . GetFieldName ( saName , nsName ); err == nil {
295+ if _ , ok := aliasToFieldMap [ saName ]; ok {
295296 return serviceerror .NewAlreadyExist (
296297 fmt .Sprintf (errSearchAttributeAlreadyExistsMessage , saName ),
297298 )
@@ -318,15 +319,18 @@ func (h *OperatorHandlerImpl) addSearchAttributesSQL(
318319 fmt .Sprintf (errTooManySearchAttributesMessage , cntUsed , saType .String ()),
319320 )
320321 }
321- fieldToAliasMap [targetFieldName ] = saName
322+ upsertFieldToAliasMap [targetFieldName ] = saName
322323 }
323324
324325 _ , err = client .UpdateNamespace (ctx , & workflowservice.UpdateNamespaceRequest {
325326 Namespace : nsName ,
326327 Config : & namespacepb.NamespaceConfig {
327- CustomSearchAttributeAliases : fieldToAliasMap ,
328+ CustomSearchAttributeAliases : upsertFieldToAliasMap ,
328329 },
329330 })
331+ if err .Error () == errCustomSearchAttributeFieldAlreadyAllocated .Error () {
332+ return errRaceConditionAddingSearchAttributes
333+ }
330334 return err
331335}
332336
@@ -410,25 +414,28 @@ func (h *OperatorHandlerImpl) removeSearchAttributesSQL(
410414 if nsName == "" {
411415 return errNamespaceNotSet
412416 }
413- ns , err := h .namespaceRegistry .GetNamespace (namespace .Name (nsName ))
417+ resp , err := client .DescribeNamespace (
418+ ctx ,
419+ & workflowservice.DescribeNamespaceRequest {Namespace : nsName },
420+ )
414421 if err != nil {
415422 return serviceerror .NewUnavailable (fmt .Sprintf (errUnableToGetNamespaceInfoMessage , nsName ))
416423 }
417424
418- mapper := ns . CustomSearchAttributesMapper ( )
419- fieldToAliasMap := maps . Clone ( mapper . FieldToAliasMap () )
425+ upsertFieldToAliasMap := make ( map [ string ] string )
426+ aliasToFieldMap := util . InverseMap ( resp . Config . CustomSearchAttributeAliases )
420427 for _ , saName := range request .GetSearchAttributes () {
421- fieldName , err := mapper . GetFieldName ( saName , nsName )
422- if err != nil {
428+ fieldName , ok := aliasToFieldMap [ saName ]
429+ if ! ok {
423430 return serviceerror .NewNotFound (fmt .Sprintf (errSearchAttributeDoesntExistMessage , saName ))
424431 }
425- delete ( fieldToAliasMap , fieldName )
432+ upsertFieldToAliasMap [ fieldName ] = ""
426433 }
427434
428435 _ , err = client .UpdateNamespace (ctx , & workflowservice.UpdateNamespaceRequest {
429436 Namespace : nsName ,
430437 Config : & namespacepb.NamespaceConfig {
431- CustomSearchAttributeAliases : fieldToAliasMap ,
438+ CustomSearchAttributeAliases : upsertFieldToAliasMap ,
432439 },
433440 })
434441 return err
@@ -460,7 +467,7 @@ func (h *OperatorHandlerImpl) ListSearchAttributes(
460467 if h .visibilityMgr .HasStoreName (elasticsearch .PersistenceName ) || indexName == "" {
461468 return h .listSearchAttributesElasticsearch (ctx , indexName , searchAttributes )
462469 }
463- return h .listSearchAttributesSQL (request , searchAttributes )
470+ return h .listSearchAttributesSQL (ctx , request , searchAttributes )
464471}
465472
466473func (h * OperatorHandlerImpl ) listSearchAttributesElasticsearch (
@@ -486,23 +493,36 @@ func (h *OperatorHandlerImpl) listSearchAttributesElasticsearch(
486493}
487494
488495func (h * OperatorHandlerImpl ) listSearchAttributesSQL (
496+ ctx context.Context ,
489497 request * operatorservice.ListSearchAttributesRequest ,
490498 searchAttributes searchattribute.NameTypeMap ,
491499) (* operatorservice.ListSearchAttributesResponse , error ) {
500+ _ , client , err := h .clientFactory .NewLocalFrontendClientWithTimeout (
501+ frontend .DefaultTimeout ,
502+ frontend .DefaultLongPollTimeout ,
503+ )
504+ if err != nil {
505+ return nil , serviceerror .NewUnavailable (fmt .Sprintf (errUnableToCreateFrontendClientMessage , err ))
506+ }
507+
492508 nsName := request .GetNamespace ()
493509 if nsName == "" {
494510 return nil , errNamespaceNotSet
495511 }
496- ns , err := h .namespaceRegistry .GetNamespace (namespace .Name (nsName ))
512+ resp , err := client .DescribeNamespace (
513+ ctx ,
514+ & workflowservice.DescribeNamespaceRequest {Namespace : nsName },
515+ )
497516 if err != nil {
498517 return nil , serviceerror .NewUnavailable (
499518 fmt .Sprintf (errUnableToGetNamespaceInfoMessage , nsName ),
500519 )
501520 }
502- mapper := ns .CustomSearchAttributesMapper ()
521+
522+ fieldToAliasMap := resp .Config .CustomSearchAttributeAliases
503523 customSearchAttributes := make (map [string ]enumspb.IndexedValueType )
504524 for field , tp := range searchAttributes .Custom () {
505- if alias , err := mapper . GetAlias ( field , nsName ); err == nil {
525+ if alias , ok := fieldToAliasMap [ field ]; ok {
506526 customSearchAttributes [alias ] = tp
507527 }
508528 }
0 commit comments