@@ -43,20 +43,21 @@ var (
43
43
44
44
// Capabilities indicates the capabilities and features provided by the server.
45
45
type Capabilities struct {
46
- MaximumMessageExpiryInterval int64
47
- MaximumClientWritesPending int32
48
- MaximumSessionExpiryInterval uint32
49
- MaximumPacketSize uint32
46
+ MaximumMessageExpiryInterval int64 // maximum message expiry if message expiry is 0 or over
47
+ MaximumClientWritesPending int32 // maximum number of pending message writes for a client
48
+ MaximumSessionExpiryInterval uint32 // maximum number of seconds to keep disconnected sessions
49
+ MaximumPacketSize uint32 // maximum packet size, no limit if 0
50
50
maximumPacketID uint32 // unexported, used for testing only
51
- ReceiveMaximum uint16
52
- TopicAliasMaximum uint16
53
- SharedSubAvailable byte
54
- MinimumProtocolVersion byte
51
+ ReceiveMaximum uint16 // maximum number of concurrent qos messages per client
52
+ MaximumInflight uint16 // maximum number of qos > 0 messages can be stored, 0(=8192)-65535
53
+ TopicAliasMaximum uint16 // maximum topic alias value
54
+ SharedSubAvailable byte // support of shared subscriptions
55
+ MinimumProtocolVersion byte // minimum supported mqtt version
55
56
Compatibilities Compatibilities
56
- MaximumQos byte
57
- RetainAvailable byte
58
- WildcardSubAvailable byte
59
- SubIDAvailable byte
57
+ MaximumQos byte // maximum qos value available to clients
58
+ RetainAvailable byte // support of retain messages
59
+ WildcardSubAvailable byte // support of wildcard subscriptions
60
+ SubIDAvailable byte // support of subscription identifiers
60
61
}
61
62
62
63
// NewDefaultServerCapabilities defines the default features and capabilities provided by the server.
@@ -68,6 +69,7 @@ func NewDefaultServerCapabilities() *Capabilities {
68
69
MaximumPacketSize : 0 , // no maximum packet size
69
70
maximumPacketID : math .MaxUint16 ,
70
71
ReceiveMaximum : 1024 , // maximum number of concurrent qos messages per client
72
+ MaximumInflight : 1024 * 8 , // maximum number of qos > 0 messages can be stored
71
73
TopicAliasMaximum : math .MaxUint16 , // maximum topic alias value
72
74
SharedSubAvailable : 1 , // shared subscriptions are available
73
75
MinimumProtocolVersion : 3 , // minimum supported mqtt version (3.0.0)
@@ -201,6 +203,10 @@ func (o *Options) ensureDefaults() {
201
203
202
204
o .Capabilities .maximumPacketID = math .MaxUint16 // spec maximum is 65535
203
205
206
+ if o .Capabilities .MaximumInflight == 0 {
207
+ o .Capabilities .MaximumInflight = 1024 * 8
208
+ }
209
+
204
210
if o .SysTopicResendInterval == 0 {
205
211
o .SysTopicResendInterval = defaultSysTopicInterval
206
212
}
@@ -975,9 +981,17 @@ func (s *Server) publishToClient(cl *Client, sub packets.Subscription, pk packet
975
981
}
976
982
977
983
if out .FixedHeader .Qos > 0 {
984
+ if cl .State .Inflight .Len () >= int (s .Options .Capabilities .MaximumInflight ) {
985
+ // add hook?
986
+ atomic .AddInt64 (& s .Info .InflightDropped , 1 )
987
+ s .Log .Warn ("client store quota reached" , "client" , cl .ID , "listener" , cl .Net .Listener )
988
+ return out , packets .ErrQuotaExceeded
989
+ }
990
+
978
991
i , err := cl .NextPacketID () // [MQTT-4.3.2-1] [MQTT-4.3.3-1]
979
992
if err != nil {
980
993
s .hooks .OnPacketIDExhausted (cl , pk )
994
+ atomic .AddInt64 (& s .Info .InflightDropped , 1 )
981
995
s .Log .Warn ("packet ids exhausted" , "error" , err , "client" , cl .ID , "listener" , cl .Net .Listener )
982
996
return out , packets .ErrQuotaExceeded
983
997
}
@@ -1008,8 +1022,10 @@ func (s *Server) publishToClient(cl *Client, sub packets.Subscription, pk packet
1008
1022
default :
1009
1023
atomic .AddInt64 (& s .Info .MessagesDropped , 1 )
1010
1024
cl .ops .hooks .OnPublishDropped (cl , pk )
1011
- cl .State .Inflight .Delete (out .PacketID ) // packet was dropped due to irregular circumstances, so rollback inflight.
1012
- cl .State .Inflight .IncreaseSendQuota ()
1025
+ if out .FixedHeader .Qos > 0 {
1026
+ cl .State .Inflight .Delete (out .PacketID ) // packet was dropped due to irregular circumstances, so rollback inflight.
1027
+ cl .State .Inflight .IncreaseSendQuota ()
1028
+ }
1013
1029
return out , packets .ErrPendingClientWritesExceeded
1014
1030
}
1015
1031
0 commit comments