Benoit Tellier created JAMES-3743:
-------------------------------------
Summary: Mailbox/get failure upon negative quotas
Key: JAMES-3743
URL: https://issues.apache.org/jira/browse/JAMES-3743
Project: James Server
Issue Type: Improvement
Components: JMAP, mailbox
Affects Versions: 3.7.0
Reporter: Benoit Tellier
Assignee: Antoine Duprat
Fix For: 3.8.0
Spotted on one of my production instances:
{code:java}
{
"using": [ ... ],
"methodCalls": [
[
"Mailbox/get",
{
"accountId":
"6cfe53f5858a153a4f70ec455169ccbf9d10d2d47ab75561fc86c75aaf6fcd8a",
"ids": null
},
"0"
]
]
}
{code}
Failed with:
{code:java}
{
"sessionState": "2c9f1b12-b35a-43e6-9af2-0106fb53a943",
"methodResponses": [
[
"error",
{
"type": "invalidArguments",
"description": "Left predicate of (!(-53 < 0) && !(-53 >
9007199254740992)) failed: Predicate (-53 < 0) did not fail."
},
"0"
]
]
}
{code}
The message matches the validation error of UnsignedInt class. It backs some
types of the returned mailbox response: quota but also counters.
Further investigations showed this was due to one user quota being negative:
{code:java}
linagora@cqlsh> select * from linagora_james.currentquota WHERE quotaroot =
'#private&[email protected]';
quotaroot | messagecount | storage
-------------------------------+--------------+----------
#private&[email protected] | -46 | 54491982
{code}
An attempt to recompute quota failed:
{code:java}
curl -XPOST http://127.0.0.1:8000/quota/users?task=RecomputeCurrentQuotas
{
"additionalInformation": {
"type": "recompute-current-quotas",
"processedQuotaRoots": 219,
"failedQuotaRoots": [
"#private&[email protected]@linagora.com"
],
"runningOptions": {
"usersPerSecond": 1
},
"timestamp": "2022-04-06T05:13:12.462107Z"
},
"status": "failed",
"submittedFrom": "128593e93459",
"executedOn": "128593e93459",
"cancelledFrom": null,
"submitDate": "2022-04-06T05:06:26.916+0000",
"taskId": "5199b2b5-570f-4d78-ab14-b0fc0b60cf42",
"startedDate": "2022-04-06T05:06:27.024+0000",
"failedDate": "2022-04-06T05:13:12.513+0000",
"type": "recompute-current-quotas"
}
{code}
We thus had to fix the value to a non negative value before re-running the task.
h3. Additional notes
Quota correctness is out of scope for this issue. Cassandra counters are likely
poorly suited for the job. Counters are anyway non idempotant entities, which
causes correctness issues in the face of retries.
h3. Expected behaviour
-> Recompute quota should not fail on existing negative value.
-> Also, the mailbox layer likely should sanitize the values before handing it
to upper applicatives layers.
h3. Definition of done
-> Unit test for negative quota recomputation
-> Unit test for quota sanitation
--
This message was sent by Atlassian Jira
(v8.20.1#820001)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]