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 }