diff --git a/rocksdb b/rocksdb
--- a/rocksdb
+++ b/rocksdb
@@ -1 +1 @@
-Subproject commit 6b3b684f69a5b6ad968f2270e54e92de1a42d468
+Subproject commit 6b3b684f69a5b6ad968f2270e54e92de1a42d468-dirty
diff --git a/sql/sql_stats.cc b/sql/sql_stats.cc
index 9f746903e11..42f53db596a 100644
--- a/sql/sql_stats.cc
+++ b/sql/sql_stats.cc
@@ -295,6 +295,7 @@ static std::string sql_cmd_type(enum_sql_command sql_command)
     case SQLCOM_END:
       return "OTHER";
   }
+      return "OTHER";
 }
 
 /*
diff --git a/storage/rocksdb/CMakeLists.txt b/storage/rocksdb/CMakeLists.txt
index 17d0db98d53..fcf60589540 100644
--- a/storage/rocksdb/CMakeLists.txt
+++ b/storage/rocksdb/CMakeLists.txt
@@ -27,6 +27,10 @@ INCLUDE_DIRECTORIES(
   ${CMAKE_SOURCE_DIR}/rocksdb/utilities/transactions/range_locking/portability
 )
 
+INCLUDE_DIRECTORIES(
+  /home/ubuntu/userspace-rcu-dist/include
+)
+
 # This is a strong requirement coming from RocksDB. No conditional checks here.
 ADD_DEFINITIONS(-DROCKSDB_PLATFORM_POSIX -DROCKSDB_LIB_IO_POSIX)
 
@@ -94,6 +98,14 @@ ENDIF()
 
 SET(rocksdb_static_libs )
 
+FIND_LIBRARY(
+  URCU_LIBRARY
+  NAMES liburcu${PIC_EXT}.a urcu
+  HINTS /home/ubuntu/userspace-rcu-dist/lib
+  )
+
+SET(rocksdb_static_libs ${rocksdb_static_libs} ${URCU_LIBRARY})
+
 IF (WITH_JEMALLOC)
   FIND_LIBRARY(JEMALLOC_LIBRARY
     NAMES libjemalloc${PIC_EXT}.a jemalloc
diff --git a/storage/rocksdb/ha_rocksdb.cc b/storage/rocksdb/ha_rocksdb.cc
index c2fbaa25293..bc63741d7a5 100644
--- a/storage/rocksdb/ha_rocksdb.cc
+++ b/storage/rocksdb/ha_rocksdb.cc
@@ -85,6 +85,7 @@
 
 #include "./rdb_locking_iter.h"
 
+#include <urcu.h>
 
 // Internal MySQL APIs not exposed in any header.
 extern "C" {
@@ -3736,11 +3737,12 @@ class Rdb_transaction_impl : public Rdb_transaction {
       : Rdb_transaction(thd), m_rocksdb_tx(nullptr) {
     // Create a notifier that can be called when a snapshot gets generated.
     m_notifier = std::make_shared<Rdb_snapshot_notifier>(this);
+    rcu_register_thread(); //psergey2: register in URCU
   }
 
   virtual ~Rdb_transaction_impl() override {
     rollback();
-
+    rcu_unregister_thread(); //psergey2
     // Theoretically the notifier could outlive the Rdb_transaction_impl
     // (because of the shared_ptr), so let it know it can't reference
     // the transaction anymore.
@@ -4041,6 +4043,7 @@ static Rdb_transaction *get_or_create_tx(THD *const thd) {
 
 static int rocksdb_close_connection(handlerton *const hton, THD *const thd) {
   Rdb_transaction *&tx = get_tx_from_thd(thd);
+  // psergey-todo: URCU close
   if (tx != nullptr) {
     bool is_critical_error;
     int rc = tx->finish_bulk_load(&is_critical_error, false);
@@ -5324,6 +5327,8 @@ static int rocksdb_init_func(void *const p) {
     }
   }
 
+  rcu_init(); //psergey2
+
   // Validate the assumption about the size of ROCKSDB_SIZEOF_HIDDEN_PK_COLUMN.
   static_assert(sizeof(longlong) == 8, "Assuming that longlong is 8 bytes.");
 
diff --git a/storage/rocksdb/rdb_perf_context.cc b/storage/rocksdb/rdb_perf_context.cc
index 600f8b7cac5..17dc01a41ae 100644
--- a/storage/rocksdb/rdb_perf_context.cc
+++ b/storage/rocksdb/rdb_perf_context.cc
@@ -93,7 +93,14 @@ std::string rdb_pc_stat_types[] = {
     "IO_WRITE_NANOS",
     "IO_READ_NANOS",
     "IO_RANGE_SYNC_NANOS",
-    "IO_LOGGER_NANOS"};
+    "IO_LOGGER_NANOS",
+    
+    "RANGELOCK_REMOVE",
+    "RANGELOCK_REMOVE_RCU",
+    "RANGELOCK_ACQUIRE",
+    "RANGELOCK_ACQUIRE_RCU"
+    };
+
 
 #define IO_PERF_RECORD(_field_)                                       \
   do {                                                                \
@@ -110,6 +117,14 @@ std::string rdb_pc_stat_types[] = {
     idx++;                                                               \
   } while (0)
 
+#define IO_PERF_COPY(_field_)                                       \
+  do {                                                                \
+    if (rocksdb::get_perf_context()->_field_ > 0) {                   \
+      counters->m_value[idx] = rocksdb::get_perf_context()->_field_; \
+    }                                                                 \
+    idx++;                                                            \
+  } while (0)
+
 static void harvest_diffs(Rdb_atomic_perf_counters *const counters) {
   // (C) These should be in the same order as the PC enum
   size_t idx = 0;
@@ -171,6 +186,11 @@ static void harvest_diffs(Rdb_atomic_perf_counters *const counters) {
   IO_STAT_RECORD(read_nanos);
   IO_STAT_RECORD(range_sync_nanos);
   IO_STAT_RECORD(logger_nanos);
+
+  IO_PERF_COPY(rangelock_remove);
+  IO_PERF_COPY(rangelock_remove_rcu);
+  IO_PERF_COPY(rangelock_acquire);
+  IO_PERF_COPY(rangelock_acquire_rcu);
 }
 
 #undef IO_PERF_DIFF
diff --git a/storage/rocksdb/rdb_perf_context.h b/storage/rocksdb/rdb_perf_context.h
index 37d7d8942df..87803c5a3d9 100644
--- a/storage/rocksdb/rdb_perf_context.h
+++ b/storage/rocksdb/rdb_perf_context.h
@@ -85,6 +85,12 @@ enum {
   PC_IO_READ_NANOS,
   PC_IO_RANGE_SYNC_NANOS,
   PC_IO_LOGGER_NANOS,
+
+  PC_RANGELOCK_REMOVE,
+  PC_RANGELOCK_REMOVE_RCU,
+  PC_RANGELOCK_ACQUIRE,
+  PC_RANGELOCK_ACQUIRE_RCU,
+
   PC_MAX_IDX
 };
 
