You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by "Benoit Tellier (Jira)" <se...@james.apache.org> on 2022/04/06 06:48:00 UTC

[jira] [Created] (JAMES-3743) Mailbox/get failure upon negative quotas

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&xxx@linagora.com';

 quotaroot                     | messagecount | storage
-------------------------------+--------------+----------
 #private&xxx@linagora.com |          -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&xxx@linagora.com@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: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org