@@ -322,6 +322,8 @@ func (nDB *NetworkDB) Peers(nid string) []PeerInfo {
322322// GetEntry retrieves the value of a table entry in a given (network,
323323// table, key) tuple
324324func (nDB * NetworkDB ) GetEntry (tname , nid , key string ) ([]byte , error ) {
325+ nDB .RLock ()
326+ defer nDB .RUnlock ()
325327 entry , err := nDB .getEntry (tname , nid , key )
326328 if err != nil {
327329 return nil , err
@@ -331,9 +333,6 @@ func (nDB *NetworkDB) GetEntry(tname, nid, key string) ([]byte, error) {
331333}
332334
333335func (nDB * NetworkDB ) getEntry (tname , nid , key string ) (* entry , error ) {
334- nDB .RLock ()
335- defer nDB .RUnlock ()
336-
337336 e , ok := nDB .indexes [byTable ].Get (fmt .Sprintf ("/%s/%s/%s" , tname , nid , key ))
338337 if ! ok {
339338 return nil , types .NotFoundErrorf ("could not get entry in table %s with network id %s and key %s" , tname , nid , key )
@@ -348,13 +347,10 @@ func (nDB *NetworkDB) getEntry(tname, nid, key string) (*entry, error) {
348347// entry for the same tuple for which there is already an existing
349348// entry unless the current entry is deleting state.
350349func (nDB * NetworkDB ) CreateEntry (tname , nid , key string , value []byte ) error {
350+ nDB .Lock ()
351351 oldEntry , err := nDB .getEntry (tname , nid , key )
352- if err != nil {
353- if _ , ok := err .(types.NotFoundError ); ! ok {
354- return fmt .Errorf ("cannot create entry in table %s with network id %s and key %s: %v" , tname , nid , key , err )
355- }
356- }
357- if oldEntry != nil && ! oldEntry .deleting {
352+ if err == nil || (oldEntry != nil && ! oldEntry .deleting ) {
353+ nDB .Unlock ()
358354 return fmt .Errorf ("cannot create entry in table %s with network id %s and key %s, already exists" , tname , nid , key )
359355 }
360356
@@ -364,14 +360,13 @@ func (nDB *NetworkDB) CreateEntry(tname, nid, key string, value []byte) error {
364360 value : value ,
365361 }
366362
363+ nDB .createOrUpdateEntry (nid , tname , key , entry )
364+ nDB .Unlock ()
365+
367366 if err := nDB .sendTableEvent (TableEventTypeCreate , nid , tname , key , entry ); err != nil {
368367 return fmt .Errorf ("cannot send create event for table %s, %v" , tname , err )
369368 }
370369
371- nDB .Lock ()
372- nDB .createOrUpdateEntry (nid , tname , key , entry )
373- nDB .Unlock ()
374-
375370 return nil
376371}
377372
@@ -380,7 +375,9 @@ func (nDB *NetworkDB) CreateEntry(tname, nid, key string, value []byte) error {
380375// propagates this event to the cluster. It is an error to update a
381376// non-existent entry.
382377func (nDB * NetworkDB ) UpdateEntry (tname , nid , key string , value []byte ) error {
383- if _ , err := nDB .GetEntry (tname , nid , key ); err != nil {
378+ nDB .Lock ()
379+ if _ , err := nDB .getEntry (tname , nid , key ); err != nil {
380+ nDB .Unlock ()
384381 return fmt .Errorf ("cannot update entry as the entry in table %s with network id %s and key %s does not exist" , tname , nid , key )
385382 }
386383
@@ -390,14 +387,13 @@ func (nDB *NetworkDB) UpdateEntry(tname, nid, key string, value []byte) error {
390387 value : value ,
391388 }
392389
390+ nDB .createOrUpdateEntry (nid , tname , key , entry )
391+ nDB .Unlock ()
392+
393393 if err := nDB .sendTableEvent (TableEventTypeUpdate , nid , tname , key , entry ); err != nil {
394394 return fmt .Errorf ("cannot send table update event: %v" , err )
395395 }
396396
397- nDB .Lock ()
398- nDB .createOrUpdateEntry (nid , tname , key , entry )
399- nDB .Unlock ()
400-
401397 return nil
402398}
403399
@@ -427,27 +423,29 @@ func (nDB *NetworkDB) GetTableByNetwork(tname, nid string) map[string]*TableElem
427423// table, key) tuple and if the NetworkDB is part of the cluster
428424// propagates this event to the cluster.
429425func (nDB * NetworkDB ) DeleteEntry (tname , nid , key string ) error {
430- value , err := nDB .GetEntry (tname , nid , key )
431- if err != nil {
432- return fmt .Errorf ("cannot delete entry as the entry in table %s with network id %s and key %s does not exist" , tname , nid , key )
426+ nDB .Lock ()
427+ oldEntry , err := nDB .getEntry (tname , nid , key )
428+ if err != nil || oldEntry == nil || oldEntry .deleting {
429+ nDB .Unlock ()
430+ return fmt .Errorf ("cannot delete entry %s with network id %s and key %s " +
431+ "does not exist or is already being deleted" , tname , nid , key )
433432 }
434433
435434 entry := & entry {
436435 ltime : nDB .tableClock .Increment (),
437436 node : nDB .config .NodeID ,
438- value : value ,
437+ value : oldEntry . value ,
439438 deleting : true ,
440439 reapTime : nDB .config .reapEntryInterval ,
441440 }
442441
442+ nDB .createOrUpdateEntry (nid , tname , key , entry )
443+ nDB .Unlock ()
444+
443445 if err := nDB .sendTableEvent (TableEventTypeDelete , nid , tname , key , entry ); err != nil {
444446 return fmt .Errorf ("cannot send table delete event: %v" , err )
445447 }
446448
447- nDB .Lock ()
448- nDB .createOrUpdateEntry (nid , tname , key , entry )
449- nDB .Unlock ()
450-
451449 return nil
452450}
453451
0 commit comments