Repository: googleforgames/open-match
Pull request #1290 (2020-11-20 20:57:21)

Backfill indexing
**What this PR does / Why we need it**:
This PR adds `IndexBackfill`, `DeindexBackfill` and `GetIndexedBackfills` funcs to the statestore, funcs used in `QueryService` but, for code sanity, it was decided to put them in a separate PR

**Which issue(s) this PR fixes**:
This is related to #1280 which is also related to #1240 


Patch:
diff --git a/pkg/pb/messages.pb.go b/pkg/pb/messages.pb.go
index 49a91b97..a6755895 100644
--- a/pkg/pb/messages.pb.go
+++ b/pkg/pb/messages.pb.go
@@ -1,27 +1,46 @@
+// Copyright 2019 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
 // Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.25.0
+// 	protoc        v3.10.1
 // source: api/messages.proto
 
 package pb
 
 import (
-	fmt "fmt"
 	proto "github.com/golang/protobuf/proto"
 	any "github.com/golang/protobuf/ptypes/any"
 	timestamp "github.com/golang/protobuf/ptypes/timestamp"
 	_ "google.golang.org/genproto/googleapis/rpc/status"
-	math "math"
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
 )
 
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
 
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+// This is a compile-time assertion that a sufficiently up-to-date version
+// of the legacy proto package is being used.
+const _ = proto.ProtoPackageIsVersion4
 
 type DoubleRangeFilter_Exclude int32
 
@@ -36,26 +55,47 @@ const (
 	DoubleRangeFilter_BOTH DoubleRangeFilter_Exclude = 3
 )
 
-var DoubleRangeFilter_Exclude_name = map[int32]string{
-	0: "NONE",
-	1: "MIN",
-	2: "MAX",
-	3: "BOTH",
-}
+// Enum value maps for DoubleRangeFilter_Exclude.
+var (
+	DoubleRangeFilter_Exclude_name = map[int32]string{
+		0: "NONE",
+		1: "MIN",
+		2: "MAX",
+		3: "BOTH",
+	}
+	DoubleRangeFilter_Exclude_value = map[string]int32{
+		"NONE": 0,
+		"MIN":  1,
+		"MAX":  2,
+		"BOTH": 3,
+	}
+)
 
-var DoubleRangeFilter_Exclude_value = map[string]int32{
-	"NONE": 0,
-	"MIN":  1,
-	"MAX":  2,
-	"BOTH": 3,
+func (x DoubleRangeFilter_Exclude) Enum() *DoubleRangeFilter_Exclude {
+	p := new(DoubleRangeFilter_Exclude)
+	*p = x
+	return p
 }
 
 func (x DoubleRangeFilter_Exclude) String() string {
-	return proto.EnumName(DoubleRangeFilter_Exclude_name, int32(x))
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (DoubleRangeFilter_Exclude) Descriptor() protoreflect.EnumDescriptor {
+	return file_api_messages_proto_enumTypes[0].Descriptor()
+}
+
+func (DoubleRangeFilter_Exclude) Type() protoreflect.EnumType {
+	return &file_api_messages_proto_enumTypes[0]
+}
+
+func (x DoubleRangeFilter_Exclude) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
 }
 
+// Deprecated: Use DoubleRangeFilter_Exclude.Descriptor instead.
 func (DoubleRangeFilter_Exclude) EnumDescriptor() ([]byte, []int) {
-	return fileDescriptor_cb9fb1f207fd5b8c, []int{3, 0}
+	return file_api_messages_proto_rawDescGZIP(), []int{3, 0}
 }
 
 // A Ticket is a basic matchmaking entity in Open Match. A Ticket may represent
@@ -65,6 +105,10 @@ func (DoubleRangeFilter_Exclude) EnumDescriptor() ([]byte, []int) {
 // stores the Ticket in state storage and enables an Assignment to be set on the
 // Ticket.
 type Ticket struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Id represents an auto-generated Id issued by Open Match.
 	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
 	// An Assignment represents a game server assignment associated with a Ticket,
@@ -80,68 +124,72 @@ type Ticket struct {
 	Extensions map[string]*any.Any `protobuf:"bytes,5,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
 	// Create time is the time the Ticket was created. It is populated by Open
 	// Match at the time of Ticket creation.
-	CreateTime           *timestamp.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
+	CreateTime *timestamp.Timestamp `protobuf:"bytes,6,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
 }
 
-func (m *Ticket) Reset()         { *m = Ticket{} }
-func (m *Ticket) String() string { return proto.CompactTextString(m) }
-func (*Ticket) ProtoMessage()    {}
-func (*Ticket) Descriptor() ([]byte, []int) {
-	return fileDescriptor_cb9fb1f207fd5b8c, []int{0}
+func (x *Ticket) Reset() {
+	*x = Ticket{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_messages_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Ticket) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Ticket.Unmarshal(m, b)
+func (x *Ticket) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Ticket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Ticket.Marshal(b, m, deterministic)
-}
-func (m *Ticket) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Ticket.Merge(m, src)
-}
-func (m *Ticket) XXX_Size() int {
-	return xxx_messageInfo_Ticket.Size(m)
-}
-func (m *Ticket) XXX_DiscardUnknown() {
-	xxx_messageInfo_Ticket.DiscardUnknown(m)
+
+func (*Ticket) ProtoMessage() {}
+
+func (x *Ticket) ProtoReflect() protoreflect.Message {
+	mi := &file_api_messages_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Ticket proto.InternalMessageInfo
+// Deprecated: Use Ticket.ProtoReflect.Descriptor instead.
+func (*Ticket) Descriptor() ([]byte, []int) {
+	return file_api_messages_proto_rawDescGZIP(), []int{0}
+}
 
-func (m *Ticket) GetId() string {
-	if m != nil {
-		return m.Id
+func (x *Ticket) GetId() string {
+	if x != nil {
+		return x.Id
 	}
 	return ""
 }
 
-func (m *Ticket) GetAssignment() *Assignment {
-	if m != nil {
-		return m.Assignment
+func (x *Ticket) GetAssignment() *Assignment {
+	if x != nil {
+		return x.Assignment
 	}
 	return nil
 }
 
-func (m *Ticket) GetSearchFields() *SearchFields {
-	if m != nil {
-		return m.SearchFields
+func (x *Ticket) GetSearchFields() *SearchFields {
+	if x != nil {
+		return x.SearchFields
 	}
 	return nil
 }
 
-func (m *Ticket) GetExtensions() map[string]*any.Any {
-	if m != nil {
-		return m.Extensions
+func (x *Ticket) GetExtensions() map[string]*any.Any {
+	if x != nil {
+		return x.Extensions
 	}
 	return nil
 }
 
-func (m *Ticket) GetCreateTime() *timestamp.Timestamp {
-	if m != nil {
-		return m.CreateTime
+func (x *Ticket) GetCreateTime() *timestamp.Timestamp {
+	if x != nil {
+		return x.CreateTime
 	}
 	return nil
 }
@@ -149,59 +197,67 @@ func (m *Ticket) GetCreateTime() *timestamp.Timestamp {
 // Search fields are the fields which Open Match is aware of, and can be used
 // when specifying filters.
 type SearchFields struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Float arguments.  Filterable on ranges.
 	DoubleArgs map[string]float64 `protobuf:"bytes,1,rep,name=double_args,json=doubleArgs,proto3" json:"double_args,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"`
 	// String arguments.  Filterable on equality.
 	StringArgs map[string]string `protobuf:"bytes,2,rep,name=string_args,json=stringArgs,proto3" json:"string_args,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
 	// Filterable on presence or absence of given value.
-	Tags                 []string `protobuf:"bytes,3,rep,name=tags,proto3" json:"tags,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	Tags []string `protobuf:"bytes,3,rep,name=tags,proto3" json:"tags,omitempty"`
 }
 
-func (m *SearchFields) Reset()         { *m = SearchFields{} }
-func (m *SearchFields) String() string { return proto.CompactTextString(m) }
-func (*SearchFields) ProtoMessage()    {}
-func (*SearchFields) Descriptor() ([]byte, []int) {
-	return fileDescriptor_cb9fb1f207fd5b8c, []int{1}
+func (x *SearchFields) Reset() {
+	*x = SearchFields{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_messages_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *SearchFields) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_SearchFields.Unmarshal(m, b)
-}
-func (m *SearchFields) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_SearchFields.Marshal(b, m, deterministic)
+func (x *SearchFields) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *SearchFields) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_SearchFields.Merge(m, src)
-}
-func (m *SearchFields) XXX_Size() int {
-	return xxx_messageInfo_SearchFields.Size(m)
-}
-func (m *SearchFields) XXX_DiscardUnknown() {
-	xxx_messageInfo_SearchFields.DiscardUnknown(m)
+
+func (*SearchFields) ProtoMessage() {}
+
+func (x *SearchFields) ProtoReflect() protoreflect.Message {
+	mi := &file_api_messages_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_SearchFields proto.InternalMessageInfo
+// Deprecated: Use SearchFields.ProtoReflect.Descriptor instead.
+func (*SearchFields) Descriptor() ([]byte, []int) {
+	return file_api_messages_proto_rawDescGZIP(), []int{1}
+}
 
-func (m *SearchFields) GetDoubleArgs() map[string]float64 {
-	if m != nil {
-		return m.DoubleArgs
+func (x *SearchFields) GetDoubleArgs() map[string]float64 {
+	if x != nil {
+		return x.DoubleArgs
 	}
 	return nil
 }
 
-func (m *SearchFields) GetStringArgs() map[string]string {
-	if m != nil {
-		return m.StringArgs
+func (x *SearchFields) GetStringArgs() map[string]string {
+	if x != nil {
+		return x.StringArgs
 	}
 	return nil
 }
 
-func (m *SearchFields) GetTags() []string {
-	if m != nil {
-		return m.Tags
+func (x *SearchFields) GetTags() []string {
+	if x != nil {
+		return x.Tags
 	}
 	return nil
 }
@@ -209,52 +265,60 @@ func (m *SearchFields) GetTags() []string {
 // An Assignment represents a game server assignment associated with a Ticket.
 // Open Match does not require or inspect any fields on assignment.
 type Assignment struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Connection information for this Assignment.
 	Connection string `protobuf:"bytes,1,opt,name=connection,proto3" json:"connection,omitempty"`
 	// Customized information not inspected by Open Match, to be used by the match
 	// making function, evaluator, and components making calls to Open Match.
 	// Optional, depending on the requirements of the connected systems.
-	Extensions           map[string]*any.Any `protobuf:"bytes,4,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
+	Extensions map[string]*any.Any `protobuf:"bytes,4,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
 }
 
-func (m *Assignment) Reset()         { *m = Assignment{} }
-func (m *Assignment) String() string { return proto.CompactTextString(m) }
-func (*Assignment) ProtoMessage()    {}
-func (*Assignment) Descriptor() ([]byte, []int) {
-	return fileDescriptor_cb9fb1f207fd5b8c, []int{2}
+func (x *Assignment) Reset() {
+	*x = Assignment{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_messages_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Assignment) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Assignment.Unmarshal(m, b)
-}
-func (m *Assignment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Assignment.Marshal(b, m, deterministic)
-}
-func (m *Assignment) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Assignment.Merge(m, src)
+func (x *Assignment) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Assignment) XXX_Size() int {
-	return xxx_messageInfo_Assignment.Size(m)
-}
-func (m *Assignment) XXX_DiscardUnknown() {
-	xxx_messageInfo_Assignment.DiscardUnknown(m)
+
+func (*Assignment) ProtoMessage() {}
+
+func (x *Assignment) ProtoReflect() protoreflect.Message {
+	mi := &file_api_messages_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Assignment proto.InternalMessageInfo
+// Deprecated: Use Assignment.ProtoReflect.Descriptor instead.
+func (*Assignment) Descriptor() ([]byte, []int) {
+	return file_api_messages_proto_rawDescGZIP(), []int{2}
+}
 
-func (m *Assignment) GetConnection() string {
-	if m != nil {
-		return m.Connection
+func (x *Assignment) GetConnection() string {
+	if x != nil {
+		return x.Connection
 	}
 	return ""
 }
 
-func (m *Assignment) GetExtensions() map[string]*any.Any {
-	if m != nil {
-		return m.Extensions
+func (x *Assignment) GetExtensions() map[string]*any.Any {
+	if x != nil {
+		return x.Extensions
 	}
 	return nil
 }
@@ -273,6 +337,10 @@ func (m *Assignment) GetExtensions() map[string]*any.Any {
 //   {"foo": "7.5"}
 //   {}
 type DoubleRangeFilter struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Name of the ticket's search_fields.double_args this Filter operates on.
 	DoubleArg string `protobuf:"bytes,1,opt,name=double_arg,json=doubleArg,proto3" json:"double_arg,omitempty"`
 	// Maximum value.
@@ -283,61 +351,65 @@ type DoubleRangeFilter struct {
 	//
 	// BETA FEATURE WARNING: This field and the associated values are
 	// not finalized and still subject to possible change or removal.
-	Exclude              DoubleRangeFilter_Exclude `protobuf:"varint,4,opt,name=exclude,proto3,enum=openmatch.DoubleRangeFilter_Exclude" json:"exclude,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
-	XXX_unrecognized     []byte                    `json:"-"`
-	XXX_sizecache        int32                     `json:"-"`
+	Exclude DoubleRangeFilter_Exclude `protobuf:"varint,4,opt,name=exclude,proto3,enum=openmatch.DoubleRangeFilter_Exclude" json:"exclude,omitempty"`
 }
 
-func (m *DoubleRangeFilter) Reset()         { *m = DoubleRangeFilter{} }
-func (m *DoubleRangeFilter) String() string { return proto.CompactTextString(m) }
-func (*DoubleRangeFilter) ProtoMessage()    {}
-func (*DoubleRangeFilter) Descriptor() ([]byte, []int) {
-	return fileDescriptor_cb9fb1f207fd5b8c, []int{3}
+func (x *DoubleRangeFilter) Reset() {
+	*x = DoubleRangeFilter{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_messages_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *DoubleRangeFilter) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_DoubleRangeFilter.Unmarshal(m, b)
-}
-func (m *DoubleRangeFilter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_DoubleRangeFilter.Marshal(b, m, deterministic)
-}
-func (m *DoubleRangeFilter) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_DoubleRangeFilter.Merge(m, src)
-}
-func (m *DoubleRangeFilter) XXX_Size() int {
-	return xxx_messageInfo_DoubleRangeFilter.Size(m)
+func (x *DoubleRangeFilter) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *DoubleRangeFilter) XXX_DiscardUnknown() {
-	xxx_messageInfo_DoubleRangeFilter.DiscardUnknown(m)
+
+func (*DoubleRangeFilter) ProtoMessage() {}
+
+func (x *DoubleRangeFilter) ProtoReflect() protoreflect.Message {
+	mi := &file_api_messages_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_DoubleRangeFilter proto.InternalMessageInfo
+// Deprecated: Use DoubleRangeFilter.ProtoReflect.Descriptor instead.
+func (*DoubleRangeFilter) Descriptor() ([]byte, []int) {
+	return file_api_messages_proto_rawDescGZIP(), []int{3}
+}
 
-func (m *DoubleRangeFilter) GetDoubleArg() string {
-	if m != nil {
-		return m.DoubleArg
+func (x *DoubleRangeFilter) GetDoubleArg() string {
+	if x != nil {
+		return x.DoubleArg
 	}
 	return ""
 }
 
-func (m *DoubleRangeFilter) GetMax() float64 {
-	if m != nil {
-		return m.Max
+func (x *DoubleRangeFilter) GetMax() float64 {
+	if x != nil {
+		return x.Max
 	}
 	return 0
 }
 
-func (m *DoubleRangeFilter) GetMin() float64 {
-	if m != nil {
-		return m.Min
+func (x *DoubleRangeFilter) GetMin() float64 {
+	if x != nil {
+		return x.Min
 	}
 	return 0
 }
 
-func (m *DoubleRangeFilter) GetExclude() DoubleRangeFilter_Exclude {
-	if m != nil {
-		return m.Exclude
+func (x *DoubleRangeFilter) GetExclude() DoubleRangeFilter_Exclude {
+	if x != nil {
+		return x.Exclude
 	}
 	return DoubleRangeFilter_NONE
 }
@@ -352,49 +424,57 @@ func (m *DoubleRangeFilter) GetExclude() DoubleRangeFilter_Exclude {
 //   {"bar": "foo"}
 //   {}
 type StringEqualsFilter struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Name of the ticket's search_fields.string_args this Filter operates on.
-	StringArg            string   `protobuf:"bytes,1,opt,name=string_arg,json=stringArg,proto3" json:"string_arg,omitempty"`
-	Value                string   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	StringArg string `protobuf:"bytes,1,opt,name=string_arg,json=stringArg,proto3" json:"string_arg,omitempty"`
+	Value     string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
 }
 
-func (m *StringEqualsFilter) Reset()         { *m = StringEqualsFilter{} }
-func (m *StringEqualsFilter) String() string { return proto.CompactTextString(m) }
-func (*StringEqualsFilter) ProtoMessage()    {}
-func (*StringEqualsFilter) Descriptor() ([]byte, []int) {
-	return fileDescriptor_cb9fb1f207fd5b8c, []int{4}
+func (x *StringEqualsFilter) Reset() {
+	*x = StringEqualsFilter{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_messages_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *StringEqualsFilter) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_StringEqualsFilter.Unmarshal(m, b)
+func (x *StringEqualsFilter) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *StringEqualsFilter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_StringEqualsFilter.Marshal(b, m, deterministic)
-}
-func (m *StringEqualsFilter) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_StringEqualsFilter.Merge(m, src)
-}
-func (m *StringEqualsFilter) XXX_Size() int {
-	return xxx_messageInfo_StringEqualsFilter.Size(m)
-}
-func (m *StringEqualsFilter) XXX_DiscardUnknown() {
-	xxx_messageInfo_StringEqualsFilter.DiscardUnknown(m)
+
+func (*StringEqualsFilter) ProtoMessage() {}
+
+func (x *StringEqualsFilter) ProtoReflect() protoreflect.Message {
+	mi := &file_api_messages_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_StringEqualsFilter proto.InternalMessageInfo
+// Deprecated: Use StringEqualsFilter.ProtoReflect.Descriptor instead.
+func (*StringEqualsFilter) Descriptor() ([]byte, []int) {
+	return file_api_messages_proto_rawDescGZIP(), []int{4}
+}
 
-func (m *StringEqualsFilter) GetStringArg() string {
-	if m != nil {
-		return m.StringArg
+func (x *StringEqualsFilter) GetStringArg() string {
+	if x != nil {
+		return x.StringArg
 	}
 	return ""
 }
 
-func (m *StringEqualsFilter) GetValue() string {
-	if m != nil {
-		return m.Value
+func (x *StringEqualsFilter) GetValue() string {
+	if x != nil {
+		return x.Value
 	}
 	return ""
 }
@@ -408,40 +488,48 @@ func (m *StringEqualsFilter) GetValue() string {
 //   ["bar"]
 //   []
 type TagPresentFilter struct {
-	Tag                  string   `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
 
-func (m *TagPresentFilter) Reset()         { *m = TagPresentFilter{} }
-func (m *TagPresentFilter) String() string { return proto.CompactTextString(m) }
-func (*TagPresentFilter) ProtoMessage()    {}
-func (*TagPresentFilter) Descriptor() ([]byte, []int) {
-	return fileDescriptor_cb9fb1f207fd5b8c, []int{5}
+	Tag string `protobuf:"bytes,1,opt,name=tag,proto3" json:"tag,omitempty"`
 }
 
-func (m *TagPresentFilter) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_TagPresentFilter.Unmarshal(m, b)
-}
-func (m *TagPresentFilter) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_TagPresentFilter.Marshal(b, m, deterministic)
-}
-func (m *TagPresentFilter) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_TagPresentFilter.Merge(m, src)
+func (x *TagPresentFilter) Reset() {
+	*x = TagPresentFilter{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_messages_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
-func (m *TagPresentFilter) XXX_Size() int {
-	return xxx_messageInfo_TagPresentFilter.Size(m)
+
+func (x *TagPresentFilter) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *TagPresentFilter) XXX_DiscardUnknown() {
-	xxx_messageInfo_TagPresentFilter.DiscardUnknown(m)
+
+func (*TagPresentFilter) ProtoMessage() {}
+
+func (x *TagPresentFilter) ProtoReflect() protoreflect.Message {
+	mi := &file_api_messages_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_TagPresentFilter proto.InternalMessageInfo
+// Deprecated: Use TagPresentFilter.ProtoReflect.Descriptor instead.
+func (*TagPresentFilter) Descriptor() ([]byte, []int) {
+	return file_api_messages_proto_rawDescGZIP(), []int{5}
+}
 
-func (m *TagPresentFilter) GetTag() string {
-	if m != nil {
-		return m.Tag
+func (x *TagPresentFilter) GetTag() string {
+	if x != nil {
+		return x.Tag
 	}
 	return ""
 }
@@ -449,6 +537,10 @@ func (m *TagPresentFilter) GetTag() string {
 // Pool specfies a set of criteria that are used to select a subset of Tickets
 // that meet all the criteria.
 type Pool struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// A developer-chosen human-readable name for this Pool.
 	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
 	// Set of Filters indicating the filtering criteria. Selected tickets must
@@ -459,75 +551,79 @@ type Pool struct {
 	// If specified, only Tickets created before the specified time are selected.
 	CreatedBefore *timestamp.Timestamp `protobuf:"bytes,6,opt,name=created_before,json=createdBefore,proto3" json:"created_before,omitempty"`
 	// If specified, only Tickets created after the specified time are selected.
-	CreatedAfter         *timestamp.Timestamp `protobuf:"bytes,7,opt,name=created_after,json=createdAfter,proto3" json:"created_after,omitempty"`
-	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
-	XXX_unrecognized     []byte               `json:"-"`
-	XXX_sizecache        int32                `json:"-"`
+	CreatedAfter *timestamp.Timestamp `protobuf:"bytes,7,opt,name=created_after,json=createdAfter,proto3" json:"created_after,omitempty"`
 }
 
-func (m *Pool) Reset()         { *m = Pool{} }
-func (m *Pool) String() string { return proto.CompactTextString(m) }
-func (*Pool) ProtoMessage()    {}
-func (*Pool) Descriptor() ([]byte, []int) {
-	return fileDescriptor_cb9fb1f207fd5b8c, []int{6}
+func (x *Pool) Reset() {
+	*x = Pool{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_messages_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Pool) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Pool.Unmarshal(m, b)
-}
-func (m *Pool) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Pool.Marshal(b, m, deterministic)
-}
-func (m *Pool) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Pool.Merge(m, src)
+func (x *Pool) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Pool) XXX_Size() int {
-	return xxx_messageInfo_Pool.Size(m)
-}
-func (m *Pool) XXX_DiscardUnknown() {
-	xxx_messageInfo_Pool.DiscardUnknown(m)
+
+func (*Pool) ProtoMessage() {}
+
+func (x *Pool) ProtoReflect() protoreflect.Message {
+	mi := &file_api_messages_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Pool proto.InternalMessageInfo
+// Deprecated: Use Pool.ProtoReflect.Descriptor instead.
+func (*Pool) Descriptor() ([]byte, []int) {
+	return file_api_messages_proto_rawDescGZIP(), []int{6}
+}
 
-func (m *Pool) GetName() string {
-	if m != nil {
-		return m.Name
+func (x *Pool) GetName() string {
+	if x != nil {
+		return x.Name
 	}
 	return ""
 }
 
-func (m *Pool) GetDoubleRangeFilters() []*DoubleRangeFilter {
-	if m != nil {
-		return m.DoubleRangeFilters
+func (x *Pool) GetDoubleRangeFilters() []*DoubleRangeFilter {
+	if x != nil {
+		return x.DoubleRangeFilters
 	}
 	return nil
 }
 
-func (m *Pool) GetStringEqualsFilters() []*StringEqualsFilter {
-	if m != nil {
-		return m.StringEqualsFilters
+func (x *Pool) GetStringEqualsFilters() []*StringEqualsFilter {
+	if x != nil {
+		return x.StringEqualsFilters
 	}
 	return nil
 }
 
-func (m *Pool) GetTagPresentFilters() []*TagPresentFilter {
-	if m != nil {
-		return m.TagPresentFilters
+func (x *Pool) GetTagPresentFilters() []*TagPresentFilter {
+	if x != nil {
+		return x.TagPresentFilters
 	}
 	return nil
 }
 
-func (m *Pool) GetCreatedBefore() *timestamp.Timestamp {
-	if m != nil {
-		return m.CreatedBefore
+func (x *Pool) GetCreatedBefore() *timestamp.Timestamp {
+	if x != nil {
+		return x.CreatedBefore
 	}
 	return nil
 }
 
-func (m *Pool) GetCreatedAfter() *timestamp.Timestamp {
-	if m != nil {
-		return m.CreatedAfter
+func (x *Pool) GetCreatedAfter() *timestamp.Timestamp {
+	if x != nil {
+		return x.CreatedAfter
 	}
 	return nil
 }
@@ -538,6 +634,10 @@ func (m *Pool) GetCreatedAfter() *timestamp.Timestamp {
 // MatchFunction. It contains all the information required by the MatchFunction
 // to generate match proposals.
 type MatchProfile struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Name of this match profile.
 	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
 	// Set of pools to be queried when generating a match for this MatchProfile.
@@ -545,54 +645,58 @@ type MatchProfile struct {
 	// Customized information not inspected by Open Match, to be used by the match
 	// making function, evaluator, and components making calls to Open Match.
 	// Optional, depending on the requirements of the connected systems.
-	Extensions           map[string]*any.Any `protobuf:"bytes,5,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
-	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
-	XXX_unrecognized     []byte              `json:"-"`
-	XXX_sizecache        int32               `json:"-"`
+	Extensions map[string]*any.Any `protobuf:"bytes,5,rep,name=extensions,proto3" json:"extensions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
 }
 
-func (m *MatchProfile) Reset()         { *m = MatchProfile{} }
-func (m *MatchProfile) String() string { return proto.CompactTextString(m) }
-func (*MatchProfile) ProtoMessage()    {}
-func (*MatchProfile) Descriptor() ([]byte, []int) {
-	return fileDescriptor_cb9fb1f207fd5b8c, []int{7}
+func (x *MatchProfile) Reset() {
+	*x = MatchProfile{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_messages_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *MatchProfile) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_MatchProfile.Unmarshal(m, b)
-}
-func (m *MatchProfile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_MatchProfile.Marshal(b, m, deterministic)
-}
-func (m *MatchProfile) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_MatchProfile.Merge(m, src)
+func (x *MatchProfile) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *MatchProfile) XXX_Size() int {
-	return xxx_messageInfo_MatchProfile.Size(m)
-}
-func (m *MatchProfile) XXX_DiscardUnknown() {
-	xxx_messageInfo_MatchProfile.DiscardUnknown(m)
+
+func (*MatchProfile) ProtoMessage() {}
+
+func (x *MatchProfile) ProtoReflect() protoreflect.Message {
+	mi := &file_api_messages_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_MatchProfile proto.InternalMessageInfo
+// Deprecated: Use MatchProfile.ProtoReflect.Descriptor instead.
+func (*MatchProfile) Descriptor() ([]byte, []int) {
+	return file_api_messages_proto_rawDescGZIP(), []int{7}
+}
 
-func (m *MatchProfile) GetName() string {
-	if m != nil {
-		return m.Name
+func (x *MatchProfile) GetName() string {
+	if x != nil {
+		return x.Name
 	}
 	return ""
 }
 
-func (m *MatchProfile) GetPools() []*Pool {
-	if m != nil {
-		return m.Pools
+func (x *MatchProfile) GetPools() []*Pool {
+	if x != nil {
+		return x.Pools
 	}
 	return nil
 }
 
-func (m *MatchProfile) GetExtensions() map[string]*any.Any {
-	if m != nil {
-		return m.Extensions
+func (x *MatchProfile) GetExtensions() map[string]*any.Any {
+	if x != nil {
+		return x.Extensions
 	}
 	return nil
 }
@@ -603,6 +707,10 @@ func (m *MatchProfile) GetExtensions() map[string]*any.Any {
 // When a match is returned by the FetchMatches call, it should contain at least
 // one ticket to be considered as valid.
 type Match struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// A Match ID that should be passed through the stack for tracing.
 	MatchId string `protobuf:"bytes,1,opt,name=match_id,json=matchId,proto3" json:"match_id,omitempty"`
 	// Name of the match profile that generated this Match.
@@ -626,82 +734,86 @@ type Match struct {
 	//
 	// BETA FEATURE WARNING: This field is not finalized and still subject
 	// to possible change or removal.
-	AllocateGameserver   bool     `protobuf:"varint,9,opt,name=allocate_gameserver,json=allocateGameserver,proto3" json:"allocate_gameserver,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	AllocateGameserver bool `protobuf:"varint,9,opt,name=allocate_gameserver,json=allocateGameserver,proto3" json:"allocate_gameserver,omitempty"`
 }
 
-func (m *Match) Reset()         { *m = Match{} }
-func (m *Match) String() string { return proto.CompactTextString(m) }
-func (*Match) ProtoMessage()    {}
-func (*Match) Descriptor() ([]byte, []int) {
-	return fileDescriptor_cb9fb1f207fd5b8c, []int{8}
+func (x *Match) Reset() {
+	*x = Match{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_messages_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Match) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Match.Unmarshal(m, b)
-}
-func (m *Match) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Match.Marshal(b, m, deterministic)
-}
-func (m *Match) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Match.Merge(m, src)
-}
-func (m *Match) XXX_Size() int {
-	return xxx_messageInfo_Match.Size(m)
+func (x *Match) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Match) XXX_DiscardUnknown() {
-	xxx_messageInfo_Match.DiscardUnknown(m)
+
+func (*Match) ProtoMessage() {}
+
+func (x *Match) ProtoReflect() protoreflect.Message {
+	mi := &file_api_messages_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Match proto.InternalMessageInfo
+// Deprecated: Use Match.ProtoReflect.Descriptor instead.
+func (*Match) Descriptor() ([]byte, []int) {
+	return file_api_messages_proto_rawDescGZIP(), []int{8}
+}
 
-func (m *Match) GetMatchId() string {
-	if m != nil {
-		return m.MatchId
+func (x *Match) GetMatchId() string {
+	if x != nil {
+		return x.MatchId
 	}
 	return ""
 }
 
-func (m *Match) GetMatchProfile() string {
-	if m != nil {
-		return m.MatchProfile
+func (x *Match) GetMatchProfile() string {
+	if x != nil {
+		return x.MatchProfile
 	}
 	return ""
 }
 
-func (m *Match) GetMatchFunction() string {
-	if m != nil {
-		return m.MatchFunction
+func (x *Match) GetMatchFunction() string {
+	if x != nil {
+		return x.MatchFunction
 	}
 	return ""
 }
 
-func (m *Match) GetTickets() []*Ticket {
-	if m != nil {
-		return m.Tickets
+func (x *Match) GetTickets() []*Ticket {
+	if x != nil {
+		return x.Tickets
 	}
 	return nil
 }
 
-func (m *Match) GetExtensions() map[string]*any.Any {
-	if m != nil {
-		return m.Extensions
+func (x *Match) GetExtensions() map[string]*any.Any {
+	if x != nil {
+		return x.Extensions
 	}
 	return nil
 }
 
-func (m *Match) GetBackfill() *Backfill {
-	if m != nil {
-		return m.Backfill
+func (x *Match) GetBackfill() *Backfill {
+	if x != nil {
+		return x.Backfill
 	}
 	return nil
 }
 
-func (m *Match) GetAllocateGameserver() bool {
-	if m != nil {
-		return m.AllocateGameserver
+func (x *Match) GetAllocateGameserver() bool {
+	if x != nil {
+		return x.AllocateGameserver
 	}
 	return false
 }
@@ -710,6 +822,10 @@ func (m *Match) GetAllocateGameserver() bool {
 // messages are not finalized and still subject to possible change or removal.
 // Represents a backfill entity which is used to fill partially full matches.
 type Backfill struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
 	// Id represents an auto-generated Id issued by Open Match.
 	Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
 	// Search fields are the fields which Open Match is aware of, and can be used
@@ -728,151 +844,467 @@ type Backfill struct {
 	Generation int64 `protobuf:"varint,5,opt,name=generation,proto3" json:"generation,omitempty"`
 }
 
-func (m *Backfill) Reset()         { *m = Backfill{} }
-func (m *Backfill) String() string { return proto.CompactTextString(m) }
-func (*Backfill) ProtoMessage()    {}
-func (*Backfill) Descriptor() ([]byte, []int) {
-	return fileDescriptor_cb9fb1f207fd5b8c, []int{9}
+func (x *Backfill) Reset() {
+	*x = Backfill{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_api_messages_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-func (m *Backfill) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_Backfill.Unmarshal(m, b)
+func (x *Backfill) String() string {
+	return protoimpl.X.MessageStringOf(x)
 }
-func (m *Backfill) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_Backfill.Marshal(b, m, deterministic)
-}
-func (m *Backfill) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_Backfill.Merge(m, src)
-}
-func (m *Backfill) XXX_Size() int {
-	return xxx_messageInfo_Backfill.Size(m)
-}
-func (m *Backfill) XXX_DiscardUnknown() {
-	xxx_messageInfo_Backfill.DiscardUnknown(m)
+
+func (*Backfill) ProtoMessage() {}
+
+func (x *Backfill) ProtoReflect() protoreflect.Message {
+	mi := &file_api_messages_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
 }
 
-var xxx_messageInfo_Backfill proto.InternalMessageInfo
+// Deprecated: Use Backfill.ProtoReflect.Descriptor instead.
+func (*Backfill) Descriptor() ([]byte, []int) {
+	return file_api_messages_proto_rawDescGZIP(), []int{9}
+}
 
-func (m *Backfill) GetId() string {
-	if m != nil {
-		return m.Id
+func (x *Backfill) GetId() string {
+	if x != nil {
+		return x.Id
 	}
 	return ""
 }
 
-func (m *Backfill) GetSearchFields() *SearchFields {
-	if m != nil {
-		return m.SearchFields
+func (x *Backfill) GetSearchFields() *SearchFields {
+	if x != nil {
+		return x.SearchFields
 	}
 	return nil
 }
 
-func (m *Backfill) GetExtensions() map[string]*any.Any {
-	if m != nil {
-		return m.Extensions
+func (x *Backfill) GetExtensions() map[string]*any.Any {
+	if x != nil {
+		return x.Extensions
 	}
 	return nil
 }
 
-func (m *Backfill) GetCreateTime() *timestamp.Timestamp {
-	if m != nil {
-		return m.CreateTime
+func (x *Backfill) GetCreateTime() *timestamp.Timestamp {
+	if x != nil {
+		return x.CreateTime
 	}
 	return nil
 }
 
-func (m *Backfill) GetGeneration() int64 {
-	if m != nil {
-		return m.Generation
+func (x *Backfill) GetGeneration() int64 {
+	if x != nil {
+		return x.Generation
 	}
 	return 0
 }
 
-func init() {
-	proto.RegisterEnum("openmatch.DoubleRangeFilter_Exclude", DoubleRangeFilter_Exclude_name, DoubleRangeFilter_Exclude_value)
-	proto.RegisterType((*Ticket)(nil), "openmatch.Ticket")
-	proto.RegisterMapType((map[string]*any.Any)(nil), "openmatch.Ticket.ExtensionsEntry")
-	proto.RegisterType((*SearchFields)(nil), "openmatch.SearchFields")
-	proto.RegisterMapType((map[string]float64)(nil), "openmatch.SearchFields.DoubleArgsEntry")
-	proto.RegisterMapType((map[string]string)(nil), "openmatch.SearchFields.StringArgsEntry")
-	proto.RegisterType((*Assignment)(nil), "openmatch.Assignment")
-	proto.RegisterMapType((map[string]*any.Any)(nil), "openmatch.Assignment.ExtensionsEntry")
-	proto.RegisterType((*DoubleRangeFilter)(nil), "openmatch.DoubleRangeFilter")
-	proto.RegisterType((*StringEqualsFilter)(nil), "openmatch.StringEqualsFilter")
-	proto.RegisterType((*TagPresentFilter)(nil), "openmatch.TagPresentFilter")
-	proto.RegisterType((*Pool)(nil), "openmatch.Pool")
-	proto.RegisterType((*MatchProfile)(nil), "openmatch.MatchProfile")
-	proto.RegisterMapType((map[string]*any.Any)(nil), "openmatch.MatchProfile.ExtensionsEntry")
-	proto.RegisterType((*Match)(nil), "openmatch.Match")
-	proto.RegisterMapType((map[string]*any.Any)(nil), "openmatch.Match.ExtensionsEntry")
-	proto.RegisterType((*Backfill)(nil), "openmatch.Backfill")
-	proto.RegisterMapType((map[string]*any.Any)(nil), "openmatch.Backfill.ExtensionsEntry")
-}
-
-func init() { proto.RegisterFile("api/messages.proto", fileDescriptor_cb9fb1f207fd5b8c) }
-
-var fileDescriptor_cb9fb1f207fd5b8c = []byte{
-	// 992 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x56, 0x4d, 0x73, 0xe3, 0x34,
-	0x18, 0xc6, 0x1f, 0x69, 0x92, 0xb7, 0xd9, 0xd6, 0x55, 0xbb, 0xb3, 0xde, 0xc0, 0x42, 0xf0, 0x6e,
-	0x87, 0x0c, 0x0c, 0xf6, 0x4c, 0x19, 0x66, 0x18, 0xbe, 0x53, 0x48, 0x77, 0x5b, 0x66, 0xdb, 0xe2,
-	0xf6, 0xc0, 0x70, 0xc9, 0x28, 0xb6, 0xe2, 0xf5, 0xd4, 0x91, 0x8d, 0xa5, 0x74, 0xda, 0xff, 0xc1,
-	0x0f, 0xe0, 0xcc, 0x99, 0xff, 0xc0, 0x91, 0x0b, 0x3f, 0x82, 0x3b, 0x7f, 0x80, 0xb1, 0x64, 0x3b,
-	0x6a, 0x12, 0xba, 0xf4, 0xd0, 0xe1, 0x26, 0xbd, 0x5f, 0xd2, 0xf3, 0xe8, 0xd1, 0x2b, 0x01, 0xc2,
-	0x59, 0xec, 0x4d, 0x09, 0x63, 0x38, 0x22, 0xcc, 0xcd, 0xf2, 0x94, 0xa7, 0xa8, 0x9d, 0x66, 0x84,
-	0x4e, 0x31, 0x0f, 0x5e, 0x75, 0x1f, 0x45, 0x69, 0x1a, 0x25, 0xc4, 0xcb, 0xb3, 0xc0, 0x63, 0x1c,
-	0xf3, 0x59, 0x19, 0xd3, 0x7d, 0x5c, 0x3a, 0xc4, 0x6c, 0x3c, 0x9b, 0x78, 0x98, 0x5e, 0x97, 0xae,
-	0x77, 0x16, 0x5d, 0x3c, 0x9e, 0x12, 0xc6, 0xf1, 0x34, 0x93, 0x01, 0xce, 0x5f, 0x3a, 0xac, 0x9d,
-	0xc7, 0xc1, 0x05, 0xe1, 0x68, 0x03, 0xf4, 0x38, 0xb4, 0xb5, 0x9e, 0xd6, 0x6f, 0xfb, 0x7a, 0x1c,
-	0xa2, 0x8f, 0x01, 0x30, 0x63, 0x71, 0x44, 0xa7, 0x84, 0x72, 0xdb, 0xe8, 0x69, 0xfd, 0xf5, 0xbd,
-	0x87, 0x6e, 0xbd, 0x1f, 0x77, 0x50, 0x3b, 0x7d, 0x25, 0x10, 0x7d, 0x0e, 0x0f, 0x18, 0xc1, 0x79,
-	0xf0, 0x6a, 0x34, 0x89, 0x49, 0x12, 0x32, 0xdb, 0x14, 0x99, 0x8f, 0x94, 0xcc, 0x33, 0xe1, 0x3f,
-	0x10, 0x6e, 0xbf, 0xc3, 0x94, 0x19, 0x1a, 0x00, 0x90, 0x2b, 0x4e, 0x28, 0x8b, 0x53, 0xca, 0xec,
-	0x46, 0xcf, 0xe8, 0xaf, 0xef, 0xbd, 0xab, 0xa4, 0xca, 0xbd, 0xba, 0xc3, 0x3a, 0x66, 0x48, 0x79,
-	0x7e, 0xed, 0x2b, 0x49, 0xe8, 0x33, 0x58, 0x0f, 0x72, 0x82, 0x39, 0x19, 0x15, 0x60, 0xed, 0x35,
-	0xb1, 0x7c, 0xd7, 0x95, 0x4c, 0xb8, 0x15, 0x13, 0xee, 0x79, 0xc5, 0x84, 0x0f, 0x32, 0xbc, 0x30,
-	0x74, 0xcf, 0x60, 0x73, 0xa1, 0x36, 0xb2, 0xc0, 0xb8, 0x20, 0xd7, 0x25, 0x31, 0xc5, 0x10, 0xbd,
-	0x0f, 0x8d, 0x4b, 0x9c, 0xcc, 0x88, 0xad, 0x8b, 0xda, 0x3b, 0x4b, 0xb5, 0x07, 0xf4, 0xda, 0x97,
-	0x21, 0x9f, 0xea, 0x9f, 0x68, 0x47, 0x66, 0x4b, 0xb7, 0x0c, 0xe7, 0x37, 0x1d, 0x3a, 0x2a, 0x72,
-	0xf4, 0x02, 0xd6, 0xc3, 0x74, 0x36, 0x4e, 0xc8, 0x08, 0xe7, 0x11, 0xb3, 0x35, 0x01, 0xf6, 0xbd,
-	0x7f, 0xe1, 0xc9, 0xfd, 0x56, 0x84, 0x0e, 0xf2, 0xa8, 0x82, 0x1c, 0xd6, 0x86, 0xa2, 0x12, 0xe3,
-	0x79, 0x4c, 0x23, 0x59, 0x49, 0xbf, 0xbd, 0xd2, 0x99, 0x08, 0x55, 0x2a, 0xb1, 0xda, 0x80, 0x10,
-	0x98, 0x1c, 0x47, 0xcc, 0x36, 0x7a, 0x46, 0xbf, 0xed, 0x8b, 0x71, 0xf7, 0x0b, 0xd8, 0x5c, 0x58,
-	0x7c, 0x05, 0x27, 0x3b, 0x2a, 0x27, 0x9a, 0x82, 0xbe, 0x48, 0x5f, 0x58, 0xf1, 0x75, 0xe9, 0x6d,
-	0x25, 0xdd, 0xf9, 0x53, 0x03, 0x98, 0x4b, 0x0d, 0xbd, 0x0d, 0x10, 0xa4, 0x94, 0x92, 0x80, 0xc7,
-	0x29, 0x2d, 0x2b, 0x28, 0x16, 0x34, 0xbc, 0x21, 0x20, 0x53, 0x30, 0xb1, 0xbb, 0x52, 0xb5, 0xb7,
-	0x89, 0xe8, 0x1e, 0x75, 0x70, 0x64, 0xb6, 0x0c, 0xcb, 0x74, 0x7e, 0xd7, 0x60, 0x4b, 0xb2, 0xea,
-	0x63, 0x1a, 0x91, 0x83, 0x38, 0xe1, 0x24, 0x47, 0x4f, 0x00, 0xe6, 0x92, 0x28, 0x97, 0x6a, 0xd7,
-	0x07, 0x5d, 0x6c, 0x61, 0x8a, 0xaf, 0x4a, 0x8a, 0x8b, 0xa1, 0xb0, 0xc4, 0x54, 0xdc, 0xce, 0xc2,
-	0x12, 0x53, 0xf4, 0x25, 0x34, 0xc9, 0x55, 0x90, 0xcc, 0x42, 0x22, 0x6e, 0xde, 0xc6, 0xde, 0x33,
-	0x05, 0xfd, 0xd2, 0x8a, 0xee, 0x50, 0xc6, 0xfa, 0x55, 0x92, 0xe3, 0x41, 0xb3, 0xb4, 0xa1, 0x16,
-	0x98, 0xc7, 0x27, 0xc7, 0x43, 0xeb, 0x0d, 0xd4, 0x04, 0xe3, 0xe5, 0xe1, 0xb1, 0xa5, 0x89, 0xc1,
-	0xe0, 0x07, 0x4b, 0x2f, 0x7c, 0xfb, 0x27, 0xe7, 0x2f, 0x2c, 0xc3, 0x39, 0x04, 0x24, 0xcf, 0x77,
-	0xf8, 0xd3, 0x0c, 0x27, 0x6c, 0x8e, 0x64, 0x2e, 0xc9, 0x0a, 0x49, 0x2d, 0xb4, 0xd5, 0xe7, 0xed,
-	0x3c, 0x03, 0xeb, 0x1c, 0x47, 0xa7, 0x39, 0x61, 0x84, 0xf2, 0xb2, 0x90, 0x05, 0x06, 0xc7, 0x55,
-	0x85, 0x62, 0xe8, 0xfc, 0x6c, 0x80, 0x79, 0x9a, 0xa6, 0x49, 0x21, 0x56, 0x8a, 0xa7, 0xa4, 0xf4,
-	0x89, 0x31, 0x3a, 0x86, 0x9d, 0x92, 0xc1, 0xbc, 0x40, 0x39, 0x9a, 0x88, 0x2a, 0xd5, 0x9d, 0x78,
-	0xeb, 0x36, 0x2e, 0x7c, 0x14, 0x2e, 0x9a, 0x18, 0xfa, 0x1e, 0x1e, 0x96, 0x38, 0x88, 0x80, 0x57,
-	0x17, 0x94, 0xd2, 0x7a, 0xa2, 0x5e, 0xb2, 0x25, 0x16, 0xfc, 0x6d, 0xb6, 0x64, 0x63, 0xe8, 0x3b,
-	0xd8, 0xe6, 0x38, 0x1a, 0x65, 0x12, 0x66, 0x5d, 0x50, 0x36, 0xbb, 0x37, 0xd5, 0x66, 0xb7, 0xc0,
-	0x85, 0xbf, 0xc5, 0x17, 0x2c, 0x45, 0xc3, 0xdc, 0x90, 0xed, 0x2b, 0x1c, 0x8d, 0xc9, 0x24, 0xcd,
-	0xff, 0x4b, 0xc3, 0x7b, 0x50, 0x66, 0xec, 0x8b, 0x04, 0xf4, 0x15, 0x54, 0x86, 0x11, 0x9e, 0x70,
-	0x92, 0xdb, 0xcd, 0xd7, 0x56, 0xe8, 0x94, 0x09, 0x83, 0x22, 0xbe, 0x54, 0xf4, 0xdf, 0x1a, 0x74,
-	0x5e, 0x16, 0xfb, 0x3e, 0xcd, 0xd3, 0x49, 0x9c, 0x90, 0x95, 0xc7, 0xb3, 0x0b, 0x8d, 0x2c, 0x4d,
-	0x13, 0xd9, 0x60, 0xd6, 0xf7, 0x36, 0x15, 0xb4, 0xc5, 0x91, 0xfa, 0xd2, 0x8b, 0x9e, 0xaf, 0x78,
-	0x06, 0xd4, 0x7e, 0xa6, 0xae, 0xf3, 0xff, 0xdd, 0x63, 0xd3, 0x6a, 0x38, 0xbf, 0x18, 0xd0, 0x10,
-	0xbb, 0x41, 0x8f, 0xa1, 0x25, 0x36, 0x37, 0xaa, 0x5f, 0xd1, 0xa6, 0x98, 0x1f, 0x86, 0xe8, 0x29,
-	0x3c, 0x90, 0xae, 0x4c, 0x6e, 0xb9, 0x54, 0x7d, 0x67, 0xaa, 0xd2, 0xb5, 0x0b, 0x1b, 0x32, 0x68,
-	0x32, 0xa3, 0xb2, 0xbb, 0x19, 0x22, 0x4a, 0xa6, 0x1e, 0x94, 0x46, 0xf4, 0x01, 0x34, 0xb9, 0x78,
-	0x04, 0x2b, 0x09, 0x6e, 0x2d, 0x3d, 0x8f, 0x7e, 0x15, 0x81, 0xbe, 0xbe, 0xc1, 0x63, 0x53, 0xc4,
-	0xf7, 0x16, 0x79, 0xbc, 0xf5, 0x35, 0xf5, 0xa0, 0x35, 0xc6, 0xc1, 0xc5, 0x24, 0x4e, 0x12, 0xbb,
-	0x25, 0xe8, 0xd9, 0x56, 0xf2, 0xf7, 0x4b, 0x97, 0x5f, 0x07, 0x21, 0x0f, 0xb6, 0x71, 0x92, 0xa4,
-	0x41, 0xf1, 0x00, 0x47, 0x78, 0x4a, 0x18, 0xc9, 0x2f, 0x49, 0x6e, 0xb7, 0x7b, 0x5a, 0xbf, 0xe5,
-	0xa3, 0xca, 0xf5, 0xbc, 0xf6, 0xdc, 0xd7, 0x11, 0x35, 0xac, 0xb5, 0x23, 0xb3, 0xb5, 0x66, 0x35,
-	0x9d, 0x3f, 0x74, 0x68, 0x55, 0x1b, 0x5d, 0xfa, 0xe5, 0x2c, 0x7d, 0x57, 0xf4, 0xbb, 0x7c, 0x57,
-	0xbe, 0xb9, 0xc1, 0xaf, 0xd4, 0xf4, 0xd3, 0x15, 0xfc, 0xdc, 0xe5, 0xc3, 0x62, 0xde, 0xe5, 0xc3,
-	0x52, 0xbc, 0x87, 0x11, 0xa1, 0x24, 0xc7, 0x42, 0x31, 0x8d, 0x9e, 0xd6, 0x37, 0x7c, 0xc5, 0x72,
-	0x2f, 0xec, 0xee, 0xbb, 0x3f, 0xf6, 0x0a, 0x8c, 0x1f, 0x4a, 0x90, 0x21, 0xb9, 0xf4, 0xe6, 0x53,
-	0x2f, 0xbb, 0x88, 0xbc, 0x6c, 0xfc, 0xab, 0xde, 0x3e, 0xc9, 0x08, 0x15, 0x02, 0x1b, 0xaf, 0x89,
-	0x42, 0x1f, 0xfd, 0x13, 0x00, 0x00, 0xff, 0xff, 0x0a, 0xaa, 0xfb, 0x6f, 0xe2, 0x0a, 0x00, 0x00,
+var File_api_messages_proto protoreflect.FileDescriptor
+
+var file_api_messages_proto_rawDesc = []byte{
+	0x0a, 0x12, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x1a,
+	0x17, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x73, 0x74, 0x61, 0x74,
+	0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
+	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70,
+	0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe8, 0x02, 0x0a, 0x06, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x12,
+	0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12,
+	0x35, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e,
+	0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x69,
+	0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68,
+	0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e,
+	0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68,
+	0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69,
+	0x65, 0x6c, 0x64, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d,
+	0x61, 0x74, 0x63, 0x68, 0x2e, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65,
+	0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
+	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
+	0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+	0x54, 0x69, 0x6d, 0x65, 0x1a, 0x53, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22,
+	0xb4, 0x02, 0x0a, 0x0c, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73,
+	0x12, 0x48, 0x0a, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18,
+	0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61, 0x74, 0x63,
+	0x68, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2e, 0x44,
+	0x6f, 0x75, 0x62, 0x6c, 0x65, 0x41, 0x72, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a,
+	0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x48, 0x0a, 0x0b, 0x73, 0x74,
+	0x72, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x53, 0x65, 0x61, 0x72,
+	0x63, 0x68, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41,
+	0x72, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67,
+	0x41, 0x72, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03,
+	0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x44, 0x6f, 0x75, 0x62,
+	0x6c, 0x65, 0x41, 0x72, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b,
+	0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x53, 0x74, 0x72, 0x69, 0x6e,
+	0x67, 0x41, 0x72, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
+	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x69, 0x67,
+	0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
+	0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
+	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x70, 0x65, 0x6e,
+	0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x41, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x6d, 0x65, 0x6e, 0x74,
+	0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79,
+	0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x53, 0x0a, 0x0f,
+	0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12,
+	0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65,
+	0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
+	0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
+	0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
+	0x01, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xc7, 0x01,
+	0x0a, 0x11, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x46, 0x69, 0x6c,
+	0x74, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x72,
+	0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x41,
+	0x72, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52,
+	0x03, 0x6d, 0x61, 0x78, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28,
+	0x01, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x3e, 0x0a, 0x07, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64,
+	0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61,
+	0x74, 0x63, 0x68, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x46,
+	0x69, 0x6c, 0x74, 0x65, 0x72, 0x2e, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x52, 0x07, 0x65,
+	0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x22, 0x2f, 0x0a, 0x07, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64,
+	0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4d,
+	0x49, 0x4e, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x58, 0x10, 0x02, 0x12, 0x08, 0x0a,
+	0x04, 0x42, 0x4f, 0x54, 0x48, 0x10, 0x03, 0x22, 0x49, 0x0a, 0x12, 0x53, 0x74, 0x72, 0x69, 0x6e,
+	0x67, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x1d, 0x0a,
+	0x0a, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x72, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x41, 0x72, 0x67, 0x12, 0x14, 0x0a, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x22, 0x24, 0x0a, 0x10, 0x54, 0x61, 0x67, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74,
+	0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x22, 0x94, 0x03, 0x0a, 0x04, 0x50, 0x6f, 0x6f,
+	0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x4e, 0x0a, 0x14, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x5f,
+	0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e,
+	0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65,
+	0x72, 0x52, 0x12, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x46, 0x69,
+	0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x51, 0x0a, 0x15, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x5f,
+	0x65, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04,
+	0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68,
+	0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x73, 0x46, 0x69, 0x6c,
+	0x74, 0x65, 0x72, 0x52, 0x13, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x45, 0x71, 0x75, 0x61, 0x6c,
+	0x73, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x74, 0x61, 0x67, 0x5f,
+	0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18,
+	0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61, 0x74, 0x63,
+	0x68, 0x2e, 0x54, 0x61, 0x67, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x46, 0x69, 0x6c, 0x74,
+	0x65, 0x72, 0x52, 0x11, 0x74, 0x61, 0x67, 0x50, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x46, 0x69,
+	0x6c, 0x74, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64,
+	0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x63, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x64, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0d, 0x63, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x64, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32,
+	0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
+	0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x63, 0x72, 0x65,
+	0x61, 0x74, 0x65, 0x64, 0x41, 0x66, 0x74, 0x65, 0x72, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22,
+	0xf3, 0x01, 0x0a, 0x0c, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65,
+	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
+	0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x03, 0x20,
+	0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e,
+	0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x05, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x65,
+	0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x4d, 0x61, 0x74, 0x63,
+	0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x53, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f,
+	0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c,
+	0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
+	0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a,
+	0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0xa0, 0x03, 0x0a, 0x05, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12,
+	0x19, 0x0a, 0x08, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x07, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61,
+	0x74, 0x63, 0x68, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x0c, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12,
+	0x25, 0x0a, 0x0e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
+	0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x46, 0x75,
+	0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x07, 0x74, 0x69, 0x63, 0x6b, 0x65, 0x74,
+	0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61,
+	0x74, 0x63, 0x68, 0x2e, 0x54, 0x69, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x74, 0x69, 0x63, 0x6b,
+	0x65, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61,
+	0x74, 0x63, 0x68, 0x2e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
+	0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x62, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c,
+	0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61,
+	0x74, 0x63, 0x68, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x52, 0x08, 0x62, 0x61,
+	0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x12, 0x2f, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61,
+	0x74, 0x65, 0x5f, 0x67, 0x61, 0x6d, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x09, 0x20,
+	0x01, 0x28, 0x08, 0x52, 0x12, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x47, 0x61, 0x6d,
+	0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x1a, 0x53, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e,
+	0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65,
+	0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05,
+	0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f,
+	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e,
+	0x79, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x05,
+	0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0xcf, 0x02, 0x0a, 0x08, 0x42, 0x61, 0x63,
+	0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3c, 0x0a, 0x0d, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f,
+	0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f,
+	0x70, 0x65, 0x6e, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46,
+	0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x0c, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x46, 0x69, 0x65,
+	0x6c, 0x64, 0x73, 0x12, 0x43, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e,
+	0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x6d, 0x61,
+	0x74, 0x63, 0x68, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x2e, 0x45, 0x78, 0x74,
+	0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x65, 0x78,
+	0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61,
+	0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
+	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
+	0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74,
+	0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74,
+	0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x67, 0x65, 0x6e, 0x65, 0x72,
+	0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x53, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69,
+	0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61,
+	0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
+	0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52,
+	0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x2e, 0x5a, 0x20, 0x6f, 0x70,
+	0x65, 0x6e, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2e, 0x64, 0x65, 0x76, 0x2f, 0x6f, 0x70, 0x65,
+	0x6e, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x62, 0xaa, 0x02,
+	0x09, 0x4f, 0x70, 0x65, 0x6e, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x33,
+}
+
+var (
+	file_api_messages_proto_rawDescOnce sync.Once
+	file_api_messages_proto_rawDescData = file_api_messages_proto_rawDesc
+)
+
+func file_api_messages_proto_rawDescGZIP() []byte {
+	file_api_messages_proto_rawDescOnce.Do(func() {
+		file_api_messages_proto_rawDescData = protoimpl.X.CompressGZIP(file_api_messages_proto_rawDescData)
+	})
+	return file_api_messages_proto_rawDescData
+}
+
+var file_api_messages_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
+var file_api_messages_proto_msgTypes = make([]protoimpl.MessageInfo, 17)
+var file_api_messages_proto_goTypes = []interface{}{
+	(DoubleRangeFilter_Exclude)(0), // 0: openmatch.DoubleRangeFilter.Exclude
+	(*Ticket)(nil),                 // 1: openmatch.Ticket
+	(*SearchFields)(nil),           // 2: openmatch.SearchFields
+	(*Assignment)(nil),             // 3: openmatch.Assignment
+	(*DoubleRangeFilter)(nil),      // 4: openmatch.DoubleRangeFilter
+	(*StringEqualsFilter)(nil),     // 5: openmatch.StringEqualsFilter
+	(*TagPresentFilter)(nil),       // 6: openmatch.TagPresentFilter
+	(*Pool)(nil),                   // 7: openmatch.Pool
+	(*MatchProfile)(nil),           // 8: openmatch.MatchProfile
+	(*Match)(nil),                  // 9: openmatch.Match
+	(*Backfill)(nil),               // 10: openmatch.Backfill
+	nil,                            // 11: openmatch.Ticket.ExtensionsEntry
+	nil,                            // 12: openmatch.SearchFields.DoubleArgsEntry
+	nil,                            // 13: openmatch.SearchFields.StringArgsEntry
+	nil,                            // 14: openmatch.Assignment.ExtensionsEntry
+	nil,                            // 15: openmatch.MatchProfile.ExtensionsEntry
+	nil,                            // 16: openmatch.Match.ExtensionsEntry
+	nil,                            // 17: openmatch.Backfill.ExtensionsEntry
+	(*timestamp.Timestamp)(nil),    // 18: google.protobuf.Timestamp
+	(*any.Any)(nil),                // 19: google.protobuf.Any
+}
+var file_api_messages_proto_depIdxs = []int32{
+	3,  // 0: openmatch.Ticket.assignment:type_name -> openmatch.Assignment
+	2,  // 1: openmatch.Ticket.search_fields:type_name -> openmatch.SearchFields
+	11, // 2: openmatch.Ticket.extensions:type_name -> openmatch.Ticket.ExtensionsEntry
+	18, // 3: openmatch.Ticket.create_time:type_name -> google.protobuf.Timestamp
+	12, // 4: openmatch.SearchFields.double_args:type_name -> openmatch.SearchFields.DoubleArgsEntry
+	13, // 5: openmatch.SearchFields.string_args:type_name -> openmatch.SearchFields.StringArgsEntry
+	14, // 6: openmatch.Assignment.extensions:type_name -> openmatch.Assignment.ExtensionsEntry
+	0,  // 7: openmatch.DoubleRangeFilter.exclude:type_name -> openmatch.DoubleRangeFilter.Exclude
+	4,  // 8: openmatch.Pool.double_range_filters:type_name -> openmatch.DoubleRangeFilter
+	5,  // 9: openmatch.Pool.string_equals_filters:type_name -> openmatch.StringEqualsFilter
+	6,  // 10: openmatch.Pool.tag_present_filters:type_name -> openmatch.TagPresentFilter
+	18, // 11: openmatch.Pool.created_before:type_name -> google.protobuf.Timestamp
+	18, // 12: openmatch.Pool.created_after:type_name -> google.protobuf.Timestamp
+	7,  // 13: openmatch.MatchProfile.pools:type_name -> openmatch.Pool
+	15, // 14: openmatch.MatchProfile.extensions:type_name -> openmatch.MatchProfile.ExtensionsEntry
+	1,  // 15: openmatch.Match.tickets:type_name -> openmatch.Ticket
+	16, // 16: openmatch.Match.extensions:type_name -> openmatch.Match.ExtensionsEntry
+	10, // 17: openmatch.Match.backfill:type_name -> openmatch.Backfill
+	2,  // 18: openmatch.Backfill.search_fields:type_name -> openmatch.SearchFields
+	17, // 19: openmatch.Backfill.extensions:type_name -> openmatch.Backfill.ExtensionsEntry
+	18, // 20: openmatch.Backfill.create_time:type_name -> google.protobuf.Timestamp
+	19, // 21: openmatch.Ticket.ExtensionsEntry.value:type_name -> google.protobuf.Any
+	19, // 22: openmatch.Assignment.ExtensionsEntry.value:type_name -> google.protobuf.Any
+	19, // 23: openmatch.MatchProfile.ExtensionsEntry.value:type_name -> google.protobuf.Any
+	19, // 24: openmatch.Match.ExtensionsEntry.value:type_name -> google.protobuf.Any
+	19, // 25: openmatch.Backfill.ExtensionsEntry.value:type_name -> google.protobuf.Any
+	26, // [26:26] is the sub-list for method output_type
+	26, // [26:26] is the sub-list for method input_type
+	26, // [26:26] is the sub-list for extension type_name
+	26, // [26:26] is the sub-list for extension extendee
+	0,  // [0:26] is the sub-list for field type_name
+}
+
+func init() { file_api_messages_proto_init() }
+func file_api_messages_proto_init() {
+	if File_api_messages_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_api_messages_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Ticket); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_messages_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SearchFields); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_messages_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Assignment); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_messages_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DoubleRangeFilter); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_messages_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*StringEqualsFilter); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_messages_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*TagPresentFilter); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_messages_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Pool); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_messages_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MatchProfile); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_messages_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Match); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_api_messages_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Backfill); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_api_messages_proto_rawDesc,
+			NumEnums:      1,
+			NumMessages:   17,
+			NumExtensions: 0,
+			NumServices:   0,
+		},
+		GoTypes:           file_api_messages_proto_goTypes,
+		DependencyIndexes: file_api_messages_proto_depIdxs,
+		EnumInfos:         file_api_messages_proto_enumTypes,
+		MessageInfos:      file_api_messages_proto_msgTypes,
+	}.Build()
+	File_api_messages_proto = out.File
+	file_api_messages_proto_rawDesc = nil
+	file_api_messages_proto_goTypes = nil
+	file_api_messages_proto_depIdxs = nil
 }


Test patch:
diff --git a/internal/statestore/backfill.go b/internal/statestore/backfill.go
index 302f5b7b..94b67c16 100644
--- a/internal/statestore/backfill.go
+++ b/internal/statestore/backfill.go
@@ -16,6 +16,7 @@ package statestore
 
 import (
 	"context"
+	"strconv"
 
 	"github.com/golang/protobuf/proto"
 	"github.com/gomodule/redigo/redis"
@@ -26,6 +27,10 @@ import (
 	"open-match.dev/open-match/pkg/pb"
 )
 
+const (
+	allBackfills = "allBackfills"
+)
+
 // CreateBackfill creates a new Backfill in the state storage if one doesn't exist. The xids algorithm used to create the ids ensures that they are unique with no system wide synchronization. Calling clients are forbidden from choosing an id during create. So no conflicts will occur.
 func (rb *redisBackend) CreateBackfill(ctx context.Context, backfill *pb.Backfill, ticketIDs []string) error {
 	redisConn, err := rb.redisPool.GetContext(ctx)
@@ -134,3 +139,62 @@ func (rb *redisBackend) UpdateBackfill(ctx context.Context, backfill *pb.Backfil
 
 	return nil
 }
+
+// IndexBackfill adds the backfill to the index.
+func (rb *redisBackend) IndexBackfill(ctx context.Context, backfill *pb.Backfill) error {
+	redisConn, err := rb.redisPool.GetContext(ctx)
+	if err != nil {
+		return status.Errorf(codes.Unavailable, "IndexBackfill, id: %s, failed to connect to redis: %v", backfill.GetId(), err)
+	}
+	defer handleConnectionClose(&redisConn)
+
+	err = redisConn.Send("HSET", allBackfills, backfill.Id, backfill.Generation)
+	if err != nil {
+		err = errors.Wrapf(err, "failed to add backfill to all backfills, id: %s", backfill.Id)
+		return status.Errorf(codes.Internal, "%v", err)
+	}
+
+	return nil
+}
+
+// DeindexBackfill removes specified Backfill ID from the index. The Backfill continues to exist.
+func (rb *redisBackend) DeindexBackfill(ctx context.Context, id string) error {
+	redisConn, err := rb.redisPool.GetContext(ctx)
+	if err != nil {
+		return status.Errorf(codes.Unavailable, "DeindexBackfill, id: %s, failed to connect to redis: %v", id, err)
+	}
+	defer handleConnectionClose(&redisConn)
+
+	err = redisConn.Send("HDEL", allBackfills, id)
+	if err != nil {
+		err = errors.Wrapf(err, "failed to remove ID from backfill index, id: %s", id)
+		return status.Errorf(codes.Internal, "%v", err)
+	}
+
+	return nil
+}
+
+// GetIndexedBackfills returns the ids of all backfills currently indexed.
+func (rb *redisBackend) GetIndexedBackfills(ctx context.Context) (map[string]int, error) {
+	redisConn, err := rb.redisPool.GetContext(ctx)
+	if err != nil {
+		return nil, status.Errorf(codes.Unavailable, "GetIndexedBackfills, failed to connect to redis: %v", err)
+	}
+	defer handleConnectionClose(&redisConn)
+
+	bfIndex, err := redis.StringMap(redisConn.Do("HGETALL", allBackfills))
+	if err != nil {
+		return nil, status.Errorf(codes.Internal, "error getting all indexed backfill ids %v", err)
+	}
+
+	r := make(map[string]int, len(bfIndex))
+	for bfID, bfGeneration := range bfIndex {
+		gen, err := strconv.Atoi(bfGeneration)
+		if err != nil {
+			return nil, status.Errorf(codes.Internal, "error while parsing generation into number: %v", err)
+		}
+		r[bfID] = gen
+	}
+
+	return r, nil
+}
diff --git a/internal/statestore/backfill_test.go b/internal/statestore/backfill_test.go
index e068b21b..f5cbd4e8 100644
--- a/internal/statestore/backfill_test.go
+++ b/internal/statestore/backfill_test.go
@@ -301,3 +301,123 @@ func TestDeleteBackfill(t *testing.T) {
 	require.Equal(t, codes.Unavailable.String(), status.Convert(err).Code().String())
 	require.Contains(t, status.Convert(err).Message(), "DeleteBackfill, id: 12345, failed to connect to redis:")
 }
+
+func TestIndexBackfill(t *testing.T) {
+	cfg, closer := createRedis(t, false, "")
+	defer closer()
+	service := New(cfg)
+	require.NotNil(t, service)
+	defer service.Close()
+
+	t.Run("WithValidContext", func(t *testing.T) {
+		ctx := utilTesting.NewContext(t)
+		generateBackfills(ctx, t, service, 2)
+		c, err := redis.Dial("tcp", fmt.Sprintf("%s:%s", cfg.GetString("redis.hostname"), cfg.GetString("redis.port")))
+		require.NoError(t, err)
+		idsIndexed, err := redis.Strings(c.Do("HKEYS", allBackfills))
+		require.NoError(t, err)
+		require.Len(t, idsIndexed, 2)
+		require.Equal(t, "mockBackfillID-0", idsIndexed[0])
+		require.Equal(t, "mockBackfillID-1", idsIndexed[1])
+	})
+
+	t.Run("WithCancelledContext", func(t *testing.T) {
+		ctx, cancel := context.WithCancel(context.Background())
+		cancel()
+		service = New(cfg)
+		err := service.IndexBackfill(ctx, &pb.Backfill{
+			Id:         "12345",
+			Generation: 42,
+		})
+		require.Error(t, err)
+		require.Equal(t, codes.Unavailable.String(), status.Convert(err).Code().String())
+		require.Contains(t, status.Convert(err).Message(), "IndexBackfill, id: 12345, failed to connect to redis:")
+	})
+}
+
+func TestDeindexBackfill(t *testing.T) {
+	cfg, closer := createRedis(t, false, "")
+	defer closer()
+	service := New(cfg)
+	require.NotNil(t, service)
+	defer service.Close()
+
+	ctx := utilTesting.NewContext(t)
+
+	generateBackfills(ctx, t, service, 2)
+
+	c, err := redis.Dial("tcp", fmt.Sprintf("%s:%s", cfg.GetString("redis.hostname"), cfg.GetString("redis.port")))
+	require.NoError(t, err)
+	idsIndexed, err := redis.Strings(c.Do("HKEYS", allBackfills))
+	require.NoError(t, err)
+	require.Len(t, idsIndexed, 2)
+	require.Equal(t, "mockBackfillID-0", idsIndexed[0])
+	require.Equal(t, "mockBackfillID-1", idsIndexed[1])
+
+	// deindex and check that there is only 1 backfill in the returned slice
+	err = service.DeindexBackfill(ctx, "mockBackfillID-1")
+	require.NoError(t, err)
+	idsIndexed, err = redis.Strings(c.Do("HKEYS", allBackfills))
+	require.NoError(t, err)
+	require.Len(t, idsIndexed, 1)
+	require.Equal(t, "mockBackfillID-0", idsIndexed[0])
+
+	// pass an expired context, err expected
+	ctx, cancel := context.WithCancel(context.Background())
+	cancel()
+	service = New(cfg)
+	err = service.DeindexBackfill(ctx, "12345")
+	require.Error(t, err)
+	require.Equal(t, codes.Unavailable.String(), status.Convert(err).Code().String())
+	require.Contains(t, status.Convert(err).Message(), "DeindexBackfill, id: 12345, failed to connect to redis:")
+}
+
+func TestGetIndexedBackfills(t *testing.T) {
+	cfg, closer := createRedis(t, false, "")
+	defer closer()
+	service := New(cfg)
+	require.NotNil(t, service)
+	defer service.Close()
+
+	ctx := utilTesting.NewContext(t)
+
+	verifyBackfills := func(service Service, backfills []*pb.Backfill) {
+		ids, err := service.GetIndexedBackfills(ctx)
+		require.Nil(t, err)
+		require.Equal(t, len(backfills), len(ids))
+
+		for _, bf := range backfills {
+			gen, ok := ids[bf.GetId()]
+			require.Equal(t, bf.Generation, int64(gen))
+			require.True(t, ok)
+		}
+	}
+
+	// no indexed backfills exists
+	verifyBackfills(service, []*pb.Backfill{})
+
+	// two indexed backfills exists
+	backfills := generateBackfills(ctx, t, service, 2)
+	verifyBackfills(service, backfills)
+
+	// deindex one backfill, one backfill exist
+	err := service.DeindexBackfill(ctx, backfills[0].Id)
+	require.Nil(t, err)
+	verifyBackfills(service, backfills[1:2])
+}
+
+func generateBackfills(ctx context.Context, t *testing.T, service Service, amount int) []*pb.Backfill {
+	backfills := make([]*pb.Backfill, 0, amount)
+
+	for i := 0; i < amount; i++ {
+		tmp := &pb.Backfill{
+			Id:         fmt.Sprintf("mockBackfillID-%d", i),
+			Generation: 1,
+		}
+		require.NoError(t, service.CreateBackfill(ctx, tmp, []string{}))
+		require.NoError(t, service.IndexBackfill(ctx, tmp))
+		backfills = append(backfills, tmp)
+	}
+
+	return backfills
+}
diff --git a/internal/statestore/instrumented.go b/internal/statestore/instrumented.go
index cab94dc4..308a3bf2 100644
--- a/internal/statestore/instrumented.go
+++ b/internal/statestore/instrumented.go
@@ -141,3 +141,24 @@ func (is *instrumentedService) NewMutex(key string) RedisLocker {
 	defer span.End()
 	return is.s.NewMutex(key)
 }
+
+// IndexBackfill adds the backfill to the index.
+func (is *instrumentedService) IndexBackfill(ctx context.Context, backfill *pb.Backfill) error {
+	_, span := trace.StartSpan(ctx, "statestore/instrumented.IndexBackfill")
+	defer span.End()
+	return is.s.IndexBackfill(ctx, backfill)
+}
+
+// DeindexBackfill removes specified Backfill ID from the index. The Backfill continues to exist.
+func (is *instrumentedService) DeindexBackfill(ctx context.Context, id string) error {
+	_, span := trace.StartSpan(ctx, "statestore/instrumented.DeindexBackfill")
+	defer span.End()
+	return is.s.DeindexBackfill(ctx, id)
+}
+
+// GetIndexedBackfills returns the ids of all backfills currently indexed.
+func (is *instrumentedService) GetIndexedBackfills(ctx context.Context) (map[string]int, error) {
+	_, span := trace.StartSpan(ctx, "statestore/instrumented.GetIndexedBackfills")
+	defer span.End()
+	return is.s.GetIndexedBackfills(ctx)
+}
diff --git a/internal/statestore/public.go b/internal/statestore/public.go
index 769031ad..60b9f8f5 100644
--- a/internal/statestore/public.go
+++ b/internal/statestore/public.go
@@ -35,10 +35,12 @@ type Service interface {
 	// CreateTicket creates a new Ticket in the state storage. If the id already exists, it will be overwritten.
 	CreateTicket(ctx context.Context, ticket *pb.Ticket) error
 
-	// GetTicket gets the Ticket with the specified id from state storage. This method fails if the Ticket does not exist.
+	// GetTicket gets the Ticket with the specified id from state storage.
+	// This method fails if the Ticket does not exist.
 	GetTicket(ctx context.Context, id string) (*pb.Ticket, error)
 
-	// DeleteTicket removes the Ticket with the specified id from state storage. This method succeeds if the Ticket does not exist.
+	// DeleteTicket removes the Ticket with the specified id from state storage.
+	// This method succeeds if the Ticket does not exist.
 	DeleteTicket(ctx context.Context, id string) error
 
 	// IndexTicket adds the ticket to the index.
@@ -50,33 +52,39 @@ type Service interface {
 	// GetIndexedIDSet returns the ids of all tickets currently indexed.
 	GetIndexedIDSet(ctx context.Context) (map[string]struct{}, error)
 
-	// GetTickets returns multiple tickets from storage.  Missing tickets are
-	// silently ignored.
+	// GetTickets returns multiple tickets from storage.
+	// Missing tickets are silently ignored.
 	GetTickets(ctx context.Context, ids []string) ([]*pb.Ticket, error)
 
 	// UpdateAssignments update using the request's specified tickets with assignments.
 	UpdateAssignments(ctx context.Context, req *pb.AssignTicketsRequest) (*pb.AssignTicketsResponse, []*pb.Ticket, error)
 
-	// GetAssignments returns the assignment associated with the input ticket id
+	// GetAssignments returns the assignment associated with the input ticket id.
 	GetAssignments(ctx context.Context, id string, callback func(*pb.Assignment) error) error
 
+	// AddTicketsToPendingRelease appends new proposed tickets to the proposed sorted set with current timestamp.
 	AddTicketsToPendingRelease(ctx context.Context, ids []string) error
 
-	// DeleteTicketsFromPendingRelease deletes tickets from the proposed sorted set
+	// DeleteTicketsFromPendingRelease deletes tickets from the proposed sorted set.
 	DeleteTicketsFromPendingRelease(ctx context.Context, ids []string) error
 
-	// ReleaseAllTickets releases all pending tickets back to active
+	// ReleaseAllTickets releases all pending tickets back to active.
 	ReleaseAllTickets(ctx context.Context) error
 
 	// Backfill
 
-	// CreateBackfill creates a new Backfill in the state storage if one doesn't exist. The xids algorithm used to create the ids ensures that they are unique with no system wide synchronization. Calling clients are forbidden from choosing an id during create. So no conflicts will occur.
+	// CreateBackfill creates a new Backfill in the state storage if one doesn't exist.
+	// The xids algorithm used to create the ids ensures that they are unique with no system wide synchronization.
+	// Calling clients are forbidden from choosing an id during create. So no conflicts will occur.
 	CreateBackfill(ctx context.Context, backfill *pb.Backfill, ticketIDs []string) error
 
-	// GetBackfill gets the Backfill with the specified id from state storage. This method fails if the Backfill does not exist. Returns the Backfill and associated ticketIDs if they exist.
+	// GetBackfill gets the Backfill with the specified id from state storage.
+	// This method fails if the Backfill does not exist.
+	// Returns the Backfill and asossiated ticketIDs if they exist.
 	GetBackfill(ctx context.Context, id string) (*pb.Backfill, []string, error)
 
-	// DeleteBackfill removes the Backfill with the specified id from state storage. This method succeeds if the Backfill does not exist.
+	// DeleteBackfill removes the Backfill with the specified id from state storage.
+	// This method succeeds if the Backfill does not exist.
 	DeleteBackfill(ctx context.Context, id string) error
 
 	// UpdateBackfill updates an existing Backfill with a new data. ticketIDs can be nil.
@@ -84,6 +92,16 @@ type Service interface {
 
 	// NewMutex returns an interface of a new distributed mutex with given name
 	NewMutex(key string) RedisLocker
+
+	// IndexBackfill adds the backfill to the index.
+	IndexBackfill(ctx context.Context, backfill *pb.Backfill) error
+
+	// DeindexBackfill removes specified Backfill ID from the index. The Backfill continues to exist.
+	DeindexBackfill(ctx context.Context, id string) error
+
+	// GetIndexedBackfills returns a map containing the IDs and
+	// the Generation number of the backfills currently indexed.
+	GetIndexedBackfills(ctx context.Context) (map[string]int, error)
 }
 
 // New creates a Service based on the configuration.
diff --git a/internal/statestore/redis.go b/internal/statestore/redis.go
index 47261192..46360308 100644
--- a/internal/statestore/redis.go
+++ b/internal/statestore/redis.go
@@ -20,14 +20,13 @@ import (
 	"io/ioutil"
 	"time"
 
+	rs "github.com/go-redsync/redsync/v4"
+	rsredigo "github.com/go-redsync/redsync/v4/redis/redigo"
+	"github.com/gomodule/redigo/redis"
 	"github.com/sirupsen/logrus"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
 	"open-match.dev/open-match/internal/config"
-
-	rs "github.com/go-redsync/redsync/v4"
-	rsredigo "github.com/go-redsync/redsync/v4/redis/redigo"
-	"github.com/gomodule/redigo/redis"
 )
 
 var (
diff --git a/internal/statestore/ticket_test.go b/internal/statestore/ticket_test.go
index c31f926e..638e3f2f 100644
--- a/internal/statestore/ticket_test.go
+++ b/internal/statestore/ticket_test.go
@@ -590,7 +590,7 @@ func TestIndexTicket(t *testing.T) {
 
 	c, err := redis.Dial("tcp", fmt.Sprintf("%s:%s", cfg.GetString("redis.hostname"), cfg.GetString("redis.port")))
 	require.NoError(t, err)
-	idsIndexed, err := redis.Strings(c.Do("SMEMBERS", "allTickets"))
+	idsIndexed, err := redis.Strings(c.Do("SMEMBERS", allTickets))
 	require.NoError(t, err)
 	require.Len(t, idsIndexed, 2)
 	require.Equal(t, "mockTicketID-0", idsIndexed[0])