Archive for category Technical

(Do not) Use Rails cache as a distributed lock system

You should strive to design your application in a way that eliminates the need of critical sections as possible.

It is not robust, it adds layers of complexity and is VERY difficult to test.

You can avoid such burdens by using alternative threading constrains such as actors

Having said that there are still cases in a large distributed environment that you need to use Distributed lock manager in order to wrap a critical section of your flow.

It is preferable to use event based distributed locking – can be achieved with Zookeeper (based on Google’s Chubby)

I will show here a very simple locking mechanism based on Rails cache store.

You can set a shared cache between all your rails processes by setting config/environments/#{env}.rb

In the example I use Dalli (excellent memcached client by Mike Perham) but any store that is shared between the machines will work.

You can scroll to the bottom to see the CacheMutex spec and code

Usage is simple:

As you can see, the main disadvantage here is using a sleep-lock instead of event to notify the waiting thread.

CacheMutex source code:

<Edit>

Due to potential race conditions scenario identified by http://en.gravatar.com/cryo28 I switched to provided lock abilities of Redis-Objects https://github.com/nateware/redis-objects#lock

</Edit>

Advertisements

, , , , , ,

2 Comments

Simple buffer for queuing methods with callbacks in CoffeeScript

Leave a comment

Add ruby 1.9.3 on OSX 10.7

OSX adds gcc 4.2 via LLVM
You need to get a non LLVM GCC – can be done easily from here
After installing the new gcc just write in terminal:

rvm install 1.9.3 --with-gcc=clang

 

>>EDIT

Actually you just need


rvm get
rvm install 1.9.3

 

Leave a comment

Our version of mysql backup using rake

https://gist.github.com/1258918

Leave a comment

Delayed Jobs troubleshooting – when all delayed jobs processes are dead

– ssh to the server that suppose to run the jobs,
1. Check that there is free disk space
2. Go to application root
3. Try running delayed job with

RAILS_ENV=production script/delayed_job start -n 8

4. Get a clue regarding the failure reason from

tail log/delayed_job

— Probably there is some data corruption in the delayed jobs table in database – cleaning it will probably solve the problem

, ,

Leave a comment

Oh my god! where all my digits went?

Case 1: decimals
You are troubled to find out that some of your precision is lost…

1. First place to look is whether you are using the correct number class.

2. next place to look is db column definition
decimal 10,4 for instance, will support 6 digits number with 4 digits after the decimal point.
Don’t get too depressed, you can easily migrate your column to support more digit numbers:


class ExpandDecimals < ActiveRecord::Migration
def self.up
change_column :[table], :[column], :decimal, :precision => 12, :scale => 2
end

def self.down
change_column :[table], :[column], :decimal, :precision => 10, :scale => 4
end
end

Case 2: blob
You are using a table column to store data blob and it’s too short to contain all data?

Migration can be something like:

class ExpandLongtext < ActiveRecord::Migration
def self.up
change_column :[table], :[column], :text, :limit => 16777215
end

def self.down
change_column :[table], :[column], :string, :limit => 255
end
end

 

Migration is very easy and makes your life easy.

Use it.

, ,

Leave a comment

Bootstrap

We are on our bootstrap stage.
Bootstrap means almost everything is done for the first time.
For example-

Setting up your Ruby on Rails development environment on mac OS X 10.6

You will need to get familiar with the terminal. Keep it docked in your programs pane. You are going to use it a lot.

General note: in some installations you are required to change your .profile or your .bash_profile. I prefer using only .bash_profile and apply all the changes in the same file.

Memorize the holy trinity 🙂

$ ./configure
$ make
$ sudo make instal

Now we can get to work…

  • Install X-code, from your OS X installation disk. It has gcc compiler and some other tools that will help you during your installations.
  • Install macports, http://www.macports.org/install.php. The MacPorts Project is an open-source community initiative to design an easy-to-use system for compiling, installing,
    and upgrading either command-line, X11 or Aqua based open-source software on the Mac OS X operating system.
  • Install wget, a tool that helps fetching packages and files from internet locations
$ port install wget
$ port install readline
$ rvm install 1.8.7
$ rvm install 1.9.2
$ rvm 1.9.2 --default
$ gem install bundler
  • Install rails freamework
$ gem install rails
  • Install ruby debug  1.9 gem which enables to debug ruby from rails console.
$ gem install ruby-debug19

OK ready to go!

2 Comments