Holger Sindbaek
Holger Sindbaek

Reputation: 2344

Error on Firebase Transaction: [Error: Set]

I'm trying to increment the value of "view_amount" from my node app in the background, but it only seems to work half the time when there's a big load on it. The other half, I get this error:

[Error: set]

This is my code (Coffeescript):

@ref.firebaseClient.child('listings').child(val.listing_id).child("view_amount").transaction (current_value) ->
  (current_value || 0) + 1
, (error, committed, snapshot) ->
  if error
    console.log error

And this is the path I'm setting it on:

{
  "headline" : "Yeezy Boost 750",
  "shoe_size" : 9.5,
  "short_url" : "K5wv",
  "size_type" : "men",
  "status" : "active",
  "style_code" : "BB1840",
  "timestamp" : 1467842400000,
  "view_amount" : 3043,
  "watching_amount" : 2
}

What could make the transaction code fail? Is it possible I'm running a transaction too many times a second on that specific path? Does the transaction fail if I change the "style_code" at the same time as running the transaction?

Update: This is the error I'm getting on my Node worker. I find the "set" error quite confusing, since I'm trying to do a transaction on the path "view_amount". I'm at no point doing a "set" on that path.

Aug 17 12:15:44 Worker app/worker.1:  error:    Error: set 
Aug 17 12:15:44 Worker app/worker.1:    at Error (native) 
Aug 17 12:15:44 Worker app/worker.1:    at hi (/app/node_modules/firebase/database-node.js:222:395) 
Aug 17 12:15:44 Worker app/worker.1:    at Yh (/app/node_modules/firebase/database-node.js:220:351) 
Aug 17 12:15:44 Worker app/worker.1:    at /app/node_modules/firebase/database-node.js:220:286 
Aug 17 12:15:44 Worker app/worker.1:    at /app/node_modules/firebase/database-node.js:145:167 
Aug 17 12:15:44 Worker app/worker.1:    at Dg.h.ud (/app/node_modules/firebase/database-node.js:146:104) 
Aug 17 12:15:44 Worker app/worker.1:    at rg.ud (/app/node_modules/firebase/database-node.js:137:364) 
Aug 17 12:15:44 Worker app/worker.1:    at Xf.eg (/app/node_modules/firebase/database-node.js:135:280) 
Aug 17 12:15:44 Worker app/worker.1:    at $f (/app/node_modules/firebase/database-node.js:123:109) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].Ka.onmessage (/app/node_modules/firebase/database-node.js:121:467) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].EventTarget.dispatchEvent (/app/node_modules/firebase/node_modules/faye-websocket/lib/faye/websocket/api/event_target.js:22:30) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].instance._receiveMessage (/app/node_modules/firebase/node_modules/faye-websocket/lib/faye/websocket/api.js:134:10) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].<anonymous> (/app/node_modules/firebase/node_modules/faye-websocket/lib/faye/websocket/api.js:34:49) 
Aug 17 12:15:44 Worker app/worker.1:    at emitOne (events.js:82:20) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].emit (events.js:169:7) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].<anonymous> (/app/node_modules/firebase/node_modules/faye-websocket/node_modules/websocket-driver/lib/websocket/driver/hybi.js:451:14) 
Aug 17 12:15:44 Worker app/worker.1:    at pipe (/app/node_modules/firebase/node_modules/faye-websocket/node_modules/websocket-driver/node_modules/websocket-extensions/lib/pipeline/index.js:37:40) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].Pipeline._loop (/app/node_modules/firebase/node_modules/faye-websocket/node_modules/websocket-driver/node_modules/websocket-extensions/lib/pipeline/index.js:44:3) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].Pipeline.processIncomingMessage (/app/node_modules/firebase/node_modules/faye-websocket/node_modules/websocket-driver/node_modules/websocket-extensions/lib/pipeline/index.js:13:8) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].instance.processIncomingMessage (/app/node_modules/firebase/node_modules/faye-websocket/node_modules/websocket-driver/node_modules/websocket-extensions/lib/websocket_extensions.js:133:20) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].instance._emitMessage (/app/node_modules/firebase/node_modules/faye-websocket/node_modules/websocket-driver/lib/websocket/driver/hybi.js:442:22) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].instance._emitFrame (/app/node_modules/firebase/node_modules/faye-websocket/node_modules/websocket-driver/lib/websocket/driver/hybi.js:405:19) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].instance.parse (/app/node_modules/firebase/node_modules/faye-websocket/node_modules/websocket-driver/lib/websocket/driver/hybi.js:141:18) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].instance.parse (/app/node_modules/firebase/node_modules/faye-websocket/node_modules/websocket-driver/lib/websocket/driver/client.js:62:58) 
Aug 17 12:15:44 Worker app/worker.1:    at [object Object].IO.write (/app/node_modules/firebase/node_modules/faye-websocket/node_modules/websocket-driver/lib/websocket/streams.js:80:16) 
Aug 17 12:15:44 Worker app/worker.1:    at TLSSocket.ondata (_stream_readable.js:528:20) 
Aug 17 12:15:44 Worker app/worker.1:    at emitOne (events.js:77:13) 
Aug 17 12:15:44 Worker app/worker.1:    at TLSSocket.emit (events.js:169:7) 
Aug 17 12:15:44 Worker app/worker.1:    at readableAddChunk (_stream_readable.js:146:16) 
Aug 17 12:15:44 Worker app/worker.1:    at TLSSocket.Readable.push (_stream_readable.js:110:10) 
Aug 17 12:15:44 Worker app/worker.1:    at TLSWrap.onread (net.js:523:20)

Upvotes: 2

Views: 477

Answers (1)

Michael Lehenbauer
Michael Lehenbauer

Reputation: 16309

Sorry for the poor error message, but this error means that you did a set() or update() operation on a related path (anything at, above, or below /listings/<val.listing_id>/view_amount) before the transaction completed, and so we cancelled the transaction since we don't know if we should re-run the transaction on top of your set() or if your set() should override the transaction's write, etc.

In general, you need to be careful not to mix set() and transaction() calls on the same part of your database.

Upvotes: 3

Related Questions