go.temporal.io/server@v1.23.0/common/persistence/sql/execution_state_map.go (about)

     1  // The MIT License
     2  //
     3  // Copyright (c) 2020 Temporal Technologies Inc.  All rights reserved.
     4  //
     5  // Copyright (c) 2020 Uber Technologies, Inc.
     6  //
     7  // Permission is hereby granted, free of charge, to any person obtaining a copy
     8  // of this software and associated documentation files (the "Software"), to deal
     9  // in the Software without restriction, including without limitation the rights
    10  // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    11  // copies of the Software, and to permit persons to whom the Software is
    12  // furnished to do so, subject to the following conditions:
    13  //
    14  // The above copyright notice and this permission notice shall be included in
    15  // all copies or substantial portions of the Software.
    16  //
    17  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    18  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    19  // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    20  // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    21  // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    22  // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    23  // THE SOFTWARE.
    24  
    25  package sql
    26  
    27  import (
    28  	"context"
    29  	"database/sql"
    30  	"fmt"
    31  
    32  	commonpb "go.temporal.io/api/common/v1"
    33  
    34  	"go.temporal.io/server/common/persistence"
    35  
    36  	"go.temporal.io/api/serviceerror"
    37  
    38  	"go.temporal.io/server/common/convert"
    39  	"go.temporal.io/server/common/persistence/sql/sqlplugin"
    40  	"go.temporal.io/server/common/primitives"
    41  )
    42  
    43  func updateActivityInfos(
    44  	ctx context.Context,
    45  	tx sqlplugin.Tx,
    46  	activityInfos map[int64]*commonpb.DataBlob,
    47  	deleteIDs map[int64]struct{},
    48  	shardID int32,
    49  	namespaceID primitives.UUID,
    50  	workflowID string,
    51  	runID primitives.UUID,
    52  ) error {
    53  
    54  	if len(activityInfos) > 0 {
    55  		rows := make([]sqlplugin.ActivityInfoMapsRow, 0, len(activityInfos))
    56  		for scheduledEventId, blob := range activityInfos {
    57  			rows = append(rows, sqlplugin.ActivityInfoMapsRow{
    58  				ShardID:      shardID,
    59  				NamespaceID:  namespaceID,
    60  				WorkflowID:   workflowID,
    61  				RunID:        runID,
    62  				ScheduleID:   scheduledEventId,
    63  				Data:         blob.Data,
    64  				DataEncoding: blob.EncodingType.String(),
    65  			})
    66  		}
    67  
    68  		if _, err := tx.ReplaceIntoActivityInfoMaps(ctx, rows); err != nil {
    69  			return serviceerror.NewUnavailable(fmt.Sprintf("Failed to update activity info. Failed to execute update query. Error: %v", err))
    70  		}
    71  	}
    72  
    73  	if len(deleteIDs) > 0 {
    74  		if _, err := tx.DeleteFromActivityInfoMaps(ctx, sqlplugin.ActivityInfoMapsFilter{
    75  			ShardID:     shardID,
    76  			NamespaceID: namespaceID,
    77  			WorkflowID:  workflowID,
    78  			RunID:       runID,
    79  			ScheduleIDs: convert.Int64SetToSlice(deleteIDs),
    80  		}); err != nil {
    81  			return serviceerror.NewUnavailable(fmt.Sprintf("Failed to update activity info. Failed to execute delete query. Error: %v", err))
    82  		}
    83  	}
    84  	return nil
    85  }
    86  
    87  func getActivityInfoMap(
    88  	ctx context.Context,
    89  	db sqlplugin.DB,
    90  	shardID int32,
    91  	namespaceID primitives.UUID,
    92  	workflowID string,
    93  	runID primitives.UUID,
    94  ) (map[int64]*commonpb.DataBlob, error) {
    95  
    96  	rows, err := db.SelectAllFromActivityInfoMaps(ctx, sqlplugin.ActivityInfoMapsAllFilter{
    97  		ShardID:     shardID,
    98  		NamespaceID: namespaceID,
    99  		WorkflowID:  workflowID,
   100  		RunID:       runID,
   101  	})
   102  	if err != nil && err != sql.ErrNoRows {
   103  		return nil, serviceerror.NewUnavailable(fmt.Sprintf("Failed to get activity info. Error: %v", err))
   104  	}
   105  
   106  	ret := make(map[int64]*commonpb.DataBlob)
   107  	for _, row := range rows {
   108  		ret[row.ScheduleID] = persistence.NewDataBlob(row.Data, row.DataEncoding)
   109  	}
   110  
   111  	return ret, nil
   112  }
   113  
   114  func deleteActivityInfoMap(
   115  	ctx context.Context,
   116  	tx sqlplugin.Tx,
   117  	shardID int32,
   118  	namespaceID primitives.UUID,
   119  	workflowID string,
   120  	runID primitives.UUID,
   121  ) error {
   122  
   123  	if _, err := tx.DeleteAllFromActivityInfoMaps(ctx, sqlplugin.ActivityInfoMapsAllFilter{
   124  		ShardID:     shardID,
   125  		NamespaceID: namespaceID,
   126  		WorkflowID:  workflowID,
   127  		RunID:       runID,
   128  	}); err != nil {
   129  		return serviceerror.NewUnavailable(fmt.Sprintf("Failed to delete activity info map. Error: %v", err))
   130  	}
   131  	return nil
   132  }
   133  
   134  func updateTimerInfos(
   135  	ctx context.Context,
   136  	tx sqlplugin.Tx,
   137  	timerInfos map[string]*commonpb.DataBlob,
   138  	deleteIDs map[string]struct{},
   139  	shardID int32,
   140  	namespaceID primitives.UUID,
   141  	workflowID string,
   142  	runID primitives.UUID,
   143  ) error {
   144  
   145  	if len(timerInfos) > 0 {
   146  		rows := make([]sqlplugin.TimerInfoMapsRow, 0, len(timerInfos))
   147  		for timerID, blob := range timerInfos {
   148  			rows = append(rows, sqlplugin.TimerInfoMapsRow{
   149  				ShardID:      shardID,
   150  				NamespaceID:  namespaceID,
   151  				WorkflowID:   workflowID,
   152  				RunID:        runID,
   153  				TimerID:      timerID,
   154  				Data:         blob.Data,
   155  				DataEncoding: blob.EncodingType.String(),
   156  			})
   157  		}
   158  		if _, err := tx.ReplaceIntoTimerInfoMaps(ctx, rows); err != nil {
   159  			return serviceerror.NewUnavailable(fmt.Sprintf("Failed to update timer info. Failed to execute update query. Error: %v", err))
   160  		}
   161  	}
   162  
   163  	if len(deleteIDs) > 0 {
   164  		if _, err := tx.DeleteFromTimerInfoMaps(ctx, sqlplugin.TimerInfoMapsFilter{
   165  			ShardID:     shardID,
   166  			NamespaceID: namespaceID,
   167  			WorkflowID:  workflowID,
   168  			RunID:       runID,
   169  			TimerIDs:    convert.StringSetToSlice(deleteIDs),
   170  		}); err != nil {
   171  			return serviceerror.NewUnavailable(fmt.Sprintf("Failed to update timer info. Failed to execute delete query. Error: %v", err))
   172  		}
   173  	}
   174  	return nil
   175  }
   176  
   177  func getTimerInfoMap(
   178  	ctx context.Context,
   179  	db sqlplugin.DB,
   180  	shardID int32,
   181  	namespaceID primitives.UUID,
   182  	workflowID string,
   183  	runID primitives.UUID,
   184  ) (map[string]*commonpb.DataBlob, error) {
   185  
   186  	rows, err := db.SelectAllFromTimerInfoMaps(ctx, sqlplugin.TimerInfoMapsAllFilter{
   187  		ShardID:     shardID,
   188  		NamespaceID: namespaceID,
   189  		WorkflowID:  workflowID,
   190  		RunID:       runID,
   191  	})
   192  	if err != nil && err != sql.ErrNoRows {
   193  		return nil, serviceerror.NewUnavailable(fmt.Sprintf("Failed to get timer info. Error: %v", err))
   194  	}
   195  	ret := make(map[string]*commonpb.DataBlob)
   196  	for _, row := range rows {
   197  		ret[row.TimerID] = persistence.NewDataBlob(row.Data, row.DataEncoding)
   198  	}
   199  
   200  	return ret, nil
   201  }
   202  
   203  func deleteTimerInfoMap(
   204  	ctx context.Context,
   205  	tx sqlplugin.Tx,
   206  	shardID int32,
   207  	namespaceID primitives.UUID,
   208  	workflowID string,
   209  	runID primitives.UUID,
   210  ) error {
   211  
   212  	if _, err := tx.DeleteAllFromTimerInfoMaps(ctx, sqlplugin.TimerInfoMapsAllFilter{
   213  		ShardID:     shardID,
   214  		NamespaceID: namespaceID,
   215  		WorkflowID:  workflowID,
   216  		RunID:       runID,
   217  	}); err != nil {
   218  		return serviceerror.NewUnavailable(fmt.Sprintf("Failed to delete timer info map. Error: %v", err))
   219  	}
   220  	return nil
   221  }
   222  
   223  func updateChildExecutionInfos(
   224  	ctx context.Context,
   225  	tx sqlplugin.Tx,
   226  	childExecutionInfos map[int64]*commonpb.DataBlob,
   227  	deleteIDs map[int64]struct{},
   228  	shardID int32,
   229  	namespaceID primitives.UUID,
   230  	workflowID string,
   231  	runID primitives.UUID,
   232  ) error {
   233  
   234  	if len(childExecutionInfos) > 0 {
   235  		rows := make([]sqlplugin.ChildExecutionInfoMapsRow, 0, len(childExecutionInfos))
   236  		for initiatedID, blob := range childExecutionInfos {
   237  			rows = append(rows, sqlplugin.ChildExecutionInfoMapsRow{
   238  				ShardID:      shardID,
   239  				NamespaceID:  namespaceID,
   240  				WorkflowID:   workflowID,
   241  				RunID:        runID,
   242  				InitiatedID:  initiatedID,
   243  				Data:         blob.Data,
   244  				DataEncoding: blob.EncodingType.String(),
   245  			})
   246  		}
   247  		if _, err := tx.ReplaceIntoChildExecutionInfoMaps(ctx, rows); err != nil {
   248  			return serviceerror.NewUnavailable(fmt.Sprintf("Failed to update child execution info. Failed to execute update query. Error: %v", err))
   249  		}
   250  	}
   251  
   252  	if len(deleteIDs) > 0 {
   253  		if _, err := tx.DeleteFromChildExecutionInfoMaps(ctx, sqlplugin.ChildExecutionInfoMapsFilter{
   254  			ShardID:      shardID,
   255  			NamespaceID:  namespaceID,
   256  			WorkflowID:   workflowID,
   257  			RunID:        runID,
   258  			InitiatedIDs: convert.Int64SetToSlice(deleteIDs),
   259  		}); err != nil {
   260  			return serviceerror.NewUnavailable(fmt.Sprintf("Failed to update child execution info. Failed to execute delete query. Error: %v", err))
   261  		}
   262  	}
   263  	return nil
   264  }
   265  
   266  func getChildExecutionInfoMap(
   267  	ctx context.Context,
   268  	db sqlplugin.DB,
   269  	shardID int32,
   270  	namespaceID primitives.UUID,
   271  	workflowID string,
   272  	runID primitives.UUID,
   273  ) (map[int64]*commonpb.DataBlob, error) {
   274  
   275  	rows, err := db.SelectAllFromChildExecutionInfoMaps(ctx, sqlplugin.ChildExecutionInfoMapsAllFilter{
   276  		ShardID:     shardID,
   277  		NamespaceID: namespaceID,
   278  		WorkflowID:  workflowID,
   279  		RunID:       runID,
   280  	})
   281  	if err != nil && err != sql.ErrNoRows {
   282  		return nil, serviceerror.NewUnavailable(fmt.Sprintf("Failed to get timer info. Error: %v", err))
   283  	}
   284  
   285  	ret := make(map[int64]*commonpb.DataBlob)
   286  	for _, row := range rows {
   287  		ret[row.InitiatedID] = persistence.NewDataBlob(row.Data, row.DataEncoding)
   288  	}
   289  
   290  	return ret, nil
   291  }
   292  
   293  func deleteChildExecutionInfoMap(
   294  	ctx context.Context,
   295  	tx sqlplugin.Tx,
   296  	shardID int32,
   297  	namespaceID primitives.UUID,
   298  	workflowID string,
   299  	runID primitives.UUID,
   300  ) error {
   301  
   302  	if _, err := tx.DeleteAllFromChildExecutionInfoMaps(ctx, sqlplugin.ChildExecutionInfoMapsAllFilter{
   303  		ShardID:     shardID,
   304  		NamespaceID: namespaceID,
   305  		WorkflowID:  workflowID,
   306  		RunID:       runID,
   307  	}); err != nil {
   308  		return serviceerror.NewUnavailable(fmt.Sprintf("Failed to delete timer info map. Error: %v", err))
   309  	}
   310  	return nil
   311  }
   312  
   313  func updateRequestCancelInfos(
   314  	ctx context.Context,
   315  	tx sqlplugin.Tx,
   316  	requestCancelInfos map[int64]*commonpb.DataBlob,
   317  	deleteIDs map[int64]struct{},
   318  	shardID int32,
   319  	namespaceID primitives.UUID,
   320  	workflowID string,
   321  	runID primitives.UUID,
   322  ) error {
   323  
   324  	if len(requestCancelInfos) > 0 {
   325  		rows := make([]sqlplugin.RequestCancelInfoMapsRow, 0, len(requestCancelInfos))
   326  		for initiatedID, blob := range requestCancelInfos {
   327  			rows = append(rows, sqlplugin.RequestCancelInfoMapsRow{
   328  				ShardID:      shardID,
   329  				NamespaceID:  namespaceID,
   330  				WorkflowID:   workflowID,
   331  				RunID:        runID,
   332  				InitiatedID:  initiatedID,
   333  				Data:         blob.Data,
   334  				DataEncoding: blob.EncodingType.String(),
   335  			})
   336  		}
   337  
   338  		if _, err := tx.ReplaceIntoRequestCancelInfoMaps(ctx, rows); err != nil {
   339  			return serviceerror.NewUnavailable(fmt.Sprintf("Failed to update request cancel info. Failed to execute update query. Error: %v", err))
   340  		}
   341  	}
   342  
   343  	if len(deleteIDs) > 0 {
   344  		if _, err := tx.DeleteFromRequestCancelInfoMaps(ctx, sqlplugin.RequestCancelInfoMapsFilter{
   345  			ShardID:      shardID,
   346  			NamespaceID:  namespaceID,
   347  			WorkflowID:   workflowID,
   348  			RunID:        runID,
   349  			InitiatedIDs: convert.Int64SetToSlice(deleteIDs),
   350  		}); err != nil {
   351  			return serviceerror.NewUnavailable(fmt.Sprintf("Failed to update request cancel info. Failed to execute delete query. Error: %v", err))
   352  		}
   353  	}
   354  	return nil
   355  }
   356  
   357  func getRequestCancelInfoMap(
   358  	ctx context.Context,
   359  	db sqlplugin.DB,
   360  	shardID int32,
   361  	namespaceID primitives.UUID,
   362  	workflowID string,
   363  	runID primitives.UUID,
   364  ) (map[int64]*commonpb.DataBlob, error) {
   365  
   366  	rows, err := db.SelectAllFromRequestCancelInfoMaps(ctx, sqlplugin.RequestCancelInfoMapsAllFilter{
   367  		ShardID:     shardID,
   368  		NamespaceID: namespaceID,
   369  		WorkflowID:  workflowID,
   370  		RunID:       runID,
   371  	})
   372  	if err != nil && err != sql.ErrNoRows {
   373  		return nil, serviceerror.NewUnavailable(fmt.Sprintf("Failed to get request cancel info. Error: %v", err))
   374  	}
   375  
   376  	ret := make(map[int64]*commonpb.DataBlob)
   377  	for _, row := range rows {
   378  		ret[row.InitiatedID] = persistence.NewDataBlob(row.Data, row.DataEncoding)
   379  	}
   380  
   381  	return ret, nil
   382  }
   383  
   384  func deleteRequestCancelInfoMap(
   385  	ctx context.Context,
   386  	tx sqlplugin.Tx,
   387  	shardID int32,
   388  	namespaceID primitives.UUID,
   389  	workflowID string,
   390  	runID primitives.UUID,
   391  ) error {
   392  
   393  	if _, err := tx.DeleteAllFromRequestCancelInfoMaps(ctx, sqlplugin.RequestCancelInfoMapsAllFilter{
   394  		ShardID:     shardID,
   395  		NamespaceID: namespaceID,
   396  		WorkflowID:  workflowID,
   397  		RunID:       runID,
   398  	}); err != nil {
   399  		return serviceerror.NewUnavailable(fmt.Sprintf("Failed to delete request cancel info map. Error: %v", err))
   400  	}
   401  	return nil
   402  }
   403  
   404  func updateSignalInfos(
   405  	ctx context.Context,
   406  	tx sqlplugin.Tx,
   407  	signalInfos map[int64]*commonpb.DataBlob,
   408  	deleteIDs map[int64]struct{},
   409  	shardID int32,
   410  	namespaceID primitives.UUID,
   411  	workflowID string,
   412  	runID primitives.UUID,
   413  ) error {
   414  
   415  	if len(signalInfos) > 0 {
   416  		rows := make([]sqlplugin.SignalInfoMapsRow, 0, len(signalInfos))
   417  		for initiatedId, blob := range signalInfos {
   418  			rows = append(rows, sqlplugin.SignalInfoMapsRow{
   419  				ShardID:      shardID,
   420  				NamespaceID:  namespaceID,
   421  				WorkflowID:   workflowID,
   422  				RunID:        runID,
   423  				InitiatedID:  initiatedId,
   424  				Data:         blob.Data,
   425  				DataEncoding: blob.EncodingType.String(),
   426  			})
   427  		}
   428  
   429  		if _, err := tx.ReplaceIntoSignalInfoMaps(ctx, rows); err != nil {
   430  			return serviceerror.NewUnavailable(fmt.Sprintf("Failed to update signal info. Failed to execute update query. Error: %v", err))
   431  		}
   432  	}
   433  
   434  	if len(deleteIDs) > 0 {
   435  		if _, err := tx.DeleteFromSignalInfoMaps(ctx, sqlplugin.SignalInfoMapsFilter{
   436  			ShardID:      shardID,
   437  			NamespaceID:  namespaceID,
   438  			WorkflowID:   workflowID,
   439  			RunID:        runID,
   440  			InitiatedIDs: convert.Int64SetToSlice(deleteIDs),
   441  		}); err != nil {
   442  			return serviceerror.NewUnavailable(fmt.Sprintf("Failed to update signal info. Failed to execute delete query. Error: %v", err))
   443  		}
   444  	}
   445  	return nil
   446  }
   447  
   448  func getSignalInfoMap(
   449  	ctx context.Context,
   450  	db sqlplugin.DB,
   451  	shardID int32,
   452  	namespaceID primitives.UUID,
   453  	workflowID string,
   454  	runID primitives.UUID,
   455  ) (map[int64]*commonpb.DataBlob, error) {
   456  
   457  	rows, err := db.SelectAllFromSignalInfoMaps(ctx, sqlplugin.SignalInfoMapsAllFilter{
   458  		ShardID:     shardID,
   459  		NamespaceID: namespaceID,
   460  		WorkflowID:  workflowID,
   461  		RunID:       runID,
   462  	})
   463  	if err != nil && err != sql.ErrNoRows {
   464  		return nil, serviceerror.NewUnavailable(fmt.Sprintf("Failed to get signal info. Error: %v", err))
   465  	}
   466  
   467  	ret := make(map[int64]*commonpb.DataBlob)
   468  	for _, row := range rows {
   469  		ret[row.InitiatedID] = persistence.NewDataBlob(row.Data, row.DataEncoding)
   470  	}
   471  
   472  	return ret, nil
   473  }
   474  
   475  func deleteSignalInfoMap(
   476  	ctx context.Context,
   477  	tx sqlplugin.Tx,
   478  	shardID int32,
   479  	namespaceID primitives.UUID,
   480  	workflowID string,
   481  	runID primitives.UUID,
   482  ) error {
   483  
   484  	if _, err := tx.DeleteAllFromSignalInfoMaps(ctx, sqlplugin.SignalInfoMapsAllFilter{
   485  		ShardID:     shardID,
   486  		NamespaceID: namespaceID,
   487  		WorkflowID:  workflowID,
   488  		RunID:       runID,
   489  	}); err != nil {
   490  		return serviceerror.NewUnavailable(fmt.Sprintf("Failed to delete signal info map. Error: %v", err))
   491  	}
   492  	return nil
   493  }