You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by ma...@apache.org on 2021/09/20 12:37:08 UTC

[cassandra] branch cassandra-4.0 updated: Avoid trying to acquire 0 permits from the rate limiter when taking snapshot

This is an automated email from the ASF dual-hosted git repository.

marcuse pushed a commit to branch cassandra-4.0
in repository https://gitbox.apache.org/repos/asf/cassandra.git


The following commit(s) were added to refs/heads/cassandra-4.0 by this push:
     new b9d8700  Avoid trying to acquire 0 permits from the rate limiter when taking snapshot
b9d8700 is described below

commit b9d8700355bf0ecabe1ca7e3f139d0ad52c4bdc4
Author: Marcus Eriksson <ma...@apache.org>
AuthorDate: Fri Aug 20 13:54:36 2021 +0200

    Avoid trying to acquire 0 permits from the rate limiter when taking snapshot
    
    Patch by marcuse; reviewed by Alex Petrov for CASSANDRA-16872
---
 CHANGES.txt                                        |  1 +
 .../org/apache/cassandra/db/ColumnFamilyStore.java |  3 +-
 .../cassandra/io/sstable/format/SSTableReader.java | 14 ++++++-
 .../unit/org/apache/cassandra/db/SnapshotTest.java | 46 ++++++++++++++++++++++
 4 files changed, 61 insertions(+), 3 deletions(-)

diff --git a/CHANGES.txt b/CHANGES.txt
index 109cff7..c72dd0e 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 4.0.2
+ * Avoid trying to acquire 0 permits from the rate limiter when taking snapshot (CASSANDRA-16872)
  * Upgrade Caffeine to 2.5.6 (CASSANDRA-15153)
  * Include SASI components to snapshots (CASSANDRA-15134)
  * Fix missed wait latencies in the output of `nodetool tpstats -F` (CASSANDRA-16938)
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index 113a916..4855d7c 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -1846,8 +1846,7 @@ public class ColumnFamilyStore implements ColumnFamilyStoreMBean
                 for (SSTableReader ssTable : currentView.sstables)
                 {
                     File snapshotDirectory = Directories.getSnapshotDirectory(ssTable.descriptor, snapshotName);
-                    rateLimiter.acquire(SSTableReader.componentsFor(ssTable.descriptor).size());
-                    ssTable.createLinks(snapshotDirectory.getPath()); // hard links
+                    ssTable.createLinks(snapshotDirectory.getPath(), rateLimiter); // hard links
                     filesJSONArr.add(ssTable.descriptor.relativeFilenameFor(Component.DATA));
 
                     if (logger.isTraceEnabled())
diff --git a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java
index ea40f34..45297ef 100644
--- a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java
+++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java
@@ -1598,16 +1598,28 @@ public abstract class SSTableReader extends SSTable implements SelfRefCounted<SS
 
     public void createLinks(String snapshotDirectoryPath)
     {
-        createLinks(descriptor, components, snapshotDirectoryPath);
+        createLinks(snapshotDirectoryPath, null);
+    }
+
+    public void createLinks(String snapshotDirectoryPath, RateLimiter rateLimiter)
+    {
+        createLinks(descriptor, components, snapshotDirectoryPath, rateLimiter);
     }
 
     public static void createLinks(Descriptor descriptor, Set<Component> components, String snapshotDirectoryPath)
     {
+        createLinks(descriptor, components, snapshotDirectoryPath, null);
+    }
+
+    public static void createLinks(Descriptor descriptor, Set<Component> components, String snapshotDirectoryPath, RateLimiter limiter)
+    {
         for (Component component : components)
         {
             File sourceFile = new File(descriptor.filenameFor(component));
             if (!sourceFile.exists())
                 continue;
+            if (null != limiter)
+                limiter.acquire();
             File targetLink = new File(snapshotDirectoryPath, sourceFile.getName());
             FileUtils.createHardLink(sourceFile, targetLink);
         }
diff --git a/test/unit/org/apache/cassandra/db/SnapshotTest.java b/test/unit/org/apache/cassandra/db/SnapshotTest.java
new file mode 100644
index 0000000..a406048
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/SnapshotTest.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.StandardOpenOption;
+
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.io.sstable.Component;
+import org.apache.cassandra.io.sstable.format.SSTableReader;
+
+public class SnapshotTest extends CQLTester
+{
+    @Test
+    public void testEmptyTOC() throws Throwable
+    {
+        createTable("create table %s (id int primary key, k int)");
+        execute("insert into %s (id, k) values (1,1)");
+        getCurrentColumnFamilyStore().forceBlockingFlush();
+        for (SSTableReader sstable : getCurrentColumnFamilyStore().getLiveSSTables())
+        {
+            File toc = new File(sstable.descriptor.filenameFor(Component.TOC));
+            Files.write(toc.toPath(), new byte[0], StandardOpenOption.TRUNCATE_EXISTING);
+        }
+        getCurrentColumnFamilyStore().snapshot("hello");
+    }
+}

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org