internal/queue: increase task timeout

HTTP tasks (but not AppEngine tasks) have a default timeout of 10
minutes. Extend that to the maximum of 30 minutes.

Change-Id: I75efc0523ff83471a0a2a8d453e1284483feefe1
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/258197
Reviewed-by: Julie Qiu <julie@golang.org>
Trust: Jonathan Amsterdam <jba@google.com>
diff --git a/go.mod b/go.mod
index 4b8cddb..b61ef7a 100644
--- a/go.mod
+++ b/go.mod
@@ -20,6 +20,7 @@
 	github.com/gogo/protobuf v1.3.0 // indirect
 	github.com/golang-migrate/migrate/v4 v4.6.2
 	github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e
+	github.com/golang/protobuf v1.4.2
 	github.com/gomodule/redigo v2.0.0+incompatible // indirect
 	github.com/google/go-cmp v0.5.2
 	github.com/google/go-replayers/httpreplay v0.1.0
diff --git a/internal/queue/queue.go b/internal/queue/queue.go
index 64bbfae..229631f 100644
--- a/internal/queue/queue.go
+++ b/internal/queue/queue.go
@@ -14,6 +14,7 @@
 	"time"
 
 	cloudtasks "cloud.google.com/go/cloudtasks/apiv2"
+	"github.com/golang/protobuf/ptypes"
 	"golang.org/x/pkgsite/internal/config"
 	"golang.org/x/pkgsite/internal/derrors"
 	"golang.org/x/pkgsite/internal/experiment"
@@ -139,10 +140,17 @@
 	return enqueued, nil
 }
 
+// Maximum timeout for HTTP tasks.
+// See https://cloud.google.com/tasks/docs/creating-http-target-tasks.
+const maxCloudTasksTimeout = 30 * time.Minute
+
 func (q *GCP) newTaskRequest(modulePath, version, suffix string, taskIDChangeInterval time.Duration) *taskspb.CreateTaskRequest {
 	taskID := newTaskID(modulePath, version, time.Now(), taskIDChangeInterval)
 	relativeURI := fmt.Sprintf("/fetch/%s/@v/%s", modulePath, version)
-	task := &taskspb.Task{Name: fmt.Sprintf("%s/tasks/%s", q.queueName, taskID)}
+	task := &taskspb.Task{
+		Name:             fmt.Sprintf("%s/tasks/%s", q.queueName, taskID),
+		DispatchDeadline: ptypes.DurationProto(maxCloudTasksTimeout),
+	}
 	if q.queueService != "" {
 		task.MessageType = &taskspb.Task_AppEngineHttpRequest{
 			AppEngineHttpRequest: &taskspb.AppEngineHttpRequest{
diff --git a/internal/queue/queue_test.go b/internal/queue/queue_test.go
index 5534898..e713ae8 100644
--- a/internal/queue/queue_test.go
+++ b/internal/queue/queue_test.go
@@ -8,6 +8,7 @@
 	"testing"
 	"time"
 
+	"github.com/golang/protobuf/ptypes"
 	"github.com/google/go-cmp/cmp"
 	"golang.org/x/pkgsite/internal/config"
 	taskspb "google.golang.org/genproto/googleapis/cloud/tasks/v2"
@@ -50,6 +51,7 @@
 			&taskspb.CreateTaskRequest{
 				Parent: "projects/Project/locations/us-central1/queues/queueID",
 				Task: &taskspb.Task{
+					DispatchDeadline: ptypes.DurationProto(maxCloudTasksTimeout),
 					MessageType: &taskspb.Task_AppEngineHttpRequest{
 						AppEngineHttpRequest: &taskspb.AppEngineHttpRequest{
 							HttpMethod:  taskspb.HttpMethod_POST,
@@ -74,6 +76,7 @@
 			&taskspb.CreateTaskRequest{
 				Parent: "projects/Project/locations/us-central1/queues/queueID",
 				Task: &taskspb.Task{
+					DispatchDeadline: ptypes.DurationProto(maxCloudTasksTimeout),
 					MessageType: &taskspb.Task_HttpRequest{
 						HttpRequest: &taskspb.HttpRequest{
 							HttpMethod: taskspb.HttpMethod_POST,