Skip to content

Commit

Permalink
[pulsar-managed-ledger-admin] Fix deleting multiple ledgers (apache#9009
Browse files Browse the repository at this point in the history
)

### Motivation

There are 2 main problems in pulsar-managed-ledger-admin when deleting multiple ledgers

- Removing a ledger while iterating through the ledger list will lead to skipping the next ledger in the list
- Only the first attempt to change the zookeeper's data will succeed, the second will fail due to version error

Logs for the second problem:
```
Traceback (most recent call last):
  File "/Users/milos/Downloads/pulsar/bin/pulsar-managed-ledger-admin", line 109, in deleteLedgerIdsFromManagedLedgerInfo
    zk.set(mlPath, updatedMlInfo, version=mlStat.version)
  File "/usr/local/lib/python3.9/site-packages/kazoo/client.py", line 1359, in set
    return self.set_async(path, value, version).get()
  File "/usr/local/lib/python3.9/site-packages/kazoo/handlers/utils.py", line 75, in get
    raise self._exception
kazoo.exceptions.BadVersionError
Failed to delete ledgerIds for /managed-ledgers/public/default/persistent/events-other due to BadVersionError()
```
### Modifications

Changed iterating through the loop with a while loop and index instead of foreach and handling index increment.
Changed updating zookeeper's data only once when the loop is finished.

### Verifying this change

- [x] Make sure that the change passes the CI checks.
milos-matijasevic authored Dec 24, 2020
1 parent d5029ae commit 7ca2b44
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions bin/pulsar-managed-ledger-admin
Original file line number Diff line number Diff line change
@@ -98,16 +98,21 @@ def deleteLedgerIdsFromManagedLedgerInfo(zk, mlPath, deletLedgerIds):

ledgerInfoList = mlInfo.ledgerInfo

for ledgerInfo in ledgerInfoList:
i = 0
while i < len(ledgerInfoList):
ledgerInfo = ledgerInfoList[i]
if ledgerInfo.ledgerId in deletLedgerIds:
ledgerInfoList.remove(ledgerInfo)
updatedMlInfo = None
if isTextFormat:
updatedMlInfo = MessageToString(mlInfo, True)
else:
updatedMlInfo = mlInfo.SerializeToString();
zk.set(mlPath, updatedMlInfo, version=mlStat.version)
print('Updated {} with value\n{}'.format(mlPath, str(mlInfo)))
else:
i += 1

updatedMlInfo = None
if isTextFormat:
updatedMlInfo = MessageToString(mlInfo, True)
else:
updatedMlInfo = mlInfo.SerializeToString();
zk.set(mlPath, updatedMlInfo, version=mlStat.version)
print('Updated {} with value\n{}'.format(mlPath, str(mlInfo)))

except Exception as e:
traceback.print_exc()

0 comments on commit 7ca2b44

Please sign in to comment.