Fix duplicate activities created when running lock/unlocking scripts on hosts with scripts disabled (#16861)

This commit is contained in:
Martin Angers
2024-02-15 11:05:13 -06:00
committed by GitHub
parent 10b1116d70
commit e1e1139da7
3 changed files with 33 additions and 0 deletions
@@ -0,0 +1 @@
* Fixed generating duplicate activities when locking or unlocking a host with scripts disabled.
+21
View File
@@ -54,6 +54,17 @@ func newHostScriptExecutionRequest(ctx context.Context, request *fleet.HostScrip
}
func (ds *Datastore) SetHostScriptExecutionResult(ctx context.Context, result *fleet.HostScriptResultPayload) (*fleet.HostScriptResult, error) {
const resultExistsStmt = `
SELECT
1
FROM
host_script_results
WHERE
host_id = ? AND
execution_id = ? AND
exit_code IS NOT NULL
`
const updStmt = `
UPDATE host_script_results SET
output = ?,
@@ -91,6 +102,16 @@ func (ds *Datastore) SetHostScriptExecutionResult(ctx context.Context, result *f
var hsr *fleet.HostScriptResult
err := ds.withRetryTxx(ctx, func(tx sqlx.ExtContext) error {
var resultExists bool
err := sqlx.GetContext(ctx, tx, &resultExists, resultExistsStmt, result.HostID, result.ExecutionID)
if err != nil && !errors.Is(err, sql.ErrNoRows) {
return ctxerr.Wrap(ctx, err, "check if host script result exists")
}
if resultExists {
// succeed but leave hsr nil
return nil
}
res, err := tx.ExecContext(ctx, updStmt,
output,
result.Runtime,
+11
View File
@@ -90,6 +90,17 @@ func testHostScriptResult(t *testing.T, ds *Datastore) {
})
require.NoError(t, err)
// record a duplicate result for this execution, will be ignored
hsr, err := ds.SetHostScriptExecutionResult(ctx, &fleet.HostScriptResultPayload{
HostID: 1,
ExecutionID: createdScript.ExecutionID,
Output: "foobarbaz",
Runtime: 22,
ExitCode: 1,
})
require.NoError(t, err)
require.Nil(t, hsr)
// it is not pending anymore
pending, err = ds.ListPendingHostScriptExecutions(ctx, 1)
require.NoError(t, err)