private static List<QuotaSettings> fromQuotas(final String userName, final TableName tableName, final String namespace, final String regionServer, final Quotas quotas) { List<QuotaSettings> settings = new ArrayList<>(); if (quotas.hasThrottle()) { settings .addAll(fromThrottle(userName, tableName, namespace, regionServer, quotas.getThrottle())); } if (quotas.getBypassGlobals() == true) { settings .add(new QuotaGlobalsSettingsBypass(userName, tableName, namespace, regionServer, true)); } if (quotas.hasSpace()) { settings.add(fromSpace(tableName, namespace, quotas.getSpace())); } return settings; }
@Override public void visitTableQuotas(TableName tableName, Quotas quotas) { quotaSettings.addAll(QuotaSettingsFactory.fromTableQuotas(tableName, quotas)); }
@Override public void visitNamespaceQuotas(String namespace, Quotas quotas) { quotaSettings.addAll(QuotaSettingsFactory.fromNamespaceQuotas(namespace, quotas)); }
/** * Remove the throttling for the specified user on the specified table. * * @param userName the user * @param tableName the table * @return the quota settings */ public static QuotaSettings unthrottleUser(final String userName, final TableName tableName) { return throttle(userName, tableName, null, null, null, 0, null); }
static List<QuotaSettings> fromUserQuotas(final String userName, final TableName tableName, final Quotas quotas) { return fromQuotas(userName, tableName, null, null, quotas); }
@Test public void testQuotaMerging() throws IOException { TableName tn = TableName.valueOf("foo"); QuotaSettings originalSettings = QuotaSettingsFactory.limitTableSpace( tn, 1024L * 1024L, SpaceViolationPolicy.DISABLE); QuotaSettings largerSizeLimit = QuotaSettingsFactory.limitTableSpace( tn, 5L * 1024L * 1024L, SpaceViolationPolicy.DISABLE); QuotaSettings differentPolicy = QuotaSettingsFactory.limitTableSpace( tn, 1024L * 1024L, SpaceViolationPolicy.NO_WRITES); QuotaSettings incompatibleSettings = QuotaSettingsFactory.limitNamespaceSpace( "ns1", 5L * 1024L * 1024L, SpaceViolationPolicy.NO_WRITES); assertEquals(originalSettings.merge(largerSizeLimit), largerSizeLimit); assertEquals(originalSettings.merge(differentPolicy), differentPolicy); try { originalSettings.merge(incompatibleSettings); fail("Should not be able to merge a Table space quota with a namespace space quota."); } catch (IllegalArgumentException e) { //pass } } }
@Test(expected = IllegalArgumentException.class) public void testBothTableAndNamespace() { final SpaceQuota spaceQuota = SpaceQuota.newBuilder() .setSoftLimit(1L) .setViolationPolicy(QuotaProtos.SpaceViolationPolicy.DISABLE) .build(); QuotaSettingsFactory.fromSpace(TableName.valueOf("foo"), "bar", spaceQuota); }
@Override public void visitUserQuotas(String userName, String namespace, Quotas quotas) { quotaSettings.addAll(QuotaSettingsFactory.fromUserQuotas(userName, namespace, quotas)); }
QuotaSettingsFactory.limitTableSpace(tn, 1024L, SpaceViolationPolicy.NO_INSERTS); admin.setQuota(settings); settings = QuotaSettingsFactory.throttleTable(tn, ThrottleType.REQUEST_SIZE, 2L, TimeUnit.HOURS); admin.setQuota(settings); settings = QuotaSettingsFactory.removeTableSpaceLimit(tn); admin.setQuota(settings); assertEquals(0, getNumSpaceQuotas()); settings = QuotaSettingsFactory.limitTableSpace(tn, 1024L, SpaceViolationPolicy.NO_INSERTS); admin.setQuota(settings); assertEquals(1, getNumSpaceQuotas()); settings = QuotaSettingsFactory.unthrottleTable(tn); admin.setQuota(settings); assertEquals(1, getNumSpaceQuotas()); QuotaSettingsFactory.throttleTable(tn, ThrottleType.REQUEST_SIZE, 2L, TimeUnit.HOURS); admin.setQuota(settings); assertEquals(1, getNumSpaceQuotas());
final long sizeLimit = 1024L * 1024L * 1024L * 1024L * 5L; // 5TB final SpaceViolationPolicy violationPolicy = SpaceViolationPolicy.NO_WRITES; QuotaSettings settings = QuotaSettingsFactory.limitTableSpace(tn, sizeLimit, violationPolicy); admin.setQuota(settings); QuotaSettings removeQuota = QuotaSettingsFactory.removeTableSpaceLimit(tn); admin.setQuota(removeQuota);
QuotaSettingsFactory.limitNamespaceSpace(ns, 1024L, SpaceViolationPolicy.NO_INSERTS); admin.setQuota(settings); QuotaSettingsFactory.throttleNamespace(ns, ThrottleType.REQUEST_SIZE, 2L, TimeUnit.HOURS); admin.setQuota(settings); settings = QuotaSettingsFactory.removeNamespaceSpaceLimit(ns); admin.setQuota(settings); assertEquals(0, getNumSpaceQuotas()); settings = QuotaSettingsFactory.limitNamespaceSpace(ns, 1024L, SpaceViolationPolicy.NO_INSERTS); admin.setQuota(settings); assertEquals(1, getNumSpaceQuotas()); settings = QuotaSettingsFactory.unthrottleNamespace(ns); admin.setQuota(settings); assertEquals(1, getNumSpaceQuotas()); QuotaSettingsFactory.throttleNamespace(ns, ThrottleType.REQUEST_SIZE, 2L, TimeUnit.HOURS); admin.setQuota(settings); assertEquals(1, getNumSpaceQuotas());
@Test public void testSpaceLimitSettingsForDeletes() { final String ns = "ns1"; final TableName tn = TableName.valueOf("tn1"); QuotaSettings nsSettings = QuotaSettingsFactory.removeNamespaceSpaceLimit(ns); assertNotNull("QuotaSettings should not be null", nsSettings); assertTrue("Should be an instance of SpaceLimitSettings", nsSettings instanceof SpaceLimitSettings); SpaceLimitRequest nsProto = ((SpaceLimitSettings) nsSettings).getProto(); assertTrue("Request should have a SpaceQuota", nsProto.hasQuota()); assertTrue("The remove attribute should be true", nsProto.getQuota().getRemove()); QuotaSettings tableSettings = QuotaSettingsFactory.removeTableSpaceLimit(tn); assertNotNull("QuotaSettings should not be null", tableSettings); assertTrue("Should be an instance of SpaceLimitSettings", tableSettings instanceof SpaceLimitSettings); SpaceLimitRequest tableProto = ((SpaceLimitSettings) tableSettings).getProto(); assertTrue("Request should have a SpaceQuota", tableProto.hasQuota()); assertTrue("The remove attribute should be true", tableProto.getQuota().getRemove()); } }
private void removeQuotaFromtable(final TableName tn) throws Exception { QuotaSettings removeQuota = QuotaSettingsFactory.removeTableSpaceLimit(tn); TEST_UTIL.getAdmin().setQuota(removeQuota); LOG.debug("Space quota settings removed from the table ", tn); }
@Override public void postDeleteNamespace( ObserverContext<MasterCoprocessorEnvironment> ctx, String namespace) throws IOException { // Do nothing if quotas aren't enabled if (!quotasEnabled) { return; } final Connection conn = ctx.getEnvironment().getConnection(); Quotas quotas = QuotaUtil.getNamespaceQuota(conn, namespace); if (quotas != null) { if (quotas.hasSpace()) { QuotaSettings settings = QuotaSettingsFactory.removeNamespaceSpaceLimit(namespace); try (Admin admin = conn.getAdmin()) { admin.setQuota(settings); } } if (quotas.hasThrottle()) { QuotaSettings settings = QuotaSettingsFactory.unthrottleNamespace(namespace); try (Admin admin = conn.getAdmin()) { admin.setQuota(settings); } } } } }
@Override public void postDeleteTable( ObserverContext<MasterCoprocessorEnvironment> ctx, TableName tableName) throws IOException { // Do nothing if quotas aren't enabled if (!quotasEnabled) { return; } final Connection conn = ctx.getEnvironment().getConnection(); Quotas quotas = QuotaUtil.getTableQuota(conn, tableName); if (quotas != null){ if (quotas.hasSpace()){ QuotaSettings settings = QuotaSettingsFactory.removeTableSpaceLimit(tableName); try (Admin admin = conn.getAdmin()) { admin.setQuota(settings); } } if (quotas.hasThrottle()){ QuotaSettings settings = QuotaSettingsFactory.unthrottleTable(tableName); try (Admin admin = conn.getAdmin()) { admin.setQuota(settings); } } } }
admin.setQuota(QuotaSettingsFactory.throttleNamespace(tn3.getNamespaceAsString(), ThrottleType.WRITE_NUMBER, 100, TimeUnit.SECONDS)); QuotaSettingsFactory.throttleUser("user", ThrottleType.WRITE_NUMBER, 100, TimeUnit.MINUTES)); admin.setQuota(QuotaSettingsFactory.limitNamespaceSpace( ns.getName(), SpaceQuotaHelperForTests.ONE_GIGABYTE, SpaceViolationPolicy.NO_INSERTS));
LOG.info("Writing data"); QuotaSettings settings = QuotaSettingsFactory.limitNamespaceSpace( ns, SpaceQuotaHelperForTests.ONE_GIGABYTE, SpaceViolationPolicy.NO_INSERTS); admin.setQuota(settings);
private static List<QuotaSettings> fromQuotas(final String userName, final TableName tableName, final String namespace, final Quotas quotas) { List<QuotaSettings> settings = new ArrayList<QuotaSettings>(); if (quotas.hasThrottle()) { settings.addAll(fromThrottle(userName, tableName, namespace, quotas.getThrottle())); } if (quotas.getBypassGlobals() == true) { settings.add(new QuotaGlobalsSettingsBypass(userName, tableName, namespace, true)); } return settings; }
@Test public void testNamespaceSpaceAndRPCQuotaRemoved() throws Exception { final Connection conn = TEST_UTIL.getConnection(); final Admin admin = conn.getAdmin(); final TableName tn = TableName.valueOf(testName.getMethodName()); final String ns = testName.getMethodName(); // Drop the ns if it somehow exists if (namespaceExists(ns)) { admin.deleteNamespace(ns); } // Create the ns NamespaceDescriptor desc = NamespaceDescriptor.create(ns).build(); admin.createNamespace(desc); assertEquals(0, getNumSpaceQuotas()); assertEquals(0, getThrottleQuotas()); // Set Both quotas QuotaSettings settings = QuotaSettingsFactory.limitNamespaceSpace(ns, 1024L, SpaceViolationPolicy.NO_INSERTS); admin.setQuota(settings); settings = QuotaSettingsFactory.throttleNamespace(ns, ThrottleType.REQUEST_SIZE, 2L, TimeUnit.HOURS); admin.setQuota(settings); assertEquals(1, getNumSpaceQuotas()); assertEquals(1, getThrottleQuotas()); // Delete the namespace and observe the quotas being automatically deleted as well admin.deleteNamespace(ns); assertEquals(0, getNumSpaceQuotas()); assertEquals(0, getThrottleQuotas()); }
/** * Remove the throttling for the specified user on the specified namespace. * * @param userName the user * @param namespace the namespace * @return the quota settings */ public static QuotaSettings unthrottleUser(final String userName, final String namespace) { return throttle(userName, null, namespace, null, null, 0, null); }