diff --git a/bindings/bindingtester/tests/api.py b/bindings/bindingtester/tests/api.py index 31ebe473a7..12599b1074 100644 --- a/bindings/bindingtester/tests/api.py +++ b/bindings/bindingtester/tests/api.py @@ -165,7 +165,7 @@ class ApiTest(Test): write_conflicts = ['WRITE_CONFLICT_RANGE', 'WRITE_CONFLICT_KEY', 'DISABLE_WRITE_CONFLICT'] txn_sizes = ['GET_APPROXIMATE_SIZE'] storage_metrics = ['GET_ESTIMATED_RANGE_SIZE', 'GET_RANGE_SPLIT_POINTS'] - tenants = ['TENANT_CREATE', 'TENANT_DELETE', 'TENANT_SET_ACTIVE', 'TENANT_CLEAR_ACTIVE'] + tenants = ['TENANT_CREATE', 'TENANT_DELETE', 'TENANT_SET_ACTIVE', 'TENANT_CLEAR_ACTIVE', 'TENANT_LIST_NAMES'] op_choices += reads op_choices += mutations @@ -600,8 +600,8 @@ class ApiTest(Test): instructions.append(op) elif op == 'TENANT_CLEAR_ACTIVE': instructions.append(op) - elif op == 'TENANT_LIST': - instructions.push_args(b'', b'\xff', 10) + elif op == 'TENANT_LIST_NAMES': + instructions.push_args(b'', b'\xff', 10000) instructions.append(op) self.add_strings(1) else: diff --git a/bindings/java/src/test/com/apple/foundationdb/test/AsyncStackTester.java b/bindings/java/src/test/com/apple/foundationdb/test/AsyncStackTester.java index a66813524a..823697b4ff 100644 --- a/bindings/java/src/test/com/apple/foundationdb/test/AsyncStackTester.java +++ b/bindings/java/src/test/com/apple/foundationdb/test/AsyncStackTester.java @@ -33,6 +33,8 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.function.Function; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import com.apple.foundationdb.Database; import com.apple.foundationdb.FDB; @@ -48,6 +50,7 @@ import com.apple.foundationdb.Transaction; import com.apple.foundationdb.async.AsyncUtil; import com.apple.foundationdb.tuple.ByteArrayUtil; import com.apple.foundationdb.tuple.Tuple; +import com.apple.foundationdb.async.CloseableAsyncIterator; public class AsyncStackTester { static final String DIRECTORY_PREFIX = "DIRECTORY_"; @@ -483,12 +486,27 @@ public class AsyncStackTester { inst.push(TenantManagement.deleteTenant(inst.context.db, tenantName)); }, FDB.DEFAULT_EXECUTOR); } - else if (op == StackOperation.TENANT_LIST) { + else if (op == StackOperation.TENANT_LIST_NAMES) { return inst.popParams(3).thenAcceptAsync(params -> { byte[] begin = (byte[])params.get(0); byte[] end = (byte[])params.get(1); int limit = StackUtils.getInt(params.get(2)); - inst.push(TenantManagement.listTenants(inst.context.db, begin, end, limit)); + CloseableAsyncIterator tenantIter = TenantManagement.listTenants(inst.context.db, begin, end, limit); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try { + while (tenantIter.hasNext()) { + try { + KeyValue next = tenantIter.next(); + outputStream.write(next.getKey()); + } catch (IOException e) { + continue; + } + } + } finally { + tenantIter.close(); + } + byte[] output = outputStream.toByteArray(); + inst.push(output); }, FDB.DEFAULT_EXECUTOR); } else if (op == StackOperation.TENANT_SET_ACTIVE) { diff --git a/bindings/java/src/test/com/apple/foundationdb/test/StackOperation.java b/bindings/java/src/test/com/apple/foundationdb/test/StackOperation.java index e67d4cff81..f3d667db7c 100644 --- a/bindings/java/src/test/com/apple/foundationdb/test/StackOperation.java +++ b/bindings/java/src/test/com/apple/foundationdb/test/StackOperation.java @@ -76,7 +76,7 @@ enum StackOperation { // Tenants TENANT_CREATE, TENANT_DELETE, - TENANT_LIST, + TENANT_LIST_NAMES, TENANT_SET_ACTIVE, TENANT_CLEAR_ACTIVE, diff --git a/bindings/java/src/test/com/apple/foundationdb/test/StackTester.java b/bindings/java/src/test/com/apple/foundationdb/test/StackTester.java index 002af5e97a..4be1c9257b 100644 --- a/bindings/java/src/test/com/apple/foundationdb/test/StackTester.java +++ b/bindings/java/src/test/com/apple/foundationdb/test/StackTester.java @@ -20,6 +20,8 @@ package com.apple.foundationdb.test; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.math.BigInteger; import java.nio.ByteBuffer; import java.nio.ByteOrder; @@ -429,12 +431,27 @@ public class StackTester { byte[] tenantName = (byte[])inst.popParam().join(); inst.push(TenantManagement.deleteTenant(inst.context.db, tenantName)); } - else if (op == StackOperation.TENANT_LIST) { + else if (op == StackOperation.TENANT_LIST_NAMES) { List params = inst.popParams(3).join(); byte[] begin = (byte[])params.get(0); byte[] end = (byte[])params.get(1); int limit = StackUtils.getInt(params.get(2)); - inst.push(TenantManagement.listTenants(inst.context.db, begin, end, limit)); + CloseableAsyncIterator tenantIter = TenantManagement.listTenants(inst.context.db, begin, end, limit); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + try { + while (tenantIter.hasNext()) { + try { + KeyValue next = tenantIter.next(); + outputStream.write(next.getKey()); + } catch (IOException e) { + continue; + } + } + } finally { + tenantIter.close(); + } + byte[] output = outputStream.toByteArray(); + inst.push(output); } else if (op == StackOperation.TENANT_SET_ACTIVE) { byte[] tenantName = (byte[])inst.popParam().join(); diff --git a/bindings/python/fdb/tenant_management.py b/bindings/python/fdb/tenant_management.py index c8b061611f..6e571f45a5 100644 --- a/bindings/python/fdb/tenant_management.py +++ b/bindings/python/fdb/tenant_management.py @@ -92,11 +92,9 @@ class FDBTenantList(object): return list(self.__iter__()) def __iter__(self): - while True: - result = self._iter.__next__() - - tenant_name = _impl.remove_prefix(result.key, _tenant_map_prefix) - yield _impl.KeyValue(tenant_name, result.value) + for next_item in self._iter: + tenant_name = _impl.remove_prefix(next_item.key, _tenant_map_prefix) + yield _impl.KeyValue(tenant_name, next_item.value) # Lists the tenants created in the cluster, specified by the begin and end range. # Also limited in number of results by the limit parameter. diff --git a/bindings/python/tests/tester.py b/bindings/python/tests/tester.py index f392772a31..81a731b08d 100644 --- a/bindings/python/tests/tester.py +++ b/bindings/python/tests/tester.py @@ -604,12 +604,14 @@ class Tester: self.tenant = self.db.open_tenant(name) elif inst.op == six.u("TENANT_CLEAR_ACTIVE"): self.tenant = None - elif inst.op == six.u("TENANT_LIST"): - begin = inst.pop() - end = inst.pop() - limit = inst.pop() + elif inst.op == six.u("TENANT_LIST_NAMES"): + begin, end, limit = inst.pop(3) tenant_list = fdb.tenant_management.list_tenants(self.db, begin, end, limit) - inst.push(tenant_list) + result = bytearray() + for tenant in tenant_list: + result += tenant.key + result_bytes = bytes(result) + inst.push(result_bytes) elif inst.op == six.u("UNIT_TESTS"): try: test_db_options(db)