You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2015/10/31 23:22:26 UTC

[11/14] lucy git commit: Custom Go bindings for Lock.

Custom Go bindings for Lock.


Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/bda80a7a
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/bda80a7a
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/bda80a7a

Branch: refs/heads/master
Commit: bda80a7aebecaf716ba9b3145a5687d8989ec8b4
Parents: 19ce9af
Author: Marvin Humphrey <ma...@rectangular.com>
Authored: Tue Oct 27 19:24:51 2015 -0700
Committer: Marvin Humphrey <ma...@rectangular.com>
Committed: Tue Oct 27 19:36:59 2015 -0700

----------------------------------------------------------------------
 go/build.go           |  7 ++++++
 go/lucy/store.go      | 35 ++++++++++++++++++++++++++
 go/lucy/store_test.go | 61 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 103 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy/blob/bda80a7a/go/build.go
----------------------------------------------------------------------
diff --git a/go/build.go b/go/build.go
index 902ca2b..1d429ff 100644
--- a/go/build.go
+++ b/go/build.go
@@ -284,6 +284,13 @@ func specClasses(parcel *cfc.Parcel) {
 	dhBinding := cfc.NewGoClass(parcel, "Lucy::Store::DirHandle")
 	dhBinding.SpecMethod("Close", "Close() error")
 	dhBinding.Register()
+
+	lockBinding := cfc.NewGoClass(parcel, "Lucy::Store::Lock")
+	lockBinding.SpecMethod("Request", "Request() error")
+	lockBinding.SpecMethod("Obtain", "Obtain() error")
+	lockBinding.SpecMethod("Release", "Release() error")
+	lockBinding.SpecMethod("Clear_Stale", "ClearStale() error")
+	lockBinding.Register()
 }
 
 func build() {

http://git-wip-us.apache.org/repos/asf/lucy/blob/bda80a7a/go/lucy/store.go
----------------------------------------------------------------------
diff --git a/go/lucy/store.go b/go/lucy/store.go
index 50b98be..05d6dc3 100644
--- a/go/lucy/store.go
+++ b/go/lucy/store.go
@@ -662,3 +662,38 @@ func OpenFSDirHandle(path string) (dh FSDirHandle, err error) {
 	})
 	return dh, err
 }
+
+func (lock *LockIMP) Request() error {
+	self := (*C.lucy_Lock)(clownfish.Unwrap(lock, "lock"))
+	success := C.LUCY_Lock_Request(self)
+	if !success {
+		cfErr := C.cfish_Err_get_error();
+		return clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error)
+	}
+	return nil
+}
+
+func (lock *LockIMP) Obtain() error {
+	self := (*C.lucy_Lock)(clownfish.Unwrap(lock, "lock"))
+	success := C.LUCY_Lock_Obtain(self)
+	if !success {
+		cfErr := C.cfish_Err_get_error();
+		return clownfish.WRAPAny(unsafe.Pointer(C.cfish_incref(unsafe.Pointer(cfErr)))).(error)
+	}
+	return nil
+}
+
+func (lock *LockIMP) Release() error {
+	return clownfish.TrapErr(func() {
+		self := (*C.lucy_Lock)(clownfish.Unwrap(lock, "lock"))
+		C.LUCY_Lock_Release(self)
+	})
+}
+
+
+func (lock *LockIMP) ClearStale() error {
+	return clownfish.TrapErr(func() {
+		self := (*C.lucy_Lock)(clownfish.Unwrap(lock, "lock"))
+		C.LUCY_Lock_Clear_Stale(self)
+	})
+}

http://git-wip-us.apache.org/repos/asf/lucy/blob/bda80a7a/go/lucy/store_test.go
----------------------------------------------------------------------
diff --git a/go/lucy/store_test.go b/go/lucy/store_test.go
index e243e46..fb2fdc7 100644
--- a/go/lucy/store_test.go
+++ b/go/lucy/store_test.go
@@ -624,3 +624,64 @@ func TestFSDirHandleAll(t *testing.T) {
 	}
 	runDirHandleCommonTests(t, folder, makeDH)
 }
+
+func runLockCommonTests(t *testing.T, makeLock func(string, string) Lock) {
+	var err error
+	lock := makeLock("foo", "dev.example.com")
+	other := makeLock("foo", "dev.example.com")
+
+	if got := lock.GetName(); got != "foo" {
+		t.Errorf("GetName: %v", got)
+	}
+	if got := lock.GetHost(); got != "dev.example.com" {
+		t.Errorf("GetHost: %v", got)
+	}
+
+	err = lock.Request()
+	if err != nil {
+		t.Errorf("Request: %v", err)
+	}
+	if !lock.IsLocked() {
+		t.Errorf("Lock should be locked, but IsLocked returned false")
+	}
+	if got := lock.GetLockPath(); len(got) == 0 {
+		// Lock path only valid when locked for shared locks.
+		t.Errorf("GetLockPath should work")
+	}
+	err = other.Request()
+	if other.Shared() && err != nil {
+		t.Errorf("SharedLock Request should succeed: %v", err)
+	} else if !other.Shared() && err == nil {
+		t.Errorf("Request should fail for locked resource")
+	}
+	err = lock.Release()
+	if err != nil {
+		t.Errorf("Request: %v", err)
+	}
+	other.Release()
+	err = lock.Obtain()
+	if err != nil {
+		t.Errorf("Obtain: %v", err)
+	}
+
+	err = lock.ClearStale()
+	if err != nil {
+		t.Errorf("Nothing for ClearStale to do, but should still suceed: %v", err)
+	}
+}
+
+func TestLockFileLockAll(t *testing.T) {
+	folder := NewRAMFolder("myindex")
+	makeLock := func(name, host string) Lock {
+		return NewLockFileLock(folder, name, host, 0, 1)
+	}
+	runLockCommonTests(t, makeLock)
+}
+
+func TestSharedLockAll(t *testing.T) {
+	folder := NewRAMFolder("myindex")
+	makeLock := func(name, host string) Lock {
+		return NewSharedLock(folder, name, host, 0, 1)
+	}
+	runLockCommonTests(t, makeLock)
+}